diff --git a/.devcontainer.json b/.devcontainer.json deleted file mode 100644 index c0ae5292d6b572..00000000000000 --- a/.devcontainer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "Node.js Core Developer Environment", - "runArgs": [ - "--platform=linux/amd64" - ], - "customizations": { - "vscode": { - "extensions": [ - "github.vscode-pull-request-github", - "ms-vsliveshare.vsliveshare", - "vscode-icons-team.vscode-icons", - "visualstudioexptteam.vscodeintellicode" - ], - "settings": { - "terminal.integrated.profiles.linux": { - "zsh (login)": { - "path": "zsh", - "args": ["-l"] - } - } - } - } - }, - "image": "nodejs/devcontainer:nightly" -} diff --git a/.devcontainer/base/devcontainer.json b/.devcontainer/base/devcontainer.json new file mode 100644 index 00000000000000..9d14ab87572bea --- /dev/null +++ b/.devcontainer/base/devcontainer.json @@ -0,0 +1,11 @@ +{ + "name": "Node.js Dev Container", + "image": "nodejs/devcontainer:nightly", + "workspaceMount": "source=${localWorkspaceFolder},target=/home/developer/nodejs/node,type=bind,consistency=cached", + "workspaceFolder": "/home/developer/nodejs/node", + "remoteUser": "developer", + "mounts": [ + "source=node-devcontainer-cache,target=/home/developer/nodejs/node/out,type=volume" + ], + "postCreateCommand": "git restore-mtime" +} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 5ef23759b3e18e..00000000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,231 +0,0 @@ -# Node.js Project Codeowners - -# This file does not define any requirements for landing PRs. -# Its purpose is to allow automation of courtesy pings to the -# relevant team(s) when any of the paths listed here are modified. -# Criteria for landing PRs are defined in -# https://github.com/nodejs/node/blob/main/doc/contributing/collaborator-guide.md#code-reviews. -# -# Codeowners must always be teams, never individuals. - -# tsc - -/.github/CODEOWNERS @nodejs/tsc -/.github/PULL_REQUEST_TEMPLATE.md @nodejs/tsc -/.github/ISSUE_TEMPLATE/* @nodejs/tsc -/CODE_OF_CONDUCT.md @nodejs/tsc -/CONTRIBUTING.md @nodejs/tsc -/doc/contributing/**/* @nodejs/tsc -/GOVERNANCE.md @nodejs/tsc -/SECURITY.md @nodejs/tsc -/BUILDING.md @nodejs/build @nodejs/tsc -/LICENSE @nodejs/tsc -/onboarding.md @nodejs/tsc - -# nodejs.org website -/doc/api_assets @nodejs/nodejs-website -/doc/template.html @nodejs/nodejs-website -/tools/doc @nodejs/web-infra - -# streams - -/lib/_stream* @nodejs/streams -/lib/internal/streams/* @nodejs/streams -/lib/stream.js @nodejs/streams -/lib/stream/* @nodejs/streams - -# net - -/deps/cares @nodejs/net -/doc/api/dgram.md @nodejs/net -/doc/api/dns.md @nodejs/net -/doc/api/net.md @nodejs/net -/lib/dgram.js @nodejs/net -/lib/dns.js @nodejs/net -/lib/internal/dgram.js @nodejs/net -/lib/internal/dns/* @nodejs/net -/lib/internal/js_stream_socket.js @nodejs/net -/lib/internal/net.js @nodejs/net -/lib/internal/socket_list.js @nodejs/net -/lib/net.js @nodejs/net -/src/cares_wrap.cc @nodejs/net -/src/connect_wrap.* @nodejs/net -/src/connection_wrap.* @nodejs/net -/src/node_sockaddr* @nodejs/net -/src/tcp_wrap.* @nodejs/net -/src/udp_wrap.* @nodejs/net - -# tls/crypto - -/doc/api/crypto.md @nodejs/crypto -/doc/api/webcrypto.md @nodejs/crypto -/lib/crypto.js @nodejs/crypto -/lib/internal/crypto/* @nodejs/crypto -/lib/internal/tls/* @nodejs/crypto @nodejs/net -/lib/tls.js @nodejs/crypto @nodejs/net -/src/crypto/* @nodejs/crypto -/src/node_crypto* @nodejs/crypto -/deps/ncrypto/* @nodejs/crypto - -# http - -/deps/llhttp/* @nodejs/http @nodejs/net -/doc/api/http.md @nodejs/http @nodejs/net -/lib/_http_* @nodejs/http @nodejs/net -/lib/http.js @nodejs/http @nodejs/net -/lib/https.js @nodejs/crypto @nodejs/net @nodejs/http -/src/node_http_common* @nodejs/http @nodejs/http2 @nodejs/net -/src/node_http_parser.cc @nodejs/http @nodejs/net - -# http2 - -/deps/nghttp2/* @nodejs/http2 @nodejs/net -/doc/api/http2.md @nodejs/http2 @nodejs/http @nodejs/net -/lib/http2.js @nodejs/http2 @nodejs/net -/lib/internal/http2/* @nodejs/http2 @nodejs/net -/src/node_http2* @nodejs/http2 @nodejs/net -/src/node_mem* @nodejs/http2 - -# modules, including loaders - -/doc/api/esm.md @nodejs/loaders -/doc/api/module.md @nodejs/loaders -/doc/api/modules.md @nodejs/loaders -/doc/api/packages.md @nodejs/loaders -/lib/internal/bootstrap/realm.js @nodejs/loaders -/lib/internal/modules/* @nodejs/loaders -/lib/internal/process/execution.js @nodejs/loaders -/lib/module.js @nodejs/loaders -/src/module_wrap* @nodejs/loaders @nodejs/vm - -# Node-API - -/doc/api/n-api.md @nodejs/node-api -/doc/contributing/adding-new-napi-api.md @nodejs/node-api -/src/js_native_api* @nodejs/node-api -/src/node_api* @nodejs/node-api - -# gyp - -*.gyp @nodejs/gyp -*.gypi @nodejs/gyp -/tools/gyp/**/* @nodejs/gyp - -# WASI - -/deps/uvwasi/ @nodejs/wasi -/doc/api/wasi.md @nodejs/wasi -/lib/wasi.js @nodejs/wasi -/src/node_wasi* @nodejs/wasi -/test/fixtures/wasi/ @nodejs/wasi -/test/wasi/ @nodejs/wasi - -# Startup - -/benchmark/misc/startup-* @nodejs/startup -/lib/internal/bootstrap/* @nodejs/startup -/src/node_builtins* @nodejs/startup -/src/node_realm* @nodejs/startup @nodejs/realm -/src/node_snapshot* @nodejs/startup -/src/node.cc @nodejs/startup -/test/parallel/test-bootstrap-* @nodejs/startup -/test/parallel/test-snapshot-* @nodejs/startup -/tools/snapshot/* @nodejs/startup - -# V8 - -/deps/v8/* @nodejs/v8-update -/tools/v8_gypfiles/* @nodejs/v8-update - -# Actions - -/.github/workflows/* @nodejs/actions -/.github/workflows/create-release-proposal.yml @nodejs/releasers -/tools/actions/* @nodejs/actions - -# Test runner - -/doc/api/test.md @nodejs/test_runner -/lib/internal/main/test_runner.js @nodejs/test_runner -/lib/internal/test_runner/* @nodejs/test_runner -/lib/test.js @nodejs/test_runner -/lib/test/reporters.js @nodejs/test_runner -/test/parallel/test-runner-* @nodejs/test_runner - -# Single Executable Applications -/deps/postject @nodejs/single-executable -/doc/api/single-executable-applications.md @nodejs/single-executable -/doc/contributing/maintaining/maintaining-single-executable-application-support.md @nodejs/single-executable -/src/node_sea* @nodejs/single-executable -/test/fixtures/postject-copy @nodejs/single-executable -/test/parallel/test-single-executable-* @nodejs/single-executable -/test/sequential/test-single-executable-* @nodejs/single-executable -/tools/dep_updaters/update-postject.sh @nodejs/single-executable - -# Permission Model -/doc/api/permissions.md @nodejs/security-wg -/lib/internal/process/permission.js @nodejs/security-wg -/src/permission/* @nodejs/security-wg -/test/parallel/test-permission-* @nodejs/security-wg - -# Security Release -/doc/contributing/security-release-process.md @nodejs/security-stewards - -# Dependency Update Tools - -/.github/workflows/tools.yml @nodejs/security-wg -/.github/workflows/update-openssl.yml @nodejs/security-wg -/.github/workflows/update-v8.yml @nodejs/security-wg @nodejs/v8-update -/deps @nodejs/security-wg -/tools/dep_updaters/* @nodejs/security-wg - -# Web Standards -/lib/internal/bootstrap/web/* @nodejs/web-standards -/lib/internal/navigator.js @nodejs/web-standards -/test/fixtures/wpt/ @nodejs/web-standards -/test/wpt/ @nodejs/web-standards - -# TypeScript - -/deps/amaro/ @nodejs/typescript -/doc/api/typescript.md @nodejs/typescript -/test/fixtures/typescript/ @nodejs/typescript -/tools/dep_updaters/update-amaro.sh @nodejs/typescript - -# Performance -/benchmark/* @nodejs/performance - -# URL -/deps/ada @nodejs/url -/lib/internal/url.js @nodejs/url -/lib/url.js @nodejs/url -/src/node_url.* @nodejs/url -/test/fixtures/wpt/url @nodejs/url - -# SQLite -/deps/sqlite/ @nodejs/sqlite -/doc/api/sqlite.md @nodejs/sqlite -/src/node_sqlite.* @nodejs/sqlite -/test/parallel/test-sqlite* @nodejs/sqlite -/test/sqlite/ @nodejs/sqlite -/tools/dep_updaters/update-sqlite.sh @nodejs/sqlite - -# Config -/doc/node-config-schema.json @nodejs/config -/src/node_config.* @nodejs/config -/src/node_dotenv.* @nodejs/config -/src/node_options.* @nodejs/config -/test/parallel/test-config-* @nodejs/config -/test/parallel/test-dotenv-* @nodejs/config - -# Inspector -/src/inspector/* @nodejs/inspector -/src/inspector_* @nodejs/inspector -/lib/internal/inspector/* @nodejs/inspector -/lib/internal/inspector_* @nodejs/inspector -/lib/inspector.js @nodejs/inspector - -# path -/lib/path.js @nodejs/path -/lib/path/* @nodejs/path -/test/parallel/test-path-* @nodejs/path diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml deleted file mode 100644 index 4637a2fa86e17b..00000000000000 --- a/.github/ISSUE_TEMPLATE/1-bug-report.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: 🐛 Bug report -description: Create a report to help us improve -body: - - type: markdown - attributes: - value: | - Thank you for reporting an issue. - - This issue tracker is for bugs and issues found within Node.js core. - If you require more general support please file an issue on our help repo. https://github.com/nodejs/help - - Please fill in as much of the following form as you're able. - - type: input - attributes: - label: Version - description: | - Output of `node -v`. - Please verify that you are reproducing the issue in a [currently-supported version](https://github.com/nodejs/Release/blob/HEAD/README.md#release-schedule) of Node.js. - - type: textarea - attributes: - label: Platform - render: text - description: | - UNIX: output of `uname -a` - Windows: output of `"$([Environment]::OSVersion.VersionString) $(('x86', 'x64')[[Environment]::Is64BitOperatingSystem])"` in PowerShell console - - type: input - attributes: - label: Subsystem - description: If known, please specify affected core module name - - type: textarea - attributes: - label: What steps will reproduce the bug? - description: > - Enter details about your bug, preferably a simple code snippet that can - be run using `node` directly without installing third-party dependencies - or downloading code from the internet (i.e. no ZIP archive, no GitHub - repository, etc.). - validations: - required: true - - type: textarea - attributes: - label: How often does it reproduce? Is there a required condition? - validations: - required: true - - type: textarea - attributes: - label: What is the expected behavior? Why is that the expected behavior? - description: If possible please provide textual output instead of screenshots. - validations: - required: true - - type: textarea - attributes: - label: What do you see instead? - description: If possible please provide textual output instead of screenshots. - validations: - required: true - - type: textarea - attributes: - label: Additional information - description: Tell us anything else you think we should know. diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml deleted file mode 100644 index 26a77a3617cbeb..00000000000000 --- a/.github/ISSUE_TEMPLATE/2-feature-request.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: 🚀 Feature request -description: Suggest an idea for this project -labels: [feature request] -body: - - type: markdown - attributes: - value: | - Thank you for suggesting an idea to make Node.js better. - - Please fill in as much of the following form as you're able. - - For more information on how the project manages feature - requests, see [Feature request management](https://github.com/nodejs/node/blob/HEAD/doc/contributing/feature-request-management.md). - - type: textarea - attributes: - label: What is the problem this feature will solve? - validations: - required: true - - type: textarea - attributes: - label: What is the feature you are proposing to solve the problem? - validations: - required: true - - type: textarea - attributes: - label: What alternatives have you considered? diff --git a/.github/ISSUE_TEMPLATE/3-api-ref-docs-problem.yml b/.github/ISSUE_TEMPLATE/3-api-ref-docs-problem.yml deleted file mode 100644 index 753e2d9e58a9d5..00000000000000 --- a/.github/ISSUE_TEMPLATE/3-api-ref-docs-problem.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: 📗 Open an issue regarding the Node.js API reference docs -description: Let us know about any problematic API reference documents -labels: [doc] -body: - - type: markdown - attributes: - value: | - Thank you for wanting to make nodejs.org better! - - Please fill in as much of the following form as you're able. - - type: input - attributes: - label: Affected URL(s) - - type: textarea - attributes: - label: Description of the problem - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml b/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml deleted file mode 100644 index a3f45b377b6332..00000000000000 --- a/.github/ISSUE_TEMPLATE/4-report-a-flaky-test.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Report a flaky test -description: Report a flaky test in our CI -labels: [flaky-test] -body: - - type: markdown - attributes: - value: | - Thank you for reporting a flaky test. - - Flaky tests are tests that fail occasionally in the Node.js CI, but not - consistently enough to block PRs from landing, or that are failing in CI - jobs or test modes that are not run for every PR. - - Please fill in as much of the form below as you're able. - - type: input - attributes: - label: Test - description: The test that is flaky. - placeholder: e.g. `test-fs-stat-bigint` - validations: - required: true - - type: dropdown - attributes: - label: Platform - description: The platform the test is flaky on. - multiple: true - options: - - AIX - - FreeBSD - - Linux ARM64 - - Linux PPC64LE - - Linux s390x - - Linux x64 - - macOS ARM64 - - macOS x64 - - SmartOS - - Windows ARM64 - - Windows x64 - - Other - - type: textarea - attributes: - label: Console output - description: > - A pasted console output from a failed CI job showing the whole failure - of the test. - render: console - - type: textarea - attributes: - label: Build links - description: Links to builds affected by the flaky test. - value: '- ' - - type: textarea - attributes: - label: Additional information - description: > - If any investigation has been done, please include any information - found, such as how consistently the test fails, whether the failure - could be reproduced locally, when the test started failing, or anything - else you think is relevant. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 0ec17d486e7712..00000000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,14 +0,0 @@ -blank_issues_enabled: true -contact_links: - - name: ⁉️ Need general help with Node.js? - url: https://github.com/nodejs/help - about: Please file an issue in our help repo. - - name: 📦 Have an issue with npm? - url: https://github.com/npm/cli/issues - about: npm has a seperate issue tracker. - - name: 📡 Have an issue with undici? (`WebSocket`, `fetch`, etc.) - url: https://github.com/nodejs/undici/issues - about: Undici has a seperate issue tracker. - - name: 🌐 Found a problem with nodejs.org beyond the API reference docs? - url: https://github.com/nodejs/nodejs.org/issues/new/choose - about: Please file an issue in the Node.js website repo. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 936c2a06125795..00000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md deleted file mode 100644 index 4613512bf2d01f..00000000000000 --- a/.github/SUPPORT.md +++ /dev/null @@ -1,27 +0,0 @@ -# Support - -Node.js contributors have limited availability to address general support -questions. Please make sure you are using a [currently-supported version of -Node.js](https://github.com/nodejs/Release#release-schedule). - -When looking for support, please first search for your question in these venues: - -* [Node.js Website](https://nodejs.org/en/), especially the - [API docs](https://nodejs.org/api/) or the [Learn material](https://nodejs.org/en/learn) -* [Node.js's GitHub Help repository](https://github.com/nodejs/help) -* [Open or closed issues in the Node.js GitHub organization](https://github.com/issues?utf8=%E2%9C%93&q=sort%3Aupdated-desc+org%3Anodejs+is%3Aissue) -* [Ask for support on Node.js's Discord server](https://nodejs.org/discord) - -If you didn't find an answer in the resources above, try these unofficial -resources: - -* [Questions tagged 'node.js' on Stack Overflow](https://stackoverflow.com/questions/tagged/node.js) -* [#node.js channel on libera.chat](https://web.libera.chat?channels=node.js&uio=d4) -* [Node.js Slack Community](https://node-js.slack.com/) - * To register: [nodeslackers.com](https://www.nodeslackers.com/) - -**GitHub issues are for tracking enhancements and bugs, not general support.** - -The open source license grants you the freedom to use Node.js. It does not -guarantee commitments of other people's time. Please be respectful and manage -your expectations. diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 998f55603a8720..00000000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Set update schedule for GitHub Actions - -version: 2 -updates: - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - cooldown: - semver-major-days: 5 - semver-minor-days: 5 - semver-patch-days: 5 - - commit-message: - prefix: meta - open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} - - - package-ecosystem: npm - directory: /tools/eslint - schedule: - interval: monthly - cooldown: - semver-major-days: 5 - semver-minor-days: 5 - semver-patch-days: 5 - commit-message: - prefix: tools - open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} - groups: - eslint: - applies-to: version-updates - patterns: - - '*' - - - package-ecosystem: npm - directory: /tools/lint-md - schedule: - interval: monthly - cooldown: - semver-major-days: 5 - semver-minor-days: 5 - semver-patch-days: 5 - commit-message: - prefix: tools - open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} - groups: - lint-md: - applies-to: version-updates - patterns: - - '*' - - - package-ecosystem: npm - directory: /tools/doc - schedule: - interval: weekly - cooldown: - semver-major-days: 5 - semver-minor-days: 5 - semver-patch-days: 5 - commit-message: - prefix: tools - open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} - groups: - doc: - applies-to: version-updates - patterns: - - '*' diff --git a/.github/label-pr-config.yml b/.github/label-pr-config.yml deleted file mode 100644 index 0b94dd5755d7d6..00000000000000 --- a/.github/label-pr-config.yml +++ /dev/null @@ -1,218 +0,0 @@ -## Order of entries in this map *does* matter for the resolved labels -## earlier entries override later entries -subSystemLabels: - # src subsystems - /^src\/async_wrap/: c++, async_wrap - /^src\/(?:base64|node_buffer|string_)/: c++, buffer - /^src\/cares/: c++, cares - /^src\/(?:process_wrap|spawn_)/: c++, child_process - /^src\/(?:node_)?crypto/: c++, crypto - /^src\/debug_/: c++, debugger - /^src\/udp_/: c++, dgram - /^src\/(?:fs_|node_file|node_stat_watcher)/: c++, fs - /^src\/node_http_parser/: c++, http_parser - /^src\/node_i18n/: c++, i18n-api - /^src\/uv\./: c++, libuv - /^src\/(?:connect(?:ion)?|pipe|tcp)_/: c++, net - /^src\/node_os/: c++, os - /^src\/(?:node_main|signal_)/: c++, process - /^src\/timer[_s]/: c++, timers - /^src\/node_root_certs/: c++, tls - /^src\/tty_/: c++, tty - /^src\/node_url/: c++, whatwg-url - /^src\/node_util/: c++, util - /^src\/node_v8/: c++, v8 engine - /^src\/node_contextify/: c++, vm - /^src\/node_zlib/: c++, zlib - /^src\/tracing/: c++, tracing - /^src\/(?:node_api|js_native_api)/: c++, node-api - /^src\/node_http2/: c++, http2 - /^src\/node_report/: c++, report - /^src\/node_wasi/: c++, wasi - /^src\/node_worker/: c++, worker - /^src\/quic\/*/: c++, quic - /^src\/node_bob*/: c++, quic - /^src\/node_sea/: single-executable - /^src\/node_sqlite.*/: c++, sqlite - /^src\/node_config_file.*/: c++, config - /^src\/node_dotenv.*/: c++, config - /^src\/node_options.*/: c++, config - - # Properly label changes to V8 inspector integration-related files - /^src\/inspector_/: c++, inspector, needs-ci - - # Don't want to label it a C++ update when we're "only" bumping the Node.js version - /^src\/(?!node_version\.h)/: c++ - # BUILDING.md should be marked as 'build' in addition to 'doc' - /^BUILDING\.md$/: build, doc - # 'meta' is a very specific label for things that are policy and or meta-info related - /^(?:[A-Z]+$|CODE_OF_CONDUCT|GOVERNANCE|CHANGELOG|\.mail|\.git.+)/: meta - # Things that edit top-level .md files are always a doc change - /^\w+\.md$/: doc - # Different variants of Makefile and build files - /^(?:tools\/)?(?:Makefile|BSDmakefile|create_android_makefiles)$/: build, needs-ci - /^tools\/(?:install\.py|getnodeversion\.py|js2c\.py|utils\.py|configure\.d\/.*)$/: build, python, needs-ci - /^vcbuild\.bat$/: build, windows, needs-ci - /^(?:android-)?configure|node\.gyp|common\.gypi$/: build, needs-ci - # More specific tools - /^tools\/gyp/: tools, build, gyp, needs-ci - /^tools\/doc\//: tools, doc - /^tools\/icu\//: tools, i18n-api, icu, needs-ci - /^tools\/osx-/: tools, macos - /^tools\/test-npm/: tools, test, npm - /^tools\/test/: tools, test - /^tools\/(?:certdata|mkssldef|mk-ca-bundle)/: tools, openssl, tls - /^tools\/msvs\//: tools, windows, install, needs-ci - /^tools\/[^/]+\.bat$/: tools, windows, needs-ci - /^tools\/make-v8/: tools, v8 engine, needs-ci - /^tools\/v8_gypfiles/: tools, v8 engine, needs-ci - /^tools\/snapshot/: needs-ci - /^tools\/build-addons.mjs/: needs-ci - # All other tool changes should be marked as such - /^tools\//: tools - /^eslint\.config|\.editorconfig/: tools - /^typings\//: typings - - ## Dependencies - # libuv needs an explicit mapping, as the ordinary /deps/ mapping below would - # end up as libuv changes labeled with 'uv' (which is a non-existing label) - /^deps\/uv\//: libuv - /^deps\/v8\/tools\/gen-postmortem-metadata\.py/: v8 engine, python, post-mortem - /^deps\/v8\//: v8 engine - /^deps\/uvwasi\//: wasi - /^deps\/npm\//: npm, fast-track - /^deps\/nghttp2\/nghttp2\.gyp/: build, http2 - /^deps\/nghttp2\//: http2 - /^deps\/ngtcp2\//: quic - /^deps\/amaro\//: strip-types - /^deps\/([^/]+)/: dependencies, $1 - - ## JS subsystems - # Oddities first - /^lib\/(?:punycode|\w+\/freelist|sys\.js)/: '' - /^lib\/constants\.js$/: lib / src - /^lib\/internal\/debugger$/: debugger - /^lib\/internal\/linkedlist\.js$/: timers - /^lib\/internal\/bootstrap/: lib / src - /^lib\/internal\/v8_prof_/: tools - /^lib\/internal\/socket(?:_list|address)\.js$/: net - /^lib\/(_stream.*|internal\/streams\/.*|stream\.js|stream\/.*)$/: stream - /^lib\/.*http2/: http2 - /^lib\/worker_threads.js$/: worker - /^lib\/test.js$/: test_runner - /^lib\/internal\/url\.js$/: whatwg-url - /^lib\/internal\/modules\/esm/: esm - /^lib\/internal\/modules/: module - /^lib\/internal\/webstreams/: web streams - /^lib\/internal\/test_runner/: test_runner - - # All other lib/ files map directly - /^lib\/_(\w+)_\w+\.js?$/: $1 # e.g. _(stream)_wrap - /^lib(?:\/internal)?\/(\w+)\.js?$/: $1 # Other .js files - /^lib(?:\/internal)?\/(\w+)(?:\/|$)/: $1 # Subfolders - -exlusiveLabels: - # More specific tests - /^test\/addons\//: test, addons - /^test\/debugger/: test, debugger - /^test\/doctool\//: test, doc, tools - /^test\/timers/: test, timers - /^test\/pseudo-tty\//: test, tty - /^test\/inspector/: test, inspector - /^test\/cctest\/test_inspector/: test, inspector - /^test\/node-api\//: test, node-api - /^test\/js-native-api\//: test, node-api - /^test\/async-hooks\//: test, async_hooks - /^test\/report\//: test, report - /^test\/fixtures\/es-module/: test, esm - /^test\/es-module\//: test, esm - /^test\/fixtures\/wpt\/streams\//: test, web streams - /^test\/fixtures\/typescript/: test, strip-types - /^test\/module-hooks\//: test, module, loaders - /^test\/fixtures/module-hooks\//: test, module, loaders - - /^test\//: test - - # Specific map for webcrypto.md as it should be labeled 'crypto' - /^doc\/api\/webcrypto.md$/: doc, crypto - # Specific map for modules.md as it should be labeled 'module' not 'modules' - /^doc\/api\/modules.md$/: doc, module - # node-api is treated separately since it is not a JS core module but is still - # considered a subsystem of sorts - /^doc\/api\/n-api.md$/: doc, node-api - # Add worker label to PRs that affect doc/api/worker_threads.md - /^doc\/api\/worker_threads.md$/: doc, worker - # test_runner documentation - /^doc\/api\/test.md$/: doc, test_runner - # Automatically tag JS subsystem-specific API doc changes - /^doc\/api\/(\w+)\.md$/: doc, $1 - # Add deprecations label to PRs that affect doc/api/deprecations.md - /^doc\/api\/deprecations.md$/: doc, deprecations - /^doc\/changelogs\//: release - # Specific map for typescript.md as it should be labeled 'strip-types' - /^doc\/api\/typescript.md$/: doc, strip-types - - /^doc\/node-config-schema.json$/: doc, config - - /^doc\//: doc - - # More specific benchmarks - /^benchmark\/buffers\//: benchmark, buffer - /^benchmark\/es\//: benchmark, v8 engine - /^benchmark\/_http/: benchmark, http - /^benchmark\/(?:misc|fixtures)\//: benchmark - /^benchmark\/streams\//: benchmark, stream - /^benchmark\/url\//: benchmark, url, whatwg-url - /^benchmark\/([^/]+)\//: benchmark, $1 - - /^benchmark\//: benchmark, performance - -allJsSubSystems: - - assert - - async_hooks - - buffer - - child_process - - cluster - - config - - console - - crypto - - debugger - - dgram - - diagnostics_channel - - dns - - domain - - events - - esm - - fs - - http - - https - - http2 - - inspector - - module - - net - - os - - path - - perf_hooks - - process - - punycode - - querystring - - quic - - readline - - repl - - report - - sqlite - - stream - - string_decoder - - strip-types - - timers - - tls - - trace_events - - tty - - typings - - url - - util - - v8 - - vm - - wasi - - worker - - zlib diff --git a/.github/workflows/auto-start-ci.yml b/.github/workflows/auto-start-ci.yml deleted file mode 100644 index 8e9c6801b786d0..00000000000000 --- a/.github/workflows/auto-start-ci.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: Auto Start CI - -on: - schedule: - # Runs every five minutes (fastest the scheduler can run). Five minutes is - # optimistic, it can take longer to run. - # To understand why `schedule` is used instead of other events, refer to - # ./doc/contributing/commit-queue.md - - cron: '*/5 * * * *' - -concurrency: ${{ github.workflow }} - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - get-prs-for-ci: - permissions: - pull-requests: read - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - outputs: - numbers: ${{ steps.get_prs_for_ci.outputs.numbers }} - steps: - - name: Get Pull Requests - id: get_prs_for_ci - run: > - numbers=$(gh pr list \ - --repo ${{ github.repository }} \ - --label 'request-ci' \ - --json 'number' \ - -t '{{ range . }}{{ .number }} {{ end }}' \ - --limit 5) - echo "numbers=$numbers" >> $GITHUB_OUTPUT - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - start-ci: - permissions: - contents: read - pull-requests: write - needs: get-prs-for-ci - if: needs.get-prs-for-ci.outputs.numbers != '' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Install @node-core/utils - run: npm install -g @node-core/utils - - - name: Setup @node-core/utils - run: | - 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)" - 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 }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-tarball.yml b/.github/workflows/build-tarball.yml deleted file mode 100644 index 365f5eccd5bafa..00000000000000 --- a/.github/workflows/build-tarball.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Build from tarball - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/build-tarball.yml' - push: - branches: - - main - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/build-tarball.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - CLANG_VERSION: '19' - -permissions: - contents: read - -jobs: - build-tarball: - if: github.event.pull_request.draft == false - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - name: Make tarball - run: | - export DISTTYPE=nightly - export DATESTRING=$(date "+%Y-%m-%d") - export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA") - ./configure && make tar -j4 SKIP_XZ=1 - - name: Upload tarball artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: tarballs - path: '*.tar.gz' - compression-level: 0 - test-tarball-linux: - needs: build-tarball - runs-on: ubuntu-24.04 - env: - CC: sccache clang-19 - CXX: sccache clang++-19 - SCCACHE_GHA_ENABLED: 'true' - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - sparse-checkout: .github/actions/install-clang - sparse-checkout-cone-mode: false - - name: Install Clang ${{ env.CLANG_VERSION }} - uses: ./.github/actions/install-clang - with: - clang-version: ${{ env.CLANG_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - - name: Download tarball - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 - with: - name: tarballs - path: tarballs - - name: Extract tarball - run: | - tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP" - echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV" - - name: Build - run: make -C "$TAR_DIR" build-ci -j4 V=1 - - name: Test - run: make -C "$TAR_DIR" run-ci -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" diff --git a/.github/workflows/close-stale-feature-requests.yml b/.github/workflows/close-stale-feature-requests.yml deleted file mode 100644 index c979e52854f1ed..00000000000000 --- a/.github/workflows/close-stale-feature-requests.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: Close stale feature requests -on: - workflow_dispatch: - schedule: - # Run every day at 1:00 AM UTC. - - cron: 0 1 * * * - -# yamllint disable rule:empty-lines -env: - CLOSE_MESSAGE: > - There has been no activity on this feature request - and it is being closed. If you feel closing this issue is not the - right thing to do, please leave a comment. - - - For more information on how the project manages - feature requests, please consult the - [feature request management document](https://github.com/nodejs/node/blob/HEAD/doc/contributing/feature-request-management.md). - - WARN_MESSAGE: > - There has been no activity on this feature request for - 5 months. To help maintain relevant open issues, please - add the https://github.com/nodejs/node/labels/never-stale - label or close this issue if it should be closed. If not, - the issue will be automatically closed 6 months after the - last non-automated comment. - - For more information on how the project manages - feature requests, please consult the - [feature request management document](https://github.com/nodejs/node/blob/HEAD/doc/contributing/feature-request-management.md). -# yamllint enable - -permissions: - contents: read - -jobs: - stale: - permissions: - issues: write # for actions/stale to close stale issues - pull-requests: write # for actions/stale to close stale PRs - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - days-before-stale: 180 - days-before-close: 30 - stale-issue-label: stale - close-issue-message: ${{ env.CLOSE_MESSAGE }} - stale-issue-message: ${{ env.WARN_MESSAGE }} - only-labels: feature request - exempt-issue-labels: never-stale - # max requests it will send per run to the GitHub API before it deliberately exits to avoid hitting API rate limits - operations-per-run: 500 - remove-stale-when-updated: true diff --git a/.github/workflows/close-stale-pull-requests.yml b/.github/workflows/close-stale-pull-requests.yml deleted file mode 100644 index b18cd5c37e69c4..00000000000000 --- a/.github/workflows/close-stale-pull-requests.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Close stale pull requests -on: - workflow_dispatch: - inputs: - endDate: - description: stop processing PRs after this date - required: false - type: string - -# yamllint disable rule:empty-lines -env: - CLOSE_MESSAGE: > - This pull request was opened more than a year ago and there has - been no activity in the last 6 months. We value your contribution - but since it has not progressed in the last 6 months it is being - closed. If you feel closing this pull request is not the right thing - to do, please leave a comment. - - WARN_MESSAGE: > - This pull request was opened more than a year ago and there has - been no activity in the last 5 months. We value your contribution - but since it has not progressed in the last 5 months it is being - marked stale and will be closed if there is no progress in the - next month. If you feel that is not the right thing to do please - comment on the pull request. -# yamllint enable - -permissions: - contents: read - -jobs: - stale: - permissions: - pull-requests: write # for actions/stale to close stale PRs - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - name: Set default end date which is 1 year ago - run: echo "END_DATE=$(date --date='525600 minutes ago' --rfc-2822)" >> "$GITHUB_ENV" - - name: if date set in event override the default end date - env: - END_DATE_INPUT_VALUE: ${{ github.event.inputs.endDate }} - if: ${{ github.event.inputs.endDate != '' }} - run: echo "END_DATE=$END_DATE_INPUT_VALUE" >> "$GITHUB_ENV" - - uses: mhdawson/stale@453d6581568dc43dbe345757f24408d7b451c651 # PR to add support for endDate - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - end-date: ${{ env.END_DATE }} - days-before-issue-stale: -1 - days-before-issue-close: -1 - days-before-stale: 150 - days-before-close: 30 - stale-issue-label: stale - close-issue-message: ${{ env.CLOSE_MESSAGE }} - stale-issue-message: ${{ env.WARN_MESSAGE }} - exempt-pr-labels: never-stale - # max requests it will send per run to the GitHub API before it deliberately exits to avoid hitting API rate limits - operations-per-run: 500 - remove-stale-when-updated: true diff --git a/.github/workflows/close-stalled.yml b/.github/workflows/close-stalled.yml deleted file mode 100644 index 140cedfb460479..00000000000000 --- a/.github/workflows/close-stalled.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Close stalled issues and PRs -on: - schedule: - - cron: 0 0 * * * - -env: - CLOSE_MESSAGE: > - Closing this because it has stalled. Feel free to reopen if this issue/PR - is still relevant, or to ping the collaborator who labelled it stalled if - you have any questions. - -permissions: - contents: read - -jobs: - stale: - permissions: - issues: write # for actions/stale to close stale issues - pull-requests: write # for actions/stale to close stale PRs - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - days-before-close: 30 - stale-pr-label: stalled - stale-issue-label: stalled - close-issue-message: ${{ env.CLOSE_MESSAGE }} - close-pr-message: ${{ env.CLOSE_MESSAGE }} - # used to filter issues to check whether or not should be closed, avoids hitting maximum operations allowed if needing to paginate through all open issues - only-labels: stalled - # max requests it will send per run to the GitHub API before it deliberately exits to avoid hitting API rate limits - operations-per-run: 500 - # deactivates automatic stale labelling as we prefer to do that manually - days-before-stale: -1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ce44d02f698d37..dfd5f44208039e 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@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: languages: ${{ matrix.language }} config-file: ./.github/codeql-config.yml - name: Autobuild - uses: github/codeql-action/autobuild@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/autobuild@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 + uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4.31.2 with: category: /language:${{matrix.language}} diff --git a/.github/workflows/comment-labeled.yml b/.github/workflows/comment-labeled.yml deleted file mode 100644 index 7e3a19c6afd13c..00000000000000 --- a/.github/workflows/comment-labeled.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Comment on issues and PRs when labeled -on: - issues: - types: [labeled] - pull_request_target: - types: [labeled] - -env: - STALE_MESSAGE: > - This issue/PR was marked as stalled, it will be automatically closed in 30 days. - If it should remain open, please leave a comment explaining why it should remain open. - FAST_TRACK_MESSAGE: Fast-track has been requested by @${{ github.actor }}. Please 👍 to approve. - NOTABLE_CHANGE_MESSAGE: | - The https://github.com/nodejs/node/labels/notable-change label has been added by @${{ github.actor }}. - - Please suggest a text for the release notes if you'd like to include a more detailed summary, then proceed to update the PR description with the text or a link to the notable change suggested text comment. Otherwise, the commit will be placed in the _Other Notable Changes_ section. - -permissions: - contents: read - -jobs: - stale-comment: - permissions: - issues: write - pull-requests: write - if: github.repository == 'nodejs/node' && github.event.label.name == 'stalled' - runs-on: ubuntu-latest - steps: - - name: Post stalled comment - env: - NUMBER: ${{ github.event.issue.number || github.event.pull_request.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh issue comment "$NUMBER" --repo ${{ github.repository }} --body "$STALE_MESSAGE" - - fast-track: - permissions: - pull-requests: write - if: github.repository == 'nodejs/node' && github.event_name == 'pull_request_target' && github.event.label.name == 'fast-track' - runs-on: ubuntu-latest - steps: - - name: Request Fast-Track - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --body "$FAST_TRACK_MESSAGE" - - notable-change: - permissions: - pull-requests: write - if: github.repository == 'nodejs/node' && github.event_name == 'pull_request_target' && github.event.label.name == 'notable-change' - runs-on: ubuntu-latest - steps: - - name: Add notable change description - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --body "$NOTABLE_CHANGE_MESSAGE" diff --git a/.github/workflows/commit-lint-problem-matcher.json b/.github/workflows/commit-lint-problem-matcher.json deleted file mode 100644 index 72dd13b9e0929d..00000000000000 --- a/.github/workflows/commit-lint-problem-matcher.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "core-validate-commit", - "pattern": [ - { - "regexp": "^not ok \\d+ (.*)$", - "message": 1 - } - ] - } - ] -} diff --git a/.github/workflows/commit-lint.yml b/.github/workflows/commit-lint.yml deleted file mode 100644 index 5d9314925e682e..00000000000000 --- a/.github/workflows/commit-lint.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: First commit message adheres to guidelines - -on: [pull_request] - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - lint-commit-message: - runs-on: ubuntu-latest - steps: - - name: Compute number of commits in the PR - id: nb-of-commits - run: | - echo "plusOne=$((${{ github.event.pull_request.commits }} + 1))" >> $GITHUB_OUTPUT - echo "minusOne=$((${{ github.event.pull_request.commits }} - 1))" >> $GITHUB_OUTPUT - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: ${{ steps.nb-of-commits.outputs.plusOne }} - persist-credentials: false - - run: git reset HEAD^2 - - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Validate commit message - run: | - echo "::add-matcher::.github/workflows/commit-lint-problem-matcher.json" - git rev-parse HEAD~${{ steps.nb-of-commits.outputs.minusOne }} | xargs npx -q core-validate-commit --no-validate-metadata --tap diff --git a/.github/workflows/commit-queue.yml b/.github/workflows/commit-queue.yml deleted file mode 100644 index cc572ec979b4f7..00000000000000 --- a/.github/workflows/commit-queue.yml +++ /dev/null @@ -1,99 +0,0 @@ -# This action requires the following secrets to be set on the repository: -# GH_USER_TOKEN: GitHub user token, to be used by ncu and to push changes -# JENKINS_USER: GitHub user whose Jenkins token is defined below -# JENKINS_TOKEN: Jenkins token, to be used to check CI status - -name: Commit Queue - -on: - # `schedule` event is used instead of `pull_request` because when a - # `pull_request` event is triggered on a PR from a fork, GITHUB_TOKEN will - # be read-only, and the Action won't have access to any other repository - # secrets, which it needs to access Jenkins API. - schedule: - - cron: '*/5 * * * *' - -concurrency: ${{ github.workflow }} - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - get_mergeable_prs: - permissions: - pull-requests: read - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - outputs: - numbers: ${{ steps.get_mergeable_prs.outputs.numbers }} - steps: - - name: Get Pull Requests - id: get_mergeable_prs - run: | - prs=$(gh pr list \ - --repo "$GITHUB_REPOSITORY" \ - --base "$GITHUB_REF_NAME" \ - --label 'commit-queue' \ - --json 'number' \ - --search "created:<=$(date --date="2 days ago" +"%Y-%m-%dT%H:%M:%S%z") -label:blocked" \ - -t '{{ range . }}{{ .number }} {{ end }}' \ - --limit 100) - fast_track_prs=$(gh pr list \ - --repo "$GITHUB_REPOSITORY" \ - --base "$GITHUB_REF_NAME" \ - --label 'commit-queue' \ - --label 'fast-track' \ - --search "-label:blocked" \ - --json 'number' \ - -t '{{ range . }}{{ .number }} {{ end }}' \ - --limit 100) - numbers=$(echo $prs' '$fast_track_prs | jq -r -s 'unique | join(" ")') - echo "numbers=$numbers" >> "$GITHUB_OUTPUT" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - commitQueue: - needs: get_mergeable_prs - if: needs.get_mergeable_prs.outputs.numbers != '' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - # A personal token is required because pushing with GITHUB_TOKEN will - # prevent commits from running CI after they land. It needs - # to be set here because `checkout` configures GitHub authentication - # for push as well. - token: ${{ secrets.GH_USER_TOKEN }} - - # Install dependencies - - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Install @node-core/utils - run: npm install -g @node-core/utils - - - name: Set variables - run: | - echo "REPOSITORY=$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" >> "$GITHUB_ENV" - - - name: Configure @node-core/utils - run: | - ncu-config set branch "${GITHUB_REF_NAME}" - ncu-config set upstream origin - ncu-config set username "$USERNAME" - ncu-config set token "$GITHUB_TOKEN" - ncu-config set jenkins_token "$JENKINS_TOKEN" - ncu-config set repo "${REPOSITORY}" - ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" - env: - USERNAME: ${{ secrets.JENKINS_USER }} - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - JENKINS_TOKEN: ${{ secrets.JENKINS_TOKEN }} - - - name: Start the Commit Queue - run: ./tools/actions/commit-queue.sh "${GITHUB_REPOSITORY_OWNER}" "${REPOSITORY}" ${{ needs.get_mergeable_prs.outputs.numbers }} - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml deleted file mode 100644 index 502d574d54d02d..00000000000000 --- a/.github/workflows/coverage-linux-without-intl.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Coverage Linux (without intl) - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-linux-without-intl.yml - - codecov.yml - - .nycrc - push: - branches: - - main - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-linux-without-intl.yml - - codecov.yml - - .nycrc - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - CLANG_VERSION: '19' - CC: sccache clang-19 - CXX: sccache clang++-19 - SCCACHE_GHA_ENABLED: 'true' - -permissions: - contents: read - -jobs: - coverage-linux-without-intl: - if: github.event.pull_request.draft == false - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Install Clang ${{ env.CLANG_VERSION }} - uses: ./.github/actions/install-clang - with: - clang-version: ${{ env.CLANG_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - - name: Install gcovr - run: pip install gcovr==7.2 - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --coverage --without-intl" - # TODO(bcoe): fix the couple tests that fail with the inspector enabled. - # The cause is most likely coverage's use of the inspector. - - name: Test - run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" || exit 0 - - name: Report JS - run: npx c8 report --check-coverage - env: - NODE_OPTIONS: --max-old-space-size=8192 - - name: Report C++ - run: gcovr --object-directory=out -v --filter src --xml -o ./coverage/coverage-cxx.xml --root=./ --gcov-executable="llvm-cov-18 gcov" - # Clean temporary output from gcov and c8, so that it's not uploaded: - - name: Clean tmp - run: rm -rf coverage/tmp && rm -rf out - - name: Upload - uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 - with: - directory: ./coverage diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml deleted file mode 100644 index 9160412adde151..00000000000000 --- a/.github/workflows/coverage-linux.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: Coverage Linux - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-linux.yml - - codecov.yml - - .nycrc - push: - branches: - - main - paths: - - lib/**/*.js - - Makefile - - src/**/*.cc - - src/**/*.h - - test/** - - tools/gyp/** - - tools/test.py - - .github/workflows/coverage-linux.yml - - codecov.yml - - .nycrc - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - CLANG_VERSION: '19' - CC: sccache clang-19 - CXX: sccache clang++-19 - SCCACHE_GHA_ENABLED: 'true' - -permissions: - contents: read - -jobs: - coverage-linux: - if: github.event.pull_request.draft == false - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Install Clang ${{ env.CLANG_VERSION }} - uses: ./.github/actions/install-clang - with: - clang-version: ${{ env.CLANG_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - - name: Install gcovr - run: pip install gcovr==7.2 - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn --coverage" - # TODO(bcoe): fix the couple tests that fail with the inspector enabled. - # The cause is most likely coverage's use of the inspector. - - name: Test - run: NODE_V8_COVERAGE=coverage/tmp make test-cov -j4 V=1 TEST_CI_ARGS="-p dots --measure-flakiness 9" || exit 0 - - name: Report JS - run: npx c8 report --check-coverage - env: - NODE_OPTIONS: --max-old-space-size=8192 - - name: Report C++ - run: gcovr --object-directory=out -v --filter src --xml -o ./coverage/coverage-cxx.xml --root=./ --gcov-executable="llvm-cov-18 gcov" - # Clean temporary output from gcov and c8, so that it's not uploaded: - - name: Clean tmp - run: rm -rf coverage/tmp && rm -rf out - - name: Upload - uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 - with: - directory: ./coverage diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml deleted file mode 100644 index f34af4a1494ad0..00000000000000 --- a/.github/workflows/coverage-windows.yml +++ /dev/null @@ -1,77 +0,0 @@ -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 - 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 - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - -permissions: - contents: read - -jobs: - coverage-windows: - if: github.event.pull_request.draft == false - runs-on: windows-2025 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Install deps - run: choco install nasm - - name: Environment Information - run: npx envinfo - - name: Build - run: ./vcbuild.bat clang-cl - # TODO(bcoe): investigate tests that fail with coverage enabled - # on Windows. - - name: Test - run: ./vcbuild.bat noprojgen nobuild test-ci-js; node -e 'process.exit(0)' - env: - NODE_V8_COVERAGE: ./coverage/tmp - - name: Report - run: npx c8 report - env: - NODE_OPTIONS: --max-old-space-size=8192 - - name: Clean tmp - run: npx rimraf ./coverage/tmp - - name: Upload - uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 - with: - directory: ./coverage diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml index 8a73f544de0564..43599a1ab682cb 100644 --- a/.github/workflows/create-release-proposal.yml +++ b/.github/workflows/create-release-proposal.yml @@ -40,7 +40,7 @@ jobs: # Install dependencies - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.github/workflows/daily-wpt-fyi.yml b/.github/workflows/daily-wpt-fyi.yml deleted file mode 100644 index 41645a6a1a4df3..00000000000000 --- a/.github/workflows/daily-wpt-fyi.yml +++ /dev/null @@ -1,163 +0,0 @@ -# This workflow runs every night and tests various releases of Node.js -# (latest nightly, current, and two latest LTS release lines) against the -# `epochs/daily` branch of WPT. - -name: Daily WPT report - -on: - workflow_dispatch: - schedule: - # This is 20 minutes after `epochs/daily` branch is triggered to be created - # in WPT repo. - # https://github.com/web-platform-tests/wpt/blob/master/.github/workflows/epochs.yml - - cron: 30 0 * * * - -env: - PYTHON_VERSION: '3.14' - -permissions: - contents: read - -jobs: - collect-versions: - if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.query.outputs.matrix }} - steps: - - id: query - run: | - matrix=$(curl -s https://raw.githubusercontent.com/nodejs/Release/refs/heads/main/schedule.json | jq -c --arg now "$(date +%Y-%m-%d)" '[with_entries(select(.value.end > $now and .value.start < $now)) | keys[] | ltrimstr("v") | tonumber] + ["latest-nightly"]') - echo "matrix=$matrix" >> "$GITHUB_OUTPUT" - report: - needs: - - collect-versions - strategy: - matrix: - node-version: ${{ fromJSON(needs.collect-versions.outputs.matrix) }} - fail-fast: false - runs-on: ubuntu-latest - steps: - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - # 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 - - name: Install Node.js - id: setup-node - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NIGHTLY || matrix.node-version }} - check-latest: true - - name: Get nightly ref - if: contains(matrix.node-version, 'nightly') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - SHORT_SHA=$(node -p 'process.version.split(/-nightly\d{8}/)[1]') - echo "NIGHTLY_REF=$(gh api /repos/nodejs/node/commits/$SHORT_SHA --jq '.sha')" >> $GITHUB_ENV - - name: Checkout ${{ steps.setup-node.outputs.node-version }} - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - ref: ${{ env.NIGHTLY_REF || steps.setup-node.outputs.node-version }} - - name: Set env.NODE - run: echo "NODE=$(which node)" >> $GITHUB_ENV - - name: Set env.WPT_REVISION - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: echo "WPT_REVISION=$(gh api /repos/web-platform-tests/wpt/branches/epochs/daily --jq '.commit.sha')" >> $GITHUB_ENV - - # replace checked out WPT with the synchronized branch - - name: Remove stale WPT - run: rm -rf wpt - working-directory: test/fixtures - - name: Checkout epochs/daily WPT - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - repository: web-platform-tests/wpt - persist-credentials: false - path: test/fixtures/wpt - clean: false - ref: ${{ env.WPT_REVISION }} - - # Node.js WPT Runner - - name: Run WPT and generate report - run: | - make test-wpt-report || true - if [ -e out/wpt/wptreport.json ]; then - echo "WPT_REPORT=$(pwd)/out/wpt/wptreport.json" >> $GITHUB_ENV - fi - - # undici WPT Runner - - name: Set env.UNDICI_VERSION - if: ${{ env.WPT_REPORT != '' }} - run: echo "UNDICI_VERSION=v$(jq -r '.version' < deps/undici/src/package.json)" >> $GITHUB_ENV - - name: Remove deps/undici - if: ${{ env.WPT_REPORT != '' }} - run: rm -rf deps/undici - - name: Checkout undici - if: ${{ env.WPT_REPORT != '' }} - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - repository: nodejs/undici - persist-credentials: false - path: deps/undici - clean: false - ref: ${{ env.UNDICI_VERSION }} - - name: Add undici WPTs to the report - if: ${{ env.WPT_REPORT != '' }} - run: | - rm -rf test/wpt/tests - mv ../../test/fixtures/wpt/ test/wpt/tests/ - npm install - npm run test:wpt || true - working-directory: deps/undici - - # Upload artifacts - - name: Clone report for upload - if: ${{ env.WPT_REPORT != '' }} - working-directory: out/wpt - 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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - path: out/wpt/wptreport-*.json - name: WPT Report for ${{ steps.setup-node.outputs.node-version }} - if-no-files-found: error - - name: Upload WPT Report to wpt.fyi API - if: ${{ env.WPT_REPORT != '' }} - env: - WPT_FYI_USERNAME: ${{ vars.WPT_FYI_USERNAME }} - WPT_FYI_PASSWORD: ${{ secrets.WPT_FYI_PASSWORD }} - working-directory: out/wpt - run: | - gzip wptreport.json - echo "## Node.js ${{ steps.setup-node.outputs.node-version }}" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "WPT Revision: [\`${WPT_REVISION:0:7}\`](https://github.com/web-platform-tests/wpt/commits/$WPT_REVISION)" >> $GITHUB_STEP_SUMMARY - for WPT_FYI_ENDPOINT in "https://wpt.fyi/api/results/upload" "https://staging.wpt.fyi/api/results/upload" - do - response=$(curl -sS \ - -u "$WPT_FYI_USERNAME:$WPT_FYI_PASSWORD" \ - -F "result_file=@wptreport.json.gz" \ - -F "labels=master" \ - $WPT_FYI_ENDPOINT) - - if [[ $response =~ Task\ ([0-9]+)\ added\ to\ queue ]]; then - run_id=${BASH_REMATCH[1]} - origin=${WPT_FYI_ENDPOINT%/api/results/upload} - - echo "" >> $GITHUB_STEP_SUMMARY - echo "Run ID [\`$run_id\`]($origin/api/runs/$run_id) added to the processor queue at ${origin:8}" >> $GITHUB_STEP_SUMMARY - echo "- [View on the ${origin:8} dashboard]($origin/results?run_id=$run_id)" >> $GITHUB_STEP_SUMMARY - fi - done diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml deleted file mode 100644 index d2ee0972df1472..00000000000000 --- a/.github/workflows/daily.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Node.js daily job - -on: - workflow_dispatch: - schedule: - - cron: 0 0 * * * - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - build-lto: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Build lto - run: | - sudo apt-get update && sudo apt-get install ninja-build -y - ./configure --enable-lto --ninja - ninja -C out/Release diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml deleted file mode 100644 index 5c698343cd5cc0..00000000000000 --- a/.github/workflows/doc.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Test and upload documentation to artifacts - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - push: - branches: - - main - - v[0-9]+.x-staging - - v[0-9]+.x - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - build-docs: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Build - run: NODE=$(command -v node) make doc-only - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: docs - path: out/doc - - name: Test - run: NODE=$(command -v node) make test-doc-ci TEST_CI_ARGS="-p actions --measure-flakiness 9" diff --git a/.github/workflows/find-inactive-collaborators.yml b/.github/workflows/find-inactive-collaborators.yml deleted file mode 100644 index 6e6662d5097eca..00000000000000 --- a/.github/workflows/find-inactive-collaborators.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Find inactive collaborators - -on: - schedule: - # Run every Monday at 4:05 AM UTC. - - cron: 5 4 * * 1 - - workflow_dispatch: - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - find: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Find inactive collaborators - run: tools/find-inactive-collaborators.mjs - - - name: Open pull request - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 - # Creates a PR or update the Action's existing PR, or - # no-op if the base branch is already up-to-date. - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - with: - author: Node.js GitHub Bot - branch: actions/inactive-collaborators - body: | - This PR was generated by the [`find-inactive-collaborators.yml` workflow](https://github.com/nodejs/node/blob/main/.github/workflows/find-inactive-collaborators.yml). - - @nodejs/tsc Please follow up with the [offboarding tasks](https://github.com/nodejs/node/blob/main/doc/contributing/offboarding.md). - commit-message: 'meta: move one or more collaborators to emeritus' - labels: meta - title: 'meta: move one or more collaborators to emeritus' diff --git a/.github/workflows/find-inactive-tsc.yml b/.github/workflows/find-inactive-tsc.yml deleted file mode 100644 index 9fee15697f4667..00000000000000 --- a/.github/workflows/find-inactive-tsc.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Find inactive TSC voting members - -on: - schedule: - # Run every Tuesday 12:05 AM UTC. - - cron: 5 0 * * 2 - - workflow_dispatch: - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - find: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - - steps: - - name: Checkout the repo - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Clone nodejs/TSC repository - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: 0 - path: .tmp - persist-credentials: false - repository: nodejs/TSC - - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Find inactive TSC voting members - run: tools/find-inactive-tsc.mjs >> $GITHUB_ENV - - - name: Open pull request - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 - # Creates a PR or update the Action's existing PR, or - # no-op if the base branch is already up-to-date. - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - with: - author: Node.js GitHub Bot - branch: actions/inactive-tsc - body: | - This PR was generated by tools/find-inactive-tsc.yml. - - @nodejs/tsc ${{ env.INACTIVE_TSC_HANDLES }} - - ${{ env.DETAILS_FOR_COMMIT_BODY }} - commit-message: 'meta: move TSC voting member(s) to regular member(s)' - labels: meta - title: 'meta: move TSC voting member(s) to regular member(s)' - update-pull-request-title-and-body: true diff --git a/.github/workflows/label-flaky-test-issue.yml b/.github/workflows/label-flaky-test-issue.yml deleted file mode 100644 index f56c4f0673e9dd..00000000000000 --- a/.github/workflows/label-flaky-test-issue.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Label Flaky Test Issues - -on: - issues: - types: [labeled] - -permissions: - contents: read - -jobs: - label: - if: github.event.label.name == 'flaky-test' - runs-on: ubuntu-latest - permissions: - issues: write - steps: - - name: Extract labels - id: extract-labels - env: - BODY: ${{ github.event.issue.body }} - run: | - BODY="${BODY//$'\n'/'\n'}" - - declare -A platform2label - - platform2label["AIX"]="aix"; - platform2label["FreeBSD"]="freebsd"; - platform2label["Linux ARM64"]="linux"; - platform2label["Linux PPC64LE"]="ppc"; - platform2label["Linux s390x"]="s390"; - platform2label["Linux x64"]="linux"; - platform2label["macOS ARM64"]="macos"; - platform2label["macOS x64"]="macos"; - platform2label["SmartOS"]="smartos"; - platform2label["Windows"]="windows"; - - # sed is cleaning up the edges - PLATFORMS=$(echo $BODY | sed 's/^.*Platform\\n\\n//' | sed 's/\(, Other\)\?\\n\\n.*$//') 2> /dev/null - readarray -d , -t list <<< "$PLATFORMS" - labels= - for row in "${list[@]}"; do \ - platform=$(echo $row | xargs); \ - labels="${labels}${platform2label[$platform]},"; \ - done; - - echo "LABELS=${labels::-1}" >> $GITHUB_OUTPUT - - - name: Add labels - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NUMBER: ${{ github.event.issue.number }} - run: gh issue edit "$NUMBER" --repo ${{ github.repository }} --add-label "${{ steps.extract-labels.outputs.LABELS }}" diff --git a/.github/workflows/label-pr.yml b/.github/workflows/label-pr.yml deleted file mode 100644 index 95fdd42a4c700a..00000000000000 --- a/.github/workflows/label-pr.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Label PRs - -on: - pull_request_target: - types: [opened] - -permissions: - contents: read - -jobs: - label: - runs-on: ubuntu-latest - - steps: - - uses: nodejs/node-pr-labeler@d4cf1b8b9f23189c37917000e5e17e796c770a6b # v1 - with: - repo-token: ${{ secrets.GH_USER_TOKEN }} - configuration-path: .github/label-pr-config.yml diff --git a/.github/workflows/license-builder.yml b/.github/workflows/license-builder.yml deleted file mode 100644 index 6c7dc8721d382b..00000000000000 --- a/.github/workflows/license-builder.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: License update -on: - schedule: - # 00:00:00 every Monday - # https://crontab.guru/#0_0_*_*_1 - - cron: 0 0 * * 1 - workflow_dispatch: - -permissions: - contents: read - -jobs: - update_license: - permissions: - contents: write # for gr2m/create-or-update-pull-request-action to push local changes - pull-requests: write # for gr2m/create-or-update-pull-request-action to create a PR - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - run: ./tools/license-builder.sh # Run the license builder tool - - uses: gr2m/create-or-update-pull-request-action@86ec1766034c8173518f61d2075cc2a173fb8c97 # v1.9.4 - # Creates a PR or update the Action's existing PR, or - # no-op if the base branch is already up-to-date. - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - author: Node.js GitHub Bot - branch: actions/license-builder - title: 'doc: run license-builder' - body: > - License is likely out of date. This is an automatically generated PR by - the `license-builder.yml` GitHub Action, which runs `license-builder.sh` - and submits a new PR or updates an existing PR. - commit-message: 'doc: run license-builder' - labels: meta diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml deleted file mode 100644 index 4f987182cd8dcf..00000000000000 --- a/.github/workflows/linters.yml +++ /dev/null @@ -1,234 +0,0 @@ -name: Linters - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - push: - branches: - - main - - v[0-9]+.x-staging - - v[0-9]+.x - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - lint-addon-docs: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Lint addon docs - run: NODE=$(command -v node) make lint-addon-docs - lint-cpp: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - name: Lint C/C++ files - run: make lint-cpp - format-cpp: - if: ${{ github.event.pull_request && github.event.pull_request.draft == false && github.base_ref == github.event.repository.default_branch }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: 0 - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - name: Format C/C++ files - run: | - make format-cpp-build - # The `make format-cpp` error code is intentionally ignored here - # because it is irrelevant. We already check if the formatter produced - # a diff in the next line. - # Refs: https://github.com/nodejs/node/pull/42764 - CLANG_FORMAT_START="$(git merge-base HEAD refs/remotes/origin/$GITHUB_BASE_REF)" \ - make format-cpp || true - git --no-pager diff --exit-code && EXIT_CODE="$?" || EXIT_CODE="$?" - if [ "$EXIT_CODE" != "0" ] - then - echo - echo 'ERROR: Please run:' - echo - echo " CLANG_FORMAT_START="$\(git merge-base HEAD ${GITHUB_BASE_REF}\)" make format-cpp" - echo - echo 'to format the commits in your branch.' - exit "$EXIT_CODE" - fi - lint-js-and-md: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Use Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Environment Information - run: npx envinfo - - name: Lint JavaScript files - run: | - set +e - NODE=$(command -v node) make lint-js - EXIT_CODE="$?" - if [ "$EXIT_CODE" != "0" ]; then - echo - echo 'ERROR: The JavaScript lint validation failed (the errors are logged above).' - echo ' Please fix the lint errors.' - if NODE=$(command -v node) make lint-js-fix > /dev/null 2>&1; then - echo ' Run:' - echo ' make lint-js-fix' - echo ' to fix the lint issues.' - git --no-pager diff - elif git diff --quiet --exit-code; then - echo ' None of the issue is auto-fixable, so manual fixes for' - echo ' all of the issues are required.' - else - echo ' Run:' - echo ' make lint-js-fix' - echo ' to fix the auto-fixable lint issues.' - echo ' Note that some manual fixes are also required.' - fi - echo - exit "$EXIT_CODE" - fi - - name: Get release version numbers - if: ${{ github.event.pull_request && github.event.pull_request.base.ref == github.event.pull_request.base.repo.default_branch }} - id: get-released-versions - run: ./tools/lint-md/list-released-versions-from-changelogs.mjs >> $GITHUB_OUTPUT - - name: Lint markdown files - run: | - echo "::add-matcher::.github/workflows/remark-lint-problem-matcher.json" - NODE=$(command -v node) make lint-md - env: - NODE_RELEASED_VERSIONS: ${{ steps.get-released-versions.outputs.NODE_RELEASED_VERSIONS }} - lint-py: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - name: Lint Python - run: | - make lint-py-build - make lint-py - lint-yaml: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Use Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Environment Information - run: npx envinfo - - name: Lint YAML - run: | - make lint-yaml-build || true - make lint-yaml - - lint-sh: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - run: shellcheck -V - - name: Lint Shell scripts - run: tools/lint-sh.mjs . - lint-codeowners: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - uses: mszostok/codeowners-validator@7f3f5e28c6d7b8dfae5731e54ce2272ca384592f - with: - checks: files,duppatterns - lint-pr-url: - if: ${{ github.event.pull_request }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - fetch-depth: 2 - persist-credentials: false - # GH Actions squashes all PR commits, HEAD^ refers to the base branch. - - run: git diff HEAD^ HEAD -G"pr-url:" -- "*.md" | ./tools/lint-pr-url.mjs ${{ github.event.pull_request.html_url }} - lint-readme: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Get team members if possible - if: ${{ (github.event.pull_request && github.event.pull_request.base.ref == github.event.pull_request.base.repo.default_branch) || github.event.ref == github.event.repository.default_branch }} - id: team_members - run: | - get_list_members() { - TEAM="$1" - QUOTE='"' - gh api "/orgs/nodejs/teams/$TEAM/members" -X GET -f per_page=100 --jq "map(.login) | ${QUOTE}${TEAM}=\(tojson)${QUOTE}" - } - [ -z "$GITHUB_TOKEN" ] || ( - get_list_members "collaborators" - get_list_members "issue-triage" - get_list_members "tsc" - ) >> "$GITHUB_OUTPUT" - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - - run: tools/lint-readme-lists.mjs "$TEAMS" - env: - TEAMS: ${{ tojson(steps.team_members.outputs) }} diff --git a/.github/workflows/notify-on-push.yml b/.github/workflows/notify-on-push.yml deleted file mode 100644 index d21f3e7943ccfb..00000000000000 --- a/.github/workflows/notify-on-push.yml +++ /dev/null @@ -1,71 +0,0 @@ -on: - push: - branches: - - main - -name: Notify on Push -permissions: - contents: read - -jobs: - notifyOnForcePush: - name: Notify on Force Push on `main` - if: github.repository == 'nodejs/node' && github.event.forced - runs-on: ubuntu-latest - steps: - - name: Slack Notification - uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 - env: - SLACK_COLOR: '#DE512A' - SLACK_ICON: https://github.com/nodejs.png?size=48 - SLACK_TITLE: ${{ github.actor }} force-pushed to ${{ github.ref }} - SLACK_MESSAGE: | - A commit was force-pushed to by - - Before: - After: - SLACK_USERNAME: nodejs-bot - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - - notifyOnMissingMetadata: - name: Notify on Push on `main` that lacks metadata - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Check commit message - run: npx -q core-validate-commit ${{ github.event.after }} || echo "INVALID_COMMIT_MESSAGE=1" >> $GITHUB_ENV - - name: Retrieve PR number if possible - if: env.INVALID_COMMIT_MESSAGE - run: | - COMMIT_TITLE=$(git --no-pager log --oneline -1 --no-color) node <<'EOF' >> $GITHUB_ENV || true - const invalidCommitMessageMatch = /\s\(\#(\d+)\)$/.exec(process.env.COMMIT_TITLE); - if (invalidCommitMessageMatch == null) process.exit(1) - console.log(`PR_ID=${invalidCommitMessageMatch[1]}`) - EOF - - name: Comment on the Pull Request - if: ${{ env.PR_ID }} - run: | - gh pr comment ${{ env.PR_ID }} --repo "${{ github.repository }}" \ - --body "A commit referencing this Pull Request was pushed to `${{ github.ref_name }}` by @${{ github.actor }} with an invalid commit message." - env: - GH_TOKEN: ${{ github.token }} - - name: Slack Notification - if: ${{ env.INVALID_COMMIT_MESSAGE }} - uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # 2.3.3 - env: - SLACK_COLOR: '#DE512A' - SLACK_ICON: https://github.com/nodejs.png?size=48 - SLACK_TITLE: Invalid commit was pushed to ${{ github.ref }} - SLACK_MESSAGE: | - A commit with an invalid message was pushed to by . - - Before: - After: - SLACK_USERNAME: nodejs-bot - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml new file mode 100644 index 00000000000000..0f877b3c639bed --- /dev/null +++ b/.github/workflows/post-release.yml @@ -0,0 +1,32 @@ +name: Post-Release actions + +on: + workflow_dispatch: + inputs: + version: + description: The version to generate a blog post for. + type: string + required: true + release: + types: [released] + +permissions: + contents: read + +jobs: + post-release-actions: + if: github.repository == 'nodejs/node' + runs-on: ubuntu-latest + steps: + - name: Trigger update-links workflow on nodejs/release-cloudflare-worker + run: | + gh workflow run update-links.yml --repo nodejs/release-cloudflare-worker + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + + - name: Trigger create-release-post workflow on nodejs/nodejs.org + run: | + gh workflow run create-release-post.yml --repo nodejs/nodejs.org -f version=$VERSION + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} + VERSION: ${{ inputs.version || github.event.release.tag_name }} diff --git a/.github/workflows/remark-lint-problem-matcher.json b/.github/workflows/remark-lint-problem-matcher.json deleted file mode 100644 index cfb281310a9a0f..00000000000000 --- a/.github/workflows/remark-lint-problem-matcher.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "remark-lint", - "pattern": [ - { - "regexp": "^(?:\\x1b\\[\\d+m)*(.+?)(?:\\x1b\\[\\d+m)*$", - "file": 1 - }, - { - "regexp": "^\\s+(?:\\d+:\\d+-)?(\\d+):(\\d+)\\s+\\S*(error|warning|info)\\S*\\s+(.+)\\s+(\\S+)\\s+(?:\\S+)$", - "line": 1, - "column": 2, - "severity": 3, - "message": 4, - "code": 5, - "loop": true - } - ] - } - ] -} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml deleted file mode 100644 index 468867e75ef778..00000000000000 --- a/.github/workflows/scorecard.yml +++ /dev/null @@ -1,78 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. They are provided -# by a third-party and are governed by separate terms of service, privacy -# policy, and support documentation. - -name: Scorecard supply-chain security -on: - # For Branch-Protection check. Only the default branch is supported. See - # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection - branch_protection_rule: - # To guarantee Maintained check is occasionally updated. See - # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained - schedule: - - cron: 16 21 * * 1 - push: - branches: [main] - workflow_dispatch: - -# Declare default permissions as read only. -permissions: read-all - -jobs: - analysis: - name: Scorecard analysis - runs-on: ubuntu-latest - permissions: - # Needed to upload the results to code-scanning dashboard. - security-events: write - # Needed to publish results and get a badge (see publish_results below). - id-token: write - # Uncomment the permissions below if installing in a private repository. - # contents: read - # actions: read - - steps: - - name: Harden Runner - uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 - with: - egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - - name: Checkout code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - - name: Run analysis - uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 - with: - results_file: results.sarif - results_format: sarif - # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: - # - you want to enable the Branch-Protection check on a *public* repository, or - # - you are installing Scorecard on a *private* repository - # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. - # repo_token: ${{ secrets.SCORECARD_TOKEN }} - - # Public repositories: - # - Publish results to OpenSSF REST API for easy access by consumers - # - Allows the repository to include the Scorecard badge. - # - See https://github.com/ossf/scorecard-action#publishing-results. - # For private repositories: - # - `publish_results` will always be set to `false`, regardless - # of the value entered here. - publish_results: true - - # 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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: SARIF file - path: results.sarif - retention-days: 5 - - # Upload the results to GitHub's code scanning dashboard. - - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@3599b3baa15b485a2e49ef411a7a4bb2452e7f93 # v3.30.5 - with: - sarif_file: results.sarif diff --git a/.github/workflows/test-internet.yml b/.github/workflows/test-internet.yml deleted file mode 100644 index 3af0aa16105981..00000000000000 --- a/.github/workflows/test-internet.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Test internet - -on: - workflow_dispatch: - schedule: - - cron: 5 0 * * * - - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths: - - .github/workflows/test-internet.yml - - test/internet/** - - internal/dns/** - - lib/dns.js - - lib/net.js - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths: - - .github/workflows/test-internet.yml - - test/internet/** - - internal/dns/** - - lib/dns.js - - lib/net.js - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - CLANG_VERSION: '19' - CC: sccache clang-19 - CXX: sccache clang++-19 - SCCACHE_GHA_ENABLED: 'true' - -permissions: - contents: read - -jobs: - test-internet: - if: github.event_name == 'schedule' && github.repository == 'nodejs/node' || github.event.pull_request.draft == false - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Install Clang ${{ env.CLANG_VERSION }} - uses: ./.github/actions/install-clang - with: - clang-version: ${{ env.CLANG_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - - name: Build - run: make build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - - name: Test Internet - run: make test-internet -j4 V=1; diff --git a/.github/workflows/test-linux.yml b/.github/workflows/test-linux.yml deleted file mode 100644 index cf2b0e1a0833b2..00000000000000 --- a/.github/workflows/test-linux.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Test Linux - -on: - pull_request: - paths-ignore: - - .mailmap - - README.md - - .github/** - - '!.github/workflows/test-linux.yml' - types: [opened, synchronize, reopened, ready_for_review] - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - .mailmap - - README.md - - .github/** - - '!.github/workflows/test-linux.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - FLAKY_TESTS: keep_retrying - CLANG_VERSION: '19' - CC: sccache clang-19 - CXX: sccache clang++-19 - SCCACHE_GHA_ENABLED: 'true' - -permissions: - contents: read - -jobs: - test-linux: - if: github.event.pull_request.draft == false - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-24.04, ubuntu-24.04-arm] - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - path: node - - name: Install Clang ${{ env.CLANG_VERSION }} - uses: ./node/.github/actions/install-clang - with: - clang-version: ${{ env.CLANG_VERSION }} - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - - name: Build - run: make -C node build-ci -j4 V=1 CONFIG_FLAGS="--error-on-warn" - - name: Test - run: make -C node run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" - - name: Re-run test in a folder whose name contains unusual chars - run: | - mv node "$DIR" - cd "$DIR" - ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 - env: - DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-macos.yml b/.github/workflows/test-macos.yml deleted file mode 100644 index 80f0cba37ff16d..00000000000000 --- a/.github/workflows/test-macos.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: Test macOS - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-macos.yml' - push: - branches: - - main - - canary - - v[0-9]+.x-staging - - v[0-9]+.x - paths-ignore: - - .mailmap - - '**.md' - - AUTHORS - - doc/** - - .github/** - - '!.github/workflows/test-macos.yml' - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - PYTHON_VERSION: '3.14' - XCODE_VERSION: '16.4' - FLAKY_TESTS: keep_retrying - -permissions: - contents: read - -jobs: - test-macOS: - if: github.event.pull_request.draft == false - strategy: - fail-fast: false - runs-on: macos-15 - env: - CC: sccache gcc - CXX: sccache g++ - SCCACHE_GHA_ENABLED: 'true' - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - path: node - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - name: Set up Xcode ${{ env.XCODE_VERSION }} - run: sudo xcode-select -s /Applications/Xcode_${{ env.XCODE_VERSION }}.app - - name: Set up sccache - uses: Mozilla-Actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9 - with: - version: v0.10.0 - - name: Environment Information - run: npx envinfo - # The `npm ci` for this step fails a lot as part of the Test step. Run it - # now so that we don't have to wait 2 hours for the Build step to pass - # first before that failure happens. (And if there's something about - # `make run-ci -j3` that is causing the failure and the failure doesn't - # happen anymore running this step here first, that's also useful - # information.) - - name: tools/doc/node_modules workaround - run: make -C node tools/doc/node_modules - # This is needed due to https://github.com/nodejs/build/issues/3878 - - name: Cleanup - run: | - echo "::group::Free space before cleanup" - df -h - echo "::endgroup::" - echo "::group::Cleaned Files" - - sudo rm -rf /Users/runner/Library/Android/sdk - - echo "::endgroup::" - echo "::group::Free space after cleanup" - df -h - echo "::endgroup::" - - name: Build - run: make -C node build-ci -j$(getconf _NPROCESSORS_ONLN) V=1 CONFIG_FLAGS="--error-on-warn" - - name: Free Space After Build - run: df -h - - name: Test - run: make -C node run-ci -j$(getconf _NPROCESSORS_ONLN) V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9" - - name: Re-run test in a folder whose name contains unusual chars - run: | - mv node "$DIR" - cd "$DIR" - ./tools/test.py --flaky-tests keep_retrying -p actions -j 4 - env: - DIR: dir%20with $unusual"chars?'åß∂ƒ©∆¬…` diff --git a/.github/workflows/test-shared.yml b/.github/workflows/test-shared.yml new file mode 100644 index 00000000000000..79df90ad281d00 --- /dev/null +++ b/.github/workflows/test-shared.yml @@ -0,0 +1,168 @@ +# This action uses the following secrets: +# CACHIX_AUTH_TOKEN: Write access to nodejs.cachix.org – without it, the cache is read-only. +name: Test Shared libraries + +on: + pull_request: + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - deps/ada/** + - deps/brotli/** + - deps/cares/** + - deps/corepack/** + - deps/icu-small/** + - deps/icu-tmp/** + - deps/llhttp/** + - deps/nghttp2/** + - deps/ngtcp2/** + - deps/openssl/*/** + - deps/simdjson/** + - deps/sqlite/** + - deps/uv/** + - deps/uvwasi/** + - deps/zlib/** + - deps/zstd/** + - doc/** + - test/internet/** + - .github/** + - '!.github/workflows/test-shared.yml' + types: [opened, synchronize, reopened, ready_for_review] + push: + branches: + - main + - canary + - v[0-9]+.x-staging + - v[0-9]+.x + paths-ignore: + - .mailmap + - '**.md' + - AUTHORS + - deps/ada/** + - deps/brotli/** + - deps/cares/** + - deps/corepack/** + - deps/icu-small/** + - deps/icu-tmp/** + - deps/llhttp/** + - deps/nghttp2/** + - deps/ngtcp2/** + - deps/openssl/*/** + - deps/simdjson/** + - deps/sqlite/** + - deps/uv/** + - deps/uvwasi/** + - deps/zlib/** + - deps/zstd/** + - doc/** + - test/internet/** + - .github/** + - '!.github/workflows/test-shared.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + FLAKY_TESTS: keep_retrying + +permissions: + contents: read + +jobs: + build-tarball: + if: github.event.pull_request.draft == false + name: ${{ github.event_name == 'workflow_dispatch' && 'Skipped job' || 'Build slim tarball' }} + runs-on: ubuntu-24.04-arm + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + if: ${{ github.event_name != 'workflow_dispatch' }} + with: + persist-credentials: false + + - name: Make tarball + if: ${{ github.event_name != 'workflow_dispatch' }} + run: | + export DATESTRING=$(date "+%Y-%m-%d") + export COMMIT=$(git rev-parse --short=10 "$GITHUB_SHA") + ./configure && make tar -j4 SKIP_XZ=1 SKIP_SHARED_DEPS=1 + env: + DISTTYPE: nightly + + - name: Upload tarball artifact + if: ${{ github.event_name != 'workflow_dispatch' }} + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: tarballs + path: '*.tar.gz' + compression-level: 0 + + build: + needs: build-tarball + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + system: x86_64-linux + - runner: ubuntu-24.04-arm + system: aarch64-linux + - runner: macos-13 + system: x86_64-darwin + - runner: macos-latest + system: aarch64-darwin + name: '${{ matrix.system }}: with shared libraries' + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 + if: ${{ github.event_name != 'workflow_dispatch' }} + with: + name: tarballs + path: tarballs + + - name: Extract tarball + if: ${{ github.event_name != 'workflow_dispatch' }} + run: | + tar xzf tarballs/*.tar.gz -C "$RUNNER_TEMP" + echo "TAR_DIR=$RUNNER_TEMP/$(basename tarballs/*.tar.gz .tar.gz)" >> "$GITHUB_ENV" + + - uses: cachix/install-nix-action@456688f15bc354bef6d396e4a35f4f89d40bf2b7 # v31.8.2 + with: + extra_nix_config: sandbox = true + + - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16 + with: + name: nodejs + authToken: ${{ secrets.CACHIX_AUTH_TOKEN }} + + - name: Configure sccache + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + core.exportVariable('SCCACHE_GHA_VERSION', 'on'); + core.exportVariable('ACTIONS_CACHE_SERVICE_V2', 'on'); + core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Load shell.nix + if: github.event_name != 'workflow_dispatch' + run: | + mv "$TAR_DIR"/*.nix . + mkdir tools + mv "$TAR_DIR"/tools/nix tools/. + + - name: Build Node.js and run tests + run: | + nix-shell \ + -I nixpkgs=./tools/nix/pkgs.nix \ + --pure --keep TAR_DIR --keep FLAKY_TESTS \ + --keep SCCACHE_GHA_VERSION --keep ACTIONS_CACHE_SERVICE_V2 --keep ACTIONS_RESULTS_URL --keep ACTIONS_RUNTIME_TOKEN \ + --arg loadJSBuiltinsDynamically false \ + --arg ccache '(import {}).sccache' \ + --arg devTools '[]' \ + --arg benchmarkTools '[]' \ + ${{ endsWith(matrix.system, '-darwin') && '--arg extraConfigFlags ''["--without-inspector"]'' \' || '\' }} + --run ' + make -C "$TAR_DIR" run-ci -j4 V=1 TEST_CI_ARGS="-p actions --measure-flakiness 9 --skip-tests=$CI_SKIP_TESTS" + ' diff --git a/.github/workflows/timezone-update.yml b/.github/workflows/timezone-update.yml deleted file mode 100644 index 51dd8f155b89fa..00000000000000 --- a/.github/workflows/timezone-update.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: Timezone update -on: - schedule: - # Run once a week at 00:05 AM UTC on Sunday. - - cron: 5 0 * * 0 - - workflow_dispatch: - -permissions: - contents: read - -jobs: - timezone_update: - permissions: - contents: write # to push local changes (gr2m/create-or-update-pull-request-action) - pull-requests: write # to create a PR (gr2m/create-or-update-pull-request-action) - - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - - steps: - - name: Checkout nodejs/node - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - - name: Checkout unicode-org/icu-data - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - path: icu-data - persist-credentials: false - repository: unicode-org/icu-data - - - name: Record new version - run: echo "new_version=$(ls icu-data/tzdata/icunew | tail -1)" >> $GITHUB_ENV - - - name: Record current version - run: echo "current_version=$(cat ./test/fixtures/tz-version.txt)" >> $GITHUB_ENV - - - name: Compare versions - run: | - echo "Comparing current version ${{ env.current_version }} to new version ${{ env.new_version }}" - - - run: ./tools/update-timezone.mjs - if: ${{ env.new_version != env.current_version }} - - - name: Update the expected timezone version in test - if: ${{ env.new_version != env.current_version }} - run: echo "${{ env.new_version }}" > test/fixtures/tz-version.txt - - - name: Open Pull Request - if: ${{ env.new_version != env.current_version }} - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 # Create a PR or update the Action's existing PR - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - with: - author: Node.js GitHub Bot - body: | - This PR was generated by tools/timezone-update.yml. - - 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 - - To test, build node off this branch & log the version of tz using - ```js - console.log(process.versions.tz) - ``` - branch: actions/timezone-update - commit-message: 'deps: update timezone to ${{ env.new_version }}' - labels: dependencies - title: 'deps: update timezone to ${{ env.new_version }}' - reviewers: \@nodejs/i18n-api - update-pull-request-title-and-body: true diff --git a/.github/workflows/tools.yml b/.github/workflows/tools.yml deleted file mode 100644 index c101c6432fa899..00000000000000 --- a/.github/workflows/tools.yml +++ /dev/null @@ -1,303 +0,0 @@ -name: Tools and deps update -on: - schedule: - # Run once a week at 00:05 AM UTC on Sunday. - - cron: 5 0 * * 0 - - workflow_dispatch: - inputs: - id: - description: The ID of the job to run - required: true - default: all - type: choice - options: - - all - - acorn - - acorn-walk - - ada - - amaro - - brotli - - c-ares - - cjs-module-lexer - - corepack - - googletest - - gyp-next - - histogram - - icu - - libuv - - llhttp - - minimatch - - nbytes - - nghttp2 - - nghttp3 - - ngtcp2 - - postject - - root-certificates - - simdjson - - sqlite - - undici - - uvwasi - - zlib - - zstd - -env: - PYTHON_VERSION: '3.14' - -permissions: - contents: read - -jobs: - tools-deps-update: - if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - strategy: - fail-fast: false # Prevent other jobs from aborting if one fails - matrix: - include: - - id: acorn - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-acorn.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: acorn-walk - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-acorn-walk.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: ada - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-ada.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: amaro - subsystem: deps - label: dependencies, strip-types - run: | - ./tools/dep_updaters/update-amaro.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: brotli - subsystem: deps - label: dependencies, zlib - run: | - ./tools/dep_updaters/update-brotli.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: c-ares - subsystem: deps - label: dependencies, cares - run: | - ./tools/dep_updaters/update-c-ares.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: cjs-module-lexer - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-cjs-module-lexer.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: corepack - subsystem: deps - label: dependencies - run: | - make corepack-update - echo "NEW_VERSION=$(node deps/corepack/dist/corepack.js --version)" >> $GITHUB_ENV - - id: googletest - subsystem: deps - label: dependencies, test - run: | - ./tools/dep_updaters/update-googletest.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: gyp-next - subsystem: tools - label: tools, gyp - run: | - ./tools/dep_updaters/update-gyp-next.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: histogram - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-histogram.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: icu - subsystem: deps - label: dependencies, test, icu - run: | - ./tools/dep_updaters/update-icu.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: libuv - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-libuv.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: llhttp - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-llhttp.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: minimatch - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-minimatch.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: nbytes - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-nbytes.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: nghttp2 - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-nghttp2.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: nghttp3 - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-nghttp3.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: ngtcp2 - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-ngtcp2.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: postject - subsystem: deps,test - label: test - run: | - ./tools/dep_updaters/update-postject.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: root-certificates - subsystem: crypto - label: crypto, notable-change - run: | - node ./tools/dep_updaters/update-root-certs.mjs -v -f "$GITHUB_ENV" - - id: simdjson - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-simdjson.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: sqlite - subsystem: deps - label: dependencies, sqlite - run: | - ./tools/dep_updaters/update-sqlite.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 - run: | - ./tools/dep_updaters/update-undici.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: uvwasi - subsystem: deps - label: dependencies - run: | - ./tools/dep_updaters/update-uvwasi.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: zlib - subsystem: deps - label: dependencies, zlib - run: | - ./tools/dep_updaters/update-zlib.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - id: zstd - subsystem: deps - label: dependencies, zlib - run: | - ./tools/dep_updaters/update-zstd.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - steps: - - name: Setup Git config - run: | - git config --global user.name "Node.js GitHub Bot" - git config --global user.email "github-bot@iojs.org" - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id - with: - persist-credentials: false - - name: Set up Python ${{ env.PYTHON_VERSION }} - if: matrix.id == 'icu' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - allow-prereleases: true - - run: ${{ matrix.run }} - if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - - name: Generate commit message if not set - if: env.COMMIT_MSG == '' && (github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id) - run: | - echo "COMMIT_MSG=${{ matrix.subsystem }}: update ${{ matrix.id }} to ${{ env.NEW_VERSION }}" >> "$GITHUB_ENV" - - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 - if: github.event_name == 'schedule' || inputs.id == 'all' || inputs.id == matrix.id - # Creates a PR or update the Action's existing PR, or - # no-op if the base branch is already up-to-date. - with: - token: ${{ secrets.GH_USER_TOKEN }} - branch: actions/tools-update-${{ matrix.id }} # Custom branch *just* for this Action. - delete-branch: true - commit-message: ${{ env.COMMIT_MSG }} - labels: ${{ matrix.label }} - title: '${{ matrix.subsystem }}: update ${{ matrix.id }} to ${{ env.NEW_VERSION }}' - body: This is an automated update of ${{ matrix.id }} to ${{ env.NEW_VERSION }}. diff --git a/.github/workflows/update-openssl.yml b/.github/workflows/update-openssl.yml deleted file mode 100644 index ee9a3e0fa11c03..00000000000000 --- a/.github/workflows/update-openssl.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: OpenSSL update -on: - schedule: - # Run once a week at 00:05 AM UTC on Sunday. - - cron: 5 0 * * 0 - - workflow_dispatch: - -permissions: - contents: read - -jobs: - openssl-update: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Check and download new OpenSSL version - run: | - ./tools/dep_updaters/update-openssl.sh download > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - - name: Create PR with first commit - if: env.NEW_VERSION - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 - # Creates a PR with the new OpenSSL source code committed - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - with: - author: Node.js GitHub Bot - body: This is an automated update of OpenSSL to ${{ env.NEW_VERSION }}. - branch: actions/tools-update-openssl # Custom branch *just* for this Action. - commit-message: 'deps: upgrade openssl sources to openssl-${{ env.NEW_VERSION }}' - labels: dependencies, openssl - title: 'deps: update OpenSSL to ${{ env.NEW_VERSION }}' - path: deps/openssl - update-pull-request-title-and-body: true - - name: Regenerate platform specific files - if: env.NEW_VERSION - run: | - sudo apt install -y nasm libtext-template-perl - ./tools/dep_updaters/update-openssl.sh regenerate - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - - name: Add second commit - # Adds a second commit to the PR with the generated platform-dependent files - if: env.NEW_VERSION - uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} - with: - author: Node.js GitHub Bot - branch: actions/tools-update-openssl # Custom branch *just* for this Action. - commit-message: 'deps: update archs files for openssl-${{ env.NEW_VERSION }}' - path: deps/openssl diff --git a/.github/workflows/update-release-links.yml b/.github/workflows/update-release-links.yml deleted file mode 100644 index 3eaa61260545e8..00000000000000 --- a/.github/workflows/update-release-links.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Update release links - -on: - workflow_dispatch: - release: - types: [released] - -permissions: - contents: read - -jobs: - update-release-links: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - name: Trigger update-links workflow on nodejs/release-cloudflare-worker - run: | - gh workflow run update-links.yml --repo nodejs/release-cloudflare-worker - env: - GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/update-v8.yml b/.github/workflows/update-v8.yml deleted file mode 100644 index e0b00fb50347c5..00000000000000 --- a/.github/workflows/update-v8.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: V8 patch update -on: - schedule: - # Run once a week at 00:05 AM UTC on Sunday. - - cron: 5 0 * * 0 - workflow_dispatch: - -env: - NODE_VERSION: lts/* - -permissions: - contents: read - -jobs: - v8-update: - if: github.repository == 'nodejs/node' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - persist-credentials: false - - name: Cache node modules and update-v8 - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - id: cache-v8-npm - env: - cache-name: cache-v8-npm - with: - path: | - ~/.update-v8 - ~/.npm - key: ${{ runner.os }}-build-${{ env.cache-name }} - - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Install @node-core/utils - run: npm install -g @node-core/utils - - name: Setup Git config - run: | - git config --global user.name "Node.js GitHub Bot" - git config --global user.email "github-bot@iojs.org" - - name: Check and download new V8 version - run: | - ./tools/dep_updaters/update-v8-patch.sh > temp-output - cat temp-output - tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - rm temp-output - - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 - # Creates a PR or update the Action's existing PR, or - # no-op if the base branch is already up-to-date. - with: - token: ${{ secrets.GH_USER_TOKEN }} - branch: actions/update-v8-patch # Custom branch *just* for this Action. - delete-branch: true - title: 'deps: patch V8 to ${{ env.NEW_VERSION }}' - body: This is an automated patch update of V8 to ${{ env.NEW_VERSION }}. - labels: dependencies, v8 engine diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml index b99387602b69e5..60cd0828919bd0 100644 --- a/.github/workflows/update-wpt.yml +++ b/.github/workflows/update-wpt.yml @@ -32,7 +32,7 @@ jobs: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ env.NODE_VERSION }} diff --git a/.gitignore b/.gitignore index 81659fe018a0a5..1008fc5bf58677 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ .* # Exclude specific dotfiles that we want to track. !deps/**/.* -!.devcontainer.json !test/fixtures/**/.* !.clang-format !.cpplint @@ -38,6 +37,7 @@ /*.exe /*.swp /out +/out* /*.msi /*.wixpdb /*.qlog @@ -167,3 +167,10 @@ __pycache__ # === Rules for C++ development === compile_commands.json + +# === Dev Container rules === +# Only track the shared base devcontainer.json; ignore everything else under .devcontainer +!.devcontainer/ +.devcontainer/** +!.devcontainer/base/ +!.devcontainer/base/devcontainer.json diff --git a/BUILDING.md b/BUILDING.md index 84182f8fa05793..0413efd37cc9e7 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -175,6 +175,11 @@ Binaries at are produced on: | win-arm64 | Windows Server 2022 (x64) with Visual Studio 2022 | | win-x64 | Windows Server 2022 (x64) with Visual Studio 2022 | +Starting with Node.js 25, official Linux binaries are linked with `libatomic` and these systems +must have the `libatomic` runtime installed and available at execution time to run the binaries. +The package name for the `libatomic` runtime is typically `libatomic` or `libatomic1` depending +on your Linux distibution. + [^5]: Binaries produced on these systems require libstdc++12, available @@ -239,6 +244,7 @@ Consult previous versions of this document for older versions of Node.js: Installation via Linux package manager can be achieved with: +* Nix, NixOS: `nix-shell` * Ubuntu, Debian: `sudo apt-get install python3 g++-12 gcc-12 make python3-pip` * Fedora: `sudo dnf install python3 gcc-c++ make python3-pip` * CentOS and RHEL: `sudo yum install python3 gcc-c++ make python3-pip` @@ -259,6 +265,81 @@ installed, you can find them under the menu `Xcode -> Open Developer Tool -> More Developer Tools...`. This step will install `clang`, `clang++`, and `make`. +#### Nix integration + +If you are using Nix and direnv, you can use the following to get started: + +```bash +echo 'use_nix --arg sharedLibDeps {} --argstr icu small' > .envrc +direnv allow . +make build-ci -j12 +``` + +Most dependencies will likely be available in the official nixpkgs cache, +although for some dependencies we have to deviate for the upstream repository, +in which case those will be built locally, or you can use the Cachix repository +for the project: `cachix use nodejs`. See for more +information. + +The use of `make build-ci` is to ensure you are using the `CONFIG_FLAGS` +environment variable. You can also specify it manually: + +```bash +./configure $CONFIG_FLAGS +make -j12 +``` + +Passing the `--arg sharedLibDeps {}` instructs direnv and Nix to generate an +environment that uses the vendored-in native dependencies. Using the vendored-in +dependencies result in a result closer to the official binaries, the tradeoff +being the build will take longer to complete as you'd have to build those +dependencies instead of using the cached ones from the Nix cache. You can omit +that flag to use all the shared dependencies, or specify only some dependencies: + +```bash +cat -> .envrc <<'EOF' +use nix --arg sharedLibDeps '{ + inherit (import ./tools/nix/sharedLibDeps.nix {}) + openssl + zlib + ; +}' +EOF +``` + +Passing the `--argstr icu small` instructs direnv and Nix to pass `--with-intl=small` in +the `CONFIG_FLAGS` environment variable. If you omit this, the prebuilt ICU from Nix cache +will be used, which should speed up greatly compilation time. + +The use of `direnv` is completely optional, you can also use `nix-shell` directly, +e.g. here's a command you can use to build a binary for benchmarking purposes: + +```bash +# Passing `--arg loadJSBuiltinsDynamically false` to instruct the compiler to +# embed the JS core files so it is no longer affected by local changes +# (necessary for getting useful benchmark results). +# Passing `--arg devTools '[]' --arg benchmarkTools '[]'` since we don't need +# those to build node. +nix-shell \ + --arg loadJSBuiltinsDynamically false \ + --arg devTools '[]' --arg benchmarkTools '[]' \ + --run 'make build-ci -j12' + +mv out/Release/node ./node_old + +# ... +# Make your local changes, and re-build node + +nix-shell \ + --arg loadJSBuiltinsDynamically false \ + --arg devTools '[]' --arg benchmarkTools '[]' \ + --run 'make build-ci -j12' + +nix-shell --pure --run './node benchmark/compare.js --old ./node_old --new ./node http | Rscript benchmark/compare.R' +``` + +There are additional attributes you can pass, see `shell.nix` file for more details. + #### Building Node.js If the path to your build directory contains a space, the build will likely @@ -267,7 +348,6 @@ fail. To build Node.js: ```bash -export CXX=g++-12 ./configure make -j4 ``` @@ -352,6 +432,27 @@ You can also execute the tests in a test suite directory tools/test.py test/message ``` +You can execute tests that match a specific naming pattern using the wildcard +`*`. For example, to run all tests under `test/parallel` with a name that starts +with `test-stream-`: + +```bash +tools/test.py test/parallel/test-stream-* +tools/test.py parallel/test-stream-* # The test/ prefix can be omitted +# In some shell environments, you may need to quote the pattern +tools/test.py "test/parallel/test-stream-*" +``` + +The whildcard `*` can be used in any part of the path. For example, to run all tests +with a name that starts with `test-inspector-`, regardless of the directory they are in: + +```bash +# Matches test/sequential/test-inspector-*, test/parallel/test-inspector-*, +# test/known_issues/test-inspector-*, etc. +tools/test.py "test/*/test-inspector-*" +tools/test.py "*/test-inspector-*" # The test/ prefix can be omitted +``` + If you want to check the other options, please refer to the help by using the `--help` option: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d9266d557fcb4..36aa3280779cf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Select a Node.js version below to view the changelog history: +* [Node.js 25](doc/changelogs/CHANGELOG_V25.md) **Current** * [Node.js 24](doc/changelogs/CHANGELOG_V24.md) **Current** * [Node.js 23](doc/changelogs/CHANGELOG_V23.md) End-of-Life * [Node.js 22](doc/changelogs/CHANGELOG_V22.md) **Long Term Support** @@ -33,12 +34,19 @@ release. + +
25 (Current) 24 (Current) 22 (LTS) 20 (LTS)
+25.2.1
+25.2.0
+25.1.0
+25.0.0
+
24.10.0
24.9.0
24.8.0
diff --git a/Makefile b/Makefile index 34f3ed11bfa9a9..bccbac90bca748 100644 --- a/Makefile +++ b/Makefile @@ -399,7 +399,7 @@ ADDONS_HEADERS_PREREQS := tools/install.py \ $(wildcard deps/uv/include/*/*.h) \ $(wildcard deps/v8/include/*.h) \ $(wildcard deps/v8/include/*/*.h) \ - deps/zlib/zconf.h deps/zlib/zlib.h \ + $(wildcard deps/zlib/z*.h) \ src/node.h src/node_api.h src/js_native_api.h src/js_native_api_types.h \ src/node_api_types.h src/node_buffer.h src/node_object_wrap.h \ src/node_version.h @@ -1032,6 +1032,11 @@ override DESTCPU=x86 endif TARNAME=node-$(FULLVERSION) +# Supply SKIP_SHARED_DEPS=1 to explicitly skip all dependencies that can be included as shared deps +SKIP_SHARED_DEPS ?= 0 +ifeq ($(SKIP_SHARED_DEPS), 1) +TARNAME:=$(TARNAME)-slim +endif TARBALL=$(TARNAME).tar # Custom user-specified variation, use it directly ifdef VARIATION @@ -1215,12 +1220,31 @@ $(TARBALL): release-only doc-only $(RM) -r $(TARNAME)/.mailmap $(RM) -r $(TARNAME)/deps/corepack $(RM) $(TARNAME)/test/parallel/test-corepack-version.js +ifeq ($(SKIP_SHARED_DEPS), 1) + $(RM) -r $(TARNAME)/deps/ada + $(RM) -r $(TARNAME)/deps/brotli + $(RM) -r $(TARNAME)/deps/cares + $(RM) -r $(TARNAME)/deps/icu-small + $(RM) -r $(TARNAME)/deps/icu-tmp + $(RM) -r $(TARNAME)/deps/llhttp + $(RM) -r $(TARNAME)/deps/nghttp2 + $(RM) -r $(TARNAME)/deps/ngtcp2 + find $(TARNAME)/deps/openssl -maxdepth 1 -type f ! -name 'nodejs-openssl.cnf' -exec $(RM) {} + + find $(TARNAME)/deps/openssl -mindepth 1 -maxdepth 1 -type d -exec $(RM) -r {} + + $(RM) -r $(TARNAME)/deps/simdjson + $(RM) -r $(TARNAME)/deps/sqlite + $(RM) -r $(TARNAME)/deps/uv + $(RM) -r $(TARNAME)/deps/uvwasi + $(RM) -r $(TARNAME)/deps/zlib + $(RM) -r $(TARNAME)/deps/zstd +else $(RM) -r $(TARNAME)/deps/openssl/openssl/demos $(RM) -r $(TARNAME)/deps/openssl/openssl/doc $(RM) -r $(TARNAME)/deps/openssl/openssl/test $(RM) -r $(TARNAME)/deps/uv/docs $(RM) -r $(TARNAME)/deps/uv/samples $(RM) -r $(TARNAME)/deps/uv/test +endif $(RM) -r $(TARNAME)/deps/v8/samples $(RM) -r $(TARNAME)/deps/v8/tools/profviz $(RM) -r $(TARNAME)/deps/v8/tools/run-tests.py diff --git a/README.md b/README.md index 281420dfc89c23..46df21a18457aa 100644 --- a/README.md +++ b/README.md @@ -323,8 +323,6 @@ For information about the governance of the Node.js project, see **Erick Wendel** <> (he/him) * [Ethan-Arrowood](https://github.com/Ethan-Arrowood) - **Ethan Arrowood** <> (he/him) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <> (he/him) * [fhinkel](https://github.com/fhinkel) - **Franziska Hinkelmann** <> (she/her) * [Flarna](https://github.com/Flarna) - @@ -347,6 +345,8 @@ For information about the governance of the Node.js project, see **Harshitha K P** <> (she/her) * [himself65](https://github.com/himself65) - **Zeyu "Alex" Yang** <> (he/him) +* [hybrist](https://github.com/hybrist) - + **Jan Martin** <> (he/him) * [IlyasShabi](https://github.com/IlyasShabi) - **Ilyas Shabi** <> (he/him) * [islandryu](https://github.com/islandryu) - @@ -359,8 +359,6 @@ For information about the governance of the Node.js project, see **James M Snell** <> (he/him) * [jazelly](https://github.com/jazelly) - **Jason Zhang** <> (he/him) -* [jkrems](https://github.com/jkrems) - - **Jan Martin** <> (he/him) * [JonasBa](https://github.com/JonasBa) - **Jonas Badalic** <> (he/him) * [joyeecheung](https://github.com/joyeecheung) - @@ -527,6 +525,8 @@ For information about the governance of the Node.js project, see **Eugene Ostroukhov** <> * [evanlucas](https://github.com/evanlucas) - **Evan Lucas** <> (he/him) +* [F3n67u](https://github.com/F3n67u) - + **Feng Yu** <> (he/him) * [firedfox](https://github.com/firedfox) - **Daniel Wang** <> * [Fishrock123](https://github.com/Fishrock123) - @@ -751,12 +751,12 @@ maintaining the Node.js project. **Oliver Medhurst** <> (they/them) * [daeyeon](https://github.com/daeyeon) - **Daeyeon Jeong** <> (he/him) -* [F3n67u](https://github.com/F3n67u) - - **Feng Yu** <> (he/him) * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** <> (he/him) * [gurgunday](https://github.com/gurgunday) - **Gürgün Dayıoğlu** <> +* [haramj](https://github.com/haramj) - + **Haram Jeong** <> * [HBSPS](https://github.com/HBSPS) - **Wiyeong Seo** <> * [iam-frankqiu](https://github.com/iam-frankqiu) - diff --git a/android_configure.py b/android_configure.py index 5cea0393f48a76..1c4177976e18d7 100644 --- a/android_configure.py +++ b/android_configure.py @@ -66,6 +66,14 @@ def patch_android(): os.environ['CC'] = toolchain_path + "/bin/" + TOOLCHAIN_PREFIX + android_sdk_version + "-" + "clang" os.environ['CXX'] = toolchain_path + "/bin/" + TOOLCHAIN_PREFIX + android_sdk_version + "-" + "clang++" +# As part of its own build process, Node.js makes some binaries that need to be executed along the way. +# Consequently, if you build those tools with a cross compiler for ARM and try to run them on the Intel machine they’re sitting on, the build fails at that point because of the architecture mismatch. +# These env vars allow you to specify different compilers for the target and host architectures, in turn allowing the system to make the local executables runnable on the host machine. +# See https://chrislea.com/2018/08/20/cross-compiling-node-js-for-arm-on-ubuntu/ +os.environ['CC_host'] = "gcc" +os.environ['CXX_host'] = "g++" +os.environ['GYP_CROSSCOMPILE'] = "1" + GYP_DEFINES = "target_arch=" + arch GYP_DEFINES += " v8_target_arch=" + arch GYP_DEFINES += " android_target_arch=" + arch @@ -74,4 +82,4 @@ def patch_android(): os.environ['GYP_DEFINES'] = GYP_DEFINES if os.path.exists("./configure"): - os.system("./configure --dest-cpu=" + DEST_CPU + " --dest-os=android --openssl-no-asm --cross-compiling") + os.system("./configure --dest-cpu=" + DEST_CPU + " --dest-os=android --openssl-no-asm --cross-compiling --shared") diff --git a/benchmark/common.js b/benchmark/common.js index 0bb3fa3dfae32f..bc8695df09d765 100644 --- a/benchmark/common.js +++ b/benchmark/common.js @@ -28,6 +28,7 @@ class Benchmark { const argv = process.argv.slice(2); const parsed_args = this._parseArgs(argv, configs, options); + this.originalOptions = options; this.options = parsed_args.cli; this.extra_options = parsed_args.extra; this.combinationFilter = typeof options.combinationFilter === 'function' ? options.combinationFilter : allow; @@ -207,6 +208,12 @@ class Benchmark { }); } + if (this.originalOptions.setup) { + // Only do this from the root process. _run() is only ever called from the root, + // in child processes main is run directly. + this.originalOptions.setup(this.queue); + } + const recursive = (queueIndex) => { const config = this.queue[queueIndex]; diff --git a/benchmark/console/log.js b/benchmark/console/log.js new file mode 100644 index 00000000000000..37fb2e466bc576 --- /dev/null +++ b/benchmark/console/log.js @@ -0,0 +1,78 @@ +'use strict'; + +// A console throughput benchmark. +// Uses a custom Console with null Writable streams to avoid I/O latency. + +const common = require('../common.js'); +const { Writable } = require('stream'); +const { Console } = require('console'); + +const bench = common.createBenchmark(main, { + n: [2e6], + variant: ['plain', 'format', 'object', 'group', 'info', 'warn', 'error'], +}); + +class Null extends Writable { + _write(chunk, enc, cb) { cb(); } +} + +function makeConsole() { + const dn = new Null(); + return new Console({ stdout: dn, stderr: dn, ignoreErrors: true, colorMode: false }); +} + +function main({ n, variant }) { + const c = makeConsole(); + + switch (variant) { + case 'plain': { + bench.start(); + for (let i = 0; i < n; i++) c.log('hello world'); + bench.end(n); + break; + } + case 'format': { + bench.start(); + for (let i = 0; i < n; i++) c.log('%s %d %j', 'a', 42, { x: 1 }); + bench.end(n); + break; + } + case 'object': { + const obj = { a: 1, b: 2, c: 3 }; + bench.start(); + for (let i = 0; i < n; i++) c.log(obj); + bench.end(n); + break; + } + case 'group': { + bench.start(); + for (let i = 0; i < n; i++) { + c.group('g'); + c.log('x'); + c.groupEnd(); + } + bench.end(n); + break; + } + case 'info': { + bench.start(); + for (let i = 0; i < n; i++) c.info('hello world'); + bench.end(n); + break; + } + case 'warn': { + bench.start(); + for (let i = 0; i < n; i++) c.warn('hello world'); + bench.end(n); + break; + } + case 'error': { + bench.start(); + for (let i = 0; i < n; i++) c.error('hello world'); + bench.end(n); + break; + } + default: + throw new Error('unknown variant'); + } +} diff --git a/benchmark/cpu.sh b/benchmark/cpu.sh index 9c9dd7fa4ddc58..7e35c0ef0de8c8 100755 --- a/benchmark/cpu.sh +++ b/benchmark/cpu.sh @@ -4,21 +4,73 @@ CPUPATH=/sys/devices/system/cpu MAXID=$(cat $CPUPATH/present | awk -F- '{print $NF}') +[ "$(uname -s || true)" = "Linux" ] || \ + echo "Warning: This script supports Linux only." >&2 + +[ "$(id -u || true)" = "0" ] || \ + echo "Warning: This script typically needs root access to modify CPU governor. Consider running it with sudo." >&2 + +get_default_governor() { + case "$(cat "$CPUPATH/cpu0/cpufreq/scaling_available_governors")" in + *"schedutil"*) echo "schedutil" ;; + *"ondemand"*) echo "ondemand" ;; + *"conservative"*) echo "conservative";; + *) echo "powersave" ;; + esac + +} + set_governor() { - echo "Setting CPU frequency governor to \"$1\"" + governor_name="$1" + + echo "Setting governor for all CPU cores to \"$governor_name\"..." + i=0 while [ "$i" -le "$MAXID" ]; do echo "$1" > "$CPUPATH/cpu$i/cpufreq/scaling_governor" i=$((i + 1)) done + + echo "Done." +} + +usage() { + default_gov=$(get_default_governor) + echo "CPU Governor Management Script" + echo "----------------------------------------------------------------------------" + echo "Usage: $0 [command]" + echo + echo "Commands:" + echo " fast Sets the governor to 'performance' for maximum speed." + echo " (Warning: Increases heat/power use. Use for short-term tasks.)" + echo + echo " reset Resets the governor to the system's recommended default ('$default_gov')." + echo + echo " get Shows the current CPU governor for ALL cores." + echo "----------------------------------------------------------------------------" } case "$1" in fast | performance) + echo "Warning: The 'performance' mode locks the CPU at its highest speed." + echo "It is highly recommended to 'reset' after your task is complete." set_governor "performance" ;; + + reset | default) + default_governor=$(get_default_governor) + set_governor "$default_governor" + ;; + + get | status) + echo "Current governor status for all cores:" + grep . "$CPUPATH"/cpu*/cpufreq/scaling_governor + ;; + *) - echo "Usage: $0 fast" + usage exit 1 ;; esac + +exit 0 diff --git a/benchmark/esm/import-esm-reload.js b/benchmark/esm/import-esm-reload.js new file mode 100644 index 00000000000000..40143930b04ed8 --- /dev/null +++ b/benchmark/esm/import-esm-reload.js @@ -0,0 +1,37 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const tmpdir = require('../../test/common/tmpdir'); +const assert = require('assert'); +const { pathToFileURL } = require('url'); +const bench = common.createBenchmark(main, { + count: [1, 100], + n: [1000], +}); + +function prepare(count) { + tmpdir.refresh(); + const dir = tmpdir.resolve('modules'); + fs.mkdirSync(dir, { recursive: true }); + let modSource = ''; + for (let i = 0; i < count; ++i) { + modSource += `export const value${i} = 1;\n`; + } + const script = tmpdir.resolve('mod.js'); + fs.writeFileSync(script, modSource, 'utf8'); + return script; +} + +async function main({ n, count }) { + const script = prepare(count); + const url = pathToFileURL(script).href; + let result = 0; + bench.start(); + for (let i = 0; i < n; i++) { + const mod = await import(`${url}?t=${i}`); + result += mod[`value${count - 1}`]; + } + bench.end(n); + assert.strictEqual(result, n); +} diff --git a/benchmark/esm/import-meta.js b/benchmark/esm/import-meta.js index 0e56d8a34a353d..1f405a59a0a757 100644 --- a/benchmark/esm/import-meta.js +++ b/benchmark/esm/import-meta.js @@ -10,28 +10,44 @@ const bench = common.createBenchmark(main, { 'dirname-and-filename', 'dirname', 'filename', + 'url', ], }); -const fixtureDir = path.resolve(__filename, '../../fixtures'); -const fixtureDirURL = pathToFileURL(fixtureDir); -async function load(array, n, valuesToRead) { +async function load(n, fixtureFileURL) { + const array = []; for (let i = 0; i < n; i++) { - array[i] = await import(`${fixtureDirURL}/import-meta-${valuesToRead}.mjs?i=${i}`); + array[i] = await import(`${fixtureFileURL}?i=${i}`); } return array; } function main({ n, valuesToRead }) { - const array = []; - for (let i = 0; i < n; ++i) { - array.push({ dirname: '', filename: '', i: 0 }); - } + const fixtureDir = path.resolve(__filename, '../../fixtures'); + const fixtureFile = path.join(fixtureDir, `import-meta-${valuesToRead}.mjs`); + const fixtureFileURL = pathToFileURL(fixtureFile); - bench.start(); - load(array, n, valuesToRead).then((arr) => { + load(n, fixtureFileURL).then((array) => { + const results = new Array(n); + bench.start(); + for (let i = 0; i < n; i++) { + results[i] = array[i].default(); + } bench.end(n); - if (valuesToRead.includes('dirname')) assert.strictEqual(arr[n - 1].dirname, fixtureDir); - if (valuesToRead.includes('filename')) assert.strictEqual(arr[n - 1].filename, path.join(fixtureDir, `import-meta-${valuesToRead}.mjs`)); + + switch (valuesToRead) { + case 'dirname-and-filename': + assert.deepStrictEqual(results[n - 1], [fixtureDir, fixtureFile]); + break; + case 'dirname': + assert.strictEqual(results[n - 1], fixtureDir); + break; + case 'filename': + assert.strictEqual(results[n - 1], fixtureFile); + break; + case 'url': + assert.strictEqual(results[n - 1], `${fixtureFileURL}?i=${n - 1}`); + break; + } }); } diff --git a/benchmark/fixtures/import-meta-dirname-and-filename.mjs b/benchmark/fixtures/import-meta-dirname-and-filename.mjs index a1028d57afd56b..1f92bc85f52692 100644 --- a/benchmark/fixtures/import-meta-dirname-and-filename.mjs +++ b/benchmark/fixtures/import-meta-dirname-and-filename.mjs @@ -1,2 +1 @@ -export const dirname = import.meta.dirname; -export const filename = import.meta.filename; +export default () => [ import.meta.dirname, import.meta.filename ]; diff --git a/benchmark/fixtures/import-meta-dirname.mjs b/benchmark/fixtures/import-meta-dirname.mjs index 8429b1f3cf84ae..f8ee699d31416e 100644 --- a/benchmark/fixtures/import-meta-dirname.mjs +++ b/benchmark/fixtures/import-meta-dirname.mjs @@ -1 +1 @@ -export const dirname = import.meta.dirname; +export default () => import.meta.dirname; diff --git a/benchmark/fixtures/import-meta-filename.mjs b/benchmark/fixtures/import-meta-filename.mjs index 73e495e19b76ab..ecec26d09c74c7 100644 --- a/benchmark/fixtures/import-meta-filename.mjs +++ b/benchmark/fixtures/import-meta-filename.mjs @@ -1 +1 @@ -export const filename = import.meta.filename; +export default () => import.meta.filename; diff --git a/benchmark/fixtures/import-meta-url.mjs b/benchmark/fixtures/import-meta-url.mjs new file mode 100644 index 00000000000000..a924853bcc7113 --- /dev/null +++ b/benchmark/fixtures/import-meta-url.mjs @@ -0,0 +1 @@ +export default () => import.meta.url; diff --git a/benchmark/module/module-require.js b/benchmark/module/module-require.js index 5346366dc8e8b7..472f943746b785 100644 --- a/benchmark/module/module-require.js +++ b/benchmark/module/module-require.js @@ -8,12 +8,15 @@ const benchmarkDirectory = tmpdir.resolve('nodejs-benchmark-module'); const bench = common.createBenchmark(main, { type: ['.js', '.json', 'dir'], n: [1e4], +}, { + setup(configs) { + tmpdir.refresh(); + const maxN = configs.reduce((max, c) => Math.max(max, c.n), 0); + createEntryPoint(maxN); + }, }); function main({ type, n }) { - tmpdir.refresh(); - createEntryPoint(n); - switch (type) { case '.js': measureJSFile(n); @@ -24,8 +27,6 @@ function main({ type, n }) { case 'dir': measureDir(n); } - - tmpdir.refresh(); } function measureJSFile(n) { diff --git a/benchmark/napi/create_object_with_properties/.gitignore b/benchmark/napi/create_object_with_properties/.gitignore new file mode 100644 index 00000000000000..567609b1234a9b --- /dev/null +++ b/benchmark/napi/create_object_with_properties/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/benchmark/napi/create_object_with_properties/binding.cc b/benchmark/napi/create_object_with_properties/binding.cc new file mode 100644 index 00000000000000..d7fae01d1659f9 --- /dev/null +++ b/benchmark/napi/create_object_with_properties/binding.cc @@ -0,0 +1,116 @@ +#include +#include +#include + +struct BenchmarkParams { + napi_value count_val; + napi_value bench_obj; + napi_value start_fn; + napi_value end_fn; + uint32_t count; +}; + +static BenchmarkParams ParseBenchmarkArgs(napi_env env, + const napi_callback_info info) { + BenchmarkParams params; + size_t argc = 4; + napi_value args[4]; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + params.count_val = args[0]; + params.bench_obj = args[1]; + params.start_fn = args[2]; + params.end_fn = args[3]; + + napi_get_value_uint32(env, params.count_val, ¶ms.count); + return params; +} + +static napi_value global_names[20]; +static napi_value global_values[20]; +static bool global_properties_initialized = false; + +// Creating with many options because complains are when ~20 properties +static void InitializeTestProperties(napi_env env) { + if (global_properties_initialized) return; + + for (int i = 0; i < 20; i++) { + std::string name = "foo" + std::to_string(i); + napi_create_string_utf8( + env, name.c_str(), NAPI_AUTO_LENGTH, &global_names[i]); + napi_create_string_utf8( + env, name.c_str(), NAPI_AUTO_LENGTH, &global_values[i]); + } + global_properties_initialized = true; +} + +static napi_value CreateObjectWithPropertiesNew(napi_env env, + napi_callback_info info) { + BenchmarkParams params = ParseBenchmarkArgs(env, info); + + InitializeTestProperties(env); + + napi_value null_prototype; + napi_get_null(env, &null_prototype); + + napi_call_function( + env, params.bench_obj, params.start_fn, 0, nullptr, nullptr); + + for (uint32_t i = 0; i < params.count; i++) { + napi_value obj; + napi_create_object_with_properties( + env, null_prototype, global_names, global_values, 20, &obj); + } + + napi_call_function( + env, params.bench_obj, params.end_fn, 1, ¶ms.count_val, nullptr); + + return nullptr; +} + +static napi_value CreateObjectWithPropertiesOld(napi_env env, + napi_callback_info info) { + BenchmarkParams params = ParseBenchmarkArgs(env, info); + + InitializeTestProperties(env); + + napi_call_function( + env, params.bench_obj, params.start_fn, 0, nullptr, nullptr); + + for (uint32_t i = 0; i < params.count; i++) { + napi_value obj; + napi_create_object(env, &obj); + for (int j = 0; j < 20; j++) { + napi_set_property(env, obj, global_names[j], global_values[j]); + } + } + + napi_call_function( + env, params.bench_obj, params.end_fn, 1, ¶ms.count_val, nullptr); + + return nullptr; +} + +NAPI_MODULE_INIT() { + napi_property_descriptor desc[] = { + {"createObjectWithPropertiesNew", + 0, + CreateObjectWithPropertiesNew, + 0, + 0, + 0, + napi_default, + 0}, + {"createObjectWithPropertiesOld", + 0, + CreateObjectWithPropertiesOld, + 0, + 0, + 0, + napi_default, + 0}, + }; + + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} diff --git a/benchmark/napi/create_object_with_properties/binding.gyp b/benchmark/napi/create_object_with_properties/binding.gyp new file mode 100644 index 00000000000000..125b7d4cbf91cf --- /dev/null +++ b/benchmark/napi/create_object_with_properties/binding.gyp @@ -0,0 +1,9 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ], + 'defines': ['NAPI_EXPERIMENTAL'] + } + ] +} diff --git a/benchmark/napi/create_object_with_properties/index.js b/benchmark/napi/create_object_with_properties/index.js new file mode 100644 index 00000000000000..b099697dd0188f --- /dev/null +++ b/benchmark/napi/create_object_with_properties/index.js @@ -0,0 +1,24 @@ +'use strict'; + +const common = require('../../common.js'); + +let binding; +try { + binding = require(`./build/${common.buildType}/binding`); +} catch { + console.error(`${__filename}: Binding failed to load`); + process.exit(0); +} + +const bench = common.createBenchmark(main, { + n: [1e2, 1e3, 1e4, 1e5, 1e6], + method: ['new', 'old'], +}); + +function main({ n, method }) { + if (method === 'new') { + binding.createObjectWithPropertiesNew(n, bench, bench.start, bench.end); + } else { + binding.createObjectWithPropertiesOld(n, bench, bench.start, bench.end); + } +} diff --git a/benchmark/vm/source-text-module-chained.js b/benchmark/vm/source-text-module-chained.js new file mode 100644 index 00000000000000..691af2561883e5 --- /dev/null +++ b/benchmark/vm/source-text-module-chained.js @@ -0,0 +1,48 @@ +'use strict'; + +const vm = require('vm'); +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + stage: ['all', 'instantiate', 'evaluate'], + n: [1000], +}, { + flags: ['--experimental-vm-modules'], +}); + +function main({ stage, n }) { + const arr = [new vm.SourceTextModule(` + export const value = 42; + `)]; + + if (stage === 'all') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + const m = new vm.SourceTextModule(` + export { value } from 'mod${i}'; + `); + arr.push(m); + m.linkRequests([arr[i]]); + } + + if (stage === 'instantiate') { + bench.start(); + } + arr[n].instantiate(); + if (stage === 'instantiate') { + bench.end(n); + } + + if (stage === 'evaluate') { + bench.start(); + } + arr[n].evaluate(); + if (stage === 'evaluate' || stage === 'all') { + bench.end(n); + } + + assert.strictEqual(arr[n].namespace.value, 42); +} diff --git a/benchmark/vm/source-text-module-flat.js b/benchmark/vm/source-text-module-flat.js new file mode 100644 index 00000000000000..06acacb25a550c --- /dev/null +++ b/benchmark/vm/source-text-module-flat.js @@ -0,0 +1,68 @@ +'use strict'; + +const vm = require('vm'); +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + stage: ['all', 'link', 'instantiate', 'evaluate'], + n: [1000], +}, { + flags: ['--experimental-vm-modules'], +}); + +function main({ stage, n }) { + const arr = []; + let importSource = ''; + let useSource = 'export const result = 0 '; + for (let i = 0; i < n; i++) { + importSource += `import { value${i} } from 'mod${i}';\n`; + useSource += ` + value${i}\n`; + } + + if (stage === 'all') { + bench.start(); + } + for (let i = 0; i < n; i++) { + const m = new vm.SourceTextModule(` + export const value${i} = 1; + `); + arr.push(m); + } + + const root = new vm.SourceTextModule(` + ${importSource} + ${useSource}; + `); + + if (stage === 'link') { + bench.start(); + } + + root.linkRequests(arr); + for (let i = 0; i < n; i++) { + arr[i].linkRequests([]); + } + + if (stage === 'link') { + bench.end(n); + } + + if (stage === 'instantiate') { + bench.start(); + } + root.instantiate(); + if (stage === 'instantiate') { + bench.end(n); + } + + if (stage === 'evaluate') { + bench.start(); + } + root.evaluate(); + if (stage === 'evaluate' || stage === 'all') { + bench.end(n); + } + + assert.strictEqual(root.namespace.result, n); +} diff --git a/benchmark/vm/source-text-module-leaf.js b/benchmark/vm/source-text-module-leaf.js new file mode 100644 index 00000000000000..66d942556c6ac8 --- /dev/null +++ b/benchmark/vm/source-text-module-leaf.js @@ -0,0 +1,84 @@ +'use strict'; + +const vm = require('vm'); +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + stage: ['all', 'compile', 'link', 'instantiate', 'evaluate'], + type: ['sync', 'async'], + n: [1000], +}, { + flags: ['--experimental-vm-modules'], +}); + +function main({ stage, type, n }) { + const arr = []; + if (stage === 'all' || stage === 'compile') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + let source = `export const value${i} = 1;`; + if (type === 'async') { + source += `\nawait Promise.resolve();\n`; + } + const m = new vm.SourceTextModule(source); + arr.push(m); + } + + if (stage === 'compile') { + bench.end(n); + return; + } + + if (stage === 'link') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + arr[i].linkRequests([]); + } + + if (stage === 'link') { + bench.end(n); + return; + } + + if (stage === 'instantiate') { + bench.start(); + } + + for (let i = 0; i < n; i++) { + arr[i].instantiate(); + } + + if (stage === 'instantiate') { + bench.end(n); + return; + } + + if (stage === 'evaluate') { + bench.start(); + } + + function finalize() { + bench.end(n); + for (let i = 0; i < n; i++) { + assert.strictEqual(arr[i].namespace[`value${i}`], 1); + } + } + + if (type === 'sync') { + for (let i = 0; i < n; i++) { + arr[i].evaluate(); + } + finalize(); + } else { + const promises = []; + for (let i = 0; i < n; i++) { + promises.push(arr[i].evaluate()); + } + Promise.all(promises).then(finalize); + } +} diff --git a/common.gypi b/common.gypi index 592c4e9294e05f..765e384b7b962e 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.10', + 'v8_embedder_string': '-node.14', ##### V8 defaults for Node.js ##### @@ -144,7 +144,7 @@ }], ], }, - 'defines': [ 'DEBUG', '_DEBUG' ], + 'defines': [ 'DEBUG', '_DEBUG', 'V8_ENABLE_CHECKS' ], 'cflags': [ '-g', '-O0' ], 'conditions': [ ['OS in "aix os400"', { @@ -443,12 +443,12 @@ ['v8_enable_pointer_compression == 1', { 'defines': ['V8_COMPRESS_POINTERS'], }], + ['v8_enable_pointer_compression == 1 and v8_enable_pointer_compression_shared_cage != 1', { + 'defines': ['V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES'], + }], ['v8_enable_pointer_compression_shared_cage == 1', { 'defines': ['V8_COMPRESS_POINTERS_IN_SHARED_CAGE'], }], - ['v8_enable_pointer_compression == 1 and v8_enable_pointer_compression_shared_cage != 1', { - 'defines': ['V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE'], - }], ['v8_enable_pointer_compression == 1 or v8_enable_31bit_smis_on_64bit_arch == 1', { 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH'], }], @@ -508,7 +508,7 @@ 'ldflags': [ '-rdynamic' ], 'target_conditions': [ # The 1990s toolchain on SmartOS can't handle thin archives. - ['_type=="static_library" and OS=="solaris"', { + ['_type=="static_library"', { 'standalone_static_library': 1, }], ['OS=="openbsd"', { diff --git a/configure.py b/configure.py index 5a05a1fdcd496c..a752897e90aa25 100755 --- a/configure.py +++ b/configure.py @@ -646,6 +646,12 @@ default=None, help='[Experimental] Enable V8 pointer compression (limits max heap to 4GB and breaks ABI compatibility)') +parser.add_argument('--experimental-pointer-compression-shared-cage', + action='store_true', + dest='pointer_compression_shared_cage', + default=None, + help='[Experimental] Use V8 pointer compression with shared cage (requires --experimental-enable-pointer-compression)') + parser.add_argument('--v8-options', action='store', dest='v8_options', @@ -1789,7 +1795,10 @@ def configure_v8(o, configs): # Note that enabling pointer compression without enabling sandbox is unsupported by V8, # so this can be broken at any time. o['variables']['v8_enable_sandbox'] = 0 - o['variables']['v8_enable_pointer_compression_shared_cage'] = 1 if options.enable_pointer_compression else 0 + # We set v8_enable_pointer_compression_shared_cage to 0 always, even when + # pointer compression is enabled so that we don't accidentally enable shared + # cage mode when pointer compression is on. + o['variables']['v8_enable_pointer_compression_shared_cage'] = 1 if options.pointer_compression_shared_cage else 0 o['variables']['v8_enable_external_code_space'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_31bit_smis_on_64bit_arch'] = 1 if options.enable_pointer_compression else 0 o['variables']['v8_enable_extensible_ro_snapshot'] = 0 diff --git a/deps/amaro/dist/index.js b/deps/amaro/dist/index.js index 7b64c58215b673..26ff44b9ee3cae 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_wrapper6822 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 966, __wbg_adapter_50); + module2.exports.__wbindgen_closure_wrapper6827 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 967, __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("AGFzbQEAAAAB7AROYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmACf38AYAJ/fwF/YAJ/fwF+YAJ/fwF8YAN/f38AYAN/f38Bf2ADf39/AX5gBH9/f38AYAR/f39/AX9gBH9/f38BfmAFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwBgB39/f39/f38Bf2AIf39/f39/f38AYAh/f39/f39/fwF/YAt/f39/f39/f39/fwF/YA1/f39/f39/f39/f39/AGAOf39/f39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AX9gE39/f39/f39/f39/f39/f39/f38Bf2AXf39/f39/f39/f39/f39/f39/f39/f38Bf2AJf39/f39/fn5+AGAFf39/f34AYAZ/f39/fn8AYAR/f39+AGAGf39/fn9/AGADf39+AGADf39+AX9gBH9/fn8AYAR/f35/AX9gBX9/fn9/AGAGf39+f35/AGAFf399f38AYAV/f3x/fwBgAn9+AGACf34Bf2ADf35/AGADf35/AX9gBH9+f38AYAR/fn9+AX5gA39+fgBgA39+fgF/YAR/fn5/AGAFf35+fn4AYAR/fX9/AGACf3wAYAN/fH8Bf2AEf3x/fwBgBH98f38Bf2ABfgBgAX4Bf2ABfgF+YAJ+fwBgAn5/AX9gAn5/AX5gA35/fwBgA35/fwF/YAJ+fgBgAn5+AX5gA35+fwBgBH5+f38BfmAEfn5+fwF+YAd+fn5/f39/AX5gAXwBf2ABfAF8YAJ8fwF/YAJ8fwF8YAJ8fAF8YAN8fHwBfALLGj0YX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX2dldAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMjNhMjY2NWZhYzgzYzYxMQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfMWRjMzYxYmQxMDA1M2JmZQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfZTJkMmE0OTEzMmMxYjI1NgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX3N0cmluZwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfYjliOTMwNDdmZTNjZjQ1YgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19uZXcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18fX193YmdfdG9TdHJpbmdfNTI4NTU5Nzk2MDY3NmI3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNDA1ZTIyZjM5MDU3NmNlMgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNzhmZWIxMDhiNjQ3MjcxMwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfMzc4MzcwMjNmM2Q3NDBlOAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21fdTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fE19fd2JpbmRnZW5fanN2YWxfZXEABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcASBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF82NTc0ZTFhOGE2MmQxMDU1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2RvbmVfNzY5ZTVlZGU0YjMxYzY3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxxfX3diZ192YWx1ZV9jZDFmZmE3YjFhYjc5NGYxAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX2dldF82N2IyYmE2MmZjMzBkZTEyAAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24ABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF8yNWZlYWRmYzA5MTNmZWE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfNjcyYTRkMjE2MzRkNGEyNAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyBfX3diZ19uZXdub2FyZ3NfMTA1ZWQ0NzE0NzVhYWY1MAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzg4YTkwMmQxM2E1NTdkMDcAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18yX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzU2NTc4YmU3ZTlmODMyYjAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV181ZGUzNzA0M2E5MWE5YzQwAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fK19fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzM3YzVkNDE4ZTRiZjU4MTkAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfaXNBcnJheV9hMWVhYjdlMGQwNjczOTFiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfN2NjY2RkNjllMDc5MWFlMgALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfYTQ0NjE5M2RjMjJjMTJmOAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxFfX3diaW5kZ2VuX21lbW9yeQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfYTEyMDAyYTdmOTFjNzViZQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfNjU1OTViZGQ4NjhiMzAwOQAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfMTcxNTZiY2YxMTgwODZhOQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWYABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18ZX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2UxNDU4NTQzMmUzNzM3ZmMABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfZW50cmllc18zMjY1ZDQxNThiMzNlNWRjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEF9fd2JpbmRnZW5fdGhyb3cABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ190aGVuXzQ0YjczOTQ2ZDJmYjNlN2QABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfcXVldWVNaWNyb3Rhc2tfOTdkOTJiNGZjYzhhNjFjNQADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza19kMzIxOWRlZjgyNTUyNDg1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX3Jlc29sdmVfNDg1MTc4NWM5YzVmNTczZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxJfX3diaW5kZ2VuX2NiX2Ryb3AABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmluZGdlbl9jbG9zdXJlX3dyYXBwZXI2ODIyAAsDkjCQMA0GEAoLBgYGBgYKEAoKCgYKCg0GBg0GBgYKEgoNEAoNBi8GDQYQBgc5BgYKBwoNCg0GBhIGBg4GBgYSChANChIEBwoNCgYNBgoKEgYDEBIGDQYHBgcDAwYSDQQGEgYKAwoKDQoNBgMDAwYGBgYGBgoSEg0SAwMDEgMGAwMHAwMKChISAwMGCgYQAwMGBgMDAwcGBgYDBgYKBgMDBgYDAwoDBgoGDQoGTAMDBgYLFA0GCgYQDQ0KBkoHAwoQBhJKAwYGDQoQBxAQCwMDBgcQBg0HFAYHEAsHBwYLEgcKBgYDEAYNCwYGDQ0GCg0BEBAGBgcGBgYGCgcDBAYKCgsKCgYEDQYNBg0GBw0QEA0HBg0SBg0HBwoNEAYDCgtNChAKEgYDEgYGBgYGAwYHBgMGEAoKCgoKCgoGBwoDCgoGBgYGBgQEBwoGARQNBwoKDQsDCgYGDQcGBgQKAQoGAwYGEAMGBgoLCwMHBgoGEAYNBgoDAwMDDQYGAwMGGgMSCgMKBgYNBgYEAwMHBgQKBgMNAwMDAwMDCgMDAwMDAwMDAwMDAwMDAwMDAwwGBAoDChQOAwMDAwMNDQYVDgYKBgYDBhQGBgYOBgQGDg0OCgYLEgMGBgoGBgoGBAMDAwMOCgYSCyAKCwYHBgYGBgYGBgYDBgYSBxQGBxQNNwYGBg0HAwoNFwYKBgoQBgYLCwMKBgsLBgYNCwsEBgsGCgoNBgoKCgYNBgcDBgYDBgYGCgoNBgoHAwcOBgoDCwsSBwYGAwMKBgQQORkQAw0DCgMDAwcKCg0HCwMHEAsGBgMDEAcKCgoGDQ0GDQsNDQMDCgYGBgcLBhYDAygGCgoGBwYDAwYGBgYUCwoDEgoNFAYGBgcGAwMGBwYLBgYNCgMGEBIFBgoTBwYLAwYGCgYKBhIHCwYGDQ0DEggKAwYGAwcDCgsGCgMHBgYKCg4LBwYKAy0ILgYDAwMDAwMDAwYNBA0GBgMQEBISBgYHAwMGBgYVAwMDAwMDDQ0NBAYGEgMDBwoDBgYKBgYUEgYGBysLFAoSEgYKBwcDBgoKRUUGCwYKChEHBkUGDQYQEhQSBwYUEgoETAsGBgoHBgYKBwcDMQsLBwcGBgoQEgMHAw0NBgYKBg0GBgYGCwoKBgYDBgYKAwAGCgYGPQQGAwYNCg0HBhAeBwMGBgoDBwMDBgoKAwMDBwYGDgYSBwYLCgoKBgYGAwYGCgYGBgcDBwcGBkEGCwYGCgYHAwYKCgoKCg0NDQcGAwMLDQMDCgYGCgoKDQMKBiEGBgsDBwQVBBIGBA0NCgYTBxIKCgoNDQYKBwYKSQoSBA0KCgoKDQYGBwQDBwYVBwYHCg0ECgYGCwYUDQYEBxAGBwcNBgYKChIHCgQGHwoEBgYSBAYGBwYGBgYDBgYGBiUGCg4GBgMGBgMGEA0NDQ0NDgoGBgcHCgYEEg0NEgoNBhIGEAYGEgoGBgMDBgcQCjANDRIKBwYKDQMGBg0DBgYGBgoGEhIEAwMFBgoGCgQHBwYQBgcKAwYNDQMGAwMSEgsEEBEDBwUHBgYHBgoDAwYGBgYHBgYGBgYKDgcGBAoKBgoDCyIGCwMHBgoDBg0NBgMGBhAHBwcKBgYGBgoLEi0EEhIGBgYHBwMHBwcDBwcHBgYGBgMGBgYGCg0QBgYHBw0KCgYNCgoGBAoGCgMVEg0NDQYHAwcDBgYHAwYGAw4KDQYKBgcHAwYGBwcGCgYNEg0KBwMKBgYKBgYGBwoKBwoHBwMDDQ0KBwYKCwYKBgMLAwsHDgoHBAYHBgoNDQ0GBgoDAwMDAwMDAwMGCg0NBgMSAwYGCgQSCgYGBgYHCgoLCwoHBwcGBi0GAwcDAwYHBwYGBgoGBgYGBgYKBg0SAwQGBgMHDRIGCwYHAwsODgcQAwMDAwMKBiUGChADCw0HBwcNBgYGBg0LBgYQBgoDDQMGEAQGBgcGBgMKBgMKKwYGBgYGBgYGERAKAwcGBgcGCgYGEhIKDQoDCgUHEAMrCgsLBg0KCgYNDQYDBgoDBgoQHQYDEA0GCgoGBi8HBwYEBgoGAwYKBg0KBwYHDQoKBgcKBgcHBwMGBAgHBgMHBwcmBgcHBwYGBhwKBwM9CgoDDQ0GBgYHBg0KAwYDDgMDCgYUDgcKBwYLBgYGBgYKBwoKCgYHBgoDBwUHAwMDJgQDBwQKBgYGAwYGBgYGBgoKBg0bBg4HBwYGBxAKEBAQEAoQEAoQEBANEBAQCgoHFAMNCgoGAwMDAwMDAwYDAwMDAwMDAwYHLAMHBw0GBwcSBgpBAw0GBgYGCgYHBwQGChgNCwYNBgMLAwoEAxILCwcEBgMHEg0UBgYGBgQGBgoKBgYHAwYDBhEGBgYGBgYGBgYGBgQDCgYDBgcGAwYDDQoKFRAGBwYHBwMEBwcHBwcGAwYENgYDDQYDBhEKBgMKAwMDBgYGBhIDAwYLBAoGBgYHCgoHDQcEBwoHBgMGBgMHEAcHBgMHAwMDBwMDBhISAxIGBg0EDQsLBgYGAw0NBgQGEAoEAwYGBgoKCgoKCgYKBhAGBgYGBgcLAwQHBwkGBwcDBgYGAwYGBgYDAwYEBgcEBwcGBwMDAwMHBwcHBwcHBwcHBwcHBwcHAwMDBAcHBwcDAwMDAwMDAwMDAw4ODQYNDgQGEA0GBgoKBgpLCgcKEgYGBgYGChQQBgYNBg0GDQcGCgYKBgYGAwQHBwcDBgoDAwMKDQMKBAcGBgYrBgYJBwcHBwcHBwcHBwctBgYQDQMGBgYGBgQDBwoHBAZMTEwQBwcHBwoGBBINBgcHBwcHBwMHBwMHBwcHBwcHBwcHBwcHBwcHBxIHBwcHBwcHBwcHBwcDAwcGBgYGBgoGBgYGCgYODQMGBgYDCwtMTEwSBC0GBAYNBwYDBgMDAwcHAwYHAwMDAwcDAwMDAwMDAwMDBgcGBgcGEgYGBgYDCi0KBgoNCgoDAwYSBwYEBxIrDSQGEAcNBwYHBwoHBwMGBgMDBwcGBgcQDwYGBwcHBwcLCwsLAwcDAwcGAwMDAwMEBgoPBgoKCg0GBwsDBgYGBxQHBhAKBAMGDQMDBAcKBgMHBgMDAwMDAwMDAwQNBgQFBBIHBwMDAwcHKwoOAwYGCgYGBgYGBgYGBgYKBgMGCzQQCwsLBgMHBgcDBwMGBgYGBQYGBgYGCw0KCgYGCgQQBw4GAwYKBgQGAwoKCgoKAwMOAwMDByQEAwokDgQkCgoEJBIGCwoKCwcEAwcGAwcGEBAQEAYEBgYHBgcGBw0SAwMKAwYDAwMGBgYKBBAEBgYNCgoQBAoGBgYHBwYEBgoKBAMDBgYGBgMDBgYGBg0NDQoGCwYGBgYGCgoGEgcHAwYDBgYKBAoGCgoDAwMDAwMDAwMDAwMGAwoHBhIKBg4GBgQGA0IGBwcHBwYtBwcHBgcGBgYGBgYGBgYGBgYGBgYKBgYKEBAQBgsKCkZGDQMDAwMHBwcHBwcHBwcHBwcHAwcDBwcHAwMDAwcHBwcHBwcHAwcDAwMDAwMDAwMDAwMDAwMDCgoKBg0GBwcDCg0NBA0KCgoGKwoKCgoNCgoDCwYEDgYSBxIOEAMHCgsEC0IGBwcHBwcEBwsLCwsHBwcHQgcHBgYKAwYGBwYLAwsDBwYHBgYGBgcDDgYHBwcHAwQHEAcDAwMHAwYGDQYGAwMDBgsDBwQDBAcHBwcHBwcHBwcHBwMKBgYEBjMzAw0KBgYGBw0HBw0KAwMDBg0EBAcHBwcGBgcHBwcDBgYGDQoHCgcHBwYKEgsNBwcDBgcHBwcHBwcHBwcHBwcHBwcHBwcDAwcHBwcHBwcHBwQGBwcHBwcHBwcHBwMHBwMDBwcHBwcHBwcHBwcHBwMHBwcHAwcDAwMGAwMDBgYGBwQHCgcHCgMKCgcHBwoHBgoDBwMKBwQGAwQGBgcDBgoGBgoHAwoHCgcQAwcHCwcNBgoKBgoGBgYKBwcHBwcHBAYGBwcHBwcGBgYGCgYNBgoKBwcHBwMHBwcHBwcGBwcKCgMDBwcHBwcHBwoHBgcHBwcHBwcKBA4HDgoGBgoNBgcLBwQGDQoKBgcKCj0GBwcHBwMHPQc9Bj0HBwcHBwc9Bz09Bz0DPT09Az09PT09PT09CgYKCgoQAwcKEBAKEAQDBwMDAwMDBwcHBwcHBgYHEAMDBwcHBwcHBwcHBwcHBwcHAwYHBwMHBgYGBgcHBwcHBwcDBwcDAwcHBwMDBgYGBgYGBgMDAwMGAwMQEAYQBgQQChAQEAoHCgoQCgcHBgYGBwcQEBA9AwYGBgYKCgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBxAHBwcHBwcHCwsLCwc9BwcHBwcHBwcHBwcHBwMGBwcHBwcHBwcHBwcHBwcHBwcHBgcHBwcHBwcHBwcHBwMHBwcDBhAQAw0HEA0KBAYKEAoKEAMNBwoHAQQDBhIQAwcEBwYDAwMGBgoHBwMGBgMDAwMHBwQGCgMQBwcDBwsHBgYGBgYGBwYGBgZJBgYGBgYGBgYGBgYGBgAKBgYGBgYGBgYGBgYLAwoGAwEDBgoGBxAOBgYLCgoGBgMGBgMEAwcQCwMDCgoGDQ0DBgYKAyEKBgMDAyEDAwMDAwMDAwYGAwMDAwMDAwQGIQoKAwYGAwMKAwcHCgYHCgcGAwYGBgYGBwMGBgQHBgMDBxIDAwcHBwQHBwYHBwYGCgMDBgYDAwcGBgYGAwYKAwcGDQYGBgYGAwMDBgMDBgMDBgMDAwYDAwMDAwcHBwMGBgMHBwMKCgYDAwYDAwMDBgMDBwYHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMHBwMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBgYHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDAwHBwcHBwYGBgMGBgMHAwMKEAMGAwMQBgMDEhALBgMGBgYQAwMDBBABAwYGAwYDAwMQAwYDAwYGAwYDBgMGAwMDAwYDBgMDAwYDBgMDBgMGBgMDAwMGBgYGAwMEAwMDBwcHBwcHBwcHCg0GBwcHBwcHBwcMBwMHAwMHEgcGAwMHBwYGAwYDBwMDAwMDAwcHAwMGBgYGBwYHBwYGBgYHAwoNChIGCAYDBwoDBAcGBgQDBgMDBgQDAwoKBgYDCkdHA0AGPwYNBwMKCgoKCgoKCgMKCgYHCgcKBgcKChINBgoNDQ0KCgcHRBIEAwMLCgoLCwYGCgoKCgYGAwYDBwcUBgYNOgsHDgYKCgsKNgMDAy0DAwMDAwYGBgYGBgYDCgYGCgMDAwMDCgMKAwcHBAYKBgYQBwoKAwMHCAcDBAcKCgoKBwICAgICDgQDBwcCAgICAgICAgICAgICAgICBgYGBgYGBgYGBgYGBgYGBgYDAgIDAgICBgYGBgYGBgYCBgYGBAYGBgYGBAYGBwYHMjIKAwoHBwcEBw0RDgoHBgYGBwcHBwcGBgQNCgcHQwI8CgcCAgICAgICAgICAgICAgICAgcHBwcHBwcHBwICAgcHBwcHBgcHBwcHBwYDBgYGBgYGBgYGBgYGDgcQEAcQCggHBwoGAwYNBgoDCgYGCg4DBgcHBwcHBwcHBwcNBwcHDQcHBwYGBAYHCg0GBww6OgcHBwYHBzoGOgcECgY6BjoxAQYGBgMGCwcAAwMNAwAAAAAEAAAEBwcHBwcHBwcLBwcHBwcHBwcKCgYACwsHBwMDAwMDAwMHBgMDAwMHBkwDAwMDAwQFCgoGBgQEBAQEBAQEBgYGAw4HBwcQEBANEA0HBwQDAwYHCwcHEBANEBAQCAoQAwMHBwcHBwcHBwcHBwcEBwQOBwcGAwcOBAQGEBAQBw4DBwcHBgYGBgMDAwMDAwMDAwMDAwMGBgZAAwMtBAsNCgMDAw0KBwoLCgYGBgYDCgsQAwMDAwMGBgYKBgQGBgYNBAYDAwYGBgYKAwQKBwcGAwYDCgoKMQYDBgYQCwMQEAMDAwcOBxAQBAQEDQMLBgZABAYDAw0EAwMDAwMDAwMGBgMKCgcDBwcGCgYEBwcHBwcDAyMHDQMHBgcQAwcHBwclCwsLBgYGBgcDBgcHBwMDDQYGBgYHBwcDAwYHDQ0HBw4NBgMDAwYDBAMNCwYDAwMDAwMDBxAKBA0DBwcKCgYDCgoDAwMHAwMDBwYGBAcEAxANPj4DAw0GBwcHBwcEBAMHBgYGBgYDBw0GBgYMBgMHCgYGBwMGEhAGBwYQBgYDAwMGBgYEBgMGAwYGDQYGBgYHAwYGBgYDCwYGDAMGBgMDAwMDBgMDAwMDBgYGBgMDBwgGBgYDDg4ODgMOCxAOBAoHEw4OBwMrAw4ODgcEDgMGBgYGAwMOBgMHBg4DDQoKAwQODhAREBApKicRCwMDBAoHBwYGBgoKDQ0NDAsGAwMDAwMHAwwDBgcGBgYBAQMHAwMDCgoGBgYKCgYGAwoEDQ0DAwMGBgoKAQEHDg4HMg0HBgMHBAoBBgwMBwQ9PQM9PQMGBgYGBgYGBAsKBgMDAwMKAwMHBgQDAwYHBgQKCgMGDQYHCwYKCwoKAwcEBAcKBQMDAwMDAwMGBgYDDQMDBgcQBwQEAwMDAwMDBAYDAwYDAwMDAwoKAwMHBwMEBwMHBwQHBzsHBwcDAwMDAwMDAwMDAwMDDQ0DBgoKBgoDBgMDAwMDAwMDBgYGCgYDBgMDBgYGBwMDAwMDAwMDBAMDBAMEBgcEBAMDAQMEAwoKAwoHAQQBAQEBAQEBAQEBAQEBAQEHBgMDAwMDAwMDAwMDAwMDAwYDBgYDBgYDAwMDAwYGBgYGAwYGBgYGBgEDAwMDAwMDCgoGAwYDAwMMAwYGAwMGBgMDAwMDAwMDAwMHBwcHBwcGAwcDAwMDAwcHBwsLBwcMPT09DQcBEAMDAwMDBgYGBgYGBgYDAwMGBgMLAwMDAwMHCgcGAwMKDgsGDQcKBwcHBwcHBwMDBwMDBgoDAwMHBwcHBwcHAwYxBwcHBwcGCgcHBwsLBwMDAwYDBgMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHAwMDAwMDAwMBAQMDBwMDAwMDAwMDBgsLCwsDAwMHBwcDBwcDAwMDAwMDAwMDAwMHAwMDAwMDAwMDCgMHBgcDAwcDAwcDAwoSBgsLBwcKAwMKBwoGBgYDAwMBBwMDBgYKBgYGBgcGBgYDAwMGBgYGAwcDAwMDAwMDAwMDAwMKAwMLAwsEBAQEBxADAwcDAQsHBAQEAw4DAwMLCw0DAwMDOgMDAwMDAwMDAzoDAwMDAwMDAwMDAwMDAwMDAwMDAwYGAwMLCwMDCg0DAwMDAwMDAwMDAwQKAwMDAwMDBgYGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYKAwoHBwYGBwcHBwcHAwYGBg0NDQ0NDQ0LBwcHBgMHBwcDBwoDAwoHBgcHCgoHAwMDAwMDAwMDAwMDAwMDCgYHBwQHBwYGBwMDBAcDAwMHCgMDCgoKAwMHCgMDAwMHAwMDBgYGBgYGBgYGBgYGBgMDAwMDAwMDBwMGAwMDBgYGBgMGBwQHBgYGBgYGBgsGCgoKBgYLBwYGBgcGBgcDBAoGBgYGBgYGAwMGBgYGBgYGBgYDAwYEBgYHBwYGAwsDDg4DBAMGBgYOBgYGBgYGBgYGBgYGBgYDCwMDBgYGAwMDAw0NBgYGAwMGBgYGBwYGBgMGBgYDCwADBAAKBgoKCgYGBgMDCgoGAwMDAwMDAwQEBAQKBwoLCgcHBwcHBwcHBAYDAwMNCwcEBwcHBwcEBAQEBAQHBwcEBwcHAwMDAwMDBwcHBwcHCgYHBwYHBAQGBwQH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DQIgARCYEQwCCyAELwDtCiAEQe8Kai0AAEEQdHIhGyAELwDdCiAEQd8Kai0AAEEQdHIhHCAELwDNCiAEQc8Kai0AAEEQdHIhHSAELwC9CiAEQb8Kai0AAEEQdHIhHiAELwCtCiAEQa8Kai0AAEEQdHIhHyAELwCdCiAEQZ8Kai0AAEEQdHIhICAELwCNCiAEQY8Kai0AAEEQdHIhISAELwD9CSAEQf8Jai0AAEEQdHIhIiAELwDtCSAEQe8Jai0AAEEQdHIhIyAELwDdCSAEQd8Jai0AAEEQdHIhJCAELwDNCSAEQc8Jai0AAEEQdHIhJSAELwC9CSAEQb8Jai0AAEEQdHIhJiAELwCtCSAEQa8Jai0AAEEQdHIhJyAELwCdCSAEQZ8Jai0AAEEQdHIhKCAELwCNCSAEQY8Jai0AAEEQdHIhKSAELwD9CCAEQf8Iai0AAEEQdHIhKiAELwDtCCAEQe8Iai0AAEEQdHIhKyAELwDdCCAEQd8Iai0AAEEQdHIhLCAELwDNCCAEQc8Iai0AAEEQdHIhLSAELwC9CCAEQb8Iai0AAEEQdHIhLiAELwCtCCAEQa8Iai0AAEEQdHIhLyAELwCdCCAEQZ8Iai0AAEEQdHIhMCAELwCNCCAEQY8Iai0AAEEQdHIhMSAELwD9ByAEQf8Hai0AAEEQdHIhMiAELwDtByAEQe8Hai0AAEEQdHIhMyAELwDdByAEQd8Hai0AAEEQdHIhNCAELwDNByAEQc8Hai0AAEEQdHIhNSAELwC9ByAEQb8Hai0AAEEQdHIhNiAELwCtByAEQa8Hai0AAEEQdHIhNyAELwCdByAEQZ8Hai0AAEEQdHIhOCAELwCNByAEQY8Hai0AAEEQdHIhOSAELwD9BiAEQf8Gai0AAEEQdHIhOiAELwDtBiAEQe8Gai0AAEEQdHIhOyAELwDdBiAEQd8Gai0AAEEQdHIhPCAELwDNBiAEQc8Gai0AAEEQdHIhPSAELwC9BiAEQb8Gai0AAEEQdHIhPiAELwCtBiAEQa8Gai0AAEEQdHIhPyAELwCdBiAEQZ8Gai0AAEEQdHIhQCAELwCNBiAEQY8Gai0AAEEQdHIhQSAELwD9BSAEQf8Fai0AAEEQdHIhQiAELwDtBSAEQe8Fai0AAEEQdHIhQyAELwDdBSAEQd8Fai0AAEEQdHIhRCAELwDNBSAEQc8Fai0AAEEQdHIhRSAELwC9BSAEQb8Fai0AAEEQdHIhRiAELwCtBSAEQa8Fai0AAEEQdHIhRyAELwCdBSAEQZ8Fai0AAEEQdHIhSCAELwCNBSAEQY8Fai0AAEEQdHIhSSAELwD9BCAEQf8Eai0AAEEQdHIhSiAELwDtBCAEQe8Eai0AAEEQdHIhSyAELwDdBCAEQd8Eai0AAEEQdHIhTCAELwDNBCAEQc8Eai0AAEEQdHIhTSAELwC9BCAEQb8Eai0AAEEQdHIhTiAELwCtBCAEQa8Eai0AAEEQdHIhTyAELwCdBCAEQZ8Eai0AAEEQdHIhUCAELwCNBCAEQY8Eai0AAEEQdHIhUSAELwD9AyAEQf8Dai0AAEEQdHIhUiAELwDtAyAEQe8Dai0AAEEQdHIhUyAELwDdAyAEQd8Dai0AAEEQdHIhVCAELwDNAyAEQc8Dai0AAEEQdHIhVSAELwC9AyAEQb8Dai0AAEEQdHIhViAELwCtAyAEQa8Dai0AAEEQdHIhVyAELwCdAyAEQZ8Dai0AAEEQdHIhWCAELwCNAyAEQY8Dai0AAEEQdHIhWSAELwD9AiAEQf8Cai0AAEEQdHIhWiAELwDtAiAEQe8Cai0AAEEQdHIhWyAELwDdAiAEQd8Cai0AAEEQdHIhXCAELwDNAiAEQc8Cai0AAEEQdHIhXSAELwC9AiAEQb8Cai0AAEEQdHIhXiAELwCtAiAEQa8Cai0AAEEQdHIhXyAELwCdAiAEQZ8Cai0AAEEQdHIhYCAELwCNAiAEQY8Cai0AAEEQdHIhYSAELwD9ASAEQf8Bai0AAEEQdHIhYiAELwDtASAEQe8Bai0AAEEQdHIhYyAELwDdASAEQd8Bai0AAEEQdHIhZCAELwDNASAEQc8Bai0AAEEQdHIhZSAELwC9ASAEQb8Bai0AAEEQdHIhZiAELwCtASAEQa8Bai0AAEEQdHIhGSAELwCdASAEQZ8Bai0AAEEQdHIhBiAELwCNASAEQY8Bai0AAEEQdHIhCCAEQfwAajUCACGWBCAEQewAajUCACGaBCAEKQJ0IZcEIAQpAmQhlQQgBC0A7AohZyAEKALoCiFoIAQoAuQKIWkgBCgC4AohaiAELQDcCiFrIAQoAtgKIWwgBCgC1AohbSAEKALQCiFuIAQtAMwKIW8gBCgCyAohcCAEKALECiFxIAQoAsAKIXIgBC0AvAohcyAEKAK4CiF0IAQoArQKIXUgBCgCsAohdiAELQCsCiF3IAQoAqgKIXggBCgCpAoheSAEKAKgCiF6IAQtAJwKIXsgBCgCmAohfCAEKAKUCiF9IAQoApAKIX4gBC0AjAohfyAEKAKICiGAASAEKAKECiGBASAEKAKACiGCASAELQD8CSGDASAEKAL4CSGEASAEKAL0CSGFASAEKALwCSGGASAELQDsCSGHASAEKALoCSGIASAEKALkCSGJASAEKALgCSGKASAELQDcCSGLASAEKALYCSGMASAEKALUCSGNASAEKALQCSGOASAELQDMCSGPASAEKALICSGQASAEKALECSGRASAEKALACSGSASAELQC8CSGTASAEKAK4CSGUASAEKAK0CSGVASAEKAKwCSGWASAELQCsCSGXASAEKAKoCSGYASAEKAKkCSGZASAEKAKgCSGaASAELQCcCSGbASAEKAKYCSGcASAEKAKUCSGdASAEKAKQCSGeASAELQCMCSGfASAEKAKICSGgASAEKAKECSGhASAEKAKACSGiASAELQD8CCGjASAEKAL4CCGkASAEKAL0CCGlASAEKALwCCGmASAELQDsCCGnASAEKALoCCGoASAEKALkCCGpASAEKALgCCGqASAELQDcCCGrASAEKALYCCGsASAEKALUCCGtASAEKALQCCGuASAELQDMCCGvASAEKALICCGwASAEKALECCGxASAEKALACCGyASAELQC8CCGzASAEKAK4CCG0ASAEKAK0CCG1ASAEKAKwCCG2ASAELQCsCCG3ASAEKAKoCCG4ASAEKAKkCCG5ASAEKAKgCCG6ASAELQCcCCG7ASAEKAKYCCG8ASAEKAKUCCG9ASAEKAKQCCG+ASAELQCMCCG/ASAEKAKICCHAASAEKAKECCHBASAEKAKACCHCASAELQD8ByHDASAEKAL4ByHEASAEKAL0ByHFASAEKALwByHGASAELQDsByHHASAEKALoByHIASAEKALkByHJASAEKALgByHKASAELQDcByHLASAEKALYByHMASAEKALUByHNASAEKALQByHOASAELQDMByHPASAEKALIByHQASAEKALEByHRASAEKALAByHSASAELQC8ByHTASAEKAK4ByHUASAEKAK0ByHVASAEKAKwByHWASAELQCsByHX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BQsLQQAtAKDwngEaQRBBwA0QtwciBUUNCCAFIJsDOwCtDSAFIJwDOwCdDSAFIJ0DOwCNDSAFIJ4DOwD9DCAFIJ8DOwDtDCAFIKADOwDdDCAFIKEDOwDNDCAFIKIDOwC9DCAFIKMDOwCtDCAFIKQDOwCdDCAFIKUDOwCNDCAFIKYDOwD9CyAFIKcDOwDtCyAFIKgDOwDdCyAFIKkDOwDNCyAFIKoDOwC9CyAFIKsDOwCtCyAFIKwDOwCdCyAFIK0DOwCNCyAFIK4DOwD9CiAFIK8DOwDtCiAFIJkDOwDdCiAFIJoDOwDNCiAFIBs7AK0KIAUgHDsAnQogBSAdOwCNCiAFIB47AP0JIAUgHzsA7QkgBSAgOwDdCSAFICE7AM0JIAUgIjsAvQkgBSAjOwCtCSAFICQ7AJ0JIAUgJTsAjQkgBSAmOwD9CCAFICc7AO0IIAUgKDsA3QggBSApOwDNCCAFICo7AL0IIAUgKzsArQggBSAsOwCdCCAFIC07AI0IIAUgLjsA/QcgBSAvOwDtByAFIDA7AN0HIAUgMTsAzQcgBSAyOwC9ByAFIDM7AK0HIAUgNDsAnQcgBSA1OwCNByAFIDY7AP0GIAUgNzsA7QYgBSA4OwDdBiAFIDk7AM0GIAUgOjsAvQYgBSA7OwCtBiAFIDw7AJ0GIAUgPTsAjQYgBSA+OwD9BSAFID87AO0FIAUgQDsA3QUgBSBBOwDNBSAFIEI7AL0FIAUgQzsArQUgBSBEOwCdBSAFIEU7AI0FIAUgRjsA/QQgBSBHOwDtBCAFIEg7AN0EIAUgSTsAzQQgBSBKOwC9BCAFIEs7AK0EIAUgTDsAnQQgBSBNOwCNBCAFIE47AP0DIAUgTzsA7QMgBSBQOwDdAyAFIFE7AM0DIAUgUjsAvQMgBSBTOwCtAyAFIFQ7AJ0DIAUgVTsAjQMgBSBWOwD9AiAFIFc7AO0CIAUgWDsA3QIgBSBZOwDNAiAFIFo7AL0CIAUgWzsArQIgBSBcOwCdAiAFIF07AI0CIAUgXjsA/QEgBSBfOwDtASAFIGA7AN0BIAUgYTsAzQEgBSBiOwC9ASAFIGM7AK0BIAUgZDsAnQEgBSBlOwCNASAFIGY7AH0gBSAZOwBtIAUgBjsAXSAFIJcENwI0IAUglQQ3AiQgBSCZBDcDECAFQQA6ALwNIAUgGjYCuA0gBSAHNgK0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INEBNgKEByAFINIBNgKAByAFINMBOgD8BiAFINQBNgL4BiAFINUBNgL0BiAFINYBNgLwBiAFINcBOgDsBiAFINgBNgLoBiAFINkBNgLkBiAFINoBNgLgBiAFINsBOgDcBiAFINwBNgLYBiAFIN0BNgLUBiAFIN4BNgLQBiAFIN8BOgDMBiAFIOABNgLIBiAFIOEBNgLEBiAFIOIBNgLABiAFIOMBOgC8BiAFIOQBNgK4BiAFIOUBNgK0BiAFIOYBNgKwBiAFIOcBOgCsBiAFIOgBNgKoBiAFIOkBNgKkBiAFIOoBNgKgBiAFIOsBOgCcBiAFIOwBNgKYBiAFIO0BNgKUBiAFIO4BNgKQBiAFIO8BOgCMBiAFIPABNgKIBiAFIPEBNgKEBiAFIPIBNgKABiAFIPMBOgD8BSAFIPQBNgL4BSAFIPUBNgL0BSAFIPYBNgLwBSAFIPcBOgDsBSAFIPgBNgLoBSAFIPkBNgLkBSAFIPoBNgLgBSAFIPsBOgDcBSAFIPwBNgLYBSAFIP0BNgLUBSAFIP4BNgLQBSAFIP8BOgDMBSAFIIACNgLIBSAFIIECNgLEBSAFIIICNgLABSAFIIMCOgC8BSAFIIQCNgK4BSAFIIUCNgK0BSAFIIYCNgKwBSAFIIcCOgCsBSAFIIgCNgKoBSAFIIkCNgKkBSAFIIoCNgKgBSAFIIsCOgCcBSAFIIwCNgKYBSAFII0CNgKUBSAFII4CNgKQBSAFII8COgCMBSAFIJACNgKIBSAFIJECNgKEBSAFIJICNgKABSAFIJMCOgD8BCAFIJQCNgL4BCAFIJUCNgL0BCAFIJYCNgLwBCAFIJcCOgDsBCAFIJgCNgLoBCAFIJkCNgLkBCAFIJoCNgLgBCAFIJsCOgDcBCAFIJwCNgLYBCAFIJ0CNgLUBCAFIJ4CNgLQBCAFIJ8COgDMBCAFIKACNgLIBCAFIKECNgLEBCAFIKICNgLABCAFIKMCOgC8BCAFIKQCNgK4BCAFIKUCNgK0BCAFIKYCNgKwBCAFIKcCOgCsBCAFIKgCNgKoBCAFIKkCNgKkBCAFIKoCNgKgBCAFIKsCOgCcBCAFIKwCNgKYBCAFIK0CNgKUBCAFIK4CNgKQBCAFIK8COgCMBCAFILACNgKIBCAFILECNgKEBCAFILICNgKABCAFILMCOgD8AyAFILQCNgL4AyAFILUCNgL0AyAFILYCNgLwAyAFILcCOgDsAyAFILgCNgLoAyAFILkCNgLkAyAFILoCNgLgAyAFILsCOgDcAyAFILwCNgLYAyAFIL0CNgLUAyAFIL4CNgLQAyAFIL8COgDMAyAFIMACNgLIAyAFIMECNgLEAyAFIMICNgLAAyAFIMMCOgC8AyAFIMQCNgK4AyAFIMUCNgK0AyAFIMYCNgKwAyAFIMcCOgCsAyAFIMgCNgKoAyAFIMkCNgKkAyAFIMoCNgKgAyAFIMsCOgCcAyAFIMwCNgKYAyAFIM0CNgKUAyAFIM4CNgKQAyAFIM8COgCMAyAFINACNgKIAyAFINECNgKEAyAFINICNgKAAyAFINMCOgD8AiAFINQCNgL4AiAFINUCNgL0AiAFINYCNgLwAiAFINcCOgDsAiAFINgCNgLoAiAFINkCNgLkAiAFINoCNgLgAiAFINsCOgDcAiAFINwCNgLYAiAFIN0CNgLUAiAFIN4CNgLQAiAFIN8COgDMAiAFIOACNgLIAiAFIOECNgLEAiAFIOICNgLAAiAFIOMCOgC8AiAFIOQCNgK4AiAFIOUCNgK0AiAFIOYCNgKwAiAFIOcCOgCsAiAFIOgCNgKoAiAFIOkCNgKkAiAFIOoCNgKgAiAFIOsCOgCcAiAFIOwCNgKYAiAFIO0CNgKUAiAFIO4CNgKQAiAFIO8COgCMAiAFIPACNgKIAiAFIPECNgKEAiAFIPICNgKAAiAFIPMCOgD8ASAFIPQCNgL4ASAFIPUCNgL0ASAFIPYCNgLwASAFIPcCOgDsASAFIPgCNgLoASAFIPkCNgLkASAFIPoCNgLgASAFIPsCOgDcASAFIPwCNgLYASAFIP0CNgLUASAFIP4CNgLQASAFIP8COgDMASAFIIADNgLIASAFIIEDNgLEASAFIIIDNgLAASAFIIMDOgC8ASAFIIQDNgK4ASAFIIUDNgK0ASAFIIYDNgKwASAFIIcDOgCsASAFIIgDNgKoASAFIIkDNgKkASAFIIoDNgKgASAFIIsDOgCcASAFIIwDNgKYASAFII0DNgKUASAFII4DNgKQASAFII8DOgCMASAFIJADNgKIASAFIJEDNgKEASAFIJIDNgKAASAFIJMDOgB8IAUglAM2AnggBSCVAzYCdCAFIJYDNgJwIAUglwM6AGwgBSCYAzYCaCAFIA02AmQg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CCAFICg7AN0IIAUgKTsAzQggBSAqOwC9CCAFICs7AK0IIAUgLDsAnQggBSAtOwCNCCAFIC47AP0HIAUgLzsA7QcgBSAwOwDdByAFIDE7AM0HIAUgMjsAvQcgBSAzOwCtByAFIDQ7AJ0HIAUgNTsAjQcgBSA2OwD9BiAFIDc7AO0GIAUgODsA3QYgBSA5OwDNBiAFIDo7AL0GIAUgOzsArQYgBSA8OwCdBiAFID07AI0GIAUgPjsA/QUgBSA/OwDtBSAFIEA7AN0FIAUgQTsAzQUgBSBCOwC9BSAFIEM7AK0FIAUgRDsAnQUgBSBFOwCNBSAFIEY7AP0EIAUgRzsA7QQgBSBIOwDdBCAFIEk7AM0EIAUgSjsAvQQgBSBLOwCtBCAFIEw7AJ0EIAUgTTsAjQQgBSBOOwD9AyAFIE87AO0DIAUgUDsA3QMgBSBROwDNAyAFIFI7AL0DIAUgUzsArQMgBSBUOwCdAyAFIFU7AI0DIAUgVjsA/QIgBSBXOwDtAiAFIFg7AN0CIAUgWTsAzQIgBSBaOwC9AiAFIFs7AK0CIAUgXDsAnQIgBSBdOwCNAiAFIF47AP0BIAUgXzsA7QEgBSBgOwDdASAFIGE7AM0BIAUgYjsAvQEgBSBjOwCtASAFIGQ7AJ0BIAUgZTsAjQEgBSBmOwB9IAUgGTsAbSAFIAY7AF0gBSAIOwBNIAUglwQ3AjQgBSCVBDcCJCAFIJkENwMQIAVBADoAvA0gBSAaNgK4DSAFIAc2ArQNIAUgATYCsA0gBSCwAzoArA0gBSCxAzYCqA0gBSCyAzYCpA0gBSCzAzYCoA0gBSC0AzoAnA0gBSC1AzYCmA0gBSC2AzYClA0gBSC3AzYCkA0gBSC4AzoAjA0gBSC5AzYCiA0gBSC6AzYChA0gBSC7AzYCgA0gBSC8AzoA/AwgBSC9AzYC+AwgBSC+AzYC9AwgBSC/AzYC8AwgBSDAAzoA7AwgBSDBAzYC6AwgBSDCAzYC5AwgBSDDAzYC4AwgBSDEAzoA3AwgBSDFAzYC2AwgBSDGAzYC1AwgBSDHAzYC0AwgBSDIAzoAzAwgBSDJAzYCyAwgBSDKAzYCxAwgBSDLAzYCwAwgBSDMAzoAvAwgBSDNAzYCuAwgBSDOAzYCtAwgBSDPAzYCsAwgBSDQAzoArAwgBSDRAzYCqAwgBSDSAzYCpAwgBSDT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IGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAApFDQAgAyABQfDbmgFBECACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AC0UNACADIAFBgNyaAUETIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAMRQ0AIAMgAUGT3JoBQRcgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAA1FDQAgAyABQarcmgFBDyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ADkUNACADIAFBudyaAUEYIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAPRQ0AIAMgAUHR3JoBQQ4gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABBFDQAgAyABQd/cmgFBEiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AEUUNACADIAFB8dyaAUEVIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQASRQ0AIAMgAUGG3ZoBQQsgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABNFDQAgAyABQZHdmgFBCiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AFEUNACADIAFBm92aAUEbIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAVRQ0AIAMgAUG23ZoBQSIgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABZFDQAgAyABQdjdmgFBGiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AF0UNACADIAFB8t2aAUEaIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAYRQ0AIAMgAUGM3poBQR0gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABlFDQAgAyABQanemgFBECACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AGkUNACADIAFBud6aAUErIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAbRQ0AIAMgAUHk3poBQR4gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABxFDQAgAyABQYLfmgFBFCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AHUUNACADIAFBlt+aAUEXIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAeRQ0AIAMgAUGt35oBQRggAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAB9FDQAgAyABQcXfmgFBHiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AIEUNACADIAFB49+aAUEdIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAhRQ0AIAMgAUGA4JoBQRcgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACJFDQAgAyABQZfgmgFBGiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AI0UNACADIAFBseCaAUEYIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAkRQ0AIAMgAUHJ4JoBQRkgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACVFDQAgAyABQeLgmgFBGCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJkUNACADIAFB+uCaAUEjIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAnRQ0AIAMgAUGd4ZoBQSMgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAChFDQAgAyABQcDhmgFBISACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AKUUNACADIAFB4eGaAUEJIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAqRQ0AIAMgAUHq4ZoBQQwgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACtFDQAgAyABQfbhmgFBCCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ALEUNACADIAFB/uGaAUEIIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAtRQ0AIAMgAUGG4poBQRwgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAC5FDQAgAyABQaLimgFBDyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AL0UNACADIAFBseKaAUELIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAwRQ0AIAMgAUHc8psBQQcgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADFFDQAgAyABQeiqnAFBAyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AMkUNACADIAFBvOKaAUEQIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAzRQ0AIAMgAUHM4poBQQggAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADRFDQAgAyABQdTimgFBDiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ANUUNACADIAFB4uKaAUEbIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA2RQ0AIAMgAUH94poBQRogAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADdFDQAgAyABQbKlnAFBCiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AOEUNACADIAFBl+OaAUEXIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA5RQ0AIAMgAUGu45oBQRggAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADpFDQAgAyABQcbjmgFBEiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AO0UNACADIAFB2OOaAUERIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA8RQ0AIAMgAUHp45oBQRcgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAD1FDQAgAyABQYDkmgFBHSACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0APkUNACADIAFBneSaAUEDIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA/RQ0AIAMgAUGg5JoBQQ8gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEBFDQAgAyABQa/kmgFBESACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQUUNACADIAFBwOSaAUETIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBCRQ0AIAMgAUHT5JoBQRogAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAENFDQAgAyABQe3kmgFBDSACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AREUNACADIAFB+uSaAUETIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBFRQ0AIAMgAUGN5ZoBQRkgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEZFDQAgAyABQablmgFBHyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AR0UNACADIAFBxeWaAUEOIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBIRQ0AIAMgAUHT5ZoBQRsgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAElFDQAgAyABQe7lmgFBDyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ASkUNACADIAFB66qcAUEDIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBLRQ0AIAMgAUH95ZoBQRAgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAExFDQAgAyABQY3mmgFBGSACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ATUUNACADIAFBpuaaAUEPIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBORQ0AIAMgAUG15poBQRUgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAE9FDQAgAyABQcrmmgFBDyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AUEUNACADIAFB2eaaAUEXIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBRRQ0AIAMgAUHw5poBQR0gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFJFDQAgAyABQdD9mwFBBSACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AU0UNACADIAFBjeeaAUEIIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBURQ0AIAMgAUGV55oBQRMgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFVFDQAgAyABQajnmgFBDCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AVkUNACADIAFBtOeaAUEPIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBXRQ0AIAMgAUGT/poBQQYgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFhFDQAgAyABQcPnmgFBByACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AWUUNACADIAFByueaAUEdIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBaRQ0AIAMgAUHn55oBQRQgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFtFDQAgAyABQfvnmgFBESACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AXEUNACADIAFBjOiaAUEQIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBdRQ0AIAMgAUGc6JoBQR8gAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAF5FDQAgAyABQbvomgFBJiACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AX0UNACADIAFB4eiaAUEfIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBgRQ0AIAMgAUGA6ZoBQSEgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGFFDQAgAyABQaHpmgFBGyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AYkUNACADIAFBvOmaAUEMIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBjRQ0AIAMgAUHI6ZoBQSMgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGRFDQAgAyABQevpmgFBCyACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZUUNACADIAFB9umaAUEMIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBmRQ0AIAMgAUGC6poBQQsgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGdFDQAgAyABQY3qmgFBCCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AaEUNACADIAFBleqaAUEJIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBpRQ0AIAMgAUGe6poBQRogAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGpFDQAgAyABQbjqmgFBFCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0Aa0UNACADIAFBzOqaAUEkIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBsRQ0AIAMgAUHw6poBQREgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAG1FDQAgAyABQYHrmgFBCCACKAIAENYFAkAgACgCCCIFIAAoAgBHDQAgABDwHQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AbkUNACADIAFBieuaAUEHIAIoAgAQ1gUCQCAAKAIIIgUgACgCAEcNACAAEPAdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBvRQ0AIAMgAUG8rZwBQQUgAigCABDWBQJAIAAoAggiBSAAKAIARw0AIAAQ8B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAHBFDQAgAyABQZDrmgFBCSACKAIAENYFAkAgACgCCCIEIAAoAgBHDQAgABDwHQsgACgCBCAEQTBsaiIBIAMpAwA3AwAgAUEoaiADQShqKQMANwMAIAFBIGogA0EgaikDADcDACABQRhqIANBGGopAwA3AwAgAUEQaiADQRBqKQMANwMAIAFBCGogA0EIaikDADcDACAAIARBAWo2AggLIAIgAigCBEF/ajYCBCADQTBqJAAL/ogBAmh/CH4jAEHAB2siAyQAIAFBCGohBCADQeABakEdaiEFIANBsARqQQhqIQYgA0GwBWpBDGohByADQbAEakEEciEIIANB1QRqIQkgA0GwBWpBFWohCiADQbAEakEUaiELIANBsAVqQQRyIQwgA0GhAmohDSADQeABakEgaiEOIANBsARqQRVqIQ8gA0GwAWpBFWohECADQbABakEEciERIANB6AZqQRVqIRIgA0HoBmpBBHIhEyADQbAGakEVaiEUIANBsAZqQQRyIRUgA0GABmpBFWohFiADQYAGakEEciEXIANBsARqQRBqIRggA0GwBGpBDGohGSADQakCaiEaIANBnQJqIRsgA0GMAmohHCADQeABakEMaiEdIANB4AFqQRVqIR4gA0HgAWpBBHIhHyADQaAHakEEciEgIANB4AFqQRRqISEgA0HoBmpBDGohIiADQbAFakEdaiEjIANB4AFqQQhqISQgA0HoBmpBCGohJSADQbABakEdaiEmIANBsAFqQQhqIScgA0GEAWpBBGohKCAAKAIAISkCQAJAA0ACQAJAICkoAgAiKkUNACADICo2AugGAkAgAS0A4AEiAEGjAUcNACADQbAFaiABEM0mIAEoAtwBIQAgASgC2AEhAiADQQE2AuQBIANByL6cATYC4AEgA0IBNwLsASADQbMHNgK0ASADIANBsAFqNgLoASADIANB6AZqNgKwASADQbAEaiADQeABahD0GiADQcQEaiADQbgFaigCADYCACADIAMpArAFNwK8BCABIAIgACADQbAEahDXIwwECyAAICotAABHDQEMAwsgAS0A4AEiAEGjAUYNAgsgA0EBOgB/IAMgASgC2AE2AoABAkACQCAAQRhGDQBBBCEqQQAhK0EAISwMAQsgA0HgAWogAUEBEPcBIAMoAuQBISogAygC4AEiLEGAgICAeEYNAyADKALoASErIAEtAOABIQALAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH/AXEiAEHYAEYiLQ0AIABB3wBHDQELIAMgKzYCkAEgAyAqNgKMASADICw2AogBIAMgATYChAECQCABKAKIASIqQYCAgIAGcQ0AIAEoAtwBIQAgASgC2AEhKiADQcaAgIB4NgLgASAqIAAgA0HgAWoQ1xohKgwuCwJAAkAgAEHfAEYNACAtDQEgA0EBNgLkASADQeC6nAE2AuABIANCADcC7AEgAyADQbwHajYC6AEgA0HgAWpB6LqcARDiIwALIAEoAtgBIS0CQAJAAkAgARDUCSIARQ0AIAAtAABBCEYNAQsCQAJAIAEQ1AkiAEUNACAALQAARQ0BCwJAIAEoAogBIgBBAnENACABIABBCnIQnxILAkAgAS0A4AFB3wBGDQAgASgC3AEhACABKALYASEqIANBvANqIAEQzSYgA0EBNgK0BCADQci+nAE2ArAEIANCATcCvAQgA0GzBzYCtAEgA0HfADoAsAYgAyADQbABajYCuAQgAyADQegGajYCsAEgAyADQbAGajYC6AYgA0GwBWogA0GwBGoQ/hogB0EIaiADQbwDakEIaigCADYCACAHIAMpArwDNwIAICogACADQbAFahDXGiEuIAEtAOABQaIBRw0xIAEgARCXLBCfFwwxCyABEKALAkAgAS0A4AFBwABGDQAgA0EgakEEQQhByABBrLicARCsGiADQQA2AtADIAMgAykDIDcCyAMCQCABKAKIASABLQDgASIAENoNRQ0AIANBsARqIAEQpQ0gAygCsAQhLiADLQDEBCIAQQJGDTAgESAIKQIANwIAIBAgDy8AADsAACARQQhqIiwgCEEIaiIrKQIANwIAIBBBAmoiLyAPQQJqIjAtAAA6AAAgAyAAOgDEASADIC42ArABQQAhMSABLQCRAUEgcUUNHyADQbABakG8uJwBQQQQ/CFFDR9BASExQQAhKiABLQDgASIAQQJGDSAgAEEPRg0gQQAhMSABKAKIASAAENoNRQ0fAkACQCAAQf4ARw0AIAEQ1AkiAEUNASAALQAAQf4ARw0BCyADQbAEaiABEKUNIAMoArAEIS4gAy0AxAQiAEECRg0lIANB2ANqQQhqICspAgA3AwAgA0HUA2pBAmogMC0AADoAACADIAgpAgA3A9gDIAMgDy8AADsB1AMgA0HUA2ohKiADQdgDaiExDB8LIAEQ1AkiAEUNHyAALQAAQRdHDR8gA0GwBWogARDYDiADQbAEaiADQbAFahDrJCADKAKwBCEuIAMtAMQEIgBBAkYNJCADQfADakEIaiArKQIANwMAIANB7ANqQQJqIDAtAAA6AAAgAyAIKQIANwPwAyADIA8vAAA7AewDIANB7ANqISogA0HwA2ohMQweC0EAITBBACExIABB/wFxQQ9GDScMKQsgA0GwBGogARD1GkEYQQgQoioiAEEQaiAYKQMANwMAIABBCGogBikDADcDACAAIAMpA7AENwMAQQAhK0EAISoCQCABLQDhAQ0AAkAgAS0A4AEiLEH3AEYNAEEAISogLEHwAEcNAQsgARCgCyADQbAEaiABEKUgIAMoArQEIS4CQCADKAKwBCIqQTJHDQAgABDaJwwyCwJAQThFDQAgA0GwBWogBkE4/AoAAAsgKkEORw0GQRRBBBCiKiIqIC42AgAgKiADKQOwBTcCBCAqQQxqIANBsAVqQQhqKQMANwIACyABEKMgGiABKALUASEyQQghM0EAITQgLSE1QQAhNkEAIS5BACEsDCwLIANBKGogARD7CSADKAIsITEgAygCKEEBcQ0BIAEQoyAaIAEoAtQBITVBCSEsQRIhMyA3ISsgOCE0IDkhKiA6ITIgLSEAIDEhNgwrCyADQTBqIAEQ+wkgAygCNCExIAMoAjBBAXENGSABEKMgGiABKALUASE1QQkhLEESITMgNyErIDghNCA5ISogOiEyIC0hACAxITYMKgsgMSEuDC0LIANBoAFqQQhqIi0gKEEIaigCADYCACADICgpAgA3A6ABAkAgKkGCgICAAnFBgICAgAJHDQAgASAqQQpyEJ8SCyABKALYASEqIAEQoAsgAS0A4AEiAEGjAUYNAiABLwGQAUGAwABxIixFDQMgAEH8AEcNAyABKALYASEAIAEQoAsgA0GwBGogKBDqCCADQeABaiABIAAgA0GwBGoQjAwgAygC5AEhAAJAIAMoAuABIitBCUcNAEEJISwgACE7DBQLICcgJCkDADcDACAnQRhqICRBGGopAwA3AwAgJ0EQaiAkQRBqKQMANwMAICdBCGogJEEIaikDADcDACADIAA2ArQBIAMgKzYCsAECQCArQQhGDQAgA0GaAWpBAmogJkECai0AADoAACADIAMvAcoBOwGeASADICYvAAA7AZoBIAMoArwBIjxBCHYhPSABKALUASE+QQEhLCADKQPQASFrIAMtAMwBIT8gAy0AyQEhQCADLQDIASFBIAMoAsQBIUIgAygCwAEhQyADKAK4ASFEICohRSAAIUYgKyFHDAULIANBsAFqEMwqIAEvAZABQYDAAHEhLCABLQDgASEADAMLIAMgKzYCuAQgAyAqNgK0BCADICw2ArAEIAEoAogBIQAgAyADQf8AajYCwAQgAyADQYABajYCvAQCQAJAIABBgIAEcUUNACABIABB//97cTYCiAEgA0HgAWogA0GwBGogARD7EiABIAEoAogBQYCABHI2AogBDAELIANB4AFqIANBsARqIAEQ+xILAkAgAygC4AEiAEETRw0AQQohLCADKALkASEqDC8LIANB8gBqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBdiADIAUvAAA7AXJBCSEsIAMoAowCIUggAygCiAIhSSADKQOAAiFsIAMtAPwBIUogAy0A+QEhSyADLQD4ASE0IAMoAvQBIUwgAygC8AEhMiADKALsASE1IAMoAugBIU0gAygC5AEhNiAAITMMLgtBy7icAUEoQdS5nAEQzB4AC0EJISwgASgCgAEQ2CMhOwwQCwJAICwNACABKALYASErQQAhMQwCCwJAIAAQoBVFDQACQAJAIABBACAEIAQoAgBBCUYbEIgGIm1CAFENACAlICgQ6gggAyBtNwPoBgJAIAEtAJEBQSBxDQAgA0EINgKwBSAlEI0oIG0QviEMAgsgASgCiAEhKyADQbACaiABEN4BIAEgASgCiAFBAXIQnxIgA0HgAWogASABKALYASAlIG1BARCdBCADKALkASEAAkAgAygC4AEiLEEJRw0AIAMgADYCtAQgA0EJNgKwBCABIANBsAJqEMcFIANBCDYCsAUgCBDnBwwCCyAGICQpAwA3AwAgBkEYaiAkQRhqKQMANwMAIAZBEGogJEEQaikDADcDACAGQQhqICRBCGopAwA3AwAgAyAANgK0BCADICw2ArAEAkAgLEEIRw0AIAEgA0GwAmoQxwUgA0EINgKwBQwCCyArQQFxIQACQEEoRQ0AIANBsAVqIANBsARqQSj8CgAACyABIAEoAogBQX5xIAByEJ8SIANBsAJqEI8mIAMoArAFIgBBCEYNASADQZoBakECaiAjQQJqLQAAOgAAIAMgAy8BygU7AZ4BIAMgIy8AADsBmgEgAygCvAUiPEEIdiE9IAEoAtQBIT5BASEsIAMpA9AFIWsgAy0AzAUhPyADLQDJBSFAIAMtAMgFIUEgAygCxAUhQiADKALABSFDIAMoArgFIUQgAygCtAUhRiAqIUUgACFHDAMLQey3nAEQziwACyADQbAFahDMKiABLQDgASEACwJAAkACQAJAAkAgAEH/AXEiLEEXRg0AAkACQCAsQd8ARg0AICxB9QBHDQYgARCgCyABLQDgAUGGAUYNASABKALcASEAIAEoAtgBISogA0GYBGogARDNJiADQQE2AuQBIANByL6cATYC4AEgA0IBNwLsASADQbMHNgLsBiADQYYBOgCgByADIANB6AZqNgLoASADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAEaiADQeABahD+GiAZQQhqIANBmARqQQhqKAIANgIAIBkgAykCmAQ3AgAgKiAAIANBsARqENcaITtBCSEsIAEtAOABQaIBRw0WIAEgARCXLBCfFwwWCyABEKALQQAhACABLQDgAUGXAUcNBCABENQJIixFDQQgLC0AABCgFQ0CDAQLIAEQoAsgA0HgAWogAUEAQQAQygMgAygC4AEhACADLQD0ASIrQQJGDQIgA0GwBGpBAmoiLCAeQQJqLQAAOgAAIAMgAy8B8gE7AegGIAMgHi8AADsBsAQgAy0A8QEhLyADLQDwASEwIAMoAuwBIU4gAygC6AEhTyADKALkASEtAkAgARDCEiIxRQ0AIC2tQiCGIACthBC+IUEJISwgMSE7DBULIANBmgFqQQJqICwtAAA6AAAgAyADLwHoBjsBngEgAyADLwGwBDsBmgFBCCEsIC1BCHYhPSABKALUASFGIC0hPCArIT8gLyFAIDAhQSBOIUIgTyFDIAAhRCAqIUcMFAsgARCgCyADQegAaiABEPsJQQkhLCADKAJsIQACQCADKAJoQQFxDQAgAyAANgLgAQJAIAEQwhIiO0UNACADQeABahDSAwwVCyABKALUASFGQQchLCAqIUcLIAAhOwwTCyABEKALQQEhAAwBC0EJISwgACE7DBELIANB4AFqIAEQ2A4gAygC6AEhOyADKQPgASJtUA0PIAMoAuwBISwgA0EANgLwASADICw2AuwBIAMgOzYC6AEgA0EAOgD0ASADIG03A+ABIANB4ABqIAEgKiADQeABakEBIAAQzAJBCUEGIAMoAmBBAXEbISwgAygCZCE7DBALIAEoAtgBISsgAS0AkQFBBXYgLEGXAUZxIjFFDQEgARCgCwwCCwwOCyAAQf8BcUHUAEYNAQtBAiEAQQAhLAwBCyABEKALAkAgAS0A4AEiAEEYRw0AIAEoAtgBIS8gA0HgAWogAUEAEPcBIAMoAuQBIQACQCADKALgASIsQYCAgIB4Rw0AIAAhOwwMCyADIAMoAugBNgK4BCADIAA2ArQEIAMgLDYCsAQCQCADKAKoAUUNACABKALUASEAIANBtIGAgHg2AuABIC8gACADQeABahDXGiE7AkAgAS0A4AFBogFHDQAgASABEJcsEJ8XCyADQbAEahCNKAwMCyADQaABahCNKCAtIAYoAgA2AgAgAyADKQKwBDcDoAEgAS0A4AEhAAsCQAJAAkACQAJAAkAgAS0AkQFBIHFFDQACQAJAIABB/wFxQfMARw0AAkAgARDUCSIARQ0AIAAtAABB0ABHDQAgARCEJw0AIAEoAtgBIQAgARCgCwJAAkAgAS0A4AFBogFGDQAgA0HgAWogASAqIAAgA0GgAWpBARCzBiADKALgASIAQQNHDQFBCSEsIAMoAuQBITsMFwtBCSEsIAEQlywhOwwVCyADQZoBakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7AZ4BIAMgBS8AADsBmgEgAygC7AEiPEEIdiE9QQMhLCADKAKMAiE+IAMoAogCIUUgAykDgAIhayADLQD8ASE/IAMtAPkBIUAgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC6AEhRCADKALkASFGIAAhRwwVCyABLQDgASIAQfMARw0BIAEQ1AkiAEUNACAALQAAQYIBRw0AIAEoAtwBIQAgASgC2AEhLCADQZ6BgIB4NgLgASABICwgACADQeABahDXIyABEKALCyABLQDgASEACyAAQf8BcUGCAUcNACABKALYASEAIAEQoAsgA0HYAGogASAAELsEQQkhLCADKAJcIQAgAygCWEEBcUUNASAAITsMEQsCQCAAQf8BcSIAQdAARg0AIABB+ABHDQUgARDUCSIARQ0FIAAtAABB3QBHDQUgARCEJw0FIAEoAtgBIQACQCABLQDgAUH4AEYNACABKALcASEqIANBsAZqIAEQzSYgA0EBNgK0BCADQci+nAE2ArAEIANCATcCvAQgA0GzBzYCpAcgA0H4ADoA0AYgAyADQaAHajYCuAQgAyADQYgHajYCoAcgAyADQdAGajYCiAcgA0HoBmogA0GwBGoQjRAgIkEIaiADQbAGakEIaigCADYCACAiIAMpArAGNwIAIAAgKiADQegGahDXGiE7IAEtAOABQaIBRw0EIAEgARCXLBCfFwwECyABEKALIANB4AFqIAEgKkEBIAAgA0GgAWoQ2g4gAygC5AEhAAJAIAMoAuABIipBA0cNACAAITsMBQsgA0GaAWpBAmogBUECai0AADoAACADIAMvAfoBOwGeASADIAUvAAA7AZoBIAMoAuwBIjxBCHYhPSADLQD5ASFAIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAugBIUQgAy0A/AEhPyADKQOAAiFrIAMoAogCIUUgAygCjAIhPkEDISwgACFGICohRwwSCyADQeABaiABICogASgC2AEgA0GgAWpBABCzBiADKALkASEAIAMoAuABIipBA0YNASADQZoBakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7AZ4BIAMgBS8AADsBmgEgAygC7AEiPEEIdiE9IAMtAPkBIUAgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC6AEhRCADLQD8ASE/IAMpA4ACIWsgAygCiAIhRSADKAKMAiE+QQMhLCAAIUYgKiFHDBELIAEoAtQBIT5BAyEsQQIhRyAqIUUgACFGDA8LQQkhLCAAITsMDwsgA0GgAWoQjSgLQQkhLAwNCyABLQDgASIAQd0ARg0CIAEtAJABQRBxRQ0BAkACQCAAQf4ARw0AAkAgARDUCSIARQ0AIAAtAABBwABGDQILIAEtAOABIQALIABB/wFxQQdHDQIgARDUCSIARQ0CIAAtAAAiAEECRg0AIABBD0cNAgsgASgC1AEhLyABKALQASEwQQAhAEEBISwLIAEtAOABQRhHDQMgASgC2AEhUCADQeABaiABQQAQ9wEgAygC5AEhTiADKALgASJPQYCAgIB4Rw0CIE4hOwwJCwJAAkAgASgCiAEiAEHAAHENACABIABBwAByNgKIASADQThqIAEQuhggAygCOCErIAEgASgCiAFBv39xNgKIASADKAI8IQAMAQsgA0HAAGogARC6GCADKAJEIQAgAygCQCErC0EJISwCQCArQQFxDQAgAyAANgLgAQJAIAEQwhIiO0UNACADQeABahDSAwwLCyABKALUASFGQQQhLCAqIUcLIAAhOwwJCyADQeABaiABICpBACADIANBoAFqENoOIAMoAuQBIQAgAygC4AEiKkEDRg0GIANBmgFqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBngEgAyAFLwAAOwGaASADKALsASI8QQh2IT0gAy0A+QEhQCADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALoASFEIAMtAPwBIT8gAykDgAIhayADKAKIAiFFIAMoAowCIT5BAyEsIAAhRiAqIUcMCQsgAyADKALoATYCuAQgAyBONgK0BCADIE82ArAEAkAgAygCqAFFDQAgASgC1AEhACADQbSBgIB4NgLgASBQIAAgA0HgAWoQ1xohOyABLQDgAUGiAUYNAgwFCyADQaABahCNKCAtIAYoAgA2AgAgAyADKQKwBDcDoAELIDENAQJAAkAgAS0A4AEiTkH4AEYNACBOQdAARw0BIANB4AFqIAEgKiABKALYASADQaABakEAEIoEIAMoAuQBISsCQCADKALgASItQQhHDQAgKyE7DAwLIANB1ANqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsB3gEgAyAFLwAAOwHUAyADLQD5ASFRIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAuwBIVIgAygC6AEhRCADLQD8ASFTIAMpA4ACIW5BACEsIC0hRyArIUYMBAsCQCABENQJIk5FDQAgTi0AAEHdAEcNACABEIQnDQAgA0HgAWogASADQaABahDQCyADKALkASErAkAgAygC4AEiLUEIRw0AICshOwwMCyADQdQDakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7Ad4BIAMgBS8AADsB1AMgAy0A+QEhUSADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALsASFSIAMoAugBIUQgAy0A/AEhUyADKQOAAiFuQQAhLCAtIUcgKyFGDAQLIAEtAOABIU4LAkAgTkH/AXEiT0HdAEcNACAGIC0oAgA2AgAgAyADKQOgATcDsAQgA0HgAWogASADQbAEahCdLCADKALkASErAkAgAygC4AEiLUEIRw0AICshOwwLCyADQdQDakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7Ad4BIAMgBS8AADsB1AMgAy0A+QEhUSADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALsASFSIAMoAugBIUQgAy0A/AEhUyADKQOAAiFuQQAhLCAtIUcgKyFGDAMLAkAgAS0AkQFBIHFFDQAgT0HRAEcNAAJAIAEQ1AkiLUUNACAtLQAAQf0ARw0AIAEoAtgBIQAgARCgCyABEKALIANB0ABqIAEgAEEBEP8BIAMoAlQhAAJAIAMoAlBBAXFFDQBBCSEsIAAhOwwJCyABKALUASE+QQEhLEEGIUcgKiFFIAAhRgwICyABLQDgASFOCwJAIE5B/wFxIi1B0QBGDQACQCAtQeIARg0AIC1B7QBGDQEMAwsgARDUCSItRQ0CAkACQCAtLQAAIi1BfmoOAwIBAgALIC1BtX9qQQJJDQEgLUHiAEYNASAtQfEARg0BCyAtQY1/akH/AXFBLUsNAgsgA0HIAGogAUEAENsCQQEhLCADKAJMISsCQCADKAJIQQFxDQAgVCFEIFUhQyBWIUIgVyFBQQIhRyArIUYMAwtBCSEsICshOwwGCyABIAEQlywQnxcMAgsCQAJAAkACQAJAAkACQCAsDQAgAS0A4AEhAAJAAkACQCABLQCQAUEQcUUNACAAEKAVDQELAkAgAEH/AXFBD0cNACABENQJIgBFDQIgAC0AAEH1AEcNAiABLQDgASEACyADQQA2AqwEIANCgICAgIABNwKkBCAAQf8BcUEPRg0EDAcLIANB4AFqIAFBAEEAEMoDIAMoAuABITsgAy0A9AEiAEECRg0LIANB7ANqQQJqIB5BAmotAAA6AAAgAyAeLwAAOwHsAyADKALwASEsIAMoAuwBIS8gAygC6AEhMCADKALkASEtDAILIAEQoAsgA0HgAWogARC5BSADKALkASE7IAMoAuABIgBFDQogASgC1AEhRkEFISwgMSE8IDshRCAqIUcgACE7DAsLIANB7ANqQQJqIANB2wFqQQJqLQAAOgAAIAMgAy8A2wE7AewDQQAhLEHh6rGjByEtQfHIlbMGITsLIANBADYCrAQgA0KAgICAgAE3AqQEIAUgAy8B7AM7AAAgBUECaiADQewDakECai0AADoAACADIAA6APwBIAMgLDYC+AEgAyAvNgL0ASADIDA2AvABIAMgLTYC7AEgAyA7NgLoASADQgM3A+ABIANBpARqIANB4AFqQfy3nAEQ8R4gAS0A4AEhAAJAIAMoAqwERQ0AIABB/wFxQQdHDQIgARDUCSIARQ0CIAAtAABBD0cNAiABEKALDAELIABB/wFxQQ9HDQILIAEQoAsCQCABLQDgAUH1AEYNACABKALcASEAIAEoAtgBISogA0GYBWogARDNJiADQQE2AuQBIANByL6cATYC4AEgA0IBNwLsASADQbMHNgLsBiADQfUAOgCgByADIANB6AZqNgLoASADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAEaiADQeABahD+GiAZQQhqIANBmAVqQQhqKAIANgIAIBkgAykCmAU3AgAgKiAAIANBsARqENcaITsgAS0A4AFBogFHDQQgASABEJcsEJ8XDAQLIAEQoAsgA0GwBGogARCICiADKAK4BCE7IAMpA7AEIm1CAlENAyAhIBkpAgA3AgAgIUEQaiAZQRBqKAIANgIAICFBCGogGUEIaikCADcCACADICs2AogCIAMgOzYC8AEgAyBtNwPoASADQgI3A+ABIAMgASgC1AE2AowCIANBpARqIANB4AFqQYy4nAEQ8R4LIAEtAOABIQALAkACQAJAAkAgAEH/AXEiAEH+AEYNACABLQCQAUEQcQ0BIAEoAtwBIQAgASgC2AEhKiADQaQFaiABEM0mIANBATYC5AEgA0HIvpwBNgLgASADQgE3AuwBIANBswc2AuwGIANB/gA6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEP4aIBlBCGogA0GkBWpBCGooAgA2AgAgGSADKQKkBTcCACAqIAAgA0GwBGoQ1xohOyABLQDgAUGiAUcNBSABIAEQlywQnxcMBQsgA0HgAWogARC5BSADKALkASEAIAMoAuABIisNASAAITsMBAsgAEEHRg0BIAEoAtwBIQAgASgC2AEhKiADQdgDaiABEM0mIANBATYC5AEgA0HIvpwBNgLgASADQgE3AuwBIANBswc2AuwGIANBBzoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQ/hogGUEIaiADQdgDakEIaigCADYCACAZIAMpAtgDNwIAICogACADQbAEahDXGiE7IAEtAOABQaIBRw0DIAEgARCXLBCfFwwDCyABKALUASI8QQh2IT1BAiEsIAMoAqwEIUYgAygCqAQhRyADKAKkBCE7IDEhQSAAIUIgKyFDICohRAwHCyABEKALIAEtAOABIQALAkACQCAAQf8BcUECRw0AIFghKwJAAkADQCABEKALIAEtAOABQQNGDQEgASgC2AEhWCADQeABaiABEIgKIAMoAugBITsgAykD4AEibUICUQ0EIANBiAdqQRBqIiwgHUEQaiIvKAIANgIAIANBiAdqQQhqIi0gHUEIaiIAKQIANwMAIAMgHSkCADcDiAcCQAJAAkAgbadBAXFFDQAgGSADKQOIBzcCACAZQQhqIC0pAwA3AgAgGUEQaiAsKAIANgIAIAMgOzYCuAQgAyBtNwOwBEEAISwMAQsgICADKQOIBzcCACAgQQhqIjAgLSkDADcCACAgQRBqIi0gLCgCADYCACADIDs2AqAHAkACQCABLQCRAUEgcUUNACADQaAHakG8uJwBQQQQ/CFFDQAgAS0A4AEQoBVFDQAgA0HoBmogARDYDiADQeABaiADQegGahDrJCADKALgASE7AkACQCADLQD0ASIsQQJGDQAgFSAfKQIANwIAIBQgHi8AADsAACAVQQhqIk4gH0EIaiJPKQIANwIAIBRBAmogHkECaiJQLQAAOgAAIAMgLDoAxAYgAyA7NgKwBgJAAkACQAJAAkACQCADQbAGakH4upwBQQIQ/CENACAxDQEMBQsCQCABLQDgARCgFQ0AIDFFDQQgAygCrAchLCADKAKoByErIANBp4GAgHg2AuABIAEgKyAsIANB4AFqENcjDAQLIANB6AVqIAEQ2A4gA0HgAWogA0HoBWoQ6yQgAygC4AEhOyADLQD0ASIsQQJGDQIgEyAfKQIANwIAIBIgHi8AADsAACATQQhqIlkgTykCADcCACASQQJqIlogUC0AADoAACADICw6APwGIAMgOzYC6AYCQCADQegGakH4upwBQQIQ/CFFDQAgAS0A4AEQoBVFDQAgA0HoBWogARDYDiADQeABaiADQegFahDrJCADKALgASEsAkAgAy0A9AEiLUECRw0AIAMpA+gGEL4hIAMpA7AGEL4hQgIhbSAsITsgKyFYDAgLIANBgAZqQQhqIisgTykCADcDACADQfgEakECaiI7IFAtAAA6AAAgAyAfKQIANwOABiADIB4vAAA7AfgEIDFFDQIgAygCrAchWyADKAKoByFcIANBp4GAgHg2AuABIAEgXCBbIANB4AFqENcjDAILIANB0AZqQQhqIDApAgA3AwAgA0HQBmpBEGogLSgCADYCACADQYAFakEIaiBZKQIANwMAIANBhARqQQJqIFotAAA6AAAgAyAgKQIANwPQBiADIBMpAgA3A4AFIAMgEi8AADsBhAQgAygCoAchOyADKAKsByFbIAMoAugGIV0gAy0A/AYhXiADKQOwBhC+IUIAIW9BACFcIFghK0IAIW0MCgsgAygCrAchLCADKAKoByEtIANBp4GAgHg2AuABIAEgLSAsIANB4AFqENcjDAMLIANB0AZqQQhqIE4pAgA3AwAgA0HQBmpBEGogFUEQaigCADYCACADQYAFakEIaiArKQMANwMAIANBhARqQQJqIDstAAA6AAAgAyADKQOABjcDgAUgAyADLwH4BDsBhAQgAyAVKQIANwPQBiADKAKwBiE7IAMoAqwHIVsgAykD6AYQviFBASFcQgAhbUIAIW8gLCFdIC0hXgwECyADKQOwBhC+IQwCCyADQdAGakEIaiBOKQIANwMAIANB0AZqQRBqIBVBEGooAgA2AgAgAyAVKQIANwPQBiABKALUASFbQQEhXEICIW9CACFtIAMoArAGITsMAgsgBiADKQOwBjcDACAGQRBqIANBsAZqQRBqKQMANwMAIAZBCGogA0GwBmpBCGopAwA3AwAgA0IANwOwBCADKQOgBxC+IUEBISwMAwtCAiFtICshWAsgAykDoAcQviEgbUICUQ0JIFghKwwDCyAGIAMpA6AHNwMAIAZBEGogA0GgB2pBEGopAwA3AwAgBkEIaiADQaAHakEIaikDADcDACADQgA3A7AEQQAhLAtCACFtCwJAAkAgAS0A4AFB9QBGDQBCAiFvDAELIAEQoAsgA0HgAWogARCICiADKALoASE7IAMpA+ABInBCAlENBCADQZgGakEIaiAAKQIANwMAIANBvANqQQJqIAVBAmotAAA6AAAgAyAdKQIANwOYBiADIAUvAAA7AbwDIAMtAPwBIV8gOyFdIHAhbwsgA0HQBmpBCGogGUEIaikCADcDACADQdAGakEQaiAZQRBqKAIANgIAIANBgAVqQQhqIANBmAZqQQhqKQMANwMAIANBhARqQQJqIANBvANqQQJqLQAAOgAAIAMgAykDmAY3A4AFIAMgAy8BvAM7AYQEIAMgGSkCADcD0AYgASgC1AEhWyADKAK4BCE7ICwhXCBYISsgXyFeCyAdIAMpA9AGNwIAIBwgAykDgAU3AgAgGyADLwGEBDsAACAvIANB0AZqQRBqKAIANgIAIAAgA0HQBmpBCGopAwA3AgAgHEEIaiADQYAFakEIaikDADcCACAbQQJqIANBhARqQQJqLQAAOgAAIAMgXTYCiAIgAyBvNwOAAiADIF46AJwCIBogAygAyAM2AAAgGkEDaiADQcgDakEDaigAADYAACADIFw6AKgCIAMgWzYCpAIgAyArNgKgAiADIDs2AugBIAMgbTcD4AEgA0GkBGogA0HgAWpBnLicARDxHgJAIAEtAOABQX1qDgUCAAAAAQALCyABKALcASEAIAEoAtgBISogA0GIBGogARDNJiADQQE2AuQBIANByL6cATYC4AEgA0IBNwLsASADQbMHNgLsBiADQQc6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEP4aIBlBCGogA0GIBGpBCGooAgA2AgAgGSADKQKIBDcCACAqIAAgA0GwBGoQ1xohOyABLQDgAUGiAUcNAyABIAEQlywQnxcMAwsgARCgCwJAAkAgAS0A4AFB/gBGDQAgAygCqAQiRyADKAKsBCJGQdAAbGohRCBHISwCQANAAkACQAJAAkAgLCIAIERGDQAgAEHQAGohLCAAKQMAInBCfnwibUICIG1CAlQbpw4DAQIDAQsgARCjIBpBACFDDAYLAkAgACkDECJtQgODQgBSDQAgbaciLSAtKAIAIi1BAWo2AgAgLUF/TA0ECyAAKAIsIS0gACgCKCEAIANB7ICAgHg2AuABIAMgbTcD6AEgASAAIC0gA0HgAWoQ1yMMAgsgACgCFCEtIAAoAhAhOwJAIAApAwgibUIDg0IAUg0AIG2nIgAgACgCACIAQQFqNgIAIABBf0wNAwsgA0HsgICAeDYC4AEgAyBtNwPoASABIDsgLSADQeABahDXIwwBCwJAIHCnQQFxRQ0AIAAoAhQhLSAAKAIQIQAgA0HwgICAeDYC4AEgASAAIC0gA0HgAWoQ1yMMAQtBkOCeAUGQ4J4BEIMoGiAAQQhqIS1BACgCnOCeAUUNAEEAITxBACgCkOCeASJDQXhqIUEgLSkDABDPICJtQhmIQoGChIiQoMCAAX4hcEEAKAKU4J4BIkIgbadxITsCQANAAkAgQyA7aikAACJxIHCFIm1Cf4UgbUL//fv379+//358g0KAgYKEiJCgwIB/gyJtUA0AA0AgLSBBIG16p0EDdiA7aiBCcUEDdGsQkQwNAyBtQn98IG2DIm1QRQ0ACwsgcSBxQgGGg0KAgYKEiJCgwIB/g1BFDQIgOyA8QQhqIjxqIEJxITsMAAsLIAAoAhQhLSAAKAIQITsCQCAAKQMIIm1CA4NCAFINACBtpyIAIAAoAgAiAEEBajYCACAAQX9MDQILIANB7ICAgHg2AuABIAMgbTcD6AEgASA7IC0gA0HgAWoQ1yMMAAsLAAsgA0HgAWogARC5BSADKALkASE7IAMoAuABIgBFDQMgAygCrAQhRiADKAKoBCFHIAAhQwsgO0EAIEMbIUIgASgC1AEiPEEIdiE9QQIhLCADKAKkBCE7IDEhQSAqIUQgKyFYDAgLIANBsARqEJMmDAELIAEoAtwBIQAgASgC2AEhKiADQfADaiABEM0mIANBATYC5AEgA0HIvpwBNgLgASADQgE3AuwBIANBswc2AuwGIANBAjoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQ/hogGUEIaiADQfADakEIaigCADYCACAZIAMpAvADNwIAICogACADQbAEahDXGiE7IAEtAOABQaIBRw0BIAEgARCXLBCfFwwBCyArIVgLIANBpARqEMwoDAMLIANBmgFqQQJqIANB1ANqQQJqLQAAOgAAIAMgAy8B3gE7AZ4BIAMgAy8B1AM7AZoBIAEoAtQBIUhC8ciVs5asnbb0ACAAEOQoIFJBCHYhPQJAICxFDQAgA0GgAWoQjSgLQQEhLCBRIUAgQSFXIEIhViBDIVUgRCFUIFIhPCBIIT4gKiFFIG4ibCFrIFMiSiE/DAULIANBsARqEI0oDAELQQkhLCAAITsMAgtBCSEsCyADQaABahCNKAsgLEEJRg0BID8hSiBrIWwgRSEqID4hSAsgA0HyAGpBAmogA0GaAWpBAmotAAA6AAAgAyADLwGeATsBdiADIAMvAZoBOwFyID1BCHQgPEH/AXFyITUgKiFJIEAhSyBBITQgQiFMIEMhMiBEIU0gRiE2IEchMyA7ISoMGQtBCiEsIDshKgwYCyAxIS4MFAsgAykDsAEQviEgESAxKQIANwIAICwgMUEIaikCADcCACAQICovAAA7AAAgLyAqQQJqLQAAOgAAIAMgLjYCsAEgAyAAOgDEAUEBITELAkAgAS0AkQFBIHFFDQAgAS0A4AFB/wFxQRdGDQILIANBGGogA0GwAWoQ6hUCQCADKAIYIgAgAygCHCIuQcC4nAFBBhDcJQ0AQQAhKiAAIC5BxricAUEFENwlRQ0ECyADQRBqIANBsAFqEOoVAkACQCADKAIQIgAgAygCFCIqQcC4nAFBBhDcJSIuRQ0AQQEhKgwBCyAAICpBxricAUEFENwlRQ0DQQIhKgsgAS0A4AEiAEECRg0AIABBD0YNAAJAAkAgASgCiAEgABDaDUUNACAAQf4ARw0BC0EAISogARDUCSIARQ0EIAAtAABB/gBHDQQLQQAhKiAuRQ0AIANBsARqIAEQpQ0gAygCsAQhLiADLQDEBCIAQQJGDQQgA0GIBGpBCGoiKiArKQIANwMAIANBhARqQQJqIisgMC0AADoAACADIAgpAgA3A4gEIAMgDy8AADsBhAQgAykDsAEQviEgESADKQOIBDcCACAsICopAwA3AgAgECADLwGEBDsAACAvICstAAA6AAAgAyAuNgKwASADIAA6AMQBQQEhKgwDCyADKQOwARC+IQwGCyAYIANBsAFqQRBqKQMANwMAIAYgJykDADcDACADIAMpA7ABNwOwBCADQQhqIAEgLSADQbAEakEAIDEQzAJBCkEGIAMoAghBAXEbISwgAygCDCEuDA8LQcu4nAFBKEH0uJwBEMweAAsgAS0A4AEiAEEHRg0BIABB/gBGDQIgASgC3AEhACABKALYASEqIANBmARqIAEQzSYgA0EBNgK0BCADQci+nAE2ArAEIANCATcCvAQgA0GzBzYC7AYgA0EHOgCgByADIANB6AZqNgK4BCADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAFaiADQbAEahD+GiAHQQhqIANBmARqQQhqKAIANgIAIAcgAykCmAQ3AgAgKiAAIANBsAVqENcaIS4gAS0A4AFBogFHDQAgASABEJcsEJ8XCyADKQOwARC+IQwLCyABEKALCyAYIAMpA7ABNwMAIBhBCGogJykDACJtNwMAIBhBEGogA0GwAWpBEGopAwA3AwAgA0IDNwOwBCADIG03A7gEIANByANqIANBsARqQYS5nAEQ8h4LQQEhKyAqQQFGDQQgAS0A4AEiAEEPRw0BICohMAsgASgC2AEhACABEKALIAEtAOABQfUARg0CIAEoAtwBIQAgASgC2AEh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MSFmDAQLIANBsAVqQRBqIgAgA0GABmpBEGopAwA3AwAgA0GwBWpBCGoiKiADQYAGakEIaikDADcDACADIAMpA4AGNwOwBSADKQPoBRC+ISADQegFakEQaiAAKQMANwMAIANB6AVqQQhqICopAwA3AwAgAyADKQOwBTcD6AVBASEACyABLQDgASEqCwJAICpB/wFxQfUARg0AIANBgAVqQRBqIANB6AVqQRBqKQMANwMAIANBgAVqQQhqIANB6AVqQQhqKQMANwMAIAMgAykD6AU3A4AFIAEoAtQBIWRCAiFtIAAhZQwGCyABEKALIANBsAVqIAFBABCzBSADKAKwBSFgIAMtAMQFIipBAkcNAwtCBSFtCyADKQPoBRC+ISBtQgVSDQQLQQohLCBgIS4MDQsgESAMKQIANwIAIBAgCikAADcAACARQQhqIAxBCGopAgA3AgAgEEEHaiAKQQdqKAAANgAAIAMgKjoAxAEgAyBgNgKwASADQYgHaiADQbABahCwGSADQYAFakEIaiADQYgHakEIaikDADcDACADQYAFakEQaiADQYgHakEQaikDADcDACADIAMpA4gHNwOABSADKQP4BSFyIAMoAvQFIWMgAygC8AUhYSADKALsBSFiIAMoAugFIWAgAygClAchZCAAIWULQgAhbQsgMSFmCyAOIAMpA4AFNwMAIA0gAygA+AQ2AAAgDkEIaiADQYAFakEIaikDADcDACAOQRBqIANBgAVqQRBqKQMANwMAIA1BA2ogA0H4BGpBA2ooAAA2AAAgAyByNwP4ASADIGM2AvQBIAMgYTYC8AEgAyBiNgLsASADIGU6AKACIAMgZDYCnAIgAyBmNgKYAiADIGA2AugBIAMgbTcD4AEgA0HIA2ogA0HgAWpBlLmcARDyHgJAIAEtAOABQX1qDgUCAAAAAQALCyABKALcASEAIAEoAtgBISogA0GYBWogARDNJiADQQE2ArQEIANByL6cATYCsAQgA0IBNwK8BCADQbMHNgK0ASADQQc6ALAGIAMgA0GwAWo2ArgEIAMgA0HoBmo2ArABIAMgA0GwBmo2AugGIANBsAVqIANBsARqEP4aIAdBCGogA0GYBWpBCGooAgA2AgAgByADKQKYBTcCACAqIAAgA0GwBWoQ1xohLiABLQDgAUGiAUcNByABIAEQlywQnxcMBwsgARCgCwsgMCExDAELIAEQoAsgA0GwBWogARClDSADKAKwBSEuIAMtAMQFIipBAkYNBCALIAwpAgA3AgAgCSAKLwAAOwAAIAtBCGogDEEIaikCADcCACAJQQJqIApBAmotAAA6AAAgAyAqOgDUBCADIC42AsAEIAMgADYCuAQgA0IENwOwBCADIAEoAtQBNgK8BCADQcgDaiADQbAEakGkuZwBEPIeIDAhKwsgAS0A4AEhAAsCQCAAQf8BcUH+AEYNACABKALcASEAIAEoAtgBISogA0GkBWogARDNJiADQQE2ArQEIANByL6cATYCsAQgA0IBNwK8BCADQbMHNgK0ASADQf4AOgCwBiADIANBsAFqNgK4BCADIANB6AZqNgKwASADIANBsAZqNgLoBiADQbAFaiADQbAEahD+GiAHQQhqIANBpAVqQQhqKAIANgIAIAcgAykCpAU3AgAgKiAAIANBsAVqENcaIS4gAS0A4AFBogFHDQMgASABEJcsEJ8XDAMLIAEQoAsCQCABLQDgAUHAAEYNACAIIAEQzSYgA0EQNgLEBCADQbS5nAE2AsAEIANBsICAgHg2ArAEIAEoAtgBIAEoAtwBIANBsARqENcaIS4gAS0A4AFBogFHDQMgASABEJcsEJ8XDAMLIANBsARqIAEQ9RpBGEEIEKIqIgBBEGogGCkDADcDACAAQQhqIAYpAwA3AwAgACADKQOwBDcDAEEAISoCQAJAAkAgAS0A4QENAAJAIAEtAOABIixB9wBGDQAgLEHwAEcNAQsgARCgCyADQbAEaiABEKUgIAMoArQEIS4gAygCsAQiKkEyRg0BAkBBOEUNACADQbAFaiAGQTj8CgAACyAqQQ5HDQRBFEEEEKIqIiogLjYCACAqIAMpA7AFNwIEICpBDGogA0GwBWpBCGopAwA3AgALIAEQwhIiLkUNASAqEMUsCyAAENonDAMLIAEoAtQBITIgAygC0AMhNiADKALMAyEzIAMoAsgDIS5BACEsIDEhNCAtITULICshNyA0ITggKiE5IDIhOiA1IWcgACFoIDYhaSAzIWoMBQtBy7icAUEoQcS5nAEQzB4AC0EKISwLIANByANqEM0oICxBCkYNACBqITMgaSE2IGghACBnITUgOiEyIDkhKiA4ITQgNyErDAILIC4hKgsgKBCNKEEKISwMAQsgA0HyAGpBAmogA0HbAWpBAmotAAA6AAAgAyADLwGaATsBdiADIAMvANsBOwFyICgQjSggKyFLICohTCAAIU0gLiEqCyAsQQpGDQIgA0H4AGpBAmoiLSADQfIAakECai0AADoAACADIAMvAXY7AXwgAyADLwFyOwF4AkAgAigCCCIrIAIoAgBHDQAgAkHcrpwBEOEdCyACKAIEICtBOGxqIgAgSzoAISAAIDQ6ACAgACBMNgIcIAAgMjYCGCAAIDU2AhQgACBNNgIQIAAgNjYCDCAAIDM2AgggACAqNgIEIAAgLDYCACAAIEo6ACQgACADLwF8OwEiIAAgAy8BeDsAJSAAQSdqIC0tAAA6AAAgACBINgE0IAAgSTYBMCAAIGw3ASggAiArQQFqNgIIDAALC0EAISoLIANBwAdqJAAgKgu6aQIWfwJ+IwBB4AFrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAIgNBdGoiBEEHIARBJkkbDiYAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJQALIAAgASkDADcDACAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMLgsgASgCCCEDIAEoAhQhBSABKAIQIQYgAkHgAGogASgCDCIHQQRBEBCQDyACKAJkIQggAigCYEEBRg0kIAIoAmghCQJAIAhFDQAgB0EEdCEKIAkhBCAIIQsDQCAKRQ0BAkAgAygCACIMQQJGDQAgA0EEaikCACEYIANBDGooAgAhDRD0JyEBIAJB4ABqIA0QQiABQThqIAJB4ABqQThqKQMANwMAIAFBMGogAkHgAGpBMGopAwA3AwAgAUEoaiACQeAAakEoaikDADcDACABQSBqIAJB4ABqQSBqKQMANwMAIAFBGGogAkHgAGpBGGopAwA3AwAgAUEQaiACQeAAakEQaikDADcDACABQQhqIAJB4ABqQQhqKQMANwMAIAEgAikDYDcDAAsgA0EQaiEDIAQgDDYCACAEQQxqIAE2AgAgBEEEaiAYNwIAIARBEGohBCAKQXBqIQogC0F/aiILDQALCyAAIAU2AhQgACAGNgIQIAAgBzYCDCAAIAk2AgggACAINgIEIABBDTYCAAwtCyABKAIQIQQgASgCFCEDIAJB4ABqIAFBBGoQogEgAEEUaiADNgIAIABBDjYCACAAIAIpAmA3AgQgAiAENgJsIABBDGogAkHoAGopAgA3AgAMLAsCQAJAIAEtABwiDUECRw0ADAELIAEoAhghCSABKAIUIQcgASgCECEIIAEpAwgiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNJAsgASgCICEEEPknIQEgAkEYaiAEEP8IIAJBwAFqIARBDGoQ6ghBgICAgHghDCAEKAI4IQUgBCgCNCEGIAQoAjAhDgJAIAQoAhhBgICAgHhGDQAgBCgCLCEDIAQpAiQhGSACQeAAaiAEQRhqELoKIAJBMGogGTcDACACQThqIAM2AgAgAiACKQJkNwMoIAIoAmAhDAsgBC0ARSEPIAQtAEQhEEEAIQpBACEDAkAgBCgCPCILRQ0AEPonIQMgCygCDCERIAsoAhAhEiACQeAAaiALEN4GIANBEGogEjYCACADIAIpAmA3AgAgAiARNgJsIANBCGogAkHgAGpBCGopAgA3AgALAkAgBCgCQCIERQ0AEPYnIQogBCkCBCEZIAQoAgAhCxD3JyEEIAJB4ABqIAsQdgJAQeAARQ0AIAQgAkHgAGpB4AD8CgAACyAKIBk3AgQgCiAENgIACyACQeAAakEIaiIEIAJBGGpBCGooAgA2AgAgAkH0AGogAkHAAWpBCGooAgA2AgAgAiACKQIYIhk3A2AgAiACKQLAATcCbCABQRBqIAJB4ABqQRBqKQMANwIAIAFBCGogBCkDADcCACABIBk3AgAgASAMNgIYIAEgDzoARSABIBA6AEQgASAKNgJAIAEgAzYCPCABIAU2AjggASAGNgI0IAEgDjYCMCABIAIpAyg3AhwgAUEkaiACQShqQQhqKQMANwIAIAFBLGogAkEoakEQaigCADYCACAAIAE2AiAgACANOgAcIAAgCTYCGCAAIAc2AhQgACAINgIQIAAgGDcDCCAAQQ82AgAMKwsgASkDCCEYIAEtABAhAxD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIAM6ABAgACAYNwMIIAAgBDYCBCAAQRA2AgAMKgsgASkCBCEYIAEvARAhAxD0JyEEIAJB4ABqIAEoAgwQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIAM7ARAgACAENgIMIAAgGDcCBCAAQRE2AgAMKQsgASkCDCEYIAEtABQhChD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqIgspAwA3AwAgBEEwaiACQeAAakEwaiIMKQMANwMAIARBKGogAkHgAGpBKGoiDSkDADcDACAEQSBqIAJB4ABqQSBqIggpAwA3AwAgBEEYaiACQeAAakEYaiIHKQMANwMAIARBEGogAkHgAGpBEGoiCSkDADcDACAEQQhqIAJB4ABqQQhqIgUpAwA3AwAgBCACKQNgNwMAEPQnIQMgAkHgAGogASgCCBBCIANBOGogCykDADcDACADQTBqIAwpAwA3AwAgA0EoaiANKQMANwMAIANBIGogCCkDADcDACADQRhqIAcpAwA3AwAgA0EQaiAJKQMANwMAIANBCGogBSkDADcDACADIAIpA2A3AwAgACAKOgAUIAAgGDcCDCAAIAM2AgggACAENgIEIABBEjYCAAwoCyABLQA8IQsgASgCNCEMIAEoAjAhDQJAIANBC0cNAAJAAkACQCABKAIEIggOAwABAgALIAEoAhghByABKAIUIQkgAkHAAWogAUEIahDCCSABLQAgIQUCQAJAIAEoAhwiBA0AQQAhCgwBCxD2JyEKIAQpAgQhGCAEKAIAIQYQ9ychBCACQeAAaiAGEHYCQEHgAEUNACAEIAJB4ABqQeAA/AoAAAsgCiAYNwIEIAogBDYCAAsgAigCyAEhBiACKQPAASEYDCkLIAEoAhghByABKAIUIQkgAkEoaiABQQhqEOACIAEtACAhBQJAAkAgASgCHCIEDQBBACEKDAELEPYnIQogBCkCBCEYIAQoAgAhBhD3JyEEIAJB4ABqIAYQdgJAQeAARQ0AIAQgAkHgAGpB4AD8CgAACyAKIBg3AgQgCiAENgIACyACKAIwIQYgAikDKCEYDCgLIAJB3gBqIAFBI2otAAA6AAAgAiABLwAhOwFcIAEtACAhBSABKAIcIQogASgCGCEHIAEoAhQhCSABKAIQIQYgASkDCCEYDCcLAkACQAJAAkACQAJAAkACQAJAAkACQCADDgsAAQIDBAUGBwgJCgALIAJB4ABqIAFBCGoQyAwgAkHeAGogAkH7AGotAAA6AAAgAiACLwB5OwFcIAItAHghBSACKAJ0IQogAigCcCEHIAIoAmwhCSACKAJoIQYgAikDYCEYIAIoAnwhDgwwCyACQeAAaiABQQhqEMAGIAJB3gBqIAJB+wBqLQAAOgAAIAIgAi8AeTsBXAwuCyACQeAAaiABQQhqEOsIIAJB3gBqIAJB+wBqLQAAOgAAIAIgAi8AeTsBXAwtCyACQeAAaiABQQRqEKwODCsLIAJB4ABqIAFBBGoQ9gMMKQsgAkHgAGogAUEEahCvDAwoCyACQeAAaiABQQRqEK8MDCcLIAJB4ABqIAFBBGoQrA4MJwsgAkHgAGogAUEEahCvDAwlCyACQeAAaiABQQRqEJALDCQLIAJB3gBqIAFBI2otAAA6AAAgAiABLwAhOwFcIAEpAyghGSABKAIkIQ4gAS0AICEFIAEoAhwhCiABKAIYIQcgASgCFCEJIAEoAhAhBiABKQMIIRggASgCBCEIDCYLIAEoAiQhCiABKAIgIQsQ9CchBCACQeAAaiABKAIoEEIgBEE4aiACQeAAakE4aiIHKQMANwMAIARBMGogAkHgAGpBMGoiCSkDADcDACAEQShqIAJB4ABqQShqIgUpAwA3AwAgBEEgaiACQeAAakEgaiIGKQMANwMAIARBGGogAkHgAGpBGGoiDikDADcDACAEQRBqIAJB4ABqQRBqIg8pAwA3AwAgBEEIaiACQeAAakEIaiIQKQMANwMAIAQgAikDYDcDAAJAAkACQAJAIAEoAggiDA4DAAECAAsgASgCFCEDIAEoAhAhDSABKAIcIQggASgCGCEHAkAgASkDECIYQgODQgBSDQAgGKciASABKAIAIgFBAWo2AgAgAUF/TA0iCyACIAM2AmAgAkEoaiEBDAILIAEoAhQhAyABKAIQIQ0gASgCHCEIIAEoAhghBwJAIAEpAxAiGEIDg0IAUg0AIBinIgEgASgCACIBQQFqNgIAIAFBf0wNIQsgAiADNgJgIAJBKGohAQwBCyABKAIUIQggASgCECENEPQnIQMgAkHgAGogASgCDBBCIANBOGogBykDADcDACADQTBqIAkpAwA3AwAgA0EoaiAFKQMANwMAIANBIGogBikDADcDACADQRhqIA4pAwA3AwAgA0EQaiAPKQMANwMAIANBCGogECkDADcDACADIAIpA2A3AwAgAkHgAGohAQsgASAINgIAIAAgDTYCECAAIAM2AgwgACAMNgIIIAAgBzYCGCAAIAQ2AiggACAKNgIkIAAgCzYCICAAQRQ2AgAgACACKAJgNgIUIAAgAigCKDYCHAwmC0EBIQQgASgCLCEDIAEoAighCiABKAIkIQsgASgCICEMAkACQCABKAIIQQFHDQAgASkDECEYIAFBDGoQrg8hAQwBCyABKAIcIQggASgCGCENQQAhBAJAIAEpAxAiGEIDg0IAUQ0ADAELIBinIgEgASgCACIHQQFqNgIAIAdBf0wNHgsgACADNgIsIAAgCjYCKCAAIAs2AiQgACAMNgIgIAAgCDYCHCAAIA02AhggACAYNwMQIAAgATYCDCAAIAQ2AgggAEEVNgIADCULIAEpAxAhGBD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqIgspAwA3AwAgBEEwaiACQeAAakEwaiIMKQMANwMAIARBKGogAkHgAGpBKGoiDSkDADcDACAEQSBqIAJB4ABqQSBqIggpAwA3AwAgBEEYaiACQeAAakEYaiIHKQMANwMAIARBEGogAkHgAGpBEGoiCSkDADcDACAEQQhqIAJB4ABqQQhqIgUpAwA3AwAgBCACKQNgNwMAEPQnIQMgAkHgAGogASgCCBBCIANBOGogCykDADcDACADQTBqIAwpAwA3AwAgA0EoaiANKQMANwMAIANBIGogCCkDADcDACADQRhqIAcpAwA3AwAgA0EQaiAJKQMANwMAIANBCGogBSkDADcDACADIAIpA2A3AwAQ9CchCiACQeAAaiABKAIMEEIgCkE4aiALKQMANwMAIApBMGogDCkDADcDACAKQShqIA0pAwA3AwAgCkEgaiAIKQMANwMAIApBGGogBykDADcDACAKQRBqIAkpAwA3AwAgCkEIaiAFKQMANwMAIAogAikDYDcDACAAIBg3AxAgACAKNgIMIAAgAzYCCCAAIAQ2AgQgAEEWNgIADCQLIAFBBGohCiABKAIkIQsgASgCICEMIAEoAhwhDQJAAkACQCABLQAYIgNBfWoiBEEBIARB/wFxQQNJG0H/AXEOAwABAgALIAJBCmogAUEbai0AADoAACACIAEvABk7AQgMHwsgAkEKaiABQRtqLQAAOgAAIAIgAS8AGTsBCAweCxD0JyEEIAJB4ABqIAEoAhAQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDAEEFIQMMHgsgASgCHCEKIAEoAhghCyABKAIUIQwQ9CchBCACQeAAaiABKAIQEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwBBgICAgHghAwJAIAEoAgRBgICAgHhGDQAgAkHgAGogAUEEahC3CCACKQJkIRggAigCYCEDCwJAAkAgASgCICIBDQBBACEBDAELIAEQmxYhAQsgACABNgIgIAAgCjYCHCAAIAs2AhggACAMNgIUIAAgBDYCECAAIBg3AwggACADNgIEIABBGDYCAAwiCyABKAIQIQQgASgCFCEDIAJB4ABqIAFBBGoQkgkgAEEUaiADNgIAIABBGTYCACAAIAIpAmA3AgQgAiAENgJsIABBDGogAkHoAGopAgA3AgAMIQsgASgCGCEEIAEoAhQhAyABKAIQIQoCQCABKQMIIhhCA4NCAFINACAYpyILIAsoAgAiC0EBajYCACALQX9MDRkLIAAgBDYCGCAAIAM2AhQgACAKNgIQIAAgGDcDCCAAQRo2AgAgACABLQAcOgAcDCALAkACQAJAAkACQAJAAkACQAJAIAEoAggiCg4HAAECAwQFBgALIAEoAhwhCCABKAIYIQQCQCABKQMQIhhCA4NCAFINACAYpyIDIAMoAgAiA0EBajYCACADQX9MDSALIAEoAiQhCyABKAIgIQMCQCABKQMgIhlQDQAgGUIDg1BFDQAgGaciASABKAIAIgFBAWo2AgAgAUF/TA0gCyAYQiCIpyEMIBinIQ0MBgsgASkDGCIYQiCIpyEIIAEpAxAiGUIgiKchDCABKAIkIQsgASgCICEDIAEoAgwhASAYpyEEIBmnIQ0MBgsgASkDGCIYQiCIpyEIIAEpAxAiGUIgiKchDCABKAIkIQsgASgCICEDIAEoAgwhASAYpyEEIBmnIQ0MBQsgASgCJCELIAEoAiAhAyABKQMYIRggASgCFCEMIAEoAhAhDQJAIAEpAyAiGVANACAZQgODUEUNACAZpyIBIAEoAgAiAUEBajYCACABQX9MDR0LIBhCIIinIQggGKchBAwDCyABKAIgIQQgASgCFCEMIAEoAhAhDRD4JyEDIAQtAAwhCyACQeAAaiAEQQRqKAIAIARBCGooAgAQ2BcgAyACKQJgNwIAIAIgCzoAbCADQQhqIAJB4ABqQQhqKQIANwIAIAEpAxgiGKchBAJAIBhQDQAgGEIDg1BFDQAgBCAEKAIAIgFBAWo2AgAgAUF/TA0cCyAYQiCIpyEIDAMLIAEoAiQhCyABKAIgIQMCQCABKQMQIhhCA4NCAFINACAYpyIEIAQoAgAiBEEBajYCACAEQX9MDRsLIAEpAxgiGachBAJAIBlCA4NCAFINACAEIAQoAgAiAUEBajYCACABQX9MDRsLIBlCIIinIQggGEIgiKchDCAYpyENDAELIAEoAiQhCyABKAIgIQMCQCABKQMQIhhCA4NCAFINACAYpyIEIAQoAgAiBEEBajYCACAEQX9MDRoLIAEpAxgiGachBAJAIBlCA4NCAFINACAEIAQoAgAiAUEBajYCACABQX9MDRoLIBlCIIinIQggGEIgiKchDCAYpyENCwsgACALNgIkIAAgAzYCICAAIAE2AgwgACAKNgIIIABBGzYCACAAIAitQiCGIASthDcDGCAAIAytQiCGIA2thDcDEAwfCyABKQIcIRggAkHgAGogAUEEahCSCSACQeAAakEMaiABKAIUIAEoAhgQ9QggAEEcaiAYNwIAIABBHDYCACAAIAIpAmA3AgQgAEEMaiACQegAaikCADcCACAAQRRqIAJB8ABqKQIANwIADB4LIAEoAhQhCiABKAIQIQsgASgCDCEMEPQnIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqIg0pAwA3AwAgBEEIaiACQeAAakEIaiIIKQMANwMAIAQgAikDYDcDAAJAAkAgASgCGCIDDQBBACEHDAELIAMQmxYhBwsgASgCCCEDEIIoIQEgAykCGCEYIAJB4ABqIAMQkgkgAkHsAGogA0EQaigCACADQRRqKAIAEPUIIAFBGGogGDcCACABIAIpAmA3AgAgAUEIaiAIKQIANwIAIAFBEGogDSkCADcCACAAIAc2AhggACAKNgIUIAAgCzYCECAAIAw2AgwgACABNgIIIAAgBDYCBCAAQR02AgAMHQsgASgCCCEDIAEoAhwhByABKAIYIQkgASgCFCEFIAJB4ABqIAEoAgwiDUEIQSgQkA8gAigCZCEMIAIoAmBBAUYNFSACKAJoIQgCQCAMRQ0AIA1BKGwhCiAIIQQgDCELA0AgCkUNASACQeAAaiADELwCIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIARBKGohBCAKQVhqIQogA0EoaiEDIAtBf2oiCw0ACwsQ/ichBEGAgICAeCELAkACQCABKAIQIgooAgBBgICAgHhHDQAQ9CchAyACQeAAaiAKKAIEEEIgA0E4aiACQeAAakE4aikDADcDACADQTBqIAJB4ABqQTBqKQMANwMAIANBKGogAkHgAGpBKGopAwA3AwAgA0EgaiACQeAAakEgaikDADcDACADQRhqIAJB4ABqQRhqKQMANwMAIANBEGogAkHgAGpBEGopAwA3AwAgA0EIaiACQeAAakEIaikDADcDACADIAIpA2A3AwAMAQsgCikCDCEYIAooAhQhAyACQeAAaiAKELoKIAIgAzYCdCACIBg3AmwgAkEwaiACQfAAaikCADcDACACIAIpAmg3AyggAigCYCELIAIoAmQhAwsgBCADNgIEIAQgCzYCACAEIAIpAyg3AgggBEEQaiACQTBqKQMANwIAIAEtACkhCyABLQAoIQZBACEDQQAhCgJAIAEoAiAiDkUNACAOEJwWIQoLAkAgASgCJCIBRQ0AIAEQuhohAwsgACALOgApIAAgBjoAKCAAIAM2AiQgACAKNgIgIAAgBzYCHCAAIAk2AhggACAFNgIUIAAgBDYCECAAIA02AgwgACAINgIIIAAgDDYCBCAAQR42AgAMHAsCQAJAIAEtABwiDUECRw0ADAELIAEoAhghCSABKAIUIQcgASgCECEIIAEpAwgiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNFAsQgSghBCABKAIgIgEoAiwhBSABKAIoIQYgASgCJCEOIAJBwAFqIAEQ6gggAkEoaiABQQxqEHVBACEKQQAhAwJAIAEoAjAiC0UNABD0JyEDIAJB4ABqIAsQQiADQThqIAJB4ABqQThqKQMANwMAIANBMGogAkHgAGpBMGopAwA3AwAgA0EoaiACQeAAakEoaikDADcDACADQSBqIAJB4ABqQSBqKQMANwMAIANBGGogAkHgAGpBGGopAwA3AwAgA0EQaiACQeAAakEQaikDADcDACADQQhqIAJB4ABqQQhqKQMANwMAIAMgAikDYDcDAAsgAS0APCEPAkAgASgCNCILRQ0AEPonIQogCygCDCEMIAsoAhAhECACQeAAaiALEN4GIApBEGogEDYCACAKIAIpAmA3AgAgAiAMNgJsIApBCGogAkHgAGpBCGopAgA3AgALAkACQCABKAI4IgwNAEEAIQsMAQsQ+ichCyAMKAIMIRAgDCgCECERIAJB4ABqIAwQ0QwgC0EQaiARNgIAIAsgAikCYDcCACACIBA2AmwgC0EIaiACQeAAakEIaikCADcCAAsgAkHgAGpBGGoiDCABQRhqENAFIAJB4ABqQQhqIgEgAkHAAWpBCGooAgA2AgAgAkH0AGogAkEoakEIaigCADYCACACIAIpAsABIhk3A2AgAiACKQIoNwJsIARBIGogAkHgAGpBIGooAgA2AgAgBEEYaiAMKQMANwIAIARBEGogAkHgAGpBEGopAwA3AgAgBEEIaiABKQMANwIAIAQgGTcCACAEIA86ADwgBCALNgI4IAQgCjYCNCAEIAM2AjAgBCAFNgIsIAQgBjYCKCAEIA42AiQgACAENgIgIAAgDToAHCAAIAk2AhggACAHNgIUIAAgCDYCECAAIBg3AwggAEEfNgIADBsLIAEoAgghBCABKAIEIQMCQAJAIAEoAgwNAEEAIQoMAQsgAUEMahCuDyEKCyAAIAo2AgwgACAENgIIIAAgAzYCBCAAQSA2AgAgACABLQAQOgAQDBoLIAAgASkDADcDACAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMGQsgASkDCCEYEPQnIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgGDcDCCAAIAQ2AgQgAEEiNgIADBgLIAEpAwghGBD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIBg3AwggACAENgIEIABBIzYCAAwXCyABKAIcIQQgASgCGCEDIAJB4ABqIAFBIGoQpwggASgCFCEKIAEoAhAhCwJAIAEpAwgiGEIDg0IAUg0AIBinIgEgASgCACIBQQFqNgIAIAFBf0wNDwsgACACKQNgNwMgIABBMGogAkHwAGopAwA3AwAgAEEoaiACQegAaikDADcDACAAIAQ2AhwgACADNgIYIAAgCjYCFCAAIAs2AhAgACAYNwMIIABBJDYCAAwWCyABKAIUIQQgASgCECEDIAEoAiwhCiABKAIoIQsCQCABKQMIIhhCA4NCAFINACAYpyIMIAwoAgAiDEEBajYCACAMQX9MDQ4LIAEoAiQhDCABKAIgIQ0CQCABKQMYIhlCA4NCAFINACAZpyIBIAEoAgAiAUEBajYCACABQX9MDQ4LIAAgCjYCLCAAIAs2AiggACAMNgIkIAAgDTYCICAAIBk3AxggACAENgIUIAAgAzYCECAAIBg3AwggAEElNgIADBULIAAgASkDADcDACAAQThqIAFBOGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMFAsgASgCBCEEEPsnIQEgBCgCBCEHIAQoAgAhCQJAAkACQAJAAkAgBC0AbEF9aiIDQQEgA0H/AXFBA0kbQf8BcQ4DAAECAAsgBCgCUCEIIAQoAkwhBSAEKAJIIQYCQCAEKQNAIhhCA4NCAFINACAYpyIDIAMoAgAiA0EBajYCACADQX9MDRALIAQtAFQhDUEAIRJBAyETDAILIAQoAlQhDSAEKAJQIQggAkHgAGogBEHYAGoQpwggBCgCTCEFIAQoAkghBgJAIAQpA0AiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNDwsgAkHaAGogAkH3AGotAAA6AAAgAiACLwB1OwFYIA1BCHYhEiACLQB0IRMgAigCcCEUIAIoAmwhDyACKAJoIQ4gAigCZCERIAIoAmAhEAwCCyAEKAJMIQUgBCgCSCEGIAQoAmQhDyAEKAJgIQ4CQCAEKQNAIhhCA4NCAFINACAYpyIDIAMoAgAiA0EBajYCACADQX9MDQ4LIAQoAlwhESAEKAJYIRAgBCkDUCIZpyEIAkAgGUIDg0IAUg0AIAggCCgCACIDQQFqNgIAIANBf0wNDgsgGUIoiKchEiAZQiCIpyENQQUhEwsLIAQoAnQhFSAEKAJwIRYgAkHAAWogBEH8AGoQqwIgBC0AiAEhFwJAAkAgBCgCeCIKDQBBACEDDAELEPonIQMgCigCDCELIAooAhAhDCACQeAAaiAKENEMIANBEGogDDYCACADIAIpAmA3AgAgAiALNgJsIANBCGogAkHgAGpBCGopAgA3AgALIAJBGGogBEGQAWoQlApBBiEKAkAgBC0APEEGRg0AIAQoAgwhDCAEKAIIIQsgAkHgAGogBEEQahClBiACQShqQShqIAJB4ABqQShqKAIANgIAIAJBKGpBIGogAkHgAGpBIGopAwA3AwAgAkEoakEYaiACQeAAakEYaikDADcDACACQShqQRBqIAJB4ABqQRBqKQMANwMAIAJBKGpBCGogAkHgAGpBCGopAwA3AwAgAkEmaiACQY8Bai0AADoAACACIAIpA2A3AyggAiACLwCNATsBJCACLQCMASEKCyACQe8AaiIEIAJBGGpBCGooAgA2AAAgAiACKQIYNwBnIAEgDDYCDCABIAs2AgggASAHNgIEIAEgCTYCACABIAIpAyg3AxAgAUEYaiACQShqQQhqKQMANwMAIAFBIGogAkE4aikDADcDACABQShqIAJBKGpBGGopAwA3AwAgAUEwaiACQShqQSBqKQMANwMAIAFBOGogAkEoakEoaigCADYCACABIAo6ADwgASATOgBsIAEgFDYCaCABIA82AmQgASAONgJgIAEgETYCXCABIBA2AlggASASQQh0IA1B/wFxcq1CIIYgCK2ENwNQIAEgBTYCTCABIAY2AkggASAYNwNAIAEgAi8BJDsAPSABQT9qIAJBJGpBAmotAAA6AAAgASACLwFYOwBtIAFB7wBqIAJB2ABqQQJqLQAAOgAAIAEgAzYCeCABIBU2AnQgASAWNgJwIAFBhAFqIAJBwAFqQQhqKAIANgIAIAEgAikCwAE3AnwgASAXOgCIASABQZgBaiAEKAAANgAAIAFBkQFqIAJB4ABqQQhqKQAANwAAIAEgAikAYDcAiQEgAEEnNgIAIAAgATYCBAwTCyABKAIQIQQgASkCFCEYIAEoAhwhAyACQeAAaiABQQRqEJQKIAJB+ABqIgogAzYCACAAQRRqIBg3AgAgAEEoNgIAIAAgAikCYDcCBCAAQSRqIAEoAiQ2AgAgAiAENgJsIABBDGogAkHoAGopAgA3AgAgAiABKAIgNgJ8IABBHGogCikCADcCAAwSCyABKQIMIRgQ9CchBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgASgCCCEDEPcnIQEgAkHgAGogAxB2AkBB4ABFDQAgASACQeAAakHgAPwKAAALIAAgGDcCDCAAIAE2AgggACAENgIEIABBKTYCAAwRCyABKQMIIRgQ9CchBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAYNwMIIAAgBDYCBCAAQSo2AgAMEAsgASkDCCEYEPQnIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgGDcDCCAAIAQ2AgQgAEErNgIADA8LIAEpAgwhGBD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACABKAIIIQMQ9ychASACQeAAaiADEHYCQEHgAEUNACABIAJB4ABqQeAA/AoAAAsgACAYNwIMIAAgATYCCCAAIAQ2AgQgAEEsNgIADA4LIAEpAgwhGBD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqIgopAwA3AwAgBCACKQNgNwMAIAEoAgghAxD6JyEBIAMoAgwhCyADKAIQIQwgAkHgAGogAxDRDCABQRBqIAw2AgAgASACKQJgNwIAIAIgCzYCbCABQQhqIAopAgA3AgAgACAYNwIMIAAgATYCCCAAIAQ2AgQgAEEtNgIADA0LIAEpAgwhGBD0JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACABKAIIIQMQ9ychASACQeAAaiADEHYCQEHgAEUNACABIAJB4ABqQeAA/AoAAAsgACAYNwIMIAAgATYCCCAAIAQ2AgQgAEEuNgIADAwLIAEoAhQhBCABKAIQIQMCQCABKQMIIhhCA4NCAFINACAYpyIBIAEoAgAiAUEBajYCACABQX9MDQQLIAAgBDYCFCAAIAM2AhAgACAYNwMIIABBLzYCAAwLCyABLQAQIQwgASgCDCENIAEoAgghCBD1JyEEQQMhCwJAAkAgASgCBCIDKAIAQQNHDQAgAygCHCEHIAMoAhghCSADKAIUIQUQ9CchCiACQeAAaiADKAIQEEIgCkE4aiACQeAAakE4aikDADcDACAKQTBqIAJB4ABqQTBqKQMANwMAIApBKGogAkHgAGpBKGopAwA3AwAgCkEgaiACQeAAakEgaikDADcDACAKQRhqIAJB4ABqQRhqKQMANwMAIApBEGogAkHgAGpBEGopAwA3AwAgCkEIaiACQeAAakEIaiIGKQMANwMAIAogAikDYDcDACACQdABaiADQQRqELcIAkAgAygCICIDDQBBACEBDAILEPonIQEgAygCDCEOIAMoAhAhDyACQeAAaiADENEMIAFBEGogDzYCACABIAIpAmA3AgAgAiAONgJsIAFBCGogBikCADcCAAwBCyADKAIcIQcgAygCGCEJEPQnIQEgAkHgAGogAygCIBBCIAFBOGogAkHgAGpBOGopAwA3AwAgAUEwaiACQeAAakEwaikDADcDACABQShqIAJB4ABqQShqKQMANwMAIAFBIGogAkHgAGpBIGopAwA3AwAgAUEYaiACQeAAakEYaikDADcDACABQRBqIAJB4ABqQRBqKQMANwMAIAFBCGogAkHgAGpBCGopAwA3AwAgASACKQNgNwMAIAJB4ABqIAMQ+QcgAkHQAWpBCGogAkHsAGooAgA2AgAgAiACKQJkNwPQASACKAJgIQsgAigCcCEKIAIoAnQhBQsgBCALNgIAIAQgAikD0AE3AgQgBCABNgIgIAQgBzYCHCAEIAk2AhggBCAFNgIUIAQgCjYCECAAIAw6ABAgACANNgIMIAAgCDYCCCAAIAQ2AgQgAEEwNgIAIARBDGogAkHYAWooAgA2AgAMCgsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwJCyAIIAIoAmhB9PGaARCFKQsACyAMIAIoAmhB9PGaARCFKQALIAEoAhQhCCABKAIQIQQLIAJBDGogChC3CAJAAkAgASgCKCIBDQBBACEBDAELIAEQmxYhAQsgACACKQIMNwIEIAAgAzoAGCAAIAg2AhQgACAENgIQIAAgAi8BCDsAGSAAIAE2AiggACALNgIkIAAgDDYCICAAIA02AhwgAEEXNgIAIABBDGogAkEUaigCADYCACAAQRtqIAJBCmotAAA6AAAMBAsgAigCbCEGIAIpAmQhGCACKAJgIQgMAgsgAikCZCEYIAIoAmAhCAwBCyACLQB4IQUgAigCdCEKIAIoAnAhByACKAJsIQkgAigCaCEGIAIpA2AhGCACKAJ8IQ4gAikDgAEhGQsQ9CchBCACQeAAaiABKAI4EEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAFOgAgIAAgCjYCHCAAIAc2AhggACAJNgIUIAAgBjYCECAAIBg3AwggACAINgIEIAAgAzYCACAAIAs6ADwgACAENgI4IAAgDDYCNCAAIA02AjAgACAZNwMoIAAgDjYCJCAAIAIvAVw7ACEgAEEjaiACQd4Aai0AADoAAAsgAkHgAWokAAuMaAIlfwd+IwBB4ARrIgIkAEEAIQMCQAJAIAEpAwAiJ6ciBA0AIAAtABsNACABKAIcIQUgASgCIEE4bCEGA0AgBkUNASAFIAZBSGoiBmoiBygCACIIQQVLDQALIAdBOGoiBiAIQQJ0IgVBrNmeAWooAgBqKAIAIQkgBiAFQcTZngFqKAIAaigCACEKQQEhAwwBCwsCQCAALQAYIgsNACAALQAaIQYgAkGQBGpBEGoiBUEAKQP4g54BIic3AwAgAkGQBGpBGGoiB0EAKQOAhJ4BIig3AwAgAkGQBGpBCGoiCCAAQQhqIgwpAgA3AwAgACkCACEpIAAgJzcCACAMICg3AgAgAiApNwOQBCACQagBakEIaiAoNwMAIAJBqAFqQRBqICc3AwAgAkGoAWpBGGogKDcDACACQQhqQQhqICg3AwAgAkEIakEYaiAoNwMAIAJBCGpBEGogJzcDACACICc3A6gBIAJBgANqQQhqIgwgKDcDACACQYADakEQaiINICc3AwAgAkGAA2pBGGoiDiAoNwMAIAJBADoASCACICc3AwggAiAnNwOAAyACQQhqQThqIg8gKDcDACACQQhqQTBqIhAgJzcDACACQQhqQShqIhEgKDcDACACICc3AyggAiAGOgDAAyAOIAcpAwA3AwAgDSAFKQMANwMAIAwgCCkDADcDACACIAIpA5AENwOAAyACQYADakE4aiAPKQMANwMAIAJBgANqQTBqIBApAwA3AwAgAkGAA2pBKGogESkDADcDACACIAIp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AELx5JWL166aueUANwMIIABBGjYCACACQgA3ApgDIAJBAzoAlAMgAkEANgKQAyACQgA3AqADIAJCADcCiAMgAkKAgICAwAA3AoADIAJBgANqEOMeQQBBBBCbLQJAIAYoAgQiBC0AQA0AQQUhIUEXISRBACERDAULIAQoAjQhICAEKAIwISECQCAEKQMoIitCA4NCAFINACArpyIEIAQoAgAiBEEBajYCACAEQX9MDQ0LQQAtAKDwngEaQcAAEH0iEUUNDCARQQA6ABwgESAUNgIYIBFCADcDECARQvHK4YP3zZy68wA3AwggEUEaNgIAQQAtAKDwngEaQcAAEH0iBEUNDCAEQgA3AjAgBEEFOgAYIAQgADYCEEEBISQgBEEBNgIMIAQgEDYCCCAEQpeAgIAQNwMAIARCADcCHEEAIRAgBEEAOgA8IAQgJTYCOCAEQSRqQgA3AgAgIUEIdiEfICtCIIinISYgK6chACAEISUMBAsgBEUNCyAEQgA3AgxBASEeIARBATYCCCAEIAA2AgQgBEEBNgIAQQIhACAEQQI6ABkgBEERakIANwAADAQLIAJBgANqQTBqIAZBMGopAwA3AwAgAkGAA2pBKGogBkEoaikDADcDACACQYADakEgaiAGQSBqKQMANwMAIAsgBkEYaikDADcDACACQYADakEQaiAGQRBqIgApAwA3AwAgAkGAA2pBCGogBkEIaiIEKQMANwMAIARCATcCACACIAYpAwA3A4ADIAZBCTYCACAAQQA2AgAgBkEcaiACQZACakEIaikCADcCACAGQSRqIAJBkAJqQRBqKQIANwIAIAZBLGogAkGQAmpBGGopAgA3AgAgBkE0aiACQZACakEgaigCADYCACAGIAIpApACNwIUIAIoAoADIgZBCUYNASAHIAgpAgA3AgAgB0EwaiAIQTBqKAIANgIAIAdBKGogCEEoaikCADcCACAHQSBqIAhBIGopAgA3AgAgB0EYaiAIQRhqKQIANwIAIAdBEGogCEEQaikCADcCACAHQQhqIAhBCGopAgA3AgAgAiAGNgKQBAJAAkAgBkEHRw0AIAIoApQEIgZFDQECQCANDQAgAikDmAQhJyAGIQ0MCAsgBhC4ASAGQcAAQQgQrBYMBwsgAkGQBGoQtwULQZSimwEQziwAC0HEgJwBQcgAQeyBnAEQky4ACyACQYgDahDuA0GEopsBEM4sAAsgFyACLwCQAjsAACACIB87AJkDIAJBgANqQRtqIB9BEHY6AAAgF0ECaiACQZACakECai0AADoAACACQQA6ALwDIAIgJTYCuAMgAkIANwOwAyACIBE2AqgDIAJCADcDoAMgAiAgNgKcAyACICE6AJgDIAIgJjYClAMgAiAANgKQAyACQQE2AowDIAIgEDYCiAMgAkEBNgKEAyACICQ2AoADIAYoAgQiAEEwaiIEKQMAISsgBEIANwMAIAApAyghLCAAQgE3AyggAEE4aikDACEtIABBNWpCADcAACAVICw3AgAgFUEIaiArNwIAIBVBEGogLTcCACACQYADahDPECEEQQAtAKDwngEaQTgQfSIARQ0HIABBADYCACAAIAIpApAENwIEIABBADoANCAAIAQ2AjAgAEIANwMoIABBADYCICAAQQxqIB4pAgA3AgAgAEEUaiAcKQIANwIAIABBHGogHSgCADYCAEEAQQgQny1BAC0AoPCeARogBigCBCIEKAIkIRAgBCgCICERQRwQfSIERQ0HIARBgAQ7ARggBEEANgIUIAQgEDYCECAEIBE2AgwgBEEBNgIIIAQgADYCBCAEQQE2AgACQAJAIAYoAgBBCUYNACAGELcFDAELIAZBCGoQ7gMLIAZBCTYCACAGQRE2AgggBiAENgIUIAZBAjYCECAGIAIpAoADNwIYIAZBIGogIikCADcCACAGQShqICMpAgA3AgAgBkEwaiALKQIANwIADAILAkACQCAGKAIAQQlGDQAgBhC3BQwBCyAGQQhqEO4DCyAGIB42AgAgBiAENgIMIAYgADYCCCAGIAQ2AhQgBkECNgIQIAYgEDYCNCAGIBE2AjAgBiACKQKAAzcCGCAGQSBqIAJBgANqQQhqKQIANwIAIAZBKGogAkGAA2pBEGopAgA3AgAgBUEAQTggBSAMRiIGG2ohAEEBIRsgBkUNAgwDCwJAAkAgBigCAEEJRg0AIAYQtwUMAQsgBkEIahDuAwsgBiAeNgIAIAYgBDYCDCAGIAA2AgggBiAENgIUIAZBAjYCECAGIBA2AjQgBiARNgIwIAYgAikCgAM3AhggBkEgaiAcKQIANwIAIAZBKGogHSkCADcCAAsgBUE4aiEAIAUgDEcNAAtBACEGIBtBAXFFDQELQQAtAKDwngEaQcgAEH0iB0UNAgJAIChCA4NCAFINACAopyIGIAYoAgAiBkEBajYCACAGQX9MDQMLIAIQliA3A4ACIAJCADcDiAIgB0EIaiACQYACahD+JSAHQgA3AzggB0EAOgA0IAcgEjYCMCAHQgA3AyggByAoNwMgIAdCADcDACAHQcAAakEAOgAAQQAtAKDwngEaQRgQfSIERQ0CIARCADcDCCAEQuHavaPWjtsyNwMAIARBEGpCADcDAEEALQCg8J4BGkEQEH0iCEUNAkEALQCg8J4BGkHAABB9IgVFDQIgBUEBOgAMIAVBADYCCCAFQiE3AwBBAC0AoPCeARpBwAAQfSIGRQ0CIAZCADcDGCAGQrHqyeMGNwMQIAZBADYCCCAGQRQ2AgAgBiAFNgIoIAZBIGpCADcDACAIIAY2AgwgCEEANgIAQQAtAKDwngEaQcAAEH0iBkUNAiAGQQA6ABwgBiASNgIYIAZCADcCECAGICg3AgggBkEaNgIAIAJBBToAmAMgAiAGNgKQAyACQQE2AowDIAIgCDYCiAMgAkEBNgKEAyACQgA3AqgEIAJBAzoApAQgAkEANgKgBCACQgA3ArAEIAJCADcCmAQgAkKAgICAwAA3ApAEIAJBpANqQgA3AgAgAkIANwKcAyACQRc2AoADIAJBkARqEOMeQQBBBBCbLQJAICpCAFINACAWIBYoAgAiBkEBajYCACAGQX9MDQMLIAJBgANqEM8QIQVBAC0AoPCeARpBOBB9IgZFDQIgBkEAOgA0IAYgBTYCMCAGQgA3AyggBkEANgIgIAZBADoAHCAGIBM2AhggBkIANwIQIAYgKTcCCCAGQQA2AgBBAEEIEJ8tQQAtAKDwngEaQRwQfSIARQ0CIABCADcCDCAAQQE2AgggACAGNgIEIABBATYCACAAQQI6ABkgAEERakIANwAAIAJB8gFqIAJBkARqQQhqKQIANwEAIAJB6AFqQRJqIAJBkARqQRBqKAIANgEAIAJBkAJqQQhqIAJBgANqQQhqKQIANwMAIAJBkAJqQRBqIhAgAkGAA2pBEGopAgA3AwAgAkGQAmpBGGoiESACQYADakEYaikCADcDACACIAIpApAENwHqASACIAIpAoADNwOQAiABKAIcIQsCQAJAIAEoAiAiDw0AQQAhBQwBCyALIA9BOGxqIQxBACEFIAshBgNAIAYoAgBBCUcNASAGQQhqKAIAQRJHDQEgBkEMaigCACIIKAIAQRtHDQEgCCgCCA0BIAVBAWohBSAGQThqIgYgDEcNAAsgDyEFCyACIAUgBSAPQfyumwEQ1B8gAkGiA2pCADcBACABIAIoAgAiBTYCICACQbIDaiACQegBakEIaikBADcBACACQYADakE4aiACQfYBaikBADcBACACIA42AoAEIAJCADcCnAMgAiAENgKYAyACQQE2ApQDIAIgBzYCkAMgAkKAgICAEDcDiAMgAkKAgICAIDcDgAMgAiACKAIEIgY2AoQEIAIgAikB6AE3AaoDIAIgDyAGayIHNgKIBCACIAsgBkE4bGo2AvwDIAIgCyAFQThsaiIINgL4AyACQeADaiACQZACakEIaikDADcDACACQegDaiAQKQMANwMAIAJB8ANqIBEpAwA3AwAgAiAANgLUAyACQQI2AtADIAJBETYCyAMgAkEJNgLAAyACIAIpA5ACNwPYAwJAIAUgBkYNACAGQThsIAVBOGxrIQAgAkGQBGpBCGohESACQZAEakEEciIHQTBqIQwgB0EoaiEEIAdBIGohCyAHQRhqIQ8gB0EQaiEQAkADQCACIAgiBkE4aiIINgL4AyAGKAIAIgVBCkYNASAMIAZBNGooAgA2AgAgBCAGQSxqKQIANwIAIAsgBkEkaikCADcCACAPIAZBHGopAgA3AgAgECAGQRRqKQIANwIAIAdBCGogBkEMaikCADcCACAHIAZBBGopAgA3AgAgAiAFNgKQBAJAAkAgBUEJRg0AAkACQAJAAkACQAJAAkACQAJAIAUOCAECAwQFBgcIAAsgAikDoAQiK0IDg0IAUg0JICunIgYgBigCACIFQX9qNgIAIAVBAUcNCSAGIAYoAhAQwCQMCQsgAigCmAQiBiACKAKcBBDvCCACKAKUBCAGEKEtIAIoAqAEIgYQwRMgBkEYQQgQrBYgAigCrAQiBkUNCCAGEJkXIAYoAgAgBkEEaigCABCXLSAGQRRBBBCsFgwICyAREIgFDAcLIAIoApgEIgYgAigCnAQQ+AcgAigClAQgBhCiLQJAIAIoAqgEIgZFDQAgBhDBEyAGQRhBCBCsFgsgAigCrAQiBkUNBiAGEJkXIAYoAgAgBkEEaigCABCXLSAGQRRBBBCsFgwGCwJAAkACQCACKAKYBA4CAQIACyACKAKcBBD6DgwHCwJAIAItALQEQQJGDQAgAikDoAQiK0IDg0IAUg0AICunIgYgBigCACIFQX9qNgIAIAVBAUcNACAGIAYoAhAQwCQLIAIoArgEEJINDAYLAkAgAi0AtARBAkYNACACKQOgBCIrQgODQgBSDQAgK6ciBiAGKAIAIgVBf2o2AgAgBUEBRw0AIAYgBigCEBDAJAsgAigCuAQQ0Q0MBQsgAigClAQiBhCyASAGQcAAQQgQrBYMBAsgAigCoAQhBiACKAKUBCIFEMETIAVBGEEIEKwWIAZFDQMgBhCZFyAGKAIAIAZBBGooAgAQly0gBkEUQQQQrBYMAwsCQCACKAKUBCIGKQMoIitCA4NCAFINACArpyIFIAUoAgAiFUF/ajYCACAVQQFHDQAgBSAFKAIQEMAkCwJAIAYpAwBCAFINACAGQQhqEOgQIAZByABBCBCsFgwDCyAGEMETIAZByABBCBCsFgwCCyACKAKUBCIGELIBIAZBwABBCBCsFgwBCyAREO8DCyAAQUhqIgANAAsLIAIoAogEIQcLIAJB+ANqIQUgAkKIgICAgAE3A/gDIAIoAoAEIQYCQAJAAkAgBw0AIAYgAigChAMgAigCgANrEJ8lIAIgBikCBEIgiTcClAQgAiAGQQhqNgKQBCACQYADaiACQZAEahC2FAwBCyAGIAIoAoQEIAJBgANqEN0JRQ0AAkACQCACKAKEAyIHIAIoAoADIgZHDQAgBiEHDAELIAUgByAGaxCyFCACKAKABCACKAKEBCACQYADahDdCUUNASACKAKEAyEGIAIoAoADIQcLIAJBkARqIAYgB2siB0EIQTgQkA8gAigClAQhBiACKAKQBEEBRg0BIAJBADYC0AQgAiACKAKYBDYCzAQgAiAGNgLIBCACQcgEaiAHEJ8lIAIgAikCzARCIIk3AtgEIAIgAkHIBGpBCGo2AtQEIAJBgANqIAJB1ARqELYUIAIgAigCyAQ2ApgEIAIgAigCzAQiBjYCkAQgAiAGNgKUBCACIAYgAigC0AQiB0E4bGo2ApwEAkAgB0UNACAFIAcQshQgAigCgAQgAigChAQgAkGQBGoQ1QcaCyACQZAEahDjBAsgBRDCAwJAIAIoAoQDIgUgAigCgAMiBkYNACAFIAZrIQUgBkE4bCACQYADampBGGohBgNAAkACQCAGQXBqKAIAIgdBCUYNAAJAAkACQAJAAkACQAJAAkACQCAHDggBAgMEBQYHCAALIAYpAwAiK0IDg0IAUg0JICunIgcgBygCACIIQX9qNgIAIAhBAUcNCSAHIAcoAhAQwCQMCQsgBkF4aigCACIHIAZBfGooAgAQ7wggBkF0aigCACAHEKEtIAYoAgAiBxDBEyAHQRhBCBCsFiAGQQxqKAIAIgdFDQggBxCZFyAHKAIAIAdBBGooAgAQly0gB0EUQQQQrBYMCAsgBkF4ahCEBQwHCyAGQXhqKAIAIgcgBkF8aigCABD4ByAGQXRqKAIAIAcQoi0CQCAGQQhqKAIAIgdFDQAgBxDBEyAHQRhBCBCsFgsgBkEMaigCACIHRQ0GIAcQmRcgBygCACAHQQRqKAIAEJctIAdBFEEEEKwWDAYLAkACQAJAIAZBeGooAgAOAgECAAsgBkF8aigCABD6DgwHCwJAIAZBFGotAABBAkYNACAGKQMAIitCA4NCAFINACArpyIHIAcoAgAiCEF/ajYCACAIQQFHDQAgByAHKAIQEMAkCyAGQRhqEPEMDAYLAkAgBkEUai0AAEECRg0AIAYpAwAiK0IDg0IAUg0AICunIgcgBygCACIIQX9qNgIAIAhBAUcNACAHIAcoAhAQwCQLIAZBGGooAgAQ0g0MBQsgBkF0aigCACIHENEBIAdBwABBCBCsFgwECyAGKAIAIQcgBkF0aigCACIIEMETIAhBGEEIEKwWIAdFDQMgBxCZFyAHKAIAIAdBBGooAgAQly0gB0EUQQQQrBYMAwsCQCAGQXRqKAIAIgcpAygiK0IDg0IAUg0AICunIgggCCgCACIAQX9qNgIAIABBAUcNACAIIAgoAhAQwCQLAkAgBykDAEIAUg0AIAdBCGoQ6BAgB0HIAEEIEKwWDAMLIAcQwRMgB0HIAEEIEKwWDAILIAZBdGooAgAiBxDRASAHQcAAQQgQrBYMAQsgBkF4ahDwAwsgBkE4aiEGIAVBf2oiBQ0ACwtBASEGDAELIAYgAigCmARBgOmbARCFKQALIA1FDQAgJ0IgiKchCCAnpyEAAkACQAJAIAItAKABDgQBAgAAAQtBACgCuO+eASIFRQ0EIAJBgANqIAVBA0HhpZsBQYUBEOgLQQAtAKDwngEaIAIoAoQDIQVBCBB9IgdFDQMgByAINgIEIAcgADYCACAFKAIcIAVBIGoiACgCABDVLCAFQSxqIggoAgAgBUEwaigCABCbIyAFKAIoIAgoAgAQ1iwgCEIENwIAIAVCATcCJCAAIAc2AgAgBUEBNgIcIAJBkARqQQhqIAJBgANqQQhqKAIANgIAIAIgAikCgAM3A5AEIAJBkARqEPYBIAJBkARqEPwNIA0QuAEgDUHAAEEIEKwWDAILQfTymwFBBhDPDCEnQQAtAKDwngEaQcAAEH0iB0UNAiAHQQA6ABwgByAUNgIYIAdCADcCECAHICc3AgggB0EaNgIAQdyhmwFBBxDPDCEnQQAtAKDwngEaQcAAEH0iBUUNAiAFQgA3AxggBSAnNwMQIAVBADYCCCAFQQE2AgAgBUEAOgA8IAUgDTYCOCAFQgA3AzAgBSAHNgIoIAVBIGpCADcDACABKAIcIQcCQCABKAIgIgxFDQAgByAMQThsaiIEQUhqIg1FDQAgDSgCAEEJRw0AIARBUGoiDSgCAEEBRw0AIA0Q7gMgBEFcaiAINgIAIARBWGogADYCACAEQVRqIAU2AgAgDUESNgIAIARBYGoiBSACKQOAAzcDACAFQQhqIAJBgANqQQhqKQMANwMAIAVBEGogAkGAA2pBEGopAwA3AwAgBUEYaiACQYADakEYaikDADcDAAwCCwJAIAwgDigCAEcNACAOQeShmwEQ4R0gASgCHCEHCyAHIAxBOGxqIgcgCDYCFCAHIAA2AhAgByAFNgIMIAdBEjYCCCAHQQk2AgAgByACKQOAAzcDGCAHQSBqIAJBiANqKQMANwMAIAdBKGogAkGQA2opAwA3AwAgB0EwaiACQZgDaikDADcDACABIAxBAWo2AiAMAQsCQCABKAIgIgUgASgCGEcNACAOQfShmwEQ4R0LIAEoAhwgBUE4bGoiByAnNwIIIAcgDTYCBCAHQQc2AgAgASAFQQFqNgIgCwJAICpCAFINACAppyIFIAUoAgAiB0F/ajYCACAHQQFHDQAgBSAFKAIQEMAkCwJAIChCA4NCAFIgBnINACAopyIGIAYoAgAiBUF/ajYCACAFQQFHDQAgBiAGKAIQEMAkCyACQQhqIA4QtgQgAigChAEiBUUNAiACQQA2AoQBIAIoAoABIQYgAigCfCEHIAJCgICAgIABNwJ8IAIgBzYCiAMgAiAGNgKEAyACIAY2AoADIAIgBiAFQQR0ajYCjAMgAkGoAWogAkGAA2oQyAhBAC0AoPCeARpBHBB9IgZFDQAgBiACKQKoATcCACAGQgA3AgwgBkESakIANwEAIAZBCGogAkGoAWpBCGooAgA2AgACQCABKAIgIgcgASgCGEcNACAOQaCemwEQ4R0LIAEoAhwgB0E4bGoiBUIANwMwIAUgBjYCDCAFQQI2AgggBUEBNgIAIAEgB0EBajYCIEEAQQgQny0MAgsAC0HEgJwBQcgAQeyBnAEQky4ACwJAIAIoAghFDQAgAkEIahDgCAsgAkE4aiEGIAJBKGoQsQoCQCACKQMYIidQDQAgJ0IDg0IAUg0AICenIgUgBSgCACIHQX9qNgIAIAdBAUcNACAFIAUoAhAQwCQLIAJB2ABqIQ0gBhDgCAJAIAIoAkwiBEUNAAJAIAIoAlQiCEUNACACKAJIIgVBCGohBiAFKQMAQn+FQoCBgoSIkKDAgH+DIScDQAJAICdCAFINAANAIAVBwH1qIQUgBikDACEnIAZBCGoiByEGICdCgIGChIiQoMCAf4MiJ0KAgYKEiJCgwIB/UQ0ACyAnQoCBgoSIkKDAgH+FIScgByEGCwJAIAVBACAneqdBA3ZrQShsaiIHQVhqKQMAIihCA4NCAFINACAopyIAIAAoAgAiDEF/ajYCACAMQQFHDQAgACAAKAIQEMAkCwJAIAdBaGopAwAiKEIDg0IAUg0AICinIgAgACgCACIMQX9qNgIAIAxBAUcNACAAIAAoAhAQwCQLICdCf3whKAJAAkACQCAHQXBqKAIADgMAAgECCyAHQXhqKQMAIilCA4NCAFINASAppyIHIAcoAgAiAEF/ajYCACAAQQFHDQEgByAHKAIQEMAkDAELIAdBdGoQuwELICggJ4MhJyAIQX9qIggNAAsLIAQgBEEobEEvakF4cSIGakEJaiIFRQ0AIAIoAkggBmsgBUEIEKwWCyANELEKIAIoAnQgAigCeBCeGCACKAJwIAIoAnQQsS0gAigCgAEgAigChAEQnhggAigCfCACKAKAARCxLSACKAKMASACKAKQARCeGCACKAKIASACKAKMARCxLSACKAKYASACKAKcARDpIiACKAKUASACKAKYARCcLQJAIANFDQACQCABKAIADQAgASgCICIAQThsIQggASgCHCEHQQAhBgJAA0AgCCAGRg0BIAcgBmohBSAGQThqIQYgBSgCAEF6akEESQ0ADAMLCwJAIAAgDigCAEcNACAOQfSnmwEQ4R0gASgCHCEHCyAHIABBOGxqIgZCADcDGCAGIAo2AhQgBiAJNgIQIAZCCDcDCCAGQgI3AwAgBkEgakEAOgAAIAEgAEEBajYCIAwBC0Hkp5sBEM4sAAsgAkHgBGokAAuxZwI8fwJ+IwBB4AprIgIkACACIAEoAkwiAzYCNAJAAkACQAJAAkACQCADQQFHDQAgAS0APCEEIAEtADQiA0EDRg0BIANBAkYNASABKAIoIgUgBSgCACIGQQFqNgIAIAZBf0wNAyABKAIwIQYgASgCLCEHDAILIAJBADYC8ARBAEGw0ZsBIAJBNGogAkHwBGpBnJSDARCOIQALCyABLQBdIQggAS0AWyEJIAEtAFohCiABLQBZIQsgAS0AWCEMIAEtAFchDSABLQBWIQ4gAS0AVSEPIAEtAFQhECABKAJQIREgAS0AOSESIAEtADghEyABLQBBIRQgAS0AQCEVIAEtAD8hFiABKAIkIRcgASgCICEYIAEoAhwhGSABKAIYIRogAS0APiEbIAEtAD0hHCABKAIEIR0gASgCACEeIAEoAhQhHyABKAIQISAgASgCDCEhIAEoAgghIiABLQBCISMgAkEoaiABKAJIIgEoAgQgASgCCBCqECACKAIsISQgAigCKCElIAJBlQFqQYIEOwAAIAJBgoSIEDYAkQEgAkEKOgCXASACQQE6AJABIAJC+gE3ApgBIAJBAzoAjgEgAkKChIiQoMCAgQI3AYYBIAJBADoAhAEgAkEDOgCAASACQQI2AmwgAkECNgJkIAJBAjYCXCACQQI2AlQgAkEANgJMIAIgBjYC+AQgAiAHNgL0BCACIAU2AvAEIAIgAzoA/AQCQCADQQNHDQAgAkHwBGoQ0x5BAyEDCyACQZEBaiEmIAIoAlghASACKAJgIScgAigCaCEoIAIoAnAhKSACLQCFASEqIAIoAlAhKyACQfQAahDTHiACIAo6AJwBIAIgIzoAjgEgAiAUOgCNASACIBU6AIwBIAIgFjoAiwEgAiAbOgCKASACIBw6AIkBIAIgBDoAiAEgAkGBAjsBhgEgAiADOgCAASACIAY2AnwgAiAHNgJ4IAIgBTYCdCACIB42AkwgAiAdICsgHhs2AlAgAiATOgCEASACIBIgKiATQQFxGzoAhQEgAiAYNgJsIAIgKSAXIBhBAkYbNgJwIAIgGjYCZCACICggGSAaQQJGGzYCaCACICA2AlwgAiAnIB8gIEECRhs2AmAgAiAiNgJUIAIgASAhICJBAkYbNgJYIAIgCDoAnQEgAiARNgKYASACQQJBACAJQQFxGzoAlQEgAkEBQQIgDEEBcRs6AJYBIAJBAUECIA5BAXEbOgCSASACQQFBAiAPQQFxGzoAkQEgAiAQOgCXASACQQFBAiANQQFxGzoAkwEgAkEBQQIgC0EBcRs6AJQBIAJBAToAkAEgAiAkNgKkASACICVBCGo2AqABIAJBADYCsAEgAkKAgICAwAA3AqgBIAJBADYCvAEgAkKAgICAwAA3ArQBIAJCgICAgBA3AogEIAIgAkGgAWpBCGoiFDYChAQgAiACQaABajYCgAQgAkGcBWohBCACQfAEakEwaiENIAJB8ARqQQxqIQkgAkHwBGpBCGohCCACQfAEakHEAGohEiACQdwCakEMaiEgIAJBkAJqIQoCQAJAA0AgAkEgaiACQYAEahCGGCACKAIkIgFFDQIgAigCICEOIAIgAi0AngE6AKcCIAIgAi0AnAEiAzoApgIgAiACLQCdAToApQIgAiACKAKYATYCoAIgAkIBNwKYAiACQoCAgIAQNwKQAiACIAM6AKQCIAJCATcCiAIgAkIANwKAAiACQgQ3AvgBIAJCADcC8AEgAkIENwLoASACQgA3AuABIAJCBDcC2AEgAkIANwLQASACQgQ3AsgBIAJCADcCwAEgASgCACEFIAIgASgCBCIYNgLsAyACIAU2AugDIAIgAzoApAIgAkKBgICAEDcClAIgAkEANgLAASACQQA2AswBIAIgAkHAAWo2AuQDIAIoAtABDQEgAkF/NgLQASACKALcASEBIAJBADYC3AEgAigC2AEhAwJAA0AgAUUNASABQX9qIQEgAxDEJCADQfAAaiEDDAALCyACIAIoAtABQQFqNgLQAQJAIAIoAuABDQAgAkF/NgLgASACKALsASEBIAJBADYC7AEgAigC6AEhAwJAA0AgAUUNASABQX9qIQEgAxCbJCADQZgBaiEDDAALCyACIAIoAuABQQFqNgLgASAIIApBCGooAgAiATYCACAJIAopAgAiPjcCACAJQQhqIAE2AgAgICA+NwIAICBBCGogCCkDADcCACAgQRBqIAJB8ARqQRBqKQMANwIAQQAhAyACQQA2AuQCIAJCgICAgMAANwLcAkEEIQYDQCACQeQDahCWBwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoApACIBhGDQACQCACQeQDahD2DyIBQVhqDgQHCAsMAAsCQCABQYV/ag4CDQkACyABQT9GDQkgAUHbAEYNDSACQeQDahD2DyIBQaR/ag4DBQIDAQsCQEEkRQ0AIAJBwANqIAJB3AJqQST8CgAACyACQfAEaiACQeQDaiACQcADahCHBCACKAL4BCEeIAIoAvQEIQEgAigC8AQiE0EiRg0PIAJB0ARqQQhqIARBCGopAgA3AwAgAiAEKQIANwPQBCACKAKYBSELIAIpApAFIT4gAikCiAUhPyACKAKEBSEHIAIoAoAFIQUgAigC/AQhIiACKAKsBSEMDB4LIAFBJEYNAiABQS5GDQ0LIAkgAkHkA2oQqA0gAkHkA2oQjAsaIAJBADoAlAUgAiABNgL4BEGCgICAeCEBIAJBgoCAgHg2AvQEDBQLIAggAkHkA2oQqA0gAkHkA2oQjAsaIAJBADoAkAUMEgsgCCACQeQDahCoDSACQeQDahCMCxogAkEBOgCQBQwRCyACQfAEaiACQeQDahCEASACKAL0BCEBIAIoAvAEIhNBIkYNESACQbADakEIaiAEQQhqKQIAIj43AwAgAkHQBGpBCGogPjcDACACIAQpAgAiPjcDsAMgAiA+NwPQBCACKAKYBSELIAIpApAFIT4gAikCiAUhPyACKAKEBSEHIAIoAoAFIQUgAigC/AQhIiACKAL4BCEeIAIoAqwFIQwMDAsCQEEkRQ0AIAJBwANqIAJB3AJqQST8CgAACyACQfAEaiACQeQDaiACQcADahDTBSACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEFIAIoAvwEIQMgAigC+AQhBiACKAL0BCEBIAIoAvAEIhNBIkYNByACQdAEakEIaiAEQQhqKQIANwMAIAIgBCkCADcD0AQMDgsCQEEkRQ0AIAJBwANqIAJB3AJqQST8CgAACyACQfAEaiACQeQDaiACQcADahCBAyACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEF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IAIoAuACIAFBFGxqIgMgBTYCACADIAIpAvADNwIEIANBDGogAkHwA2pBCGopAgA3AgAgAUEBaiEBCyACIAE2AuQCIAIoAuQDIQEgBiEFDAALCwsgAi0AiAEhIyACLQCHASEnIAItAIYBISggAigCvAEhBiACKAK4ASEBAkACQCACLQCAASIdQQNGDQAgHUECRg0AIAIoAnQiHyAfKAIAIgNBAWo2AgAgA0F/TA0CIAIoAnwhKSACKAJ4ISoMAQsLIAItAIUBISsgAi0AhAEhLCACLQCNASEtIAItAIwBIS4gAi0AiwEhLyACKAJwITAgAigCbCExIAIoAmghMiACKAJkITMgAi0AigEhNCACLQCJASE1IAIoAlAhNiACKAJMITcgAigCYCE4IAIoAlwhOSACKAJYITogAigCVCE7IAItAI4BITxBACEbIAJB8ARqIAZBAEEEQQQQpgwgAigC9AQhPQJAIAIoAvAEQQFGDQAgAigC+AQhEQJAIAZFDQAgESEDIAYhBQNAIAMgATYCACADQQRqIQMgAUEcaiEBIAVBf2oiBQ0ACyAGIRsLQQAhBSACQQA2AuwEIAJCgICAgMAANwLkBAJAAkAgGw0AQQEhFUEEIRZBACETQQAhEkEEIQRBACEmDAELIAZBAnQhGEEAIQZBBCETQQAhBwNAIBEgBmooAgAhAxDjKiIBIAMoAhgiAy0AMjoAMiABIAMvATA7ATAgASADKQIoNwIoIAEgAykCIDcCICABIAMpAhg3AhggASADKQIQNwIQIAEgAykCCDcCCCABIAMpAgA3AgACQCAHIAIoAuQERw0AIAJB5ARqEIocIAIoAugEIRMLIBMgBmogATYCACACIAdBAWoiBzYC7AQgGCAGQQRqIgZHDQALIAIoAugEIhJBBGohBCASIAdBAnRqIRYgEigCACIBKAIUIRQgASgCECEmQX8hE0EAIRULQQEhBkEBIQdBACEaQQAhHiATISBBACEiQQEhA0EAIQlBACEPQQAhCANAQQAhGANAIAkhHANAIBghCQJAAkACQAJAAkACQAJAAkACQAJAIANBAXENACAEIBZGDQIgBCEBIARBBGohBAwBCyASIQEgFQ0BCyABKAIAIQEgB0EBcSEDQQAhBwJAIANFDQAgAS0AMCEHCyABKAIsIRggASgCECEDICZBAXEiCkUNASADRQ0BIBQgASgCFEcNAgwDC0EALQCg8J4BGkE0EH0iAQ0DDAsLIAoNACADRQ0BC0EAISYLIAUgGGohAyAGQQFxIRhBACEGAkAgGEUNACABLQAxIQYLIAEoAighCiABKAIkIQsgASgCICEMIAEoAhwhDSABKAIYIQ4gAyAFSSEFQQEhGAJAIAhBAXENACABKAIAIggNAkEAIQ8LQQEhCAwDCyABIAZBAXE6ADIgAUEAOgAxIAEgB0EBcToAMCABIAU2AiwgASAaNgIoIAEgHjYCJCABIBM2AiAgASAgNgIcIAEgIjYCGCABIBQ2AhQgASAmNgIQIAEgITYCDCABIBw2AgggASAQNgIEIAEgDzYCAEEALQCg8J4BGkHcABB9IgZFDQcgBiA8OgBKIAYgLToASSAGIC46AEggBiAvOgBHIAYgNDoARiAGIDU6AEUgBiAjOgBEIAYgJzoAQyAGICg6AEIgBiArOgBBIAYgLDoAQCAGIB06ADwgBiApNgI4IAYgKjYCNCAGIB82AjAgBiAwNgIsIAYgMTYCKCAGIDI2AiQgBiAzNgIgIAYgODYCHCAGIDk2AhggBiA6NgIUIAYgOzYCECAGIDY2AgwgBiA3NgIIIAZCgYCAgBA3AgAgBiABNgJYIAZB1ABqIAJB5ARqQQhqKAIANgIAIAYgAikC5AQ3AkwgAkHwBGogBiARIBsQPSACKAL4BCETIAIoAvQEIQ4CQAJAIAIoAvAEIgNBAkYNACACQThqQQhqIAJBrAVqKQIANwMAIAIgAikCpAU3AzggAigCoAUhCyACKQOYBSE+IAIpA5AFIT8gAigCjAUhByACKAKIBSEFIAIoAoQFISIgAigCgAUhHiACKAL8BCEBIAIoArQFIQwgBiAGKAIAIhhBf2o2AgAgGEEBRw0BIAYQmBEMAQsgDiAOKAIAIgFBAWo2AgAgAUF/TA0IQQAtAKDwngEaQQgQfSIaRQ0IIBogEzYCBCAaIA42AgBBAC0AoPCeARpBwABBgAQQtwciB0UNAiACQQA2AvgEIAIgBzYC9AQgAkEINgLwBEEAIQNBACEBA0ACQCABIAIoAvAERw0AIAJB8ARqEIscIAIoAvQEIQcLIAcgA2oiBUEAOgAAIAVBDGpBADYAACAFQQRqQoCAgIDAADcAACACIAFBAWoiATYC+AQgA0HAAGohAyABQQhHDQALIAJBwAFqQQhqIAJB8ARqQQhqKAIANgIAIAIgAikC8AQ3A8ABQQAtAKDwngEaQYgGEH0iGEUNCCAYQQI2AgACQEHsBUUNACAYQQRqIAJB8ARqQewF/AoAAAsgGEEANgL4BSAYQZjygwE2AvQFIBggGjYC8AUgGCACKQPAATcC/AUgGEGEBmogAkHIAWooAgA2AgBBAC0AoPCeARpBFBB9IhpFDQggGiAGNgIQIBogEzYCDCAaIA42AgggGkKBgICAEDcCAEECIQMgGCETIBohDgsgPSARQQRBBBCLFgwJCyAPIAggDyABKAIEIhcgEE9xIhkbIQ8gECAXIBkbIRBBACEIDAELQcAAQYAEQbzQgwEQhSkACyAKIBpyIRogCyAeciEeIAwgE3EhEyANICBxISAgDiAiciEiQX8gAyAFGyEFQQAhAyAJQQFxDQALQQEhGEEAIQNBACEJIAEoAggiCkEBRw0ACyAcIAogHCABKAIMIgEgIU1xIgMbIQkgISABIAMbISFBACEDDAALCyA9IAIoAvgEQYDpmwEQhSkACwALIAJBOGpBCGogAkHQBGpBCGopAwA3AwAgAiACKQPQBDcDOCACQcABahCQCUEAIQMLIAJBtAFqEMMiIAIoArQBIAIoArgBEPIsIAJBqAFqEMQiIAIoAqgBIAIoAqwBEPMsAkACQCADQQJHDQAgACAkNgIMIAAgJTYCCCAAIBM2AgQgACAONgIADAELIAJBwAJqQQhqIgYgAkE4akEIaikDADcDACACIAIpAzg3A8ACICUgJSgCACIYQX9qNgIAAkAgGEEBRw0AICUgJBD7HgsgAkGsBWogBikDADcCACACIAs2AqAFIAIgPzcDkAUgAiAHNgKMBSACIAU2AogFIAIgIjYChAUgAiAeNgKABSACIAE2AvwEIAIgEzYC+AQgAiAONgL0BCACIAIpA8ACNwKkBSACIAw2ArQFIAIgAzYC8AQgAiA+NwOYBSACQfAEakEIaiEHAkACQCADQQFxRQ0AIBNBJ0cNACAAQYCAgIB4NgIEIAAgATYCCAwBCyAAQQRqIRgCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQQFxDQBBACEBIAJBADYCQCACQoCAgIAQNwI4AkAgE0EiRw0AIAJBADYC7AIgAiAiNgLgAiACIB42AtwCIAIgAkGIBWo2AugCIAIgAkGgBWo2AuQCIAJB5AJqIRMgAkGAA2ogAkHcAmoQ2QcCQCAeICIQxSINACACQQA2AtABIAJBATYCxAEgAkGU/IcBNgLAASACQgQ3AsgBIAJBOGogAkHAAWoQsykNCiACQcABaiACQdwCahDZByACQcADaiACQcABahC1BCACQcABahDHGCACQQE2AsQBIAJByL6cATYCwAEgAkIBNwLMASACQQQ2AtQEIAIgAkHQBGo2AsgBIAIgAkHAA2o2AtAEAkAgAkE4aiACQcABahCzKQ0AIAJBATYCxAEgAkGk/IcBNgLAASACQgE3AswBIAJB9AA2AtQEIAIgEzYC0AQgAiACQdAEajYCyAEgAkE4aiACQcABahCzKQ0AIAJBwANqEPQsDA4LIAJBwANqEPQsDAoLIAJBsAJqQf4AQc8AEJsVIAJBADYC0AEgAkEBNgLEASACQZT8hwE2AsABIAJCBDcCyAEgAkE4aiACQcABahCzKUUNBwwICyA+QiCIpyEDID6nIQUCQCATQRFLDQBBASATdEGAwAlxRQ0AIAJB/ARqIQELIAIgATYC7AIgAiAHNgLkAiACIAM2AuACIAIgBTYC3AIgAiACQaAFajYC6AIgAkHkAmohEyACQYADaiACQdwCahDZBwJAIAUgAxDFIg0AIAJBADYC0AEgAkEBNgLEASACQZT8hwE2AsABIAJCBDcCyAEgAkE4aiACQcABahCzKQ0EIAJBwAFqIAJB3AJqENkHIAJBwANqIAJBwAFqELUEIAJBwAFqEMcYIAJBATYCxAEgAkHIvpwBNgLAASACQgE3AswBIAJBBDYC1AQgAiACQdAEajYCyAEgAiACQcADajYC0AQCQCACQThqIAJBwAFqELMpDQAgAkEBNgLEASACQaT8hwE2AsABIAJCATcCzAEgAkH1ADYC1AQgAiATNgLQBCACIAJB0ARqNgLIASACQThqIAJBwAFqELMpDQAgAkHAA2oQ9CwMBwsgAkHAA2oQ9CwMBAsgAkGwAmpB/gBBzwAQmxUgAkEANgLQASACQQE2AsQBIAJBlPyHATYCwAEgAkIENwLIASACQThqIAJBwAFqELMpRQ0BDAILIAJBwAFqQQhqIgFBADYCACACQoCAgIAQNwLAASACQcABakHQxYMBQeLFgwEQvCAgGEEIaiABKAIANgIAIBggAikCwAE3AgAMDAsgAkECNgLEASACQZD9hwE2AsABIAJCATcCzAEgAkEENgLEAyACIAJBwANqNgLIASACIAJBsAJqNgLAAyACQThqIAJBwAFqELMpDQAgAkGABGogAkGAA2oQtQQgAkEBNgLEASACQci+nAE2AsABIAJCATcCzAEgAkEENgLEAyACIAJBwANqNgLIASACIAJBgARqNgLAAwJAIAJBOGogAkHAAWoQsykNACACQQI2AsQBIAJBkP2HATYCwAEgAkIBNwLMASACQQQ2AsQDIAIgAkHAA2o2AsgBIAIgAkGwAmo2AsADIAJBOGogAkHAAWoQsykNAAJAIAIoApQDIgFFDQAgAkEANgKoBCACQoCAgIDAADcCoAQgAUEYbCEDIAIoApADIgVBEGohAQJAA0AgA0UNASACQQU2AsQDIAJBwP2HATYCwAMgAkIENwLMAyACQQs2AswBIAJBCzYCxAEgBSgCFCEGIAJBCzYC3AEgAkELNgLUASACIAE2AtABIAIgAUF4ajYCyAEgAiABQXRqNgLAASACIAZBf2o2AuQDIANBaGohAyAFQRhqIQUgAUEYaiEBIAIgAkHAAWo2AsgDIAIgAkHkA2o2AtgBIAJB0ARqIAJBwANqEJQOIAJBoARqIAJB0ARqENMbDAALCyACQcADaiACKAKkBCACKAKoBEHMopwBQQEQkQUgAkEENgLUBCACQQI2AsQBIAJBkP2HATYCwAEgAkIBNwLMASACIAJBwANqNgLQBCACIAJB0ARqNgLIASACQThqIAJBwAFqELMpIQEgAkHAA2oQ9CwgAkGgBGoQoxsgAQ0BCyACQQE2AsQBIAJBpPyHATYCwAEgAkIBNwLMASACQfUANgLEAyACIBM2AsADIAIgAkHAA2o2AsgBIAJBOGogAkHAAWoQsylFDQMLIAJBgARqEPQsCyACQbACahD0LAsgAkGAA2oQxxgMBQsgAkGABGoQ9CwgAkGwAmoQ9CwLIAJBgANqEMcYDAYLIAJBAjYCxAEgAkGQ/YcBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQbACajYCwAMgAkE4aiACQcABahCzKQ0AIAJBgARqIAJBgANqELUEIAJBATYCxAEgAkHIvpwBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQYAEajYCwAMCQCACQThqIAJBwAFqELMpDQAgAkECNgLEASACQZD9hwE2AsABIAJCATcCzAEgAkEENgLEAyACIAJBwANqNgLIASACIAJBsAJqNgLAAyACQThqIAJBwAFqELMpDQACQCACKAKUAyIBRQ0AIAJBADYCqAQgAkKAgICAwAA3AqAEIAFBGGwhAyACKAKQAyIFQRBqIQECQANAIANFDQEgAkEFNgLEAyACQcD9hwE2AsADIAJCBDcCzAMgAkELNgLMASACQQs2AsQBIAUoAhQhBiACQQs2AtwBIAJBCzYC1AEgAiABNgLQASACIAFBeGo2AsgBIAIgAUF0ajYCwAEgAiAGQX9qNgLkAyADQWhqIQMgBUEYaiEFIAFBGGohASACIAJBwAFqNgLIAyACIAJB5ANqNgLYASACQdAEaiACQcADahCUDiACQaAEaiACQdAEahDTGwwACwsgAkHAA2ogAigCpAQgAigCqARBzKKcAUEBEJEFIAJBBDYC1AQgAkECNgLEASACQZD9hwE2AsABIAJCATcCzAEgAiACQcADajYC0AQgAiACQdAEajYCyAEgAkE4aiACQcABahCzKSEBIAJBwANqEPQsIAJBoARqEKMbIAENAQsgAkEBNgLEASACQaT8hwE2AsABIAJCATcCzAEgAkH0ADYCxAMgAiATNgLAAyACIAJBwANqNgLIASACQThqIAJBwAFqELMpRQ0ECyACQYAEahD0LAsgAkGwAmoQ9CwLIAJBgANqEMcYC0H8lZwBQTcgAkG0AWpBxJSDAUGAl5wBEOISAAsgAkGABGoQ9CwgAkGwAmoQ9CwLIAJBgANqEMcYCyAYIAIpAjg3AgAgGEEIaiACQThqQQhqKAIANgIACwJAAkAgAigC8ARFDQACQCACKAL4BCIBQV5qQQAgAUFdakEHSRsOAgEAAgsgAigCgAVBhICAgHhIDQEgAkGABWoQ9SwMAQsgBxDqJwsgAEEANgIACyACQcwAahDVHiACQeAKaiQAC8tcAw9/A34BfCMAQeAAayICJAAgASgCaCIDIQQCQCADIAEoAmwiBUYNAAJAIAMsAAAiBEF/TA0AIANBAWohBAwBCwJAIARBYE8NACADQQJqIQQMAQsgA0EEQQMgBEFvSxtqIQQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEIAVGDQACQAJAIAQsAAAiBkF/TA0AIAZB/wFxIQQMAQsgBC0AAUE/cSEHIAZBH3EhCAJAIAZBX0sNACAIQQZ0IAdyIQQMAQsgB0EGdCAELQACQT9xciEHAkAgBkFwTw0AIAcgCEEMdHIhBAwBCyAHQQZ0IAQtAANBP3FyIAhBEnRBgIDwAHFyIQQLIARBvn9qDjcDAAAAAAAAAAAAAAAABAAAAAAAAAAAAQAAAAAAAAAAAAMAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAsgASgCeCEHIAJBADoARiACQQA6AEcgAkEAOgA4IAEgAkHHAGogAkHGAGogAkE4ahCPAwJAIAItAEcNACACQZeAgIB4NgJIIAJBCjoATCABKAJ4IAcgAkHIAGoQyi4hBQwSCyABKAJ4IQQgAi0AOCEJIAItAEYhCiABIAEoAnAiBSABKAJ0IgtqIgg2AmwgASAFIAQgASgCfCIDayIGaiIMNgJoIAYgByADayINayEOIAUgDWohDyAEIAdrQQFHDQ4gCyAGRg0OIAwtAABB7gBHDQ4gASAINgJsIAEgBEEBaiIENgJ4IAEgBSAEIANrIgZqNgJoIAJByABqIA8gDhDbBCACKAJIDQEgAkEIaiACKAJMIgUgAigCUCIDQS0QhRgCQAJAIAIoAggiBA0AQQIhBAwBCyAFIAQgBCACKAIMIgdBKxCmHyIIGyEFIAMgByAIGyEDQQAhBAsgAkHIAGogBSADQQoQ8QEgAigCSCIHQYCAgIB4Rg0BIAJBNmoiCCACQcgAakEHai0AADoAACACIAIvAE07ATRBAC0AoPCeARogAi0ATCEJIAIoAlAhA0EQEH0iBUUNBSAFIAk6AAQgBSAHNgIAIAUgAi8BNDsABSAFIAM2AgggBSAEQQEgAxs6AAwgBUEHaiAILQAAOgAAQgEhEUIAIRIgASgChAFBCGogDyAGIA1rEOQDIRMMDwtBASEEIAEoAnghCgJAAkAgAywAACIGQX9MDQAgA0EBaiEDQQEhBgwBCyADLQABQT9xIQcgBkEfcSEIAkACQCAGQWBPDQAgCEEGdCAHciEHIANBAmohAwwBCyAHQQZ0IAMtAAJBP3FyIQcCQCAGQXBPDQAgByAIQQx0ciEHIANBA2ohAwwBCyAHQQZ0IAMtAANBP3FyIAhBEnRBgIDwAHFyIQcgA0EEaiEDCwJAIAdBgAFPDQBBASEGDAELQQIhBiAHQYAQSQ0AQQNBBCAHQYCABEkbIQYLIAEgA0EBaiIMNgJoIAYgCmohBgJAIAMsAAAiB0F/Sg0AIAEgA0ECaiIMNgJoIAMtAAFBP3EhCCAHQR9xIQkCQAJAIAdBYE8NACAJQQZ0IAhyIQMMAQsgASADQQNqIgw2AmggCEEGdCADLQACQT9xciEIAkAgB0FwTw0AIAggCUEMdHIhAwwBCyABIANBBGoiDDYCaCAIQQZ0IAMtAANBP3FyIAlBEnRBgIDwAHFyIQMLIANBgAFJDQBBAiEEIANBgBBJDQBBA0EEIANBgIAESRshBAsgASAEIAZqIg82AnggDyEIIAwgBUYNC0EAIQlBACEQIA8hCEGAgMQAIQYDQCAGQah/aiENIAZBLkYhDiAGQfgARiELIAwhAwJAAkACQAJAA0ACQAJAIAMsAAAiBEF/SiIHDQAgAy0AAUE/cSEGIARBH3EhDAJAIARBYE8NACAMQQZ0IAZyIQYMAgsgBkEGdCADLQACQT9xciEGAkAgBEFwTw0AIAYgDEEMdHIhBgwCCyAGQQZ0IAMtAANBP3FyIAxBEnRBgIDwAHFyIQYMAQsgBEH/AXEhBgsCQAJAIAZB3wBGDQAgBkGAgMQARg0BIAZBv39qQV5xQQpqIAZBUGogBkE5SxtBD0sNAUEBIRAgASADQQFqIgw2AmhBASENIAcNBSABIANBAmoiDDYCaCADLQABQT9xIQcgBEEfcSENIARBYE8NAyANQQZ0IAdyIQMMBAsCQAJAIAdFDQAgA0EBaiEGDAELAkAgBEFgTw0AIANBAmohBgwBCyADQQRBAyAEQW9LG2ohBgsCQAJAIAYgBUYNAAJAAkAgBiwAACIHQX9KDQAgBi0AAUE/cSEIIAdBH3EhCQJAIAdBYE8NACAJQQZ0IAhyIQYMAgsgCEEGdCAGLQACQT9xciEIAkAgB0FwTw0AIAggCUEMdHIhBgwCCyAIQQZ0IAYtAANBP3FyIAlBEnRBgIDwAHFyIgZBgIDEAEcNAQwCCyAHQf8BcSEGCyAGQb9/akFecUEKaiAGQVBqIAZBOUsbQQ9LDQACQAJAIA0OCAIBAQEBAQECAAsgDg0BIAsNAQsCQCAGQah/ag4IAQICAgICAgEACyAGQfgARg0AIAZBLkcNAQsgAkHugICAeDYCSCABIA8gAkHIAGoQiywgASgCbCEFIAEoAmgiAy0AACEECyABIANBAWoiBzYCaAJAAkAgBMBBf0oNACABIANBAmoiBzYCaCADLQABQT9xIQYgBEEfcSEIAkACQCAEQf8BcSIEQeABTw0AIAhBBnQgBnIhAwwBCyABIANBA2oiBzYCaCAGQQZ0IAMtAAJBP3FyIQYCQCAEQfABTw0AIAYgCEEMdHIhAwwBCyABIANBBGoiBzYCaCAGQQZ0IAMtAANBP3FyIAhBEnRBgIDwAHFyIQMLIAEoAnghBAJAIANBgAFPDQBBASEGIAchAwwCCwJAIANBgBBPDQBBAiEGIAchAwwCC0EDQQQgA0GAgARJGyEGIAchAwwBCyABKAJ4IQRBASEGIAchAwsgASAGIARqIgg2AnhBASEJIAMgBUcNAQsLIBBBAXENAwwQCyABIANBA2oiDDYCaCAHQQZ0IAMtAAJBP3FyIQcCQCAEQXBPDQAgByANQQx0ciEDDAELIAEgA0EEaiIMNgJoIAdBBnQgAy0AA0E/cXIgDUESdEGAgPAAcXIhAwsCQCADQYABTw0AQQEhDQwBC0ECIQ0gA0GAEEkNAEEDQQQgA0GAgARJGyENCyABIA0gCGoiCDYCeCAMIAVHDQELCyABIAEoAnAiBSABKAJ0Ig1qNgJsIAEgBSAIIAEoAnwiBGsiA2oiDDYCaCADIA8gBGsiB2shBiAFIAdqIQcCQCANIANGDQAgDC0AAEHuAEYNBAsgAkHIAGogByAGIAlBAXEQ9gggAigCTCEHAkAgAigCUCIEQQ5JDQBEAAAAAAAAAAAhFCAHIQUDQCAFLQAAIQMgBUEBaiEFIBREAAAAAAAAMEAgA0EPcSIGIAZBCWogA0HBAEkbuBC1LyEUIARBf2oiBA0ADAgLC0EAIQUCQAJAAkAgBA4CDQABC0EBIQUgByEDIActAABBVWoOAwwBDAELAkAgBy0AAEErRg0AIAQhBSAHIQMMAQsgBEF/aiEFIAdBAWohAwtCACETA0ACQAJAIAVFDQAgAy0AACIEQb9/akFfcUEKaiAEQVBqIARBOUsbIgRBD00NAUEBIQUMDQsgE7ohFAwICyADQQFqIQMgBUF/aiEFIBNCBIYgBK2EIRMMAAsLQaCKmgEQziwMAwtBASEEIAEoAnghDgJAAkAgAywAACIGQX9MDQAgA0EBaiEDQQEhBgwBCyADLQABQT9xIQcgBkEfcSEIAkACQCAGQWBPDQAgCEEGdCAHciEHIANBAmohAwwBCyAHQQZ0IAMtAAJBP3FyIQcCQCAGQXBPDQAgByAIQQx0ciEHIANBA2ohAwwBCyAHQQZ0IAMtAANBP3FyIAhBEnRBgIDwAHFyIQcgA0EEaiEDCwJAIAdBgAFPDQBBASEGDAELQQIhBiAHQYAQSQ0AQQNBBCAHQYCABEkbIQYLIAEgA0EBaiIPNgJoIAYgDmohBgJAIAMsAAAiB0F/Sg0AIAEgA0ECaiIPNgJoIAMtAAFBP3EhCCAHQR9xIQkCQAJAIAdBYE8NACAJQQZ0IAhyIQMMAQsgASADQQNqIg82AmggCEEGdCADLQACQT9xciEIAkAgB0FwTw0AIAggCUEMdHIhAwwBCyABIANBBGoiDzYCaCAIQQZ0IAMtAANBP3FyIAlBEnRBgIDwAHFyIQMLIANBgAFJDQBBAiEEIANBgBBJDQBBA0EEIANBgIAESRshBAsgASAEIAZqIgw2AnggDCEIAkAgDyAFRg0AQQAhCUEAIQsgDCEIQYCAxAAhBgNAIAZBUmohDSAPIQMCQAJAAkACQANAAkACQCADLAAAIgRBf0oiBw0AIAMtAAFBP3EhBiAEQR9xIQ8CQCAEQWBPDQAgD0EGdCAGciEGDAILIAZBBnQgAy0AAkE/cXIhBgJAIARBcE8NACAGIA9BDHRyIQYMAgsgBkEGdCADLQADQT9xciAPQRJ0QYCA8ABxciEGDAELIARB/wFxIQYLAkACQCAGQd8ARg0AIAZBgIDEAEYNASAGQf7//wBxQTBHDQFBASELIAEgA0EBaiIPNgJoQQEhDSAHDQUgASADQQJqIg82AmggAy0AAUE/cSEHIARBH3EhDSAEQWBPDQMgDUEGdCAHciEDDAQLAkACQCAHRQ0AIANBAWohBgwBCwJAIARBYE8NACADQQJqIQYMAQsgA0EEQQMgBEFvSxtqIQYLAkACQCAGIAVGDQACQAJAIAYsAAAiB0F/Sg0AIAYtAAFBP3EhCCAHQR9xIQkCQCAHQWBPDQAgCUEGdCAIciEGDAILIAhBBnQgBi0AAkE/cXIhCAJAIAdBcE8NACAIIAlBDHRyIQYMAgsgCEEGdCAGLQADQT9xciAJQRJ0QYCA8ABxciEGDAELIAdB/wFxIQYLIAZB/v//AHFBMEcNAAJAIA0OQgEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAABAAABAAAAAAAAAAAAAQALIAZBvn9qDi4AAQEAAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQABAQABAQABAQEBAQEBAQEAAQsgAkHugICAeDYCSCABIAwgAkHIAGoQiywgASgCbCEFIAEoAmgiAy0AACEECyABIANBAWoiBzYCaAJAAkAgBMBBf0oNACABIANBAmoiBzYCaCADLQABQT9xIQYgBEEfcSEIAkACQCAEQf8BcSIEQeABTw0AIAhBBnQgBnIhAwwBCyABIANBA2oiBzYCaCAGQQZ0IAMtAAJBP3FyIQYCQCAEQfABTw0AIAYgCEEMdHIhAwwBCyABIANBBGoiBzYCaCAGQQZ0IAMtAANBP3FyIAhBEnRBgIDwAHFyIQMLIAEoAnghBAJAIANBgAFPDQBBASEGIAchAwwCCwJAIANBgBBPDQBBAiEGIAchAwwCC0EDQQQgA0GAgARJGyEGIAchAwwBCyABKAJ4IQRBASEGIAchAwsgASAGIARqIgg2AnhBASEJIAMgBUcNAQsLIAtBAXENAwwFCyABIANBA2oiDzYCaCAHQQZ0IAMtAAJBP3FyIQcCQCAEQXBPDQAgByANQQx0ciEDDAELIAEgA0EEaiIPNgJoIAdBBnQgAy0AA0E/cXIgDUESdEGAgPAAcXIhAwsCQCADQYABTw0AQQEhDQwBC0ECIQ0gA0GAEEkNAEEDQQQgA0GAgARJGyENCyABIA0gCGoiCDYCeCAPIAVHDQELCyABIAEoAnAiBSABKAJ0Ig1qNgJsIAEgBSAIIAEoAnwiBGsiA2oiDzYCaCADIAwgBGsiB2shBiAFIAdqIQcCQAJAAkACQAJAAkACQAJAIA0gA0YNACAPLQAAQe4ARg0BCyACQcgAaiAHIAYgCUEBcRD2CCACKAJMIQYCQCACKAJQIgNBNUkNACAGIQVEAAAAAAAAAAAhFANAIBREAAAAAAAAAEBEAAAAAAAAAABEAAAAAAAA8D8gBS0AAEEwRhsQtS8hFCAFQQFqIQUgA0F/aiIDDQAMBwsLQQAhBAJAAkAgAw4CCAABC0EBIQQgBiEFIAYtAABBVWoOAwcDBwMLIAYtAABBK0cNASADQX9qIQQgBkEBaiEFIANBEkkNAgwDCyABIAhBAWoiAzYCeCABIAUgAyAEayIIajYCaCACQcgAaiAHIAYQ2wQCQCACKAJIDQAgAkEQaiACKAJMIgMgAigCUCIGQS0QhRgCQAJAIAIoAhAiBw0AQQIhBwwBCyADIAcgByACKAIUIglBKxCmHyINGyEDIAYgCSANGyEGQQAhBwsgAkHIAGogAyAGQQIQ8QEgAigCSCIJQYCAgIB4Rg0AIAJBOmoiDSACQcgAakEHai0AADoAACACIAIvAE07AThBAC0AoPCeARogAi0ATCEMIAIoAlAhBkEQEH0iA0UNCiADIAw6AAQgAyAJNgIAIAMgAi8BODsABSADIAY2AgggAyAHQQEgBhs6AAwgA0EHaiANLQAAOgAAIAEoAoQBQQhqIAUgDiAEayIEaiAIIARrEOQDIREgAiADNgIoQgEhEwwSC0Ggj5oBEM4sAAsgAyEEIAYhBSADQRFPDQELQgAhEyAERQ0BA0ACQCAFLQAAQVBqIgNBAU0NAEEBIQQMBQsgBUEBaiEFIBNCAYYgA62EIRMgBEF/aiIEDQAMAgsLQgAhEyAERQ0AA0ACQCAFLQAAQVBqIgNBAU0NAEEBIQQMBAsCQCATQgBZDQBBAiEEDAQLIAVBAWohBSATQgGGIAOthCETIARBf2oiBA0ACwsgE7ohFAsCQCABEO0KIgVFDQAgAiAFNgIoIAIoAkgiBUGAgICAeEYNCCAFIAYQ1CxCAiETDA0LIAEgASgCcCIFIAEoAnRqNgJsIAEgBSABKAJ4IAEoAnwiA2siBGo2AmggASgChAFBCGogBSAOIANrIgNqIAQgA2sQ5AMhESACIBQ5AyggAigCSCIFQYCAgIB4Rg0JIAUgBhDULAwJCyACIAQ6ADhByJecAUErIAJBOGpB+JuZAUGQn5kBEOISAAsgAkGXgICAeDYCSCACQQI6AEwgAiAIIAwgAkHIAGoQyi42AihCAiETDAoLQQEhBCABKAJ4IQ4CQAJAIAMsAAAiBkF/TA0AIANBAWohA0EBIQYMAQsgAy0AAUE/cSEHIAZBH3EhCAJAAkAgBkFgTw0AIAhBBnQgB3IhByADQQJqIQMMAQsgB0EGdCADLQACQT9xciEHAkAgBkFwTw0AIAcgCEEMdHIhByADQQNqIQMMAQsgB0EGdCADLQADQT9xciAIQRJ0QYCA8ABxciEHIANBBGohAwsCQCAHQYABTw0AQQEhBgwBC0ECIQYgB0GAEEkNAEEDQQQgB0GAgARJGyEGCyABIANBAWoiDzYCaCAGIA5qIQYCQCADLAAAIgdBf0oNACABIANBAmoiDzYCaCADLQABQT9xIQggB0EfcSEJAkACQCAHQWBPDQAgCUEGdCAIciEDDAELIAEgA0EDaiIPNgJoIAhBBnQgAy0AAkE/cXIhCAJAIAdBcE8NACAIIAlBDHRyIQMMAQsgASADQQRqIg82AmggCEEGdCADLQADQT9xciAJQRJ0QYCA8ABxciEDCyADQYABSQ0AQQIhBCADQYAQSQ0AQQNBBCADQYCABEkbIQQLIAEgBCAGaiIMNgJ4IAwhCAJAIA8gBUYNAEEAIQlBACELIAwhCEGAgMQAIQYDQCAGQVJqIQ0gDyEDAkACQAJAAkADQAJAAkAgAywAACIEQX9KIgcNACADLQABQT9xIQYgBEEfcSEPAkAgBEFgTw0AIA9BBnQgBnIhBgwCCyAGQQZ0IAMtAAJBP3FyIQYCQCAEQXBPDQAgBiAPQQx0ciEGDAILIAZBBnQgAy0AA0E/cXIgD0ESdEGAgPAAcXIhBgwBCyAEQf8BcSEGCwJAAkAgBkHfAEYNACAGQYCAxABGDQEgBkH4//8AcUEwRw0BQQEhCyABIANBAWoiDzYCaEEBIQ0gBw0FIAEgA0ECaiIPNgJoIAMtAAFBP3EhByAEQR9xIQ0gBEFgTw0DIA1BBnQgB3IhAwwECwJAAkAgB0UNACADQQFqIQYMAQsCQCAEQWBPDQAgA0ECaiEGDAELIANBBEEDIARBb0sbaiEGCwJAAkAgBiAFRg0AAkACQCAGLAAAIgdBf0oNACAGLQABQT9xIQggB0EfcSEJAkAgB0FgTw0AIAlBBnQgCHIhBgwCCyAIQQZ0IAYtAAJBP3FyIQgCQCAHQXBPDQAgCCAJQQx0ciEGDAILIAhBBnQgBi0AA0E/cXIgCUESdEGAgPAAcXIhBgwBCyAHQf8BcSEGCyAGQfj//wBxQTBHDQACQCANDkIBAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAQAAAQAAAAAAAAAAAAEACyAGQb5/ag4uAAEBAAEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEAAQEAAQEAAQEBAQEBAQEBAAELIAJB7oCAgHg2AkggASAMIAJByABqEIssIAEoAmwhBSABKAJoIgMtAAAhBAsgASADQQFqIgc2AmgCQAJAIATAQX9KDQAgASADQQJqIgc2AmggAy0AAUE/cSEGIARBH3EhCAJAAkAgBEH/AXEiBEHgAU8NACAIQQZ0IAZyIQMMAQsgASADQQNqIgc2AmggBkEGdCADLQACQT9xciEGAkAgBEHwAU8NACAGIAhBDHRyIQMMAQsgASADQQRqIgc2AmggBkEGdCADLQADQT9xciAIQRJ0QYCA8ABxciEDCyABKAJ4IQQCQCADQYABTw0AQQEhBiAHIQMMAgsCQCADQYAQTw0AQQIhBiAHIQMMAgtBA0EEIANBgIAESRshBiAHIQMMAQsgASgCeCEEQQEhBiAHIQMLIAEgBiAEaiIINgJ4QQEhCSADIAVHDQELCyALQQFxDQMMBQsgASADQQNqIg82AmggB0EGdCADLQACQT9xciEHAkAgBEFwTw0AIAcgDUEMdHIhAwwBCyABIANBBGoiDzYCaCAHQQZ0IAMtAANBP3FyIA1BEnRBgIDwAHFyIQMLAkAgA0GAAU8NAEEBIQ0MAQtBAiENIANBgBBJDQBBA0EEIANBgIAESRshDQsgASANIAhqIgg2AnggDyAFRw0BCwsgASABKAJwIgUgASgCdCINajYCbCABIAUgCCABKAJ8IgRrIgNqIg82AmggAyAMIARrIgdrIQYgBSAHaiEHAkACQAJAAkAgDSADRg0AIA8tAABB7gBGDQELIAJByABqIAcgBiAJQQFxEPYIIAIoAkwiAyACKAJQELMQIRQgARDtCiIFRQ0BIAIgBTYCKCACKAJIIgVBgICAgHhGDQggBSADENQsQgIhEwwNCyABIAhBAWoiAzYCeCABIAUgAyAEayIIajYCaCACQcgAaiAHIAYQ2wQgAigCSA0BIAJBIGogAigCTCIDIAIoAlAiBkEtEIUYAkACQCACKAIgIgcNAEECIQcMAQsgAyAHIAcgAigCJCIJQSsQph8iDRshAyAGIAkgDRshBkEAIQcLIAJByABqIAMgBkEIEPEBIAIoAkgiCUGAgICAeEYNASACQTpqIg0gAkHIAGpBB2otAAA6AAAgAiACLwBNOwE4QQAtAKDwngEaIAItAEwhDCACKAJQIQZBEBB9IgNFDQQgAyAMOgAEIAMgCTYCACADIAIvATg7AAUgAyAGNgIIIAMgB0EBIAYbOgAMIANBB2ogDS0AADoAACABKAKEAUEIaiAFIA4gBGsiBGogCCAEaxDkAyERIAIgAzYCKEIBIRMMDAsgASABKAJwIgUgASgCdGo2AmwgASAFIAEoAnggASgCfCIEayIGajYCaCABKAKEAUEIaiAFIA4gBGsiBGogBiAEaxDkAyERIAIgFDkDKCACKAJIIgVBgICAgHhGDQggBSADENQsDAgLQaCPmgEQziwACyACQZeAgIB4NgJIIAJBCDoATCACIAggDCACQcgAahDKLjYCKEICIRMMCQsgASAIQQFqIgM2AnggASAFIAMgBGsiCGo2AmggAkHIAGogByAGENsEIAIoAkgNASACQRhqIAIoAkwiAyACKAJQIgZBLRCFGAJAAkAgAigCGCIHDQBBAiEHDAELIAMgByAHIAIoAhwiCUErEKYfIg0bIQMgBiAJIA0bIQZBACEHCyACQcgAaiADIAZBEBDxASACKAJIIglBgICAgHhGDQEgAkE6aiINIAJByABqQQdqLQAAOgAAIAIgAi8ATTsBOEEALQCg8J4BGiACLQBMIQwgAigCUCEGQRAQfSIDRQ0AIAMgDDoABCADIAk2AgAgAyACLwE4OwAFIAMgBjYCCCADIAdBASAGGzoADCADQQdqIA0tAAA6AAAgASgChAFBCGogBSAKIARrIgRqIAggBGsQ5AMhESACIAM2AihCASETDAgLAAtBoI+aARDOLAALIAEQ7QoiBUUNASACIAU2AiggAigCSCIFQYCAgIB4Rg0AIAUgBxDULAtCAiETDAQLIAEgASgCcCIFIAEoAnRqNgJsIAEgBSABKAJ4IAEoAnwiA2siBGo2AmggASgChAFBCGogBSAKIANrIgNqIAQgA2sQ5AMhESACIBQ5AyggAigCSCIFQYCAgIB4Rg0AIAUgBxDULAtCACETDAILIAIgBToANEHIl5wBQSsgAkE0akH4m5kBQYCfmQEQ4hIACyACQZeAgIB4NgJIIAJBEDoATCACIAggDyACQcgAahDKLjYCKEICIRMLIAIrAygiFL2nIQUCQCATQgJSDQAgACAF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QeADaiABEOECIAIoAuQDIQQgAigC4AMiHkEHRg0KIAIgFykAADcD4AQgAiAXQQdqKAAANgDnBCACLQD8AyEfIAIoAvgDISAgAigC9AMhISACKQLsAyEmIAIoAugDIRsgHg4FAQUFBQIFCyACQeADaiABEOECIAIoAuQDISIgAigC4AMiBEEHRg0FIAJBoARqQQhqIBooAgA2AgAgAiAXKQAANwOwBCACIBdBB2ooAAA2ALcEIAIgAikCrAM3A6AEIAItAPwDIR8gAigC+AMhICACKQPwAyElIAIoAuwDIR4gAigC6AMhGyABKALUASEaICMhEiAkIREMAwsgAiACKADnBDYA1wQgAiACKQPgBDcD0AQgIa1CIIYgJkIgiIQhJSAmpyEeDAELQQIhHyAbIR4gBCEbICYhJQsgHCAdQQFzciEhIAJBoARqQQhqIBooAgA2AgAgAiACKQKsAzcDoAQgAiACKQPQBDcDsAQgAiACKADXBDYAtwQgASgC1AEhGkEHIQQgEiEjIBEhJAsgGSACKQOwBDcAACAZQQdqIAIoALcENgAAIBggAikDoAQ3AwAgGEEIaiACQaAEakEIaigCADYCACACIB86AMwCIAIgIDYCyAIgAiAlNwPAAiACIB42ArwCIAIgGzYCuAIgAiAaNgLcAiACIA82AtgCIAIgEToA7gIgAiASOgDtAiACICE6AOwCIAIgIjYCtAIgAiAENgKwAiACQaADaiACQbACakGMqZwBEO0eDAYLIBcgAikD4AQ3AAAgF0EHaiACKADnBDYAACACIB86APwDIAIgIDYC+AMgAiAhNgL0AyACICY3AuwDIAIgGzYC6AMgAiAENgLkAyACIB42AuADIAJBGGogAkHgA2oQog8gAigCHCEEIAIoAhghAyACQdyAgIB4NgK4AyADIAQgAkG4A2oQ1xohBCABLQDgAUGiAUcNAyABIAEQlywQnxcMAwsgIiEEDAMLIAEoAtgBIQUgARCgCyABKALUASESIAJB4ANqIAFBABDRAiACKALkAyEEAkAgAigC4AMiC0EHRg0AIAkgEykDADcDACAJQRhqIBNBGGopAwA3AwAgCUEQaiATQRBqKQMANwMAIAlBCGogE0EIaikDADcDACACIAQ2ArwDIAIgCzYCuANBACEEAkACQCABLQCRAUEgcUUNACABLQDgAUH/AXFBCUcNACACQSBqIAFBASABKALYARD5EiACKAIkIQQgAigCIEEBcQ0BCyABKALUASELQSgQqSshEQJAQShFDQAgESACQbgDakEo/AoAAAsgFiACKQKsAzcCACAWQQhqIAJBrANqQQhqKAIANgIAIAIgDzYCiAQgAiAENgL4AyACIBI2AvQDIAIgBTYC8AMgAiALNgLsAyACIAU2AugDIAIgETYC5AMgAkECNgLgAyACIAEoAtQBNgKMBCACQaADaiACQeADakGcqZwBEO0eDAULIAJBuANqEOIVCyACQawDahCNKAwFCyACKAKkAyEEIAIoAqADIgVBgICAgHhGDQUgAiACKAKoAyIINgKQAyACIAQ2AowDIAIgBTYCiAMCQAJAAkACQAJAIAEtAOABQQFGDQAgASgC3AEhBCABKALYASEDIAJBuANqIAEQzSYgAkEBNgK0AiACQci+nAE2ArACIAJCATcCvAIgAkGzBzYCxAQgAkEBOgCsAyACIAJBwARqNgK4AiACIAJBoARqNgLABCACIAJBrANqNgKgBCACQeADaiACQbACahCNECACQfQDaiACQcADaigCADYCACACIAIpArgDNwLsAyADIAQgAkHgA2oQ1xohBCABLQDgAUGiAUYNAQwDCyABEKALIAEtAJEBQSBxRQ0BIAEtAOABQf8BcUEJRw0BIAJBEGogAUEBIAEoAtgBEPkSIAIoAhQhBQJAIAIoAhBBAXFFDQAgAEENNgIAIAAgBTYCBAwECyACIAU2AuADIAJBCGogBSgCABCyECACKAIMIQUgAigCCCEJIAJBnIGAgHg2ArACIAEgCSAFIAJBsAJqENcjIAJB4ANqEKUqDAELIAEgARCXLBCfFwwBCyAIQQZ0IQUgBCEJAkADQCAFRQ0BAkAgCSgCACITQQdGDQAgEw0CCyAFQUBqIQUgCUHAAGohCQwACwsgAkGwAmogAUEAQQAgBUUQ4QsgAigCtAIhEwJAAkAgAigCsAIiD0GBgICAeEYNACACQegDaiACQcACaikCADcDACACIAIpArgCNwPgAyAPQYCAgIB4RyILDQEgCEEGdCEFIAQhCQNAIAVFDQICQCAJKAIAQQdHDQAgCUEsaigCACERIAlBKGooAgAhEiACQaiBgIB4NgKwAiABIBIgESACQbACahDXIwsgCUHAAGohCSAF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KQKMATcC1AIgAiAHOgDsAiACIAM2AtACIAJBADoA8AIgAkEANgLgAiACQQA7APECIAJBADsA7QIgAiAENgLEAiACIAM2AsACIAJC8ciVm8atmLnlADcDuAIgAkEANgKwAiACIAkgBUH/AXFBCkZxOgDvAiAAIAEgAkGwAmoQngQLIAJB8ARqJAAL41sCC38BfiMAQbABayIDJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCACIEQXRqIgVBByAFQSZJGw4mAAECAwQFBgcICQoLDA0ODxARJyYlJCMiISAxHx4dHBsaGRgXFhUACyABKAIIIQUgA0GgAWogAiABKAIEIgRBABCMAgJAAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyADIAU2AqgBIAMgBDYCpAEgA0EBNgKgASADQZABaiACIANBoAFqQbylnAFBBBC6DSADLQCQAUEERg0xIAMpA5ABIg5C/wGDQgRRDTELIA5C/wGDQgRRDTAgACAONwIADDELIAEoAhQhBiADQZABaiACIAEoAhAiB0EAEIwCAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0vCwJAIAdFDQAgA0GQAWogAiAHEIcjIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINLwsgA0EANgKgASADQZABaiACIANBoAFqQYufnAFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINLwsgASgCCCIFIAEoAgwiCEEEdGpBcGohCUHSIiEKAkAgCEUNACAJRQ0AQdKiwABB0iIgCSgCAEECRhshCgsgA0GQAWogAiAHIAggCiAIEMYeAkAgAy0AkAFBBUYNACADKQOQASEODC0LQQUgAygClAEQtiggCEUNKyADQShqIAUQ9xogAi0ATUEBRg0qIANBkAFqIAIQhRYgAy0AkAFBBEYNKiADKQOQASIOQv8Bg0IEUQ0qDCwLIANBoAFqIAFBBGogAhB7IAMtAKABQQRGDS4gAykDoAEiDkL/AYNCBFENLiAAIA43AgAMLwsgA0GgAWogAUEIaiACELIFIAMt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QQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0EANgKgASADQZABaiACIANBoAFqQcWQnAFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCACLQBNDQAgA0GQAWogAhCRESADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAFBCGogAhDJLQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCACLQBNDQAgA0GQAWogAhCRESADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAIgA0GgAWpBw5CcAUEBELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCwJAIAItAE0NACADQZABaiACEJERIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0GQAWogAUEMaiACEMktIAMtAJABQQRGDScgAykDkAEiDkL/AYNCBFENJwsgDkL/AYNCBFENJiAAIA43AgAMJwsgASgCICEEIANBoAFqIAIgASgCHCIFQQAQjAICQAJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQCAFRQ0AIANBoAFqIAIgBRCHIyADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkACQAJAAkACQCABLQAYIgxBfWoiC0EBIAtB/wFxQQNJG0H/AXEOAwABAgALIANBoAFqIAEoAhAgASgCFCACEIcVIAMtAKABQQRGDQMgAykDoAEiDkL/AYNCBFINAgwDCyADQQE2AoABIAMgASkDEDcChAEgA0H4AGogAiADQYABakHC95sBQQYQug0CQAJAIAMtAHhBBEYNACADKQN4Ig5C/wGDQgRSDQELAkACQCAMDgMFAAEFCyADQQA2ApABIANBgAFqIAIgA0GQAWpBwPybAUEBELkNAkAgAy0AgAFBBEYNACADKQOAASIOQv8Bg0IEUg0CCyADQYABaiACIANBkAFqQcC4nAFBBhC6DSADLQCAAUEERg0EIAMpA4ABIg5C/wGDQgRSDQEMBAsgA0EANgKgASADQYABaiACIANBoAFqQcD8mwFBARC5DQJAIAMtAIABQQRGDQAgAykDgAEiDkL/AYNCBFINAQsgA0GAAWogAiADQaABakHGuJwBQQUQug0gAy0AgAFBBEYNAyADKQOAASIOQv8Bg0IEUQ0DCyAOQv8Bg0IEUg0BDAILAkAgAUEQaiILKAIAIgwoAgBBGEcNACADQaABaiACIAxBBGpBABDdBCADLQCgAUEERg0CIAMpA6ABIg5C/wGDQgRSDQEMAgsgA0GgAWogCyACEMktIAMtAKABQQRGDQEgAykDoAEiDkL/AYNCBFENAQsgDkL/AYNCBFINAQsCQCABKAIoIgtFDQAgA0GgAWogCyACEJAKIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgA0EANgJsIANBoAFqIAIgA0HsAGpB0ZCcAUEBELkNAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyADQaABaiACIAUgBCABKAIIIAEoAgwQnSoCQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBoAFqIAIgA0HsAGpB3IOeAUEBELkNIAMtAKABQQRGDSYgAykDoAEiDkL/AYNCBFENJgsgDkL/AYNCBFENJSAAIA43AgAMJgsgA0GgAWogAiABQQRqQQEQ3QQgAy0AoAFBBEYNJCADKQOgASIOQv8Bg0IEUQ0kIAAgDjcCAAwlCyADQaABaiACIAEoAhAiBUEAEIwCAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0HCwJAIAVFDQAgA0GgAWogAiAFEIcjIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINBwsgASgCDEECdCEFIAEoAgghBEEBIQsDQCAFRQ0kAkAgC0EBcQ0AIANBADYCoAEgA0GQAWogAiADQaABakH4h5wBQQEQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQkLIAItAE0NACADQaABaiACEJERIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINCAsgA0GgAWogBCACEMktAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0ICyAEQQRqIQQgBUF8aiEFQQAhCwwACwsgA0GgAWogAUEIaiACEPwXIAMtAKABQQRGDSIgAykDoAEiDkL/AYNCBFENIiAAIA43AgAMIwsgA0GgAWogAUEIaiACEJEEIAMtAKABQQRGDSEgAykDoAEiDkL/AYNCBFENISAAIA43AgAMIgsgASgCICEIIANBkAFqIAIgASgCHCIFQQAQjAICQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRsLAkAgBUUNACADQZABaiACIAUQhyMgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0bCyADQQA2AqABIANBkAFqIAIgA0GgAWpBgPObAUEBELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0bCyABKAIMIgogASgCGCIMaiEEIAEoAhQhBiABKAIIIQdBACEFA0ACQAJAAkAgBCAFRg0AIAVBAXENASAFQQF2IgsgDE8NBiADQZABaiAGIAtBBXRqIAIQaiADLQCQAUEERg0CIAMpA5ABIg5C/wGDQgRSDR4MAgsgA0GQAWogAiADQaABakGA85sBQQEQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDR4LIAhFDSMgA0GQAWogAiAIEIcjIAMtAJABQQRGDSMgAykDkAEiDkL/AYNCBFENIwwdCyADQZABaiACIANBoAFqQZTzmwFBAhC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINHQsgBUEBdiILIApPDQMgA0GQAWogByALQQJ0aiACEMktAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0dCyADQZABaiACIANBoAFqQciQnAFBARC5DSADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRwLIAVBAWohBQwACwsgASgCECEJIANBoAFqIAIgASgCDCIFQQAQjAICQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDRkLAkAgBUUNACADQaABaiACIAUQhyMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0ZCwJAAkAgAUEEaiIFKAIAIgQoAgBBGEcNACADQaABaiACIARBBGpBABDdBCADLQCgAUEERg0BIAMpA6ABIg5C/wGDQgRRDQEMGgsgA0GgAWogBSACEMktIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINGQsgA0GgAWogAUEYaiACEJQmAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0ZCyABKAIIIgUoAhwhDSADQZABaiACIAUoAhgiBEEAEIwCAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0XCwJAIARFDQAgA0GQAWogAiAEEIcjIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINFwsgA0EANgKgASADQZABaiACIANBoAFqQYDzmwFBARCvDQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINFwsgBSgCCCIHIAUoAhQiBmohCyAFKAIQIQogBSgCBCEIQQAhBQNAAkACQAJAAkACQCALIAVGDQAgBUEBcQ0BIAVBAXYiBCAGTw0CAkACQCAKIARBBXRqIgQoAggiDEUNACADQZABaiACIAwQhyMgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQThqIAQQ6hUgA0GQAWogAkEAQQAgAygCOCADKAI8EIEPAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyAEKAIMIgRFDQUgA0GQAWogAiAEEIcjIAMtAJABQQRGDQUgAykDkAEiDkL/AYNCBFENBQsgDkL/AYNCBFINHAwECyADQZABaiACIANBoAFqQYDzmwFBARCvDQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINHAsgDUUNHCADQZABaiACIA0QhyMgAy0AkAFBBEYNHCADKQOQASIOQv8Bg0IEUg0bDBwLIANBkAFqIAIgA0GgAWpBlPObAUECEK8NAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0bCyAFQQF2IgQgB08NASADQZABaiAIIARBAnRqIAIQyS0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDRsLIANBkAFqIAIgA0GgAWpByJCcAUEBEK8NIAMtAJABQQRGDQIgAykDkAEiDkL/AYNCBFENAgwaCyAEIAZB8OKbARCMFQALIAQgB0GA45sBEIwVAAsgBUEBaiEFDAALCyALIApBiOqbARCMFQALIAsgDEH46ZsBEIwVAAsgDkL/AYNCBFENHCAAIA43AgAMHQsgA0GgAWogASgCBCABKAIIIAIQ5xEgAy0AoAFBBEYNGyADKQOgASIOQv8Bg0IEUQ0bIAAgDjcCAAwcCyADQaABaiABQQRqIAIQjgQgAy0AoAFBBEYNGiADKQOgASIOQv8Bg0IEUQ0aIAAgDjcCAAwbCyADQaABaiABQQhqIAIQ/gggAy0AoAFBBEYNGSADKQOgASIOQv8Bg0IEUQ0ZIAAgDjcCAAwaCyADQaABaiABQQRqIAIQvgggAy0AoAFBBEYNGCADKQOgASIOQv8Bg0IEUQ0YIAAgDjcCAAwZCyADQaABaiABQQRqIAIQ/Q0gAy0AoAFBBEYNFyADKQOgASIOQv8Bg0IEUQ0XIAAgDjcCAAwYCyADQaABaiABQQRqIAIQvQggAy0AoAFBBEYNFiADKQOgASIOQv8Bg0IEUQ0WIAAgDjcCAAwXCyADQaABaiABQQRqIAIQow0gAy0AoAFBBEYNFSADKQOgASIOQv8Bg0IEUQ0VIAAgDjcCAAwWCyADQZABaiACIAEoAghBABCMAgJAAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiABQQRqIAIQyS0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAIQjRECQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABakH4upwBQQIQtA0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAIQjRECQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBkAFqIAIgA0GgAWpBu/KbAUEFELQNIAMtAJABQQRGDRUgAykDkAEiDkL/AYNCBFENFQsgDkL/AYNCBFENFCAAIA43AgAMFQsgA0GgAWogAUEEaiACEKIJIAMtAKABQQRGDRMgAykDoAEiDkL/AYNCBFENEyAAIA43AgAMFAsgA0GgAWogAUEEaiACEI0MIAMtAKABQQRGDRIgAykDoAEiDkL/AYNCBFENEiAAIA43AgAMEwsgA0GgAWogASgCBCACELwBIAMtAKABQQRGDREgAykDoAEiDkL/AYNCBFENESAAIA43AgAMEgsgA0GgAWogAUEIaiACEKQNIAMtAKABQQRGDRAgAykDoAEiDkL/AYNCBFENECAAIA43AgAMEQsgA0GgAWogAUEIaiACEJwKIAMtAKABQQRGDQ8gAykDoAEiDkL/AYNCBFENDyAAIA43AgAMEAsgA0GgAWogAUEEaiACEPAHIAMtAKABQQRGDQ4gAykDoAEiDkL/AYNCBFENDiAAIA43AgAMDwsgA0GgAWogAiABKAIIIgVBABCMAgJAAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIAVFDQAgA0GgAWogAiAFEIcjIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgA0EANgKgASADQZABaiACIANBoAFqQYSEnAFBBRC6DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgA0GgAWogAhCREQJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsgA0GgAWogAUEEaiACEMktIAMtAKABQQRGDQ4gAykDoAEiDkL/AYNCBFENDgsgDkL/AYNCBFENDSAAIA43AgAMDgsgAS0ADCEEIAEoAgQhBQJAAkAgAigCREUNACADQaABaiACIAVBABCMAiADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELAkAgBUUNACADQaABaiACIAUQhyMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIARBAXFFDQAgA0EANgKgASADQZABaiACIANBoAFqQd7qmwFBCxC6DSADLQCQAUEERg0OIAMpA5ABIg5C/wGDQgRSDQEMDgsgA0EANgKgASADQZABaiACIANBoAFqQdTqmwFBChC6DSADLQCQAUEERg0NIAMpA5ABIg5C/wGDQgRRDQ0LIA5C/wGDQgRRDQwgACAONwIADA0LIANBkAFqIAIgASgCBCIFQQAQjAICQAJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsCQCAFRQ0AIANBkAFqIAIgBRCHIyADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABakGJhJwBQQUQug0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkAgAS0AECIERQ0AIANBkAFqIAIgA0GgAWpB0pCcAUEBELsNIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgASgCDCIFRQ0MAkACQAJAIAIgBRDMBiILDQACQCAEDQAgBRDwCA0CCyACLQBNDQIgA0GQAWogAhCRESADLQCQAUEERg0CIAMpA5ABIg5C/wGDQgRRDQIMAwsgA0GQAWogAiADQaABakHRkJwBQQEQuQ0gAy0AkAFBBEYNASADKQOQASIOQv8Bg0IEUQ0BDAILIANBkAFqIAIQkREgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyADQZABaiABQQxqIAIQ0iYCQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELIAtFDQwgA0GQAWogAiADQaABakHcg54BQQEQuQ0gAy0AkAFBBEYNDCADKQOQASIOQv8Bg0IEUQ0MCyAOQv8Bg0IEUQ0LIAAgDjcCAAwMCyADQaABaiABQQhqIAIQmwUgAy0AoAFBBEYNCiADKQOgASIOQv8Bg0IEUQ0KIAAgDjcCAAwLCyABKAIYIQogA0GgAWogAiABKAIUIgtBABCMAgJAAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIAtFDQAgA0GgAWogAiALEIcjIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAQsCQAJAAkAgAi0ATQ0AIAEtAChFDQIgA0EANgKgASADQZABaiACIANBoAFqQe6qnAFBBRC6DSADLQCQAUEERg0BIAMpA5ABIg5C/wGDQgRSDQMMAQtBACEFAkAgASgCDEEBRw0AIAEoAggoAgBFIQULIAEtAChBAUcNASADQQA2AqABIANBkAFqIAIgA0GgAWpB7qqcAUEFELoNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0DCyAFDQAgAi0ATQ0BIANBoAFqIAIQkREgAy0AoAFBBEYNASADKQOgASIOQv8Bg0IEUQ0BDAILIANBoAFqIAIQkREgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCwJAIAEtAClFDQAgA0EANgKgASADQZABaiACIANBoAFqQdKQnAFBARC5DSADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkACQAJAIAItAE0NACADQaABaiABQSBqIAIQlSYgAy0AoAFBBEYNASADKQOgASIOQv8Bg0IEUg0DDAELAkACQCABKAIMQQFHDQAgASgCCCIFKAIARQ0BCyADQaABaiABQSBqIAIQlSYgAy0AoAFBBEYNASADKQOgASIOQv8Bg0IEUQ0BDAMLAkACQCACKAJEIgQNAEEAIQUMAQsgBCAFKAIUIAIoAkgoAiwRBwAhBQsgA0GgAWogAUEgaiACEJUmAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0DC0EAIQggBUUNAQsgA0EANgKgAUEBIQggA0GQAWogAiADQaABakHRkJwBQQEQuQ0gAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCyABKAIIIQkgA0GgAWogAiALIAEoAgwiB0GQAiAHEMYeAkACQAJAIAMtAKABQQVGDQAgAykDoAEhDgwBC0EFIAMoAqQBELYoAkAgB0UNACADQQE6AIABIANB4ABqIAkQog8gA0EAOgCQASAHIQQgCSEFQQAhDEEAIQYDQAJAAkACQCAERQ0AIANB2ABqIAUQog8gA0GgAWogAiAKQZACIAwgBiADQZABaiADQYABahCtBQJAIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINBgsgA0GgAWogBSACEMYGAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0GCyADLQCAAQ0BIANBAToAgAEMAgsCQCAJIAdBKGxqQVhqIgVFDQAgA0HAAGogBRCiDwsgA0GgAWogAiALIApBkAIgDCAGEI4CIAMtAKABQQRGDQMgAykDoAEiDkL/AYNCBFINBAwDCyACKAJERQ0AIANB0ABqIAUQjQMgA0GgAWogAiADKAJUQQAQ8QMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0DCwJAIAMtAJABRQ0AIAIgAigCLEF/ajYCLCADQQA6AJABCyAEQX9qIQQgA0HIAGogBRCiDyAFQShqIQVBASEMIAMoAkwhBgwACwsgA0GgAWogAiAKIAdFQZACENQTIAMtAKABQQRGDQEgAykDoAEiDkL/AYNCBFENAQsgDkL/AYNCBFINAQsCQCAIRQ0AIANBADYCoAEgA0GQAWogAiADQaABakHcg54BQQEQuQ0gAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0BCwJAIAEoAiQiBUUNACADQQA2AqABIANBkAFqIAIgA0GgAWpBw5CcAUEBELkNAkAgAy0AkAFBBEYNACADKQOQASIOQv8Bg0IEUg0CCwJAIAItAE0NACADQaABaiACEJERIAMtAKABQQRGDQAgAykDoAEiDkL/AYNCBFINAgsgA0GgAWogBSACEJMSAkAgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0CCyACLQBNDQAgA0GgAWogAhCRESADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIANBADYCoAEgA0GQAWogAiADQaABakG58psBQQIQuQ0CQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQELAkACQCABKAIQIgUoAgBBgICAgHhGDQAgA0GgAWogAiAFQQEQrwYgAy0AoAFBBEYNDCADKQOgASIOQv8Bg0IEUQ0MDAELIAIgAigCLEEBajYCLCADQaABaiAFQQRqIAIQyS0CQCADLQCgAUEERg0AIAMpA6ABIg5C/wGDQgRSDQELIAIgAigCLEF/ajYCLAwLCyAOQv8Bg0IEUQ0KCyAOQv8Bg0IEUQ0JIAAgDjcCAAwKCyAOQv8Bg0IEUg0BCyAJRQ0HIANBoAFqIAIgCRCHIyADLQCgAUEERg0HIAMpA6ABIg5C/wGDQgRRDQcLIA5C/wGDQgRRDQYgACAONwIADAcLIA5C/wGDQgRRDQUgACAONwIADAYLIANBADoAbAJAIAItAE0NACACIAIoAixBAWo2AiwLIANBADoAgAEgCCEEQQAhC0EAIQwDQAJAAkACQCAERQ0AIANBIGogBRD3GiADQZABaiACIAYgCiALIAwgA0GAAWogA0HsAGoQrQUCQCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQYLAkAgBSgCAEECRg0AIANBkAFqIAUgAhDDDCADLQCQAUEERg0AIAMpA5ABIg5C/wGDQgRSDQYLIAMtAGwNASADQQE6AGwMAgsCQCAJRQ0AIANBCGogCRD3GgsgA0GQAWogAiAHIAYgCiALIAwQjgIgAy0AkAFBBEYNAyADKQOQASIOQv8Bg0IEUg0EDAMLIAIoAkRFDQBBACELAkAgBSgCACIMQQJGDQAgA0EYaiAFQQxqKAIAEMgDIAMoAhwhCyAMQQFxRQ0AIAVBBGooAgAiDCALIAwgC0sbIQsLIANBkAFqIAIgC0EAEPEDIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAwsCQCADLQCAAUUNACACIAIoAixBf2o2AiwgA0EAOgCAAQsgBEF/aiEEIANBEGogBRD3GiAFQRBqIQVBASELIAMoAhQhDAwACwsgA0GQAWogAiAGIAhFIAoQ1BMgAy0AkAFBBEYNASADKQOQASIOQv8Bg0IEUQ0BCyAOQv8Bg0IEUg0BCyADQZABaiACIANBoAFqQcSQnAFBARC5DQJAIAMtAJABQQRGDQAgAykDkAEiDkL/AYNCBFINAQsgBkUNASADQZABaiACIAYQhyMgAy0AkAFBBEYNASADKQOQASIOQv8Bg0IEUQ0BCyAOQv8Bg0IEUQ0AIAAgDjcCAAwBCwJAAkAgAigCREUNACADIAEQyAMgA0GgAWogAiADKAIEQQEQ8QMgAy0AoAFBBEYNACADKQOgASIOQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAONwIACyADQbABaiQAC6pgAgp/AX4jAEGwBWsiBSQAIAEtAOABIQYCQAJAAkAgAS8BkAFBgMAAcSIHRQ0AIAZB/wFxQdEARw0AAkAgARDUCSIGRQ0AIAYtAABB/QBHDQAgARCgCyABEKALIAVBkAJqIAEgAkEBEP8BIAUoApQCIQECQAJAIAUoApACQQFxRQ0AQRMhBkEEIQgMAQsgAEEGNgIIQREhBkEMIQgLIAAgBjYCACAAIAhqIAE2AgAMAgsgAS0A4AEhBgsgASgCiAEhCAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGQf8BcSIJQcwARw0AIAMgCEGAgICAAnEiCkEddnINAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAlBs39qDiQQCwYNCxAPCwsACwsLCwcBDgILCwsLCwsDCwQLBQsICwwLCgkLCyABKALYASEIIAEQoAsCQAJAIAEoAogBIgZBgBhxQYAYRg0AIAEgBkGAGHI2AogBIAVBkARqIAEQsC8gASABKAKIASAGQf9ncnE2AogBDAELIAVBkARqIAEQsC8LIAVBoAFqIAVBkARqENIhIAUoAqQBIQYCQCAFKAKgAUEBcUUNACAAQRM2AgAgACAGNgIEDD0LIAUgBjYCuAMCQCABLQDgAUHvAEYNACABKALcASEGIAEoAtgBIQggBUHwBGogARDNJiAFQQE2ApQEIAVByL6cATYCkAQgBUIBNwKcBCAFQbMHNgLMAiAFQe8AOgCoAyAFIAVByAJqNgKYBCAFIAVBkANqNgLIAiAFIAVBqANqNgKQAyAFQcgDaiAFQZAEahD0GiAFQdwDaiAFQfgEaigCADYCACAFIAUpAvAENwLUAyAIIAYgBUHIA2oQ1xohBiABLQDgAUGiAUYNEgw7CyABEKALAkAgAS0A4AFFDQAgASgC3AEhBiABKALYASEIIAVBkAVqIAEQzSYgBUEBNgKUBCAFQci+nAE2ApAEIAVCATcCnAQgBUGzBzYCzAIgBUEAOgCoAyAFIAVByAJqNgKYBCAFIAVBkANqNgLIAiAFIAVBqANqNgKQAyAFQcgDaiAFQZAEahD0GiAFQdwDaiAFQZgFaigCADYCACAFIAUpApAFNwLUAyAIIAYgBUHIA2oQ1xohBiABLQDgAUGiAUYNEww6CyABEKALAkACQCABKAKIASIDQcAAcQ0AIAEgA0HAAHI2AogBIAVBkAFqIAEQ+wkgBSgCkAEhAiABIAEoAogBQb9/cTYCiAEgBSgClAEhAwwBCyAFQZgBaiABEPsJIAUoApwBIQMgBSgCmAEhAgsCQCACQQFxRQ0AIABBEzYCACAAIAM2AgQMPAsgBSADNgKoAyABLQDgAUEBRg0TIAEoAtwBIQYgASgC2AEhCCAFQegCaiABEM0mIAVBATYClAQgBUHIvpwBNgKQBCAFQgE3ApwEIAVBswc2AswCIAVBAToAwAMgBSAFQcgCajYCmAQgBSAFQZADajYCyAIgBSAFQcADajYCkAMgBUHIA2ogBUGQBGoQ9BogBUHcA2ogBUHwAmooAgA2AgAgBSAFKQLoAjcC1AMgCCAGIAVByANqENcaIQYgAS0A4AFBogFHDTggASABEJcsEJ8XDDgLIAEoAtgBIQkgARCgCyABKALYASEHAkACQCABLQDgASICQcwARg0AQQAhAyACIQYMAQsgARCgCyABLQDgASEGIAEoAtQBIQtBASEDCwJAIAZB/wFxRQ0AIAEoAtwBIQYgASgC2AEhCCAFQfAEaiABEM0mIAVBATYClAQgBUHIvpwBNgKQBCAFQgE3ApwEIAVBswc2AuwCIAVBADoAkAMgBSAFQegCajYCmAQgBSAFQcgCajYC6AIgBSAFQZADajYCyAIgBUHIA2ogBUGQBGoQ9BogBUHcA2ogBUH4BGooAgA2AgAgBSAFKQLwBDcC1AMgCCAGIAVByANqENcaIQYgAS0A4AFBogFGDRQMNwsgARCgCwJAAkAgASgCiAEiBkEQcQ0AIAEgBkEQcjYCiAEgBUGQBGogAyABEMQVIAEgASgCiAFBb3E2AogBDAELIAVBkARqIAMgARDEFQsgBSgClAQhCAJAIAUoApAEIgZBBUcNACAAQRM2AgAgACAINgIEDDwLIAUgBSkCmAQiDzcC8AIgBSAINgLsAiAFIAY2AugCAkACQAJAIAEtAOABQQFGDQAgASgC3AEhCCABKALYASEDIAVBkAVqIAEQzSYgBUEBNgKUBCAFQci+nAE2ApAEIAVCATcCnAQgBUGzBzYCzAIgBUEBOgCoAyAFIAVByAJqNgKYBCAFIAVBkANqNgLIAiAFIAVBqANqNgKQAyAFQcgDaiAFQZAEahD0GiAFQdwDaiAFQZAFakEIaigCADYCACAFIAUpApAFNwLUAyADIAggBUHIA2oQ1xohCCABLQDgAUGiAUYNAQw2CyABEKALAkACQCABKAKIASIKQYAYcUGAGEYNACABIApBgBhyNgKIASAFQZAEaiABELAvIAEgASgCiAEgCkH/Z3JxNgKIAQwBCyAFQZAEaiABELAvCyAFQagBaiAFQZAEahDSISAFKAKsASEKIAUoAqgBQQFxRQ0BIABBEzYCACAAIAo2AgQMNgsgASABEJcsEJ8XDDQLIA9CIIinIQwgD6chDSAFIAo2AqgDIAEoAtQBIQ4CQAJAAkAgBkF+akEAIAZBfWpBAkkbDgMAAgEACyAFIAg2AswDIAUgBjYCyAMgBSANNgKQAyAFIAw2AsgCAkAgAw0AQQ4hASANIQIgDCEDIAghDSAKIQwgCSEKIA4hCSACIQ4MMwsgBUHSgICAeDYCkAQgByALIAVBkARqENcaIQggAS0A4AFBogFGDRYMMwsgAkHMAEYhA0EQIQEgCCEGDDELIAUgDTYCzAMgBSAINgLIAyAFIAw2AsgCAkAgAw0AQQ8hASAIIQYMMQsgBUHSgICAeDYCkAQgByALIAVBkARqENcaIQggAS0A4AFBogFHDS8gASABEJcsEJ8XDC8LIAVBkARqIAEQvwICQAJAIAUoApAEDQAgACAFKAKUBDYCBEETIQEMAQsgACAFKQKQBDcCBCAAQRRqIAVBoARqKAIANgIAQQghASAAQQxqIAVBkARqQQhqKQIANwIACyAAIAE2AgAMOgsgASgC2AEhAyABEKALQQAhBgJAAkACQCABLQDgASIIQX1qDgQCAQECAAsgCEGjAUYNAQsgAS0A4QENAAJAAkAgASgCiAEiBkHAAHENACABIAZBwAByNgKIASAFQbABaiABEPsJIAUoArABIQggASABKAKIAUG/f3E2AogBIAUoArQBIQYMAQsgBUG4AWogARD7CSAFKAK8ASEGIAUoArgBIQgLIAhBAXFFDQAgAEETNgIAIAAgBjYCBAw6CyAFIAY2AsgDAkAgARDAEiIIRQ0AIABBEzYCACAAIAg2AgQgBUHIA2oQwysMOgsgASgC1AEhCAJAIAEtAIoBQQhxDQAgAS0AkAFBgAFxDQAgBUHLgICAeDYCkAQgASADIAggBUGQBGoQ1yMLIAAgBjYCDCAAIAg2AgggACADNgIEIABBBDYCAAw5CyABKALYASEDIAEQoAsCQCABLQDgAUUNACABKALcASEGIAEoAtgBIQggBUGoA2ogARDNJiAFQQE2ApQEIAVByL6cATYCkAQgBUIBNwKcBCAFQbMHNgL0BCAFQQA6ALgDIAUgBUHwBGo2ApgEIAUgBUHIAmo2AvAEIAUgBUG4A2o2AsgCIAVByANqIAVBkARqEPQaIAVB3ANqIAVBsANqKAIANgIAIAUgBSkCqAM3AtQDIAggBiAFQcgDahDXGiEGIAEtAOABQaIBRg0TDCwLIAEQoAsCQAJAIAEoAogBIgZBwABxDQAgASAGQcAAcjYCiAEgBUHAAWogARD7CSAFKALAASEIIAEgASgCiAFBv39xNgKIASAFKALEASEGDAELIAVByAFqIAEQ+wkgBSgCzAEhBiAFKALIASEICwJAIAhBAXFFDQAgAEETNgIAIAAgBjYCBAw5CyAFIAY2ArQDAkAgAS0A4AFBAUYNACABKALcASEGIAEoAtgBIQggBUGQA2ogARDNJiAFQQE2ApQEIAVByL6cATYCkAQgBUIBNwKcBCAFQbMHNgL0BCAFQQE6ALgDIAUgBUHwBGo2ApgEIAUgBUHIAmo2AvAEIAUgBUG4A2o2AsgCIAVByANqIAVBkARqEPQaIAVB3ANqIAVBmANqKAIANgIAIAUgBSkCkAM3AtQDIAggBiAFQcgDahDXGiEGIAEtAOABQaIBRg0UDCoLIAEQoAsgBUEANgLQAiAFQoCAgIDAADcCyAIgBUEANgLwBAJAIAEtAOABQQJGDQAgASgC3AEhBiABKALYASEIIAVBkAVqIAEQzSYgBUEBNgKUBCAFQci+nAE2ApAEIAVCATcCnAQgBUGzBzYCvAMgBUECOgDHAyAFIAVBuANqNgKYBCAFIAVBwANqNgK4AyAFIAVBxwNqNgLAAyAFQcgDaiAFQZAEahD0GiAFQdwDaiAFQZgFaigCADYCACAFIAUpApAFNwLUAyAIIAYgBUHIA2oQ1xohCCABLQDgAUGiAUcNKQwoCyABEKALAkACQCABKAKIASIIQYAQcQ0AIAEgCEGAEHI2AogBIAVB8ARqIAVByAJqIAEQnwQhCCABIAEoAogBQf9vcTYCiAEMAQsgBUHwBGogBUHIAmogARCfBCEICyAIDSgCQCABLQDgAUEDRg0AIAEoAtwBIQYgASgC2AEhCCAFQegCaiABEM0mIAVBATYClAQgBUHIvpwBNgKQBCAFQgE3ApwEIAVBswc2ArwDIAVBAzoAxwMgBSAFQbgDajYCmAQgBSAFQcADajYCuAMgBSAFQccDajYCwAMgBUHIA2ogBUGQBGoQ9BogBUHcA2ogBUHwAmooAgA2AgAgBSAFKQLoAjcC1AMgCCAGIAVByANqENcaIQggAS0A4AFBogFGDSgMKQsgARCgCyAAIAM2AhQgACAGNgIQIABBCTYCACAAIAUpAsgCNwIEIABBDGogBUHQAmooAgA2AgAgACABKALUATYCGAw4CyABKALYASEDIAEQoAsCQCABLQDhAQ0AAkACQCABKAKIASIGQcAAcQ0AIAEgBkHAAHI2AogBIAVB0AFqIAEQ+wkgBSgC0AEhCCABIAEoAogBQb9/cTYCiAEgBSgC1AEhBgwBCyAFQdgBaiABEPsJIAUoAtwBIQYgBSgC2AEhCAsCQCAIQQFxRQ0AIABBEzYCACAAIAY2AgQMOQsgBSAGNgKQBAJAIAEQwBIiCEUNACAAQRM2AgAgACAINgIEIAVBkARqEMAsDDkLIAAgAzYCCCAAIAY2AgQgAEEKNgIAIAAgASgC1AE2AgwMOAsgASgC3AEhBiABKALYASEIIAVBroCAgHg2ApAEIAggBiAFQZAEahDXGiEGIAEtAOABQaIBRw0lIAEgARCXLBCfFwwlCyABKALcASEGIAEoAtgBIQggBUH1gICAeDYCkAQgASAIIAYgBUGQBGoQ1yMgBUGQBGogARCaAwJAAkAgBSgCkARBCUYNACAFQZAEahCSJwwBCyAFQZAEakEEchC2BwsgBUGQBGogARDCDyAFQZAEahDYJiAIIAYQ8SQhASAAIAY2AgwgACAINgIIIAAgATYCBCAAQRI2AgAMNgsgASgC3AEhBiABKALYASEIIAVB9YCAgHg2ApAEIAEgCCAGIAVBkARqENcjIAVBkARqIAEQwg8gBUGQBGoQ2CYgCCAGEPEkIQEgACAGNgIMIAAgCDYCCCAAIAE2AgQgAEESNgIADDULIAEoAtgBIQMgARCgCyAFQZAEaiABQQAQjAggBSgClAQhBgJAIAUoApAEIghBgICAgHhHDQAgAEETNgIAIAAgBjYCBAw1CyAFQegCakEQaiAFQZAEakEQaikCADcCACAFIAUpApgENwLwAiAFIAY2AuwCIAUgCDYC6AIgASgC2AEhAiAFQZAEaiABEJoDIAUoApQEIQYCQAJAAkAgBSgCkAQiCEEJRw0AIABBEzYCACAAIAY2AgQMAQsCQEHAAEUNACAFQcgDakEIaiAFQZAEakEIakHAAPwKAAALIAUgBjYCzAMgBSAINgLIAyAFQZAEaiABEMIPIAUoApQEIQYgBSgCkAQiCUGBgICAeEcNASAAQRM2AgAgACAGNgIEIAVByANqEJInCyAFQegCahDEKAw1CyAFQZAFakEIaiAFQZAEakEQaikCADcDACAFIAUpApgENwOQBSAJQYCAgIB4Rw0gIAhBCEcNICAFQfWAgIB4NgKQBCABIAIgAiAFQZAEahDXIwwgCwJAIAEtAJEBQSBxRQ0AIAEoAtwBIQYgASgC2AEhCCAFQauBgIB4NgKQBCABIAggBiAFQZAEahDXIwsgASgC3AEhBiABKALYASEIIAVByoCAgHg2ApAEIAEgCCAGIAVBkARqEMoOIAEoAtgBIQMgARCgCwJAIAEtAOABRQ0AIAEoAtwBIQYgASgC2AEhCCAFQZAFaiABEM0mIAVBATYClAQgBUHIvpwBNgKQBCAFQgE3ApwEIAVBswc2AvQEIAVBADoAkAMgBSAFQfAEajYCmAQgBSAFQcgCajYC8AQgBSAFQZADajYCyAIgBUHIA2ogBUGQBGoQ9BogBUHcA2ogBUGYBWooAgA2AgAgBSAFKQKQBTcC1AMgCCAGIAVByANqENcaIQYgAS0A4AFBogFGDRAMHwsgARCgCwJAAkAgASgCiAEiBkHAAHENACABIAZBwAByNgKIASAFQegBaiABEPsJIAUoAugBIQggASABKAKIAUG/f3E2AogBIAUoAuwBIQYMAQsgBUHwAWogARD7CSAFKAL0ASEGIAUoAvABIQgLAkAgCEEBcUUNACAAQRM2AgAgACAGNgIEDDQLIAUgBjYCkAMCQAJAAkAgAS0A4AFBAUYNACABKALcASEGIAEoAtgBIQggBUHoAmogARDNJiAFQQE2ApQEIAVByL6cATYCkAQgBUIBNwKcBCAFQbMHNgL0BCAFQQE6AKgDIAUgBUHwBGo2ApgEIAUgBUHIAmo2AvAEIAUgBUGoA2o2AsgCIAVByANqIAVBkARqEPQaIAVB3ANqIAVB8AJqKAIANgIAIAUgBSkC6AI3AtQDIAggBiAFQcgDahDXGiEIIAEtAOABQaIBRw0BIAEgARCXLBCfFwwBCyABEKALAkACQCABKAKIASIIQYCAIHENACABIAhBgIAgcjYCiAEgBUGQBGogARCwLyABIAEoAogBQf//X3E2AogBDAELIAVBkARqIAEQsC8LIAVB4AFqIAVBkARqENIhIAUoAuQBIQggBSgC4AFBAXFFDQELIABBEzYCACAAIAg2AgQgBUGQA2oQwCwMNAsgACADNgIMIAAgCDYCCCAAIAY2AgQgAEEDNgIAIAAgASgC1AE2AhAMMwsgASgC2AEhAyABEKALAkAgAS0A4AFFDQAgASgC3AEhBiABKALYASEIIAVBkAVqIAEQzSYgBUEBNgKUBCAFQci+nAE2ApAEIAVCATcCnAQgBUGzBzYC9AQgBUEAOgCQAyAFIAVB8ARqNgKYBCAFIAVByAJqNgLwBCAFIAVBkANqNgLIAiAFQcgDaiAFQZAEahD0GiAFQdwDaiAFQZgFaigCADYCACAFIAUpApAFNwLUAyAIIAYgBUHIA2oQ1xohBiABLQDgAUGiAUYNEAwdCyABEKALAkACQCABKAKIASIGQcAAcQ0AIAEgBkHAAHI2AogBIAVBgAJqIAEQ+wkgBSgCgAIhCCABIAEoAogBQb9/cTYCiAEgBSgChAIhBgwBCyAFQYgCaiABEPsJIAUoAowCIQYgBSgCiAIhCAsCQCAIQQFxRQ0AIABBEzYCACAAIAY2AgQMMwsgBSAGNgKQAwJAAkACQCABLQDgAUEBRg0AIAEoAtwBIQYgASgC2AEhCCAFQegCaiABEM0mIAVBATYClAQgBUHIvpwBNgKQBCAFQgE3ApwEIAVBswc2AvQEIAVBAToAqAMgBSAFQfAEajYCmAQgBSAFQcgCajYC8AQgBSAFQagDajYCyAIgBUHIA2ogBUGQBGoQ9BogBUHcA2ogBUHwAmooAgA2AgAgBSAFKQLoAjcC1AMgCCAGIAVByANqENcaIQggAS0A4AFBogFHDQEgASABEJcsEJ8XDAELIAEQoAsCQAJAIAEoAogBIghBgBhxQYAYRg0AIAEgCEGAGHI2AogBIAVBkARqIAEQsC8gASABKAKIASAIQf9ncnE2AogBDAELIAVBkARqIAEQsC8LIAVB+AFqIAVBkARqENIhIAUoAvwBIQggBSgC+AFBAXFFDQELIABBEzYCACAAIAg2AgQgBUGQA2oQwCwMMwsgACADNgIMIAAgCDYCCCAAIAY2AgQgAEEMNgIAIAAgASgC1AE2AhAMMgsCQCADRQ0AIAZB/wFxQdEARg0BCwJAAkAgA0UNACAGQf8BcUHiAEYNAQsCQAJAIANFDQAgBkH/AXFBmwFGDQELAkACQAJAAkACQAJAIAdFDQAgBkH/AXFBggFGDQELAkAgB0UNACAGQf8BcUGXAUYNAgsCQCAHRQ0AIAZB/wFxQf0ARg0DCyAGQf8BcUF+ag4FAxsbGwQbCyABENQJIgZFDRogBi0AABCgFUUNGiABEIQnDRogASgC2AEhBiABEKALIAVB+ABqIAEgBhC7BCAFKAJ8IQECQCAFKAJ4QQFxRQ0AIABBEzYCACAAIAE2AgQMOAsgACABNgIMIABBBDYCCCAAQRE2AgAMNwsgARDUCSIGRQ0ZIAYtAAAQoBVFDRkgARCEJw0ZIAEoAtgBIQYgARCgCyAFQYABaiABIAYQ1QkgBSgChAEhAQJAIAUoAoABQQFxRQ0AIABBEzYCACAAIAE2AgQMNwsgACABNgIMIABBBTYCCCAAQRE2AgAMNgsgARDUCSIGRQ0YIAYtAAAQoBVFDRggARCEJw0YIAEoAtgBIQYgARCgCyAFQYgBaiABIAZBABD/ASAFKAKMASEBAkAgBSgCiAFBAXFFDQAgAEETNgIAIAAgATYCBAw2CyAAIAE2AgwgAEEGNgIIIABBETYCAAw1CwJAAkAgCEGAgICAAXENACABIAhBgICAgAFyNgKIASAFQZAEaiABEJUvIAEgASgCiAFB/////35xNgKIAQwBCyAFQZAEaiABEJUvCwJAAkAgBSgCkARBgICAgHhHDQAgACAFKAKUBDYCBEETIQEMAQsgACAFKQKQBDcCBCAAQRRqIAVBoARqKQIANwIAIABBDGogBUGYBGopAgA3AgBBACEBCyAAIAE2AgAMNAsgARCgCyAAIAI2AgQgAEEBNgIAIAAgASgC1AE2AggMMwsgBUHwAGogASACQQAQswQgBSgCdCEGIAUoAnBBAXENGyAGRQ0VIAAgBjYCDCAAQQM2AgggAEERNgIADDILIAEQ1AkiBg0TDBQLIAVB4ABqIAFBABDbAiAFKAJkIQEgBSgCYEEBcQ0RIAAgATYCDCAAQQI2AgggAEERNgIADDALAkAgAw0AIAEoAtwBIQYgASgC2AEhCCAFQYGAgIB4NgKQBCABIAggBiAFQZAEahDXIwsgBUHIA2ogASACIAIgBEEAEIoEAkACQCAFKALIA0EIRw0AIAAgBSgCzAM2AgRBEyEBDAELAkBBKEUNACAFQZAEakEEaiAFQcgDakEo/AoAAAsCQEEsRQ0AIABBBGogBUGQBGpBLPwKAAALQREhAQsgACABNgIADDALAkAgAw0AIAEoAtwBIQYgASgC2AEhCCAFQYGAgIB4NgKQBCABIAggBiAFQZAEahDXIwsgBUGQBGpBCGogBEEIaigCADYCACAFIAQpAgA3A5AEIAVByANqIAEgBUGQBGoQnSwCQAJAIAUoAsgDQQhHDQAgACAFKALMAzYCBEETIQEMAQsCQEEoRQ0AIAVBkARqQQRqIAVByANqQSj8CgAACwJAQSxFDQAgAEEEaiAFQZAEakEs/AoAAAtBESEBCyAAIAE2AgAMLwsgARCgCwJAIAEQwBIiBkUNACAAQRM2AgAgACAGNgIEDC4LIAAgAjYCBCAAQQI2AgAgACABKALUATYCCAwtCyABEKALAkACQAJAAkACQAJAIAEQoyANACAFQZAEaiABIAEoAogBIghBgAJxRSAIQYABcUUQygMgBSgCkAQhCAJAIAUtAKQEIgNBAkcNACAAQRM2AgAgACAINgIEDDMLIAVB8AJqIgcgBUGQBGpBEGooAgA2AgAgBUGQBWpBAmogBUGQBGpBF2otAAA6AAAgBSAFKQOYBDcD6AIgBSAFLwClBDsBkAUgBSgClAQhCSABEMASIgpFDQEgAEETNgIAIAAgCjYCBCAJrUIghiAIrYQgAxDmKAwyCyAFQQI6ANwDIAEoAtQBIQggBkH/AXFBzQBGDQRBByEGIAEtAIkBQQRxRQ0BDBELIAVByANqQRBqIAcoAgA2AgAgBUHIA2pBF2ogBUGSBWotAAA6AAAgBSAJNgLMAyAFIAg2AsgDIAUgBSkD6AI3A9ADIAUgAzoA3AMgBSAFLwGQBTsA3QMgASgC1AEhCCAGQf8BcUHNAEYNAiABLQCJAUEEcQ0BCyAFQY6BgIB4NgKQBCABIAIgCCAFQZAEahDXI0EHIQYMDwtBByEGIAVByANqIAEoAvQBIAEoAvgBEI8fDQ4gBUGKgYCAeDYCkAQgASACIAggBUGQBGoQ1yMMDgsgBUHIA2ogASgC9AEgASgC+AEQjx9FDQsLQQYhBiABLQCJAUEIcQ0MIAVBiIGAgHg2ApAEIAEgAiAIIAVBkARqENcjDAwLIApFDQogAUEBOgCMAiAIQQRxDQogASgC3AEhBiABKALYASEIIAVBk4CAgHg2ApAEIAEgCCAGIAVBkARqENcjDAoLIAEgARCXLBCfFwwoCyABIAEQlywQnxcMJgsgARCgCyABEKMgGiAAIAg2AgwgACAGNgIIIAAgAzYCBCAAQQ02AgAgACABKALUATYCEAwoCyABIAEQlywQnxcMIgsgASABEJcsEJ8XDBwLIAEgARCXLBCfFwwYCyABIAEQlywQnxcMFQsgASABEJcsEJ8XDA4LIAEgARCXLBCfFwwMCyAFQY+BgIB4NgKQBCABIAIgCCAFQZAEahDXI0EGIQYMAQsgARDUCSIGRQ0DIAYtAABBmwFHDQMgASgC2AEhCCABEKALIAVB2ABqIAEgAkEBELMEIAUoAlwhBgJAIAUoAlhBAXFFDQAgAEETNgIAIAAgBjYCBAwhCwJAIAZFDQAgACAGNgIMIABBAzYCCCAAQRE2AgAMIQsgBUHQAGogAUEBIAgQrgYgBSgCVCEGAkAgBSgCUEEBcUUNACAAQRM2AgAgACAGNgIEDCELAkACQCABKAKIASIIQcAAcQ0AIAEgCEHAAHI2AogBIAVBwABqIAYgARCxICAFKAJAIQYgASABKAKIAUG/f3E2AogBIAUoAkQhCAwBCyAFQcgAaiAGIAEQsSAgBSgCTCEIIAUoAkghBgsCQCAGQQFxRQ0AIABBEzYCACAAIAg2AgQMIQsgARCjIBogACACNgIIIAAgCDYCBCAAQRI2AgAgACABKALUATYCDAwgCyAAIAg2AgwgACACNgIIIAAgBjYCACAAIAUpA8gDNwMQIABBGGogBUHQA2opAwA3AwAgAEEgaiAFQdgDaikDADcDAAwfCyAAQRM2AgAgACABNgIEDB4LIAYtAAAQlxtFDQAgBUHoAGogAUEAENsCIAUoAmwhASAFKAJoQQFxRQ0BIABBEzYCACAAIAE2AgQMHQsCQCABLQDgAUH4AEcNACABENQJIgZFDQAgBi0AAEHdAEcNACABEIQnRQ0ECyABKAKIASIGQcAAcQ0BIAEgBkHAAHI2AogBIAVBMGogARD7CSAFKAIwIQggASABKAKIAUG/f3E2AogBIAUoAjQhBgwCCyAAIAE2AgwgAEECNgIIIABBETYCAAwbCyAFQThqIAEQ+wkgBSgCPCEGIAUoAjghCAsgCEEBcUUNASAAQRM2AgAgACAGNgIEDBkLIAVByANqIAEgBBDQCwJAAkAgBSgCyANBCEcNACAAIAUoAswDNgIEQRMhAQwBCwJAQShFDQAgBUGQBGpBBGogBUHIA2pBKPwKAAALAkBBLEUNACAAQQRqIAVBkARqQSz8CgAAC0ERIQELIAAgATYCAAwZCyAGIQgCQAJAAkACQAJAAkACQAJAAkACQCAGKAIAQXRqIglBDkcNACAFQbACakEQaiIIIAZBGGopAwA3AwAgBUGwAmpBCGoiAyAGQRBqKQMANwMAIAUgBikDCDcDsAIgAS0A4AFBCUYNASAFQZAEakEUaiAIKQMANwIAIAVBkARqQQxqIAMpAwA3AgAgBSAFKQOwAjcClARBCEHAABDELCIIRQ0OIAhBGjYCACAIIAUpApAENwIEIAhBDGogBUGYBGopAgA3AgAgCEEUaiAFQaAEaikCADcCACAIQRxqIAVBqARqKAIANgIACyAFIAg2AqgDQQEhAyAIKAIAQRpHDQMgBUEoaiAIQQhqEOoVAkAgBSgCKCAFKAIsQZyvnAFBCRDcJUUNACABLQDhAQ0CCyABLQCRAUEgcUUNAyAIKAIYIQogCCgCFCEHIAgoAhAhAyAIKQMIIg9CA4NCAFINAiAPpyILIAsoAgAiC0EBajYCACALQX9KDQIMDQsgARCgCwJAAkAgASgCiAEiCEGAEHENACABIAhBgBByNgKIASAAIAVBsAJqIAEQ1BEgASABKAKIAUH/b3E2AogBDAELIAAgBUGwAmogARDUEQtBASEDDAQLIAgoAhQhAyAIKAIQIQoCQCAIKQMIIg9CA4NCAFINACAPpyIHIAcoAgAiB0EBajYCACAHQX9MDQwLIAVBp4CAgHg2ApAEIAUgDzcDmAQgASAKIAMgBUGQBGoQyg4gARCjIBogACACNgIIIAAgCDYCBCAAQRI2AgAgACABKALUATYCDEEBIQMgCUEORg0DDB4LIAUgCjYCoAMgBSAHNgKcAyAFIAM2ApgDIAUgDzcDkAMgBSAILQAcOgCkAyAFQSBqIAVBkANqEOoVAkACQAJAAkACQAJAAkAgBSgCICIKIAUoAiQiB0HJkJwBQQcQ3CUNAAJAIAogB0H68psBQQYQ3CUNACAFQegCaiABIAMgBCAFKQOQA0EAEJ0EDAQLAkAgAS0A4AFBAkYNACAFQQg2AugCIAUpA5ADEL4hDAMLIAVBqAVqIAVBkANqQRBqKQMANwMAIAVBkAVqQRBqIAVBkANqQQhqKQMANwMAIAUgBSkDkAM3A5gFIAVCADcDkAUgBUHwBGogARCwCCAFKALwBCIHQYCAgIB4Rg0BIAVByANqQQhqIAVB9ARqIgpBCGopAgA3AwAgBSAKKQIANwPIAyABKALUASELQQhB2AAQmCwiCkUNESAKIAUpA5AFNwMAIAogBzYCICAKQRhqIAVBkAVqQRhqKQMANwMAIApBEGogBUGQBWpBEGopAwA3AwAgCkEIaiAFQZAFakEIaikDADcDAAJAQSFFDQAgCkEkaiAFQcgDakEh/AoAAAsgCkEAOgBSIApBgAI7AVAgCiALNgJMIAogAzYCSCAKQQI6AEUgBSAKNgLsAiAFQQc2AugCDAILIAVByANqIAEgAyAEEIwMIAUoAswDIQMCQCAFKALIAyIKQQlGDQAgBUHwBGpBGGoiByAFQcgDakEgaikDADcDACAFQfAEakEQaiILIAVByANqQRhqKQMANwMAIAVB8ARqQQhqIgwgBUHIA2pBEGopAwA3AwAgBSAFKQPQAzcD8AQCQAJAIApBCEYNACAFQZAEakEQaiAMKQMANwMAIAVBkARqQRhqIAspAwA3AwAgBUGQBGpBIGogBykDADcDACAFIAM2ApQEIAUgCjYCkAQgBSAFKQPwBDcDmAQgBUHoAmogBUGQBGoQ4Q4MAQsgBUEINgLoAgsgBSkDkAMQviEMAwsgBSADNgLsAiAFKQOQAxC+IQwDCyAFIAUoAvQEIgM2AuwCIAVBkAVqEJMmIAQQjSgMAgsgBBCNKAsgBSgC7AIhAyAFKALoAiIKQQlGDQAgBUHIAmpBGGoiByAFQegCakEgaikDADcDACAFQcgCakEQaiILIAVB6AJqQRhqKQMANwMAIAVByAJqQQhqIgwgBUHoAmpBEGopAwA3AwAgBSAFKQPwAjcDyAIgCkEIRg0CIAAgBSkDyAI3AxAgACADNgIMIAAgCjYCCCAAQRE2AgAgAEEoaiAHKQMANwMAIABBIGogCykDADcDACAAQRhqIAwpAwA3AwAMAQsgAEETNgIAIAAgAzYCBAtBACEDDAILQQAhAwsCQCABLQCRAUEgcUUNACAIKAIAQRpHDQAgBUEYaiAIQQhqEOoVAkACQAJAIAUoAhgiCiAFKAIcIgdBpa+cAUEGENwlDQAgCiAHQauvnAFBBhDcJUUNAQsgAS0A4AFBggFHDQIMAQsgCiAHQbGvnAFBCBDcJUUNASABLQDgAUH/AXFBggFHDQELIAEQoAsgCCgCFCEKIAgoAhAhCCAFQa2BgIB4NgKQBCABIAggCiAFQZAEahDXIyAFQRBqIAEgAhC7BCAFKAIUIQECQAJAIAUoAhBBAXFFDQBBEyEIQQQhAgwBCyAAQQQ2AghBESEIQQwhAgsgACAINgIAIAAgAmogATYCAAwBCwJAAkACQAJAIAEQoyANACABKALcASEKIAEoAtgBIQcCQCABLQDgASILQVFqQf8BcUENSQ0AIAtBc2pB/wFxQQpJDQAgBUEIaiAIEMgDIAVBtYCAgHg2ApAEIAUgBSkDCDcClAQgByAKIAVBkARqENcaIQggAS0A4AFBogFHDQQgASABEJcsEJ8XDAQLIAVB9YCAgHg2ApAEIAEgByAKIAVBkARqENcjIAUgASAIQQAQ3w0gBSgCBCEIIAUoAgBBAXENASAAIAI2AgggACAINgIEIABBEjYCACAAIAEoAtQBNgIMIAlBDkYNBQwICyAAIAI2AgggACAINgIEIABBEjYCACAAIAEoAtQBNgIMIAlBDkYNAQwHCyAAQRM2AgAgACAINgIEIAlBDkYNAwwGCyAGKAIAQRpHDQMMBAsgAEETNgIAIAAgCDYCBAsgBUGoA2oQwCwgCUEORw0DCyAGKAIAQRpGDQELIAYQyQMLIAYQhS8LIANFDRgMFwsgAEETNgIAIAAgBjYCBAwWCyAAQRM2AgAgACAGNgIEDBULIABBEzYCACAAIAY2AgQMFAsgASgC1AEhCCAFQegEaiAFQegCakEQaikCADcDACAFQeAEaiAFQegCakEIaikCADcDACAFIAUpAugCNwPYBAJAQcgARQ0AIAVBkARqIAVByANqQcgA/AoAAAtBCEGAARDELCIBRQ0AAkBB4ABFDQAgASAFQZAEakHgAPwKAAALIAEgBjYCZCABIAk2AmAgASAINgJ8IAEgAzYCeCABIAUpA5AFNwNoIAFB8ABqIAVBmAVqKQMANwMAIAAgATYCBCAAQQs2AgAMEwsACyAAQRM2AgAgACAGNgIEDBELIAEgARCXLBCfFwsgAEETNgIAIAAgCDYCBCAFQcgCahDJKAwBCyAAQRM2AgAgACAGNgIECyAFQbQDahDALAwNCyAAQRM2AgAgACAGNgIEDAwLIABBEzYCACAAIAg2AgQgBUHIAmoQwCwgBUHIA2oQ3SNBACEIQQEhAAwCCyAAIAM2AhwgACAONgIYIAAgCTYCFCAAIAo2AhAgACAMNgIMIAAgDTYCCCAAIAY2AgQgACABNgIADAoLIABBEzYCACAAIAg2AgQgBUHIAmoQwysgBUGQA2oQwysgBUHIA2oQ3CNBASEIQQAhAAsgBUGoA2oQuAUMAgsgAEETNgIAIAAgCDYCBAtBASEAQQEhCAsgBUHsAmohAQJAAkACQCAGQX5qQQAgBkF9akECSRsOAwECAAELIAEQ3SMgBUH0AmoQwCwMBwsgAEUNBiAFQegCahDcIyAFQegCakEIahDDKyAFQfQCahDDKwwGCyAIRQ0FIAEQ3SMgBUH0AmoQwCwMBQsgAEETNgIAIAAgBjYCBAwECyAAQRM2AgAgACAGNgIEIAVBqANqEMAsDAILIABBEzYCACAAIAY2AgQMAQsgAEETNgIAIAAgBjYCBAsgBUG4A2oQuAULIAQQjSgLIAVBsAVqJAAL4FICDH8CfiMAQdAAayIDJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOEwABAgMEBQYHCAkKCwwNDg8QERIACyADQcAAaiABQQRqIAIQpRogAy0AQEEERg0WIAMpA0AiD0L/AYNCBFENFiAAIA83AgAMLQsgA0HAAGogASgCBCACEI8RIAMtAEBBBEYNKyADKQNAIg9C/wGDQgRRDSsgACAPNwIADCwLIAEoAgghBCADQcAAaiACIAEoAgQiBUEAEIwCAkACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCyADIAQ2AkggAyAFNgJEIANBATYCQCADQShqIAIgA0HAAGpBof6bAUEIEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAahDADSADLQAoQQRGDSsgAykDKCIPQv8Bg0IEUQ0rCyAPQv8Bg0IEUQ0qIAAgDzcCAAwrCwJAAkAgASgCDCIERQ0AIANBKGogAiAEEIcjIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGpBxf2bAUEEEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCACLQBNDQAgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHRkJwBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBBGogAhDJLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHcg54BQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBCGogAhDRLSADLQAoQQRGDSogAykDKCIPQv8Bg0IEUQ0qCyAPQv8Bg0IEUQ0pIAAgDzcCAAwqCyADQShqIAIgASgCBCIEQQAQjAICQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0oCwJAIARFDQAgA0EoaiACIAQQhyMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINKAsgA0EANgJAIANBKGogAiADQcAAakHa/ZsBQQYQvw0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0oCyABKAIMIgRFDSYCQAJAAkAgAiAEEMwGIgUNACAEEPAIDQEgAi0ATQ0CIANBKGogAhCTESADLQAoQQRGDQIgAykDKCIPQv8Bg0IEUQ0CDCoLIANBKGogAiADQcAAakHRkJwBQQEQsg0gAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQwpCyADQShqIAIQkxEgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINKAsgA0EoaiAEIAIQRwJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSgLIAVFDSYgA0EoaiACIANBwABqQdyDngFBARCyDSADLQAoQQRGDSYgAykDKCIPQv8Bg0IEUQ0mDCcLIANBwABqIAFBEGogAhD8FwJAAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAakHDkJwBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIAItAE0NACADQcAAaiACEJMRIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBwABqIAFBKGogAhDRLSADLQBAQQRGDSggAykDQCIPQv8Bg0IEUQ0oCyAPQv8Bg0IEUQ0nIAAgDzcCAAwoCwJAIAEoAggiBEUNACADQShqIAIgBBCHIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0kCyADQQA2AkAgA0EoaiACIANBwABqQcn9mwFBBRC/DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSQLIAEtACRBAkYNIiADQShqIAIQkxECQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0kCyADQShqIAFBEGogAhD8FyADLQAoQQRGDSIgAykDKCIPQv8Bg0IEUQ0iDCMLAkAgASgCCCIERQ0AIANBKGogAiAEEIcjIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSELIANBADYCQCADQShqIAIgA0HAAGpBmf6bAUEIEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINIQsgAS0AJEECRg0fIANBKGogAhCTEQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDSELIANBKGogAUEQaiACEPwXIAMtAChBBEYNHyADKQMoIg9C/wGDQgRRDR8MIAsgA0EoaiACIAEoAgwiBEEAEIwCAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsCQCAERQ0AIANBKGogAiAEEIcjIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LIANBADYCQCADQShqIAIgA0HAAGpBsv2bAUECEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsCQCACLQBNDQAgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LIANBKGogAiADQcAAakHRkJwBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0eCyADQShqIAFBBGogAhDJLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDR4LIANBKGogAiADQcAAakHcg54BQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0eCwJAIAItAE0NACADQShqIAIQkxEgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsgASgCCCgCACEEIANBKGogAUEIaiACENEtAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINHgsgASgCFCIFRQ0kIAQNHCACLQBNDRwgA0EoaiACEJMRIAMtAChBBEYNHCADKQMoIg9C/wGDQgRRDRwMHQsgASgCGCEGIANBwABqIAIgASgCFCIFQQAQjAICQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0bCwJAIAVFDQAgA0HAAGogAiAFEIcjIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDRsLIANBADYCKCADQcAAaiACIANBKGpBjP6bAUEGEL8NAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINGwsgA0HAAGogAiADQShqQdGQnAFBARCyDQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDRsLIANBwABqIAFBEGogAhDJLQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDRsLIANBwABqIAIgA0EoakHcg54BQQEQsg0CQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0bCyADQcAAaiACIANBKGpBx5CcAUEBELINAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINGwsgASgCCCEEIANBwABqIAIgBSABKAIMIgdBwQAgBxDGHgJAIAMtAEBBBUYNACADKQNAIQ8MGQtBBSADKAJEELYoAkAgBw0AIAItAE0NGCADQcAAaiACEIUWIAMtAEBBBEYNGCADKQNAIg9C/wGDQgRRDRgMGQsgAi0ATUEBRg0WIANBwABqIAIQhRYgAy0AQEEERg0WIAMpA0AiD0L/AYNCBFENFgwYCyADQShqIAIgASgCCCIEQQAQjAICQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0VCwJAIARFDQAgA0EoaiACIAQQhyMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINFQsgA0EANgJAIANBKGogAiADQcAAakHQ/ZsBQQUQvw0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0VCwJAAkACQCACIAFBBGoiBCgCACIGEMwGIgUNACAGEPAIDQEgAi0ATQ0CIANBKGogAhCTESADLQAoQQRGDQIgAykDKCIPQv8Bg0IEUQ0CDBcLIANBKGogAiADQcAAakHRkJwBQQEQsg0gAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQwWCyADQShqIAIQkxEgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINFQsgA0EoaiAEIAIQyS0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0VCyAFRQ0TIANBKGogAiADQcAAakHcg54BQQEQsg0gAy0AKEEERg0TIAMpAygiD0L/AYNCBFENEwwUCyADQcAAaiACIAEoAgQiBCgCeCIFQQAQjAICQAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELAkAgBUUNACADQcAAaiACIAUQhyMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0EANgIoIANBwABqIAIgA0EoakG7/ZsBQQMQvw0CQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCwJAIAItAE0NACADQcAAaiACEJMRIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBwABqIARByABqIAIQpRoCQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCwJAIAQoAgBBCEYNAAJAIAItAE0NACADQcAAaiACEJMRIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQILIANBOGogAiAEKAJAIgVBABCMAgJAAkAgAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINAQsCQCAFRQ0AIANBOGogAiAFEIcjIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELIANBADYCQCADQThqIAIgA0HAAGpBkv6bAUEFEL8NAkAgAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINAQsCQCACLQBNDQAgA0E4aiACEJMRIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELAkAgBCgCAEEHRg0AIANBOGogAiADQcAAakHRkJwBQQEQsg0CQCADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0CCyADQThqIAQgAhDGBgJAIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQILIANBOGogAiADQcAAakHcg54BQQEQsg0gAy0AOEEERg0AIAMpAzgiD0L/AYNCBFINAQsCQCACLQBNDQAgA0E4aiACEJMRIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELIANBOGogBEEoaiACEKUaIAMtADhBBEYNASADKQM4Ig9C/wGDQgRRDQELIA9C/wGDQgRSDQELIAQoAmBBgICAgHhGDSICQCACLQBNDQAgA0HAAGogAhCTESADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0BCyADQcAAaiACIANBKGpBvv2bAUEHEL8NAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0HAAGogBEHgAGogAhClGiADLQBAQQRGDSIgAykDQCIPQv8Bg0IEUQ0iCyAPQv8Bg0IEUQ0hIAAgDzcCAAwiCyADQShqIAIgASgCDCIEQQAQjAICQAJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkAgBEUNACADQShqIAIgBBCHIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiACIANBwABqQdX9mwFBBRC/DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHRkJwBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBBGogAhDJLQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHcg54BQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBCGogAhDRLSADLQAoQQRGDSEgAykDKCIPQv8Bg0IEUQ0hCyAPQv8Bg0IEUQ0gIAAgDzcCAAwhCyABKAIQIQUgA0EoaiACIAEoAgwiBEEAEIwCAkACQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIARFDQAgA0EoaiACIAQQhyMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAakGX/psBQQIQvw0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAAkAgASgCCCIEKAIAIARBBGooAgAQuyYNACACLQBNDQEgA0EoaiACEJMRIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMAgsgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEIaiACENEtAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQdX9mwFBBRC/DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELAkAgAi0ATQ0AIANBKGogAhCTESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB0ZCcAUEBELINAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQRqIAIQyS0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB3IOeAUEBELINAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQCACLQBSQQFLDQAgA0EoaiACIANBwABqEMANIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIAVFDSAgA0EoaiACIAUQhyMgAy0AKEEERg0gIAMpAygiD0L/AYNCBFENIAsgD0L/AYNCBFENHyAAIA83AgAMIAsgA0EoaiACIAEoAhAiBEEAEIwCAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINDwsCQCAERQ0AIANBKGogAiAEEIcjIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQ8LIANBADYCQCADQShqIAIgA0HAAGpBuP2bAUEDEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINDwsgA0EoaiACIANBwABqQdGQnAFBARCyDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQ8LAkAgASgCBCIEQQJGDQAgAUEIaiEFAkACQCAEQQFxRQ0AIANBKGogBSACEMktIAMtAChBBEYNAiADKQMoIg9C/wGDQgRSDQEMAgsgAyAFNgI4IANBKGogA0E4aiACEJkZIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQELIA9C/wGDQgRSDQ8LIANBKGogAiADQcAAakGMu5wBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0PCyABKAIYRQ0NAkAgAi0ATQ0AIANBKGogAhCTESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0PCyADQShqIAFBGGogAhDJLSADLQAoQQRHDQQMDQsgA0EoaiACIAEoAhQiBEEAEIwCAkACQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIARFDQAgA0EoaiACIAQQhyMgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EANgJAIANBKGogAiADQcAAakG4/ZsBQQMQvw0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB0ZCcAUEBELINAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQRqIAIQxAwCQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAAkAgASgCBCABKAIIEK0ODQAgAi0ATQ0BIANBKGogAhCTESADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BDAILIANBKGogAhCTESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpBsKWcAUECEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAEoAgwQ8AgNACACLQBNDQEgA0EoaiACEJMRIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMAgsgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEMaiACEMktAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQdyDngFBARCyDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEQaiACENEtIAMtAChBBEYNHiADKQMoIg9C/wGDQgRRDR4LIA9C/wGDQgRRDR0gACAPNwIADB4LIANBKGogAiABKAIUIgRBABCMAgJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQsLAkAgBEUNACADQShqIAIgBBCHIyADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0LCyADQQA2AkAgA0EoaiACIANBwABqQbj9mwFBAxC/DQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQsLIAEtABxFDQkgA0EoaiACEJMRAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINCwsgA0EoaiACIANBwABqQYSEnAFBBRC/DSADLQAoQQRGDQkgAykDKCIPQv8Bg0IEUQ0JDAoLIAFBCGohBCABKAIIQX5qDgIDAgQLIANBwABqIAIgASgCCEEAEIwCAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINBgsgA0EoaiACKAJEIAIoAkggASgCDBCGIyADQcAAaiABQQRqIAIQyS0CQAJAAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0EANgJAIANBOGogAiADQcAAahCwDQJAIAMtADhBBEYNACADKQM4Ig9C/wGDQgRSDQELQQQhCEIAIRAgAygCKEGAgICAeEYNASADKAIwQRhsIQUgAygCLCEEQQQhCANAIAVFDQIgAi0ATSEGAkACQAJAAkACQCAEQRBqLQAAQQFHDQAgBkEBcUUNAQwDCyAGQQFxDQEgA0HAAGogAkGdkJwBQQEQjxAgAy0AQEEERg0BIAMpA0AiD0L/AYNCBFENAQwFCyADQcAAaiACQZ2QnAFBARCPECADLQBAQQRGDQEgAykDQCIPQv8Bg0IEUQ0BDAQLAkAgBEEIaigCACIGRQ0AIANBwABqIAIgBhCHIyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0ECyADQcAAaiACQZLkmwFBAhCPEAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQQLIANBGGogBBDqFSADQcAAaiACIAMoAhggAygCHBCPEAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQQLAkAgBEEMaigCACIGRQ0AIANBwABqIAIgBhCHIyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0ECyADQcAAaiACEIUWIAMtAEBBBEYNASADKQNAIg9C/wGDQgRSDQMMAQsCQCAEQQhqKAIAIgZFDQAgA0HAAGogAiAGEIcjIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQMLIANBwABqIAJBlOSbAUECEI8QAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAwsgA0EQaiAEEOoVIANBwABqIAIgAygCECADKAIUEI8QAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAwsCQCAEQQxqKAIAIgZBAk0NACADQcAAaiACIAZBfmoQhyMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAwsgA0HAAGogAkGW5JsBQQIQjxACQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0DCyACLQBNDQAgA0HAAGogAhCMESADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0CCyAEQRhqIQQgBUFoaiEFDAALCyAPQoB+gyEQIA+nIQgLIANBKGoQmyogCEH/AXFBBEcNBgwaCyADKQMoIg9C/wGDQgRRDQgMCQsgA0HAAGogBCACEH8CQCADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUQ0AIAAgDzcCAAwaCyADQQA2AkAgA0EoaiACIANBwABqEMANIAMtAChBBEYNGCADKQMoIg9C/wGDQgRRDRggACAPNwIADBkLIAMgAUEMajYCOCADQcAAaiADQThqIAIQmRkCQAJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELIANBADYCQCADQShqIAIgA0HAAGoQwA0gAy0AKEEERg0YIAMpAygiD0L/AYNCBFENGAsgACAPNwIADBgLIANBwABqIAQgAhB/IAMtAEBBBEYNFiADKQNAIg9C/wGDQgRRDRYgACAPNwIADBcLIABBBDoAAAwWCyAPpyIIQf8BcUEERg0UIA9CgH6DIRALIAAgECAIrUL/AYOENwIADBQLAkAgAi0ATQ0AIANBKGogAhCTESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpB0ZCcAUEBELINAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQQRqIAIQxAwCQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAAkAgASgCBCABKAIIEK0ODQAgAi0ATQ0BIANBKGogAhCTESADLQAoQQRGDQEgAykDKCIPQv8Bg0IEUQ0BDAILIANBKGogAhCTESADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAIgA0HAAGpBzv2bAUECEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAEoAgwQ8AgNACACLQBNDQEgA0EoaiACEJMRIAMtAChBBEYNASADKQMoIg9C/wGDQgRRDQEMAgsgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEMaiACEMktAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiACIANBwABqQdyDngFBARCyDQJAIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAUEQaiACENEtIAMtAChBBEYNEiADKQMoIg9C/wGDQgRRDRILIA9C/wGDQgRRDREgACAPNwIADBILIANBKGogAiADQcAAakGMu5wBQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCwJAIAEoAhxFDQACQCACLQBNDQAgA0EoaiACEJMRIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQILIANBKGogAUEcaiACEMktIAMtAChBBEYNACADKQMoIg9C/wGDQgRSDQELIANBKGogAiADQcAAakHcg54BQQEQsg0CQCADLQAoQQRGDQAgAykDKCIPQv8Bg0IEUg0BCyADQShqIAFBDGogAhDRLSADLQAoQQRGDRAgAykDKCIPQv8Bg0IEUQ0QCyAPQv8Bg0IEUQ0PIAAgDzcCAAwQCyADQShqIAIgA0HAAGoQwA0gAy0AKEEERg0OIAMpAygiD0L/AYNCBFENDgsgD0L/AYNCBFENDSAAIA83AgAMDgsgA0EAOgAmAkAgAi0ATQ0AIAIgAigCLEEBajYCLAsgA0EAOgAnIARBFGohBCAHIQhBACEJQQAhCgNAAkACQAJAAkACQAJAAkAgCEUNACAEQXxqIgsoAgAhDCADQcAAaiACIAZBwQAgCSAKIANBJ2ogA0EmahCtBQJAIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQoLIAsoAgAhCiADQcAAaiACIARBeGooAgAiCUEAEIwCAkAgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINBgsCQCAJRQ0AIANBwABqIAIgCRCHIyADLQBAQQRGDQAgAykDQCIPQv8Bg0IEUg0GCyAEKAIAIg1FDQEgA0EANgJAIANBOGogAiADQcAAakHg/ZsBQQQQvw0CQCADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0GCyANEPAIDQIgAi0ATQ0DIANBwABqIAIQkxEgAy0AQEEERg0DIAMpA0AiD0L/AYNCBFENAwwFCyADQcAAaiACIAUgBkHBACAJIAoQjgIgAy0AQEEERg0HIAMpA0AiD0L/AYNCBFINCAwHCyADQQA2AkAgA0E4aiACIANBwABqQeT9mwFBBxC/DSADLQA4QQRGDQIgAykDOCIPQv8Bg0IEUQ0CDAMLIANBwABqIAIQkxEgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAgsgA0HAAGogBCACEMktIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELAkAgBEF0aigCACINQQFHDQAgBEFwaigCACIOQQFB7P2bARC1KiAOQQFB/P2bARC1KgsgA0EANgJAIANBOGogAiADQcAAakHDkJwBQQEQsg0CQCADLQA4QQRGDQAgAykDOCIPQv8Bg0IEUg0BCyADQcAAaiACIAkgCiAEQXBqKAIAIA1BwYAFELIEIAMtAEBBBEYNASADKQNAIg9C/wGDQgRRDQELIA9C/wGDQgRSDQMLAkACQCADLQAmDQAgA0EBOgAmDAELIAIoAkRFDQAgA0HAAGogAiALKAIAQQAQ8QMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAwsCQCADLQAnRQ0AIAIgAigCLEF/ajYCLCADQQA6ACcLIAhBf2ohCCAEQRhqIQRBASEJIAwhCgwACwsgA0HAAGogAiAGIAdFQcEAENQTIAMtAEBBBEYNASADKQNAIg9C/wGDQgRRDQELIA9C/wGDQgRSDQELAkAgBkUNACADQcAAaiACIAZBf2oQhyMgAy0AQEEERg0AIAMpA0AiD0L/AYNCBFINAQsgA0HAAGogAiADQShqQciQnAFBARCyDSADLQBAQQRGDQkgAykDQCIPQv8Bg0IEUQ0JCyAPQv8Bg0IEUQ0IIAAgDzcCAAwJCyADQShqIAIgA0HAAGpBtP2bAUEEEL8NAkAgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsCQAJAIAUoAgAgBUEEaigCABC7Jg0AIAItAE0NASADQShqIAIQkxEgAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQwCCyADQShqIAIQkxEgAy0AKEEERg0AIAMpAygiD0L/AYNCBFINAQsgA0EoaiABQRRqIAIQ0S0gAy0AKEEERg0HIAMpAygiD0L/AYNCBFENBwsgD0L/AYNCBFENBiAAIA83AgAMBwsgA0EoaiACIANBwABqEMANIAMtAChBBEYNBSADKQMoIg9C/wGDQgRRDQULIA9C/wGDQgRRDQQgACAPNwIADAULIANBKGogAiADQcAAahDADSADLQAoQQRGDQMgAykDKCIPQv8Bg0IEUQ0DCyAPQv8Bg0IEUQ0CIAAgDzcCAAwDCyADQShqIAIgA0HAAGoQwA0gAy0AKEEERg0BIAMpAygiD0L/AYNCBFENAQsgD0L/AYNCBFENACAAIA83AgAMAQsCQAJAIAIoAkRFDQAgA0EIaiABEMwFIANBwABqIAIgAygCDEEBEPEDIAMtAEBBBEYNACADKQNAIg9C/wGDQgRSDQELAkAgAi0ATQ0AIAIoAgAhASACQQA2AgAgAi0APA0AIAIoAgQhBCACKAIoIAIoAhAgAigCFBCLCQJAIAIoAjhFDQAgAkEANgI0IAIgAigCMEEBajYCMAsgAkEBOgA8IAFFDQAgAiAEEMUFCyAAQQQ6AAAMAQsgACAPNwIACyADQdAAaiQAC7pRAhJ/AX4jAEHQAGsiAyQAAkACQCACKAIwIgRFDQAgA0HAAGogARCMEQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAILIANBADYCQCADQShqIAEgA0HAAGpB3PKbAUEHELENAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFENACAAIBU3AgAMAgsCQAJAIAQQ8AgNACABLQBNDQEgA0HAAGogARCMESADLQBAQQRGDQEgAykDQCIVQv8Bg0IEUQ0BIAAgFTcCAAwDCyADQcAAaiABEIwRIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAILIANBwABqIAJBMGogARDSJgJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAILIANBwABqIAJBOGogARCUJiADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwBCwJAIAIoAiAiBEUNACADQcAAaiABEIwRAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFENACAAIBU3AgAMAgsgA0EANgJAIANBKGogASADQcAAakGI5JsBQQoQsQ0CQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUQ0AIAAgFTcCAAwCCyADQcAAaiABEIwRAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFENACAAIBU3AgAMAgsgA0HAAGogASACKAIkIAIoAiggAigCHCAEEOYFIAMtAEBBBEYNACADKQNAIhVC/wGDQgRRDQAgACAVNwIADAELAkACQAJAAkACQAJAAkAgAS0ATQ0AIANBwABqIAEQjBEgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0EANgIUIANBwABqIAEgA0EUakHHkJwBQQEQrw0CQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUQ0AIAAgFTcCAAwHCyACKAIQIQUgAigCKCEGIANBwABqIAEgAigCJCIHIAIoAhQiCEHBACAIEMYeAkAgAy0AQEEFRg0AIAMpA0AhFQwFC0EFIAMoAkQQtigCQCAIRQ0AAkAgAS0ATQ0AIANBwABqIAEQhRYgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINBgsgA0EAOgAiIAEtAE1FDQIMAwsgAS0ATQ0DIANBwABqIAEQhRYgAy0AQEEERg0DIAMpA0AiFUL/AYNCBFENAwwECyAAIBU3AgAMBQsgASABKAIsQQFqNgIsCyADQQA6ACNBACEJQQAhBEEAIQoDQCAKIQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAJIAhGDQAgBSAJQdgAbGoiAiACKAIAIgpBfGpBACAKQXtqQQhJG0ECdEGQ3J4BaigCAGooAgAhCiADQcAAaiABIAZBwQAgBCALIANBI2ogA0EiahCtBQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDRMLIAIoAgAiBEF8akEAIARBe2pBCEkbDgkBCQgHBgUEAwIBCyADQcAAaiABIAcgBkHBACAEIAsQjgIgAy0AQEEERg0QIAMpA0AiFUL/AYNCBFINEQwQCyACKAI8IQwgA0HAAGogASACKAI4Ig1BABCMAgJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQwLAkAgDUUNACADQcAAaiABIA0QiyMgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINDAsgA0HAAGogASACLQBREPMJAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINDAsgA0EANgIoIANBwABqIAEgA0EoakHTkJwBQQsQtg0CQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0MCyADQcAAaiABIANBKGpB0ZCcAUEBELcNAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINDAsgAigCRCEOIANBwABqIAEgDSACKAJIIg9BkAogDxDGHgJAIAMtAEBBBUYNACADKQNAIRUMCgtBBSADKAJEELYoIA9FDQggA0EBOgA3QQAhC0EAIRBBACERA0AgA0EAOgAkIA4gC0EGdGohBANAIBEhEgJAAkACQAJAIA8gC0YNACAEQSxqIhMoAgAhESADQcAAaiABIAxBkAogECASIANBJGogA0E3ahCtBQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDRALIAQoAgBBB0YNASADQcAAaiAEIAEQjgkgAy0AQEEERg0DIAMpA0AiFUL/AYNCBFINAgwDCyADQcAAaiABIA0gDEGQCiAQIBIQjgIgAy0AQEEERg0NIAMpA0AiFUL/AYNCBFINDgwNCyATKAIAIRAgA0HAAGogASAEQShqKAIAIhJBABCMAgJAAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0HAAGogASASIBAgBEE0aigCACAEQThqKAIAENcFAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQAJAAkACQAJAIARBPmotAAAOBAABAgQACyADQQA2AkAgA0E4aiABIANBwABqQaWvnAFBBhC0DSADLQA4QQRGDQIgAykDOCIVQv8Bg0IEUQ0CDAQLIANBADYCQCADQThqIAEgA0HAAGpByfKbAUEJELQNIAMtADhBBEYNASADKQM4IhVC/wGDQgRRDQEMAwsgA0EANgJAIANBOGogASADQcAAakHS8psBQQcQtA0gAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsgA0HAAGogARCNESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIARBPGotAABFDQAgA0EANgJAIANBOGogASADQcAAakHsqJwBQQgQtA0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQcAAaiABEI0RIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkAgBEE9ai0AAEUNACADQQA2AkAgA0E4aiABIANBwABqQfyonAFBCBC0DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBwABqIAEQjREgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgBEEIaiEQAkACQCAEQRxqLQAAQQJHIhQNACAEQRBqKAIAIRIMAQsgA0EIaiAQEK8ZIAMoAgghEgsgA0HAAGogASASQQAQjAICQAJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkAgFA0AIANBwABqIBAgARDKBiADLQBAQQRGDQQgAykDQCIVQv8Bg0IEUg0BDAQLIANBwABqIBAgARCgCiADLQBAQQRGDQMgAykDQCIVQv8Bg0IEUQ0DCyAVQv8Bg0IEUQ0CCyAVQv8Bg0IEUQ0BCyAVQv8Bg0IEUg0MCwJAAkAgAy0ANw0AIANBAToANwwBCyABKAJERQ0AIANBwABqIAEgEygCAEEAEPEDIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQwLQQEhECALQQFqIQsgBEHAAGohBCADLQAkRQ0ACyABIAEoAixBf2o2AixBASEQDAALCyADQShqIAEgAigCKCACKAIsIAIoAjQgAigCOBDXBQJAAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsgA0EoaiABIAItAEgQ8wkCQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItAERFDQAgA0EANgIoIANBOGogASADQShqQauvnAFBBhC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCOESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItAEVFDQAgA0EANgIoIANBOGogASADQShqQbGvnAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCOESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItAEZFDQAgA0EANgIoIANBOGogASADQShqQeyonAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCOESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQd6QnAFBCBC2DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBKGogARCOEQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkACQAJAIAJBCGoiBCgCAEEFRg0AIANBKGogBCABEIoFIAMtAChBBEYNAiADKQMoIhVC/wGDQgRSDQEMAgsgA0EoaiACQRBqIAEQ/gggAy0AKEEERg0BIAMpAygiFUL/AYNCBFENAQsgFUL/AYNCBFINAQsCQCACKAJARQ0AIAMgAkHAAGo2AjgCQCACLQBHRQ0AIANBKGogASADQcAAakHQkJwBQQEQtw0gAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAgsgA0EoaiABIANBwABqQcOQnAFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQILIANBKGogARCOEQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQILIANBKGogA0E4aiABEKIsIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgAigCPEUNAAJAIAEtAE0NACADQShqIAEQjhEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAgsgA0EoaiABIANBwABqQcaQnAFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQILAkAgAS0ATQ0AIANBKGogARCOESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0CCyADQShqIAJBPGogARDJLSADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQShqIAEgA0HAAGoQuA0gAy0AKEEERg0NIAMpAygiFUL/AYNCBFENDQsgFUL/AYNCBFENDAwLCyACKAIgIQsgA0HAAGogASACKAIcIgRBABCMAgJAAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQCAERQ0AIANBwABqIAEgBBCLIyADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQauvnAFBBhC2DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBwABqIAJBBGogARClGgJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIAtFDQwgA0HAAGogASALEIsjIAMtAEBBBEYNDCADKQNAIhVC/wGDQgRRDQwLIBVC/wGDQgRSDQoMCwsgA0HAAGogAigCBCABEI8RIAMtAEBBBEYNCiADKQNAIhVC/wGDQgRSDQkMCgsgA0HAAGogAkEEaiABEOIFIAMtAEBBBEYNCSADKQNAIhVC/wGDQgRSDQgMCQsgAigCHCELIANBwABqIAEgAigCGCIEQQAQjAICQAJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkAgBEUNACADQcAAaiABIAQQiyMgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0HAAGogASAEIAsgAigCMCACKAI0ENcFAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0HAAGogASACLQA4EPMJAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQCACLQA5RQ0AIANBADYCQCADQThqIAEgA0HAAGpBq6+cAUEGELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsgA0HAAGogARCOESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIAItADtFDQAgA0EANgJAIANBOGogASADQcAAakHsqJwBQQgQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQcAAaiABEI4RIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkAgAi0APEUNACADQQA2AkAgA0E4aiABIANBwABqQfyonAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBwABqIAEQjhEgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0HAAGogAkEIaiABEP4IAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQCACLQA6RQ0AIANBADYCQCADQThqIAEgA0HAAGpBxZCcAUEBELcNIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQELAkAgAigCKEUNACADIAJBKGo2AiQCQCACLQA9RQ0AIANBADYCQCADQThqIAEgA0HAAGpB0JCcAUEBELcNIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBADYCQCADQThqIAEgA0HAAGpBw5CcAUEBELcNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsgA0HAAGogARCOEQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQILIANBwABqIANBJGogARCiLCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIAIoAiQiBEUNAAJAIAEtAE0NACADQcAAaiABEI4RIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQILIANBADYCKCADQcAAaiABIANBKGpBxpCcAUEBELcNAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAgsCQCABLQBNDQAgA0HAAGogARCOESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0CCyACQSRqIRECQCAEKAIAQRlGDQAgA0HAAGogESABEMktIAMtAEBBBEYNASADKQNAIhVC/wGDQgRSDQIMAQsgA0HAAGogASADQShqQdGQnAFBARC3DQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQILIANBwABqIBEgARDJLQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQILIANBwABqIAEgA0EoakHcg54BQQEQtw0gAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgA0EANgJAIANBOGogASADQcAAahC4DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQELIAtFDQkgA0HAAGogASALEIsjIAMtAEBBBEYNCSADKQNAIhVC/wGDQgRRDQkLIBVC/wGDQgRSDQcMCAsgAigCLCERIANBwABqIAEgAigCKCIEQQAQjAICQAJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkAgBEUNACADQcAAaiABIAQQiyMgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsgAkEIaiEQIAIoAjhBDGwhBCACKAI0IQsCQANAIARFDQEgA0HAAGogCyABELMHAkAgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFIN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IGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwWCyABKQIMIRcgASgCBCEEEPQnIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiBSkDADcDACADQSBqIAJBOGpBIGoiBikDADcDACADQRhqIAJBOGpBGGoiBykDADcDACADQRBqIAJBOGpBEGoiCCkDADcDACADQQhqIAJBOGpBCGoiCSkDADcDACADIAIpAzg3AwAQ/CchBCACQThqIAEoAggQTCAEQShqIAUpAwA3AwAgBEEgaiAGKQMANwMAIARBGGogBykDADcDACAEQRBqIAgpAwA3AwAgBEEIaiAJKQMANwMAIAQgAikDODcDACAAIBc3AgwgACAENgIIIAAgAzYCBCAAQQM2AgAMFQsgASgCCCEDIAEoAgQhBAJAAkAgASgCDCIFDQBBACEBDAELEPQnIQEgAkE4aiAFEEIgAUE4aiACQThqQThqKQMANwMAIAFBMGogAkE4akEwaikDADcDACABQShqIAJBOGpBKGopAwA3AwAgAUEgaiACQThqQSBqKQMANwMAIAFBGGogAkE4akEYaikDADcDACABQRBqIAJBOGpBEGopAwA3AwAgAUEIaiACQThqQQhqKQMANwMAIAEgAikDODcDAAsgACABNgIMIAAgAzYCCCAAIAQ2AgQgAEEENgIADBQLIAEoAiAhBCABKAIcIQUgASgCGCEGIAEoAgwhByABKAIIIQgCQCABKQMQIhdCA4NCAFINACAXpyIDIAMoAgAiA0EBajYCACADQX9MDRULIAEtACQhCRD8JyEDIAJBOGogASgCKBBMIANBKGogAkE4akEoaikDADcDACADQSBqIAJBOGpBIGopAwA3AwAgA0EYaiACQThqQRhqKQMANwMAIANBEGogAkE4akEQaikDADcDACADQQhqIAJBOGpBCGopAwA3AwAgAyACKQM4NwMAIAAgAzYCKCAAIAk6ACQgACAENgIgIAAgBTYCHCAAIAY2AhggACAXNwMQIAAgBzYCDCAAIAg2AgggAEEFNgIADBMLIAEoAgwhAyABKAIIIQQgAS0AJCIFQQJHDQwMDQsgASgCDCEDIAEoAgghBCABLQAkIgVBAkcNDQwOCyABKAIQIQogASgCDCELIAEoAgQhBBD0JyEDIAJBOGogBBBCIANBOGogAkE4akE4aikDADcDACADQTBqIAJBOGpBMGopAwA3AwAgA0EoaiACQThqQShqIgUpAwA3AwAgA0EgaiACQThqQSBqIgYpAwA3AwAgA0EYaiACQThqQRhqIgcpAwA3AwAgA0EQaiACQThqQRBqIggpAwA3AwAgA0EIaiACQThqQQhqIgkpAwA3AwAgAyACKQM4NwMAEPwnIQQgAkE4aiABKAIIEEwgBEEoaiAFKQMANwMAIARBIGogBikDADcDACAEQRhqIAcpAwA3AwAgBEEQaiAIKQMANwMAIARBCGogCSkDADcDACAEIAIpAzg3AwACQAJAIAEoAhQiDA0AQQAhAQwBCxD8JyEBIAJBOGogDBBMIAFBKGogBSkDADcDACABQSBqIAYpAwA3AwAgAUEYaiAHKQMANwMAIAFBEGogCCkDADcDACABQQhqIAkpAwA3AwAgASACKQM4NwMACyAAIAE2AhQgACAKNgIQIAAgCzYCDCAAIAQ2AgggACADNgIEIABBCDYCAAwQCyABKAIYIQ0gASgCFCEOIAEoAhAhAxD0JyEPIAJBOGogAxBCIA9BOGogAkE4akE4aikDADcDACAPQTBqIAJBOGpBMGopAwA3AwAgD0EoaiACQThqQShqKQMANwMAIA9BIGogAkE4akEgaikDADcDACAPQRhqIAJBOGpBGGopAwA3AwAgD0EQaiACQThqQRBqKQMANwMAIA9BCGogAkE4akEIaikDADcDACAPIAIpAzg3AwAgASgCCCEGIAJBOGogASgCDCIQQQRBGBCQDyACKAI8IREgAigCOEEBRg0NIAIoAkAhEgJAIBFFDQAgBiAQQRhsaiETQQAhCiARIRQDQCAGIBNGDQEgBigCECEVIAYoAgwhFgJAAkAgBigCFCIBDQBBACEHDAELEPQnIQcgAkE4aiABEEIgB0E4aiACQThqQThqKQMANwMAIAdBMGogAkE4akEwaikDADcDACAHQShqIAJBOGpBKGopAwA3AwAgB0EgaiACQThqQSBqKQMANwMAIAdBGGogAkE4akEYaikDADcDACAHQRBqIAJBOGpBEGopAwA3AwAgB0EIaiACQThqQQhqKQMANwMAIAcgAikDODcDAAsgBigCBCEDIAJBOGogBigCCCILQQhBMBCQDyACKAI8IQkgAigCOEEBRg0QIBIgCkEYbGohCCACKAJAIQwCQCAJRQ0AIAtBMGwhBCAMIQEgCSEFA0AgBEUNASACQThqIAMQTCABQShqIAJBOGpBKGopAwA3AwAgAUEgaiACQThqQSBqKQMANwMAIAFBGGogAkE4akEYaikDADcDACABQRBqIAJBOGpBEGopAwA3AwAgAUEIaiACQThqQQhqKQMANwMAIAEgAikDODcDACABQTBqIQEgBEFQaiEEIANBMGohAyAFQX9qIgUNAAsLIApBAWohCiAGQRhqIQYgCCAHNgIUIAggFTYCECAIIBY2AgwgCCALNgIIIAggDDYCBCAIIAk2AgAgFEF/aiIUDQALCyAAIA02AhggACAONgIUIAAgDzYCECAAIBA2AgwgACASNgIIIAAgETYCBCAAQQk2AgAMDwsgASkDCCEXIAEoAgQhAxD0JyEBIAJBOGogAxBCIAFBOGogAkE4akE4aikDADcDACABQTBqIAJBOGpBMGopAwA3AwAgAUEoaiACQThqQShqKQMANwMAIAFBIGogAkE4akEgaikDADcDACABQRhqIAJBOGpBGGopAwA3AwAgAUEQaiACQThqQRBqKQMANwMAIAFBCGogAkE4akEIaikDADcDACABIAIpAzg3AwAgACAXNwMIIAAgATYCBCAAQQo2AgAMDgtBAC0AoPCeARogASgCBCEDQYABEH0iAUUNDiADKAJ8IQggAygCeCEJIAMpAlQhFyADKAJcIQQgAkEIaiADQcgAahC6CiACIAQ2AhwgAiAXNwIUQQghBAJAIAMoAgAiB0EIRg0AQQchBCADKAJEIQYgAygCQCEFAkAgB0EHRg0AIAJBOGogAxC8AiACQaABaiACQcQAaikCADcDACACQagBaiACQcwAaikCADcDACACQbABaiACQdQAaikCADcDACACQbgBaiACQdwAaigCADYCACACIAIpAjw3A5gBIAIoAjghBAsgAygCPCEHIAMpAjQhFyACQSBqIANBKGoQugogAkE4akEIaiACQZgBakEIaikDADcDACACQThqQRBqIAJBmAFqQRBqKQMANwMAIAJBOGpBGGogAkGYAWpBGGopAwA3AwAgAkE4akEgaiACQZgBakEgaigCADYCACACIBc3AiwgAkHkAGogAkEgakEIaikCADcCACACIAc2AjQgAkHsAGogAkEgakEQaikCADcCACACIAIpA5gBNwM4IAIgAikCIDcCXAtBgICAgHghBwJAIAMoAmBBgICAgHhGDQAgAygCdCEHIAMpAmwhFyACQZgBaiADQeAAahC6CiACQShqIBc3AwAgAkEwaiAHNgIAIAIgAikCnAE3AyAgAigCmAEhBwsgASAENgIAIAEgAikDODcCBCABIAY2AkQgASAFNgJAIAFBDGogAkE4akEIaikDADcCACABQRRqIAJBOGpBEGopAwA3AgAgAUEcaiACQdAAaikDADcCACABQSRqIAJB2ABqKQMANwIAIAFBLGogAkHgAGopAwA3AgAgAUE0aiACQegAaikDADcCACABQTxqIAJB8ABqKAIANgIAIAEgBzYCYCABIAg2AnwgASAJNgJ4IAFB2ABqIAJBCGpBEGopAwA3AwAgAUHQAGogAkEIakEIaikDADcDACABIAIpAwg3A0ggAUH0AGogAkEgakEQaigCADYCACABQewAaiACQSBqQQhqKQMANwIAIAEgAikDIDcCZCAAQQs2AgAgACABNgIEDA0LIAEpAgwhFyABKAIEIQQQ9CchAyACQThqIAQQQiADQThqIAJBOGpBOGopAwA3AwAgA0EwaiACQThqQTBqKQMANwMAIANBKGogAkE4akEoaiIFKQMANwMAIANBIGogAkE4akEgaiIGKQMANwMAIANBGGogAkE4akEYaiIHKQMANwMAIANBEGogAkE4akEQaiIIKQMANwMAIANBCGogAkE4akEIaiIJKQMANwMAIAMgAikDODcDABD8JyEEIAJBOGogASgCCBBMIARBKGogBSkDADcDACAEQSBqIAYpAwA3AwAgBEEYaiAHKQMANwMAIARBEGogCCkDADcDACAEQQhqIAkpAwA3AwAgBCACKQM4NwMAIAAgFzcCDCAAIAQ2AgggACADNgIEIABBDDYCAAwMCyABKQIMIRcgASgCBCEEEPQnIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiBSkDADcDACADQSBqIAJBOGpBIGoiBikDADcDACADQRhqIAJBOGpBGGoiBykDADcDACADQRBqIAJBOGpBEGoiCCkDADcDACADQQhqIAJBOGpBCGoiCSkDADcDACADIAIpAzg3AwAQ/CchBCACQThqIAEoAggQTCAEQShqIAUpAwA3AwAgBEEgaiAGKQMANwMAIARBGGogBykDADcDACAEQRBqIAgpAwA3AwAgBEEIaiAJKQMANwMAIAQgAikDODcDACAAIBc3AgwgACAENgIIIAAgAzYCBCAAQQ02AgAMCwtBAiEHIAEoAhQhCCABKAIQIQkCQCABKAIEIgRBAkYNAEEBIQcgASgCCCEDAkAgBEEBcUUNABD0JyEGIAJBOGogAxBCIAZBOGogAkE4akE4aikDADcDACAGQTBqIAJBOGpBMGopAwA3AwAgBkEoaiACQThqQShqKQMANwMAIAZBIGogAkE4akEgaikDADcDACAGQRhqIAJBOGpBGGopAwA3AwAgBkEQaiACQThqQRBqKQMANwMAIAZBCGogAkE4akEIaikDADcDACAGIAIpAzg3AwAMAQsQ/SchBiADKAIUIQQgAykCDCEXIAMvARghBSACQThqIAMQyQUgAkE4akEYaiIDIAU7AQAgBiACKQI4NwIAIAIgFzcCRCAGQQhqIAJBOGpBCGopAgA3AgAgAiAENgJMIAZBEGogAkE4akEQaikCADcCACAGQRhqIAMoAgA2AgBBACEHC0EAIQRBACEFAkAgASgCGCIDRQ0AEPQnIQUgAkE4aiADEEIgBUE4aiACQThqQThqKQMANwMAIAVBMGogAkE4akEwaikDADcDACAFQShqIAJBOGpBKGopAwA3AwAgBUEgaiACQThqQSBqKQMANwMAIAVBGGogAkE4akEYaikDADcDACAFQRBqIAJBOGpBEGopAwA3AwAgBUEIaiACQThqQQhqKQMANwMAIAUgAikDODcDAAsCQCABKAIcIgNFDQAQ9CchBCACQThqIAMQQiAEQThqIAJBOGpBOGopAwA3AwAgBEEwaiACQThqQTBqKQMANwMAIARBKGogAkE4akEoaikDADcDACAEQSBqIAJBOGpBIGopAwA3AwAgBEEYaiACQThqQRhqKQMANwMAIARBEGogAkE4akEQaikDADcDACAEQQhqIAJBOGpBCGopAwA3AwAgBCACKQM4NwMACxD8JyEDIAJBOGogASgCDBBMIANBKGogAkE4akEoaikDADcDACADQSBqIAJBOGpBIGopAwA3AwAgA0EYaiACQThqQRhqKQMANwMAIANBEGogAkE4akEQaikDADcDACADQQhqIAJBOGpBCGopAwA3AwAgAyACKQM4NwMAIAAgBDYCHCAAIAU2AhggACAINgIUIAAgCTYCECAAIAM2AgwgACAGNgIIIAAgBzYCBCAAQQ42AgAMCgsgASgCCCEDIAEoAhghBiABKAIUIQcCQAJAAkACQCABKAIEIggOAwABAgALEP0nIQUgAygCFCEEIAMpAgwhFyADLwEYIQkgAkE4aiADEMkFIAJBOGpBGGoiAyAJOwEAIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDYCTCAFQRBqIAJBOGpBEGopAgA3AgAgBUEYaiADKAIANgIADAILEP4nIQUgAy0AFCEEIAMpAgwhFyACQThqIAMQyQUgBSACKQI4NwIAIAIgFzcCRCAFQQhqIAJBOGpBCGopAgA3AgAgAiAEOgBMIAVBEGogAkE4akEQaikCADcCAAwBCxD1JyEFIAJBOGogAxC8AiAFQSBqIAJBOGpBIGopAwA3AwAgBUEYaiACQThqQRhqKQMANwMAIAVBEGogAkE4akEQaikDADcDACAFQQhqIAJBOGpBCGopAwA3AwAgBSACKQM4NwMACyABKAIMIQQQ9CchAyACQThqIAQQQiADQThqIAJBOGpBOGopAwA3AwAgA0EwaiACQThqQTBqKQMANwMAIANBKGogAkE4akEoaiIJKQMANwMAIANBIGogAkE4akEgaiIKKQMANwMAIANBGGogAkE4akEYaiILKQMANwMAIANBEGogAkE4akEQaiIMKQMANwMAIANBCGogAkE4akEIaiIUKQMANwMAIAMgAikDODcDABD8JyEEIAJBOGogASgCEBBMIARBKGogCSkDADcDACAEQSBqIAopAwA3AwAgBEEYaiALKQMANwMAIARBEGogDCkDADcDACAEQQhqIBQpAwA3AwAgBCACKQM4NwMAIAAgBjYCGCAAIAc2AhQgACAENgIQIAAgAzYCDCAAIAU2AgggACAINgIEIABBDzYCAAwJCyABKAIIIQMgAS0AHCEGIAEoAhghByABKAIUIQgCQAJAAkACQCABKAIEIgkOAwABAgALEP0nIQUgAygCFCEEIAMpAgwhFyADLwEYIQogAkE4aiADEMkFIAJBOGpBGGoiAyAKOwEAIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDYCTCAFQRBqIAJBOGpBEGopAgA3AgAgBUEYaiADKAIANgIADAILEP4nIQUgAy0AFCEEIAMpAgwhFyACQThqIAMQyQUgBSACKQI4NwIAIAIgFzcCRCAFQQhqIAJBOGpBCGopAgA3AgAgAiAEOgBMIAVBEGogAkE4akEQaikCADcCAAwBCxD1JyEFIAJBOGogAxC8AiAFQSBqIAJBOGpBIGopAwA3AwAgBUEYaiACQThqQRhqKQMANwMAIAVBEGogAkE4akEQaikDADcDACAFQQhqIAJBOGpBCGopAwA3AwAgBSACKQM4NwMACyABKAIMIQQQ9CchAyACQThqIAQQQiADQThqIAJBOGpBOGopAwA3AwAgA0EwaiACQThqQTBqKQMANwMAIANBKGogAkE4akEoaiIKKQMANwMAIANBIGogAkE4akEgaiILKQMANwMAIANBGGogAkE4akEYaiIMKQMANwMAIANBEGogAkE4akEQaiIUKQMANwMAIANBCGogAkE4akEIaiIVKQMANwMAIAMgAikDODcDABD8JyEEIAJBOGogASgCEBBMIARBKGogCikDADcDACAEQSBqIAspAwA3AwAgBEEYaiAMKQMANwMAIARBEGogFCkDADcDACAEQQhqIBUpAwA3AwAgBCACKQM4NwMAIAAgBjoAHCAAIAc2AhggACAINgIUIAAgBDYCECAAIAM2AgwgACAFNgIIIAAgCTYCBCAAQRA2AgAMCAsCQAJAAkACQAJAAkACQAJAAkACQCABKAIIIgQOCAABAgMEBQYHAAsgASgCICEFIAEoAhwhBiABKAIYIQcCQCABKQMQIhdCA4NCAFINACAXpyIDIAMoAgAiA0EBajYCACADQX9MDRILIAEtACwhCCABLQAkIQkgASgCKCEBEIEoIQMgASgCLCEVIAEoAighFiABKAIkIRIgAkEgaiABEOoIIAJBmAFqIAFBDGoQdUEAIQtBACEKAkAgASgCMCIMRQ0AEPQnIQogAkE4aiAMEEIgCkE4aiACQThqQThqKQMANwMAIApBMGogAkE4akEwaikDADcDACAKQShqIAJBOGpBKGopAwA3AwAgCkEgaiACQThqQSBqKQMANwMAIApBGGogAkE4akEYaikDADcDACAKQRBqIAJBOGpBEGopAwA3AwAgCkEIaiACQThqQQhqKQMANwMAIAogAikDODcDAAsgAS0APCETAkAgASgCNCIMRQ0AEPonIQsgDCgCDCEUIAwoAhAhDyACQThqIAwQ3gYgC0EQaiAPNgIAIAsgAikCODcCACACIBQ2AkQgC0EIaiACQThqQQhqKQIANwIACwJAAkAgASgCOCIUDQBBACEMDAELEPonIQwgFCgCDCEPIBQoAhAhESACQThqIBQQ0QwgDEEQaiARNgIAIAwgAikCODcCACACIA82AkQgDEEIaiACQThqQQhqKQIANwIACyACQThqQRhqIhQgAUEYahDQBSACQThqQShqIgEgFjYCACACQThqQQhqIhYgAkEgakEIaigCADYCACACQcwAaiACQZgBakEIaigCADYCACACQThqQTBqIg8gCjYCACACQThqQThqIgogDDYCACACIBU2AmQgAiASNgJcIAIgAikCICIYNwM4IAIgAikCmAE3AkQgAiATOgB0IAIgCzYCbCADQThqIAopAwA3AgAgA0EwaiAPKQMANwIAIANBKGogASkDADcCACADQSBqIAJBOGpBIGopAwA3AgAgA0EYaiAUKQMANwIAIANBEGogAkE4akEQaikDADcCACADQQhqIBYpAwA3AgAgAyAYNwIADAgLIAEoAiAhBSABKAIcIQYgASgCGCEHAkAgASkDECIXQgODQgBSDQAgF6ciAyADKAIAIgNBAWo2AgAgA0F/TA0RCyABLQAsIQggAS0AJCEJIAEoAighARD5JyEDIAJBCGogARD/CCACQSBqIAFBDGoQ6ghBgICAgHghFCABKAI4IRUgASgCNCEWIAEoAjAhEgJAIAEoAhhBgICAgHhGDQAgASgCLCEKIAEpAiQhGCACQThqIAFBGGoQugogAkGgAWogGDcDACACQagBaiAKNgIAIAIgAikCPDcDmAEgAigCOCEUCyABLQBFIRMgAS0ARCEPQQAhC0EAIQoCQCABKAI8IgxFDQAQ+ichCiAMKAIMIREgDCgCECEQIAJBOGogDBDeBiAKQRBqIBA2AgAgCiACKQI4NwIAIAIgETYCRCAKQQhqIAJBOGpBCGopAgA3AgALAkAgASgCQCIBRQ0AEPYn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QRhqIAJBOGpBGGopAwA3AwAgAkGYAWpBEGogAkE4akEQaikDADcDACACQZgBakEIaiACQThqQQhqKQMANwMAIAIgAikDODcDmAEgAi0AXSEFIAIvAV4hBgsgASAXNwMYIAEgBzYCFCABIAg2AhAgASAYNwMIIAEgGTcDACABIAIpA5gBNwMgIAEgCToAUiABIAo6AFEgASALOgBQIAEgDDYCTCABIBQ2AkggASAGOwFGIAEgBToARSABQShqIAJBoAFqKQMANwMAIAFBMGogAkGoAWopAwA3AwAgAUE4aiACQbABaikDADcDACABQT1qIAJBtQFqKQAANwAACwsgACAJOgAkIAAgBTYCICAAIAY2AhwgACAHNgIYIAAgFzcDECAAIAE2AgwgACAENgIIIAAgAi8AODsAJSAAIAg6ACwgACADNgIoIAAgAi8AmAE7AC0gAEERNgIAIABBJ2ogAkE4akECai0AADoAACAAQS9qIAJBmAFqQQJqLQAAOgAADAcLIAEpAwghFyABKAIEIQMQ9CchASACQThqIAMQQiABQThqIAJBOGpBOGopAwA3AwAgAUEwaiACQThqQTBqKQMANwMAIAFBKGogAkE4akEoaikDADcDACABQSBqIAJBOGpBIGopAwA3AwAgAUEYaiACQThqQRhqKQMANwMAIAFBEGogAkE4akEQaikDADcDACABQQhqIAJBOGpBCGopAwA3AwAgASACKQM4NwMAIAAgFzcDCCAAIAE2AgQgAEESNgIADAYLIAEoAiAhCCABKAIcIQcgASgCGCEGIAEpAxAiF0IDg0IAUg0AIBenIgEgASgCACIBQQFqNgIAIAFBf0wNBgsgACAFOgAkIAAgCDYCICAAIAc2AhwgACAGNgIYIAAgFzcDECAAIAM2AgwgACAENgIIIABBBjYCAAwECyABKAIgIQggASgCHCEHIAEoAhghBiABKQMQIhdCA4NCAFINACAXpyIBIAEoAgAiAUEBajYCACABQX9MDQQLIAAgBToAJCAAIAg2AiAgACAHNgIcIAAgBjYCGCAAIBc3AxAgACADNgIMIAAgBDYCCCAAQQc2AgAMAgsgESACKAJAQfTxmgEQhSkACyAJIAIoAkBB9PGaARCFKQALIAJBwAFqJAAPCwAL6FECJ38DfiMAQeADayIDJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgAOCAABCAIDBAUGAAsgA0GAA2ogARDXIiAAQQhqIQQgAygChAMhAQJAAkAgAygCgAMiAkEqRg0AQThFDQEgBCADQYADakEIakE4/AoAAAwBCyAEIAE2AgALIAAgAjYCACAAIAE2AgQMEgsgAigCBCIFIAIoAggiAmohBAJAAkACQAJAIAEtAAtBAXENACACRQ0CIAVBAWohAgwBCyACRQ0BIAUhAiAEQX9qIgQhBQsgA0EoaiABIAUtAAAiBSAFEIkPIAMoAigiBkErRg0AIAMoAjAhBSADKAIsIQcgBkEqRg0BAkBBNEUNACAAQQxqIANBKGpBDGpBNPwKAAALIAAgBTYCCCAAIAc2AgQgACAGNgIADBMLIANBgANqIAEQ1yIgAEEIaiEEIAMoAoQDIQECQAJAIAMoAoADIgJBKkYNAEE4RQ0BIAQgA0GAA2pBCGpBOPwKAAAMAQsgBCABNgIACyAAIAI2AgAgACABNgIEDBILIANBzAJqIQgDQAJAAkAgAS0AC0EBcQ0AIAIgBEYNCCACQQFqIQkMAQsgAiAERg0HIAIhCSAEQX9qIgQhAgsgA0HAAmogASACLQAAIgIgAhCJDyADKALAAiICQStGDQYgAygCyAIhCiADKALEAiEGAkAgAkEqRg0AAkBBNEUNACAAQQxqIAhBNPwKAAALIAAgCjYCCCAAIAY2AgQgACACNgIADBMLIANBgANqIAEgBSAGELIIAkAgAygCgAMiAkEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgAMEwsgCSECIAohBQwACwsgAigCBGhBAnRBhMKeAWooAgAhAiABLQALQQFxRQ0PIAJoQQJ0QczCngFqKAIAIQIMDwsgAigCBCEEIAIoAgghBQJAAkACQAJAIAIoAhAiBg0AIARFDQAgBUEBRg0BCyAERQ0BIAIoAgwhBCAGIAVGDQIgACABIAQgAi0AFCAGIAUQ9QQMEgsgAigCDCEEAkACQCACLQAUDQAgA0GAA2ogARCnGQwBCyADQYADaiABEIsYCyADKAKEAyECAkAgAygCgAMiBUEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAI2AgQgACAFNgIADBILIANBgANqIAEgBBBNIAMoAogDIQUgAygChAMhBAJAIAMoAoADIgZBKkYNAAJAQTRFDQAgAEEMaiADQYADakEMakE0/AoAAAsgACAFNgIIIAAgBDYCBCAAIAY2AgAMEgsgA0GAA2ogARDXIiADKAKEAyEGAkAgAygCgAMiCUEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAY2AgQgACAJNgIADBILIANBgANqIAEgAiAEELIIAkAgAygCgAMiBEEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAQ2AgAMEgsgA0GAA2ogASACIAYQsggCQCADKAKAAyIEQSpGDQACQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgBDYCAAwSCyADQYADaiABIAUgBhCyCAJAIAMoAoADIgFBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACABNgIADBILIAAgBjYCCCAAIAI2AgQgAEEqNgIADBELIAAgASACKAIMIAItABQgBhD4AQwQCyADIAY2AowDIANBADYCiAMgAyAENgKEAyADIAE2AoADIAAgASADQYADahDrBAwPCyAAIAEgAigCCCACKAIMIAIoAhAgAigCBBDcAgwOCyACKAIIIgQgAigCDCIFQRxsaiECAkACQAJAAkACQCABLQALQQFxDQAgBUUNAiADQYADaiABIAQQTSADKAKIAyEFIAMoAoQDIQggAygCgAMhBgJAQTRFDQAgA0HsAGogA0GMA2pBNPwKAAALIARBHGohBAwBCyAFRQ0BIANBgANqIAEgAkFkaiICEE0gAygCiAMhBSADKAKEAyEIIAMoAoADIQZBNEUNACADQewAaiADQYwDakE0/AoAAAsgBkFWag4CAgABCyADQYADaiABENciIABBCGohBCADKAKEAyEBAkACQCADKAKAAyICQSpGDQBBOEUNASAEIANBgANqQQhqQTj8CgAADAELIAQgATYCAAsgACACNgIAIAAgATYCBAwPCwJAQTRFDQAgAEEMaiADQewAakE0/AoAAAsgACAFNgIIIAAgCDYCBCAAIAY2AgAMDgsgA0GMA2ohBwNAAkACQAJAAkACQCABLQALQQFxDQAgBCACRg0CIANBgANqIAEgBBBNIAMoAogDIQogAygChAMh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KAIUIgVFDQAgAigCECAFQQN0aiIFQXhqRQ0AIAVBfGooAgAhBgsgAigCCCIFIAYgBGoiBEkNBwJAIAUgAigCAEcNACACEJIcCyACKAIEIARBA3RqIQYCQCAFIARNDQAgBSAEa0EDdCIERQ0AIAZBCGogBiAE/AoAAAsgBiAMOgAEIAYgBzYCACACIAVBAWo2AgggDyECIAchBAwACwsgBCADKAKIAyICTw0EIAMoAoQDIARBGGxqIgIoAhQhBAJAAkACQCACKAIIIgkNACAEDQIgAkEQaiEKIAIoAhAhBUEAIQRBACEGDAELIAJBEGohCiACKAIQIQVBACEGIARFDQAgBSAEQQN0aiIHQXhqRQ0AIAdBfGooAgAhBgsCQCAEIAIoAgxHDQAgAkEMahCYHCAKKAIAIQULIAUgBEEDdGoiBSAJNgIEIAUgBjYCACACIARBAWo2AhQLIA4hBiAOIAtGDQsMAAsLIAAgBTYCCCAAIAc2AgQgAEEqNgIADAsLIAIoAgQNByACKAIMIhEgAigCECIEEK8hDQQgAS0AC0EBcQ0FAkAgASgCIA0AIAFBfzYCIAJAIAEoAmANACABQX82AmAgA0GAA2ogAUEkaiABQeQAahCPByADQcACakEIaiICIANBjANqKAIANgIAIAMgAykChAM3A8ACAkAgAygCgAMiBUEqRg0AAkBBMEUNACAAQRBqIANBgANqQRBqQTD8CgAACyAAQQxqIANByAJqKAIANgIAIAAgAykDwAI3AgQgACAFNgIADAkLIANBKGpBCGogAigCADYCACADIAMpA8ACNwMoIBEgBEEDdGohBANAAkACQCARIARGDQAgA0HAAmogESgCACARKAIEEK4jIBFBCGohEQNAIANB+AFqIANBwAJqEOUDIAMtAPgBQQRGDQIgA0GIAmpBCGogA0H4AWpBCGotAAA6AAAgAyADKQD4ATcDiAIgA0EYaiADQYgCahCyJiADQYADaiADQShqIAMoAhggAygCHBDsBSADKAKAAyICQSpGDQALAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgAgAygCwAIgAygCxAIQ/CwMCwsgACADQShqEI0JIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAMDgsgAygCwAIgAygCxAIQ/CwMAAsLQcyehAEQyRoAC0G8noQBEMkaAAtBy7icAUEoQYyehAEQzB4ACyAEIAJBrPODARCMFQALIAQgBUHc84MBEJIVAAsgBCAHQbzzgwEQjBUACyADQYADaiABENciIAMoAoQDIQkCQCADKAKAAyICQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgCTYCBCAAIAI2AgAMBgtBACECIANBgANqIARBAEEEQQgQpgwgAygChAMhBgJAAkACQCADKAKAA0EBRg0AIANBADYC6AEgAyADKAKIAyIFNgLkASADIAY2AuABIARBA3QhBiAJrSEqQQAhBAJAA0AgBiACRg0BIBE1AgAiK0KAAloNAyARNQIEIixCgAJaDQQCQCAEIAMoAuABRw0AIANB4AFqQbyfhAEQkBwgAygC5AEhBQsgEUEIaiERIAUgAmogK0IghiAqhCAsQiiGhDcCACADIARBAWoiBDYC6AEgAkEIaiECDAALCyADQYADaiABIANB4AFqEPchIAMoAoQDIQECQCADKAKAAyICQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgATYCBCAAIAI2AgAMCQsgACAJNgIIIAAgATYCBCAAQSo2AgAMCAsgBiADKAKIA0GMn4QBEIUpAAtByJecAUErIANBgANqQbSchAFBnJ+EARDiEgALQciXnAFBKyADQYADakG0nIQBQayfhAEQ4hIACwJAAkACQCABLQAMQQFxDQACQCABKALYAQ0AIAFBfzYC2AEgAUHcAWoQkwwgA0GAA2ogARCLGCADKAKEAyENAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIA02AgQgACACNgIADAQLIANBgANqIAEQ1yIgAygChAMhDwJAIAMoAoADIgJBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACAPNgIEIAAgAjYCAAwECyARIARBA3RqIRAgAUHkAWohBwJAA0AgESAQRg0EIANBwAJqIBEoAgAgESgCBBCuIyARQQhqIREDQCADQYgCaiADQcACahDlAwJAAkACQAJAAkAgAy0AiAJBBEYNACADQShqQQhqIANBiAJqQQhqLQAAOgAAIAMgAykAiAI3AyggA0EQaiADQShqELImIAMoAhAiAiADKAIUQQF0aiEMIA8hBANAIAcoAgAiBUUNAiAFIAStIitCpcaIocicp/lLhUKzg4CAgCB+IAItAAAiCa1C/wGDIiyFQrODgICAIH4gAkEBai0AACIKrUL/AYMiKoVCs4OAgIAgfiAFrYKnIgZNDQMCQAJAIAEoAuABIAZBBHQiCGoiBS8BDCABLwHsAUcNACAEIAUoAgBHDQAgCUH/AXEgBS0ABEcNACAKQf8BcSAFLQAFRw0AIAUoAgghBAwBCyADQYADaiABIAkgChCJDyADKAKIAyEJIAMoAoQDIQUCQCADKAKAAyIKQSpGDQACQEE0RQ0AIABBDGogA0GAA2pBDGpBNPwKAAALIAAgCTYCCCAAIAU2AgQgACAKNgIADAoLIANBgANqIAEgCSAEELIIAkAgAygCgAMiBEEqRg0AAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAQ2AgAMCgsgBygCACIEIAZNDQUgASgC4AEgCGoiBCABLwHsATsBDCAEIAU2AgggBCAqQiiGICxCIIaEICuENwIAIAUhBAsgAkECaiICIAxGDQUMAAsLIAMoAsACIAMoAsQCEPwsDAULQZzJgwEQ1SEACyAGIAVBrMmDARCMFQALIAYgBEG8yYMBEIwVAAsgA0GAA2ogASANIAQQsgggAygCgAMiAkEqRg0ACwsCQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgAjYCAAsgAygCwAIgAygCxAIQ/CwMAwtBzJ+EARDJGgALAkACQCABKAKEAQ0AIAFBfzYChAEgAUGIAWoiEhCLCiABQaABaiETIAFBrAFqIRQgESAEQQN0aiEVIANB+AFqQX9qIRYgA0HAAmpBBGohFyADQShqQQJyIRggA0H4AWpBAWohGSADQcYCaiEaIANByQJqIRsDQCARIBVGDQIgA0GIAmogESgCACARKAIEEK4jIBFBCGohEQNAIANB7wFqIANBiAJqEOUDAkACQAJAIAMtAO8BQQRGDQAgA0H4AWpBCGogA0HvAWpBCGotAAA6AAAgAyADKQDvASIrNwP4AUECIQICQAJAICunQf8BcQ4EBAMAAQQLQQMhAgwCC0EEIQIMAQsgAygCiAIgAygCjAIQ/CwMAwsgAkEBdiEFIBYgAkEBdGohAiAZIQQDQCAFRQ0BIAQvAAAhBiAEIAIvAAA7AAAgAiAGOwAAIAVBf2ohBSACQX5qIQIgBEECaiEEDAALCyADQQhqIANB+AFqELImIAEpAqwBISsgAygCDCECIAMoAgghBCABQoCAgIDAADcCrAEgAUEANgK0ASADQQA2AsgDIAMgKzcDwAMgA0GAA2pBASAEIAIQvhMCQAJAICunRQ0AICtCIIinIQIMAQsgA0HAA2pBlMuDARCTHCADKALEAyECCyACIAMpAoADNwIAIAJBCGogA0GAA2pBCGoiHCkCADcCAEEBIQIDQCADIAJBf2oiAjYCyAMgA0EoakEIaiADKALEAyACQQR0aiICQQhqKQIAIis3AwAgAyACKQIANwMoAkACQCADLQA0IgpBBU8NAAJAIApFDQACQCArpyIdIAEoApABIgJPDQAgAy0AKSEeIAMtACghHwJAAkACQCABKAKMASAdQQxsIiBqIgIoAggiBg0AQQAhIQwBCyACKAIEIQlBACEhIAYhBANAIAQgIWpBAXYiAiAGTw0CIAJBAWogISAfQf8BcSAJIAJBA3RqLQAFSyIFGyIhIAQgAiAFGyIESQ0ACwsgCkF/aiEiAkAgISAGRw0AIBIgA0HAA2ogGCAiEIITIQIgASgCjAEgASgCkAEgHSAfIB4gAhC/EwwFCwNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAhIAEoAowBICBqIgIoAggiBE8NAAJAIB5B/wFxIgYgAigCBCAhQQN0aiIFLQAEIgRJDQAgBS0ABSIKQf8BcSIJIB9B/wFxIgJJDQAgBSgCACEjIAQgAkcNAyAJIAZGDQIgCSAGTw0DIApBCHQgAnIhAiAKQQFqQf8BcUEIdCAeQRB0ckEBciEFDAQLIBIgA0HAA2ogGCAiEIITIQQgASgCjAEgASgCkAEiAiAhIB0gHyAeIAQQig4MEAsgISAEQaTLgwEQjBUACyAeQQh0IAJyIQJBAiEEQQAhHkEBIQZBASEkQQAhCUEAIQdBACEFDA0LAkACQAJAIAQgAk0iBQ0AIAkgBkYNAQsCQCAEIAJHDQAgBiAJSQ0CCwJAIAIgBE0iBw0AIAkgBkYNBAsCQCAFDQAgCSAGSQ0FCwJAIAcNACAGIAlJDQYLAkAgBCAGTyIFDQAgCSACRg0HCwJAIAYgBEcNACACIAlJDQgLAkAgAiAJTw0AIAkgBkkNCQsCQCAFDQAgBiAJSQ0KC0HLuJwBQShBsM6DARDMHgALQQIhJCAEQQh0IgQgHkEQdHJBAnIhBSAEIAJyQYB+aiECQQEhBEEAIQZBACEeQQAhCQwKCyAeQQh0IAJyIQIgCkEQdCAeQQFqQf8BcUEIdHIhBQtBAiEkQQAhBkEAIR5BACEJQQAhB0ECIQQMCwtBAiEkIB5BEHQgAkEIdHJBAnIhBSAfQQh0IARyQYB+aiECQQAhBkEAIR5BACEJDAkLIARBCHQiBCAKQRB0ckECciEFIAQgAnJBgH5qIQJBASEHIApBAWohCUEDISRBACEGQQEhBAwJCyACQQh0IB5BEHRyQQJyIQUgHkEBaiEJIB9BCHQgBHJBgH5qIQJBACEGQQMhJCAKIR4MBwtBASEHIB9BAWohCSACQYCCBGxBAnIhBSAfQQh0IARyQYB+aiECDAULIB5BCHQgAnJBgH5qIQJBASEEIB5BAWohCSAGQYCCBGxBAnIhBQwCCyAKQRB0IAJBCHRyQQJyIQVBASEHIApBAWohCSAfQQh0IARyQYB+aiECDAMLIARBCHQiBCAeQRB0ckECciEFIAQgAnJBgH5qIQJBASEEIB5BAWohCQtBACEGQQMhJCAKIR4LQQAhBwwCC0EAIQZBAyEkQQAhBAwBC0EAIQdBACEECyADQcACakEMaiAeOgAAIBogAkEIdjoAACADIAU7AMcCIBsgBUEQdjoAACADICQ2AsACIAMgCUEIdCAHcjsBygIgAyACQQh0IARyOwHEAgJAIAZFDQAgIkUNByADQYADaiAjIBggIhC+EwJAIAMoAsgDIgIgAygCwANHDQAgA0HAA2pBtMuDARCTHAsgAygCxAMgAkEEdGoiBCADKQKAAzcCACAEQQhqIBwpAgA3AgAgAyACQQFqNgLIAwwHCyAXICRBA2xqISVBASEmQQAhJyAXISgCQAJAA0AgJ0EBaiEnICgtAAIhHiAoLQABIR8CQAJAAkACQCAoLQAADgMAAgEACwJAAkACQCAjDQBBACEpDAELIAFBADYCqAEgASkCoAEhKyABQoCAgIDAADcCoAEgA0EANgLYAyADICs3A9ADIBIQiA8hKQJAAkAgK6dFDQAgK0IgiKchCwwBCyADQdADakGozIMBEJAcIAMoAtQDIQsLIAsgKTYCBCALICM2AgBBASEGA0AgAyAGQX9qIgY2AtgDIAsgBkEDdGoiAigCACINIAEoApABIgRPDQICQCABKAKMASANQQxsIg9qKAIIIhBFDQAgAigCBCEOQQAhAkEFIQQDQAJAAkACQAJAIA0gASgCkAEiCE8NACACIAEoAowBIgwgD2oiBSgCCCIJTw0BIAUoAgQgBGoiBS0AACEJIAVBf2otAAAhCiAFQXtqKAIAIgdFDQIgEhCIDyEFIAEoAowBIAEoApABIA4gCiAJIAUQvxMCQCAGIAMoAtADRw0AIANB0ANqQcjMgwEQkBwgAygC1AMhCwsgCyAGQQN0aiIJIAU2AgQgCSAHNgIAIAMgBkEBaiIGNgLYAwwDCyANIAhBiM2DARCMFQALIAIgCUG4zIMBEIwVAAsgDCAIIA4gCiAJQQAQvxMLIARBCGohBCAQIAJBAWoiAkcNAAsLIAYNAAsgASgCoAEgASgCpAEQ/CwgE0EIaiADQdADakEIaigCADYCACATIAMpA9ADNwIACwJAICZBAXENACABKAKMASABKAKQASAhIB0gHyAeICkQig4MBAsCQAJAIB0gASgCkAEiAk8NACAhIAEoAowBICBqIgIoAggiBE8NASACKAIEICFBA3RqIgIgHjoABSACIB86AAQgAiApNgIADAULIB0gAkGYzYMBEIwVAAsgISAEQfjMgwEQjBUACyANIARBiM2DARCMFQALAkAgIkUNACADQYADaiAjIBggIhC+EwJAIAMoAsgDIgIgAygCwANHDQAgA0HAA2pBxMuDARCTHAsgAygCxAMgAkEEdGoiBCADKQKAAzcCACAEQQhqIBwpAgA3AgAgAyACQQFqNgLIAwsCQCAmQQFxDQAgASgCjAEgASgCkAEgISAdIB8gHiAjEIoODAILAkACQCAdIAEoApABIgJPDQAgISABKAKMASAgaiICKAIIIgRPDQEgAigCBCAhQQN0aiICIB46AAUgAiAfOgAEIAIgIzYCAAwDCyAdIAJBmM2DARCMFQALICEgBEH4zIMBEIwVAAsCQAJAIB0gASgCkAEiAk8NACAnICRHDQEgISABKAKMASAgaiIEKAIITw0BIB5B/wFxIAQoAgQgIUEDdGoiBC0ABEkNASAELQAFQf8BcSAfQf8BcU8NBgwBCyAdIAJBiM2DARCMFQALIBIgA0HAA2ogGCAiEIITIQICQCAmQQFxDQAgASgCjAEgASgCkAEgISAdIB8gHiACEIoODAELIB0gASgCkAEiBE8NAiAhIAEoAowBICBqIgQoAggiBU8NAyAEKAIEICFBA3RqIgQgHjoABSAEIB86AAQgBCACNgIACyAhQQFqISFBACEmIChBA2oiKCAlRg0JDAALCyAdIARBmM2DARCMFQALICEgBUH4zIMBEIwVAAsgHSACSQ0ACyAdIAJBiM2DARCMFQALIAIgBkGozYMBEIwVAAsgHSACQYjNgwEQjBUAC0HUy4MBQSRB+MuDARDMHgALIApBBEGgzoMBEN0sAAsgAygCyAMiAg0ACyABKAKsASABKAKwARD5LCAUQQhqIANBwANqQQhqKAIANgIAIBQgAykDwAM3AgAMAAsLC0HcnoQBEMkaAAsCQAJAAkAgASgCIA0AIAFBfzYCICABKAJgDQEgAUF/NgJgIANBgANqIAFBJGogAUHkAGoQjwcgA0HAAmpBCGoiAiADQYwDaigCADYCACADIAMpAoQDNwPAAgJAAkAgAygCgAMiBEEqRg0AAkBBMEUNACAAQRBqIANBgANqQRBqQTD8CgAACyAAQQxqIANByAJqKAIANgIAIAAgAykDwAI3AgQgACAENgIADAELIANBKGpBCGogAigCADYCACADIAMpA8ACNwMoIANBgANqIBIgA0EoahD3BSADKAKAAyICQSpGDQMCQEE8RQ0AIABBBGogA0GAA2pBBHJBPPwKAAALIAAgAjYCAAsgASABKAJgQQFqNgJgIAEgASgCIEEBajYCICABIAEoAoQBQQFqNgKEAQwJC0HsnoQBEMkaAAtB/J6EARDJGgALIAAgA0EoahCNCSABIAEoAmBBAWo2AmAgASABKAIgQQFqNgIgIAEgASgChAFBAWo2AoQBDAYLIAAgDzYCCCAAIA02AgQgAEEqNgIACyABIAEoAtgBQQFqNgLYAQwECyABIAEoAmBBAWo2AmAgASABKAIgQQFqNgIgDAMLIANBgANqIAEQ1yIgAygChAMhCgJAIAMoAoADIgRBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACAKNgIEIAAgBDYCAAwDC0EAIQUgA0GAA2ogAigCECIGQQBBBEEIEKYMIAMoAoQDIQQCQCADKAKAA0EBRg0AIANBADYC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IBg2AgQgACAXNgIADBULIABBAjYCACAAIAU2AgQMFAsgBEEgaiALIAhBA3ZBEHFqIgspAwAgC0EIaikDACAIQf8AcRCJFiAEKQMgQgGDUA0AIAitIR1CBCEeDAILIAEgCGotAGAhCwsgC0H/AXEhCAJAAkAgCQ4DBAABBAsgCEEGaiEIDAMLIAEtAFlBAXENASAKrSEdQgIhHgsgHUIghiAehCEdDAILAkAgCiABKAKABSgC3AJPDQAgCkEGbCAIakEMaiEIDAELIAEoAoQFEM4aIREMAgsCQCAIIAIoAogBIhFJDQAgCCARQbjigwEQjBUACyACKAKEASAIQQJ0aigCACIRQQBODQEgBCACNgLsASAEIAE2AugBIARBuAFqIARB6AFqIAkgCiALEIoBAkAgBCgCuAFBBUcNACAEKAK8ASERDAILIAQpA7gBIR0LIB1CIIinIQICQAJAAkACQCAdpyIIQX1qIgZBAiAGQQJJGw4DAAECAAsgBRCtIyEFDAILIAVFDQMgAiAFQX9qEKohIQUMAQsgCCACEKchIQULIABBAjYCACAAIAU2AgQMDQsCQCACKAKwAUEBcUUNACACIAIoArQBIgggAigCuAEiCWsgCSAIayAIIAlLGyACKAJwajYCcAsgAiAFNgK4ASACIAU2ArQBIAJBATYCsAECQCAFIAZJDQAgAygCDCEQDAILIAFB4AJqIQkgAygCDCEQIAMoAgghDQNAAkACQAJAAkACQCARQf///z9LDQAgBSAGTw0EIAIoAnwhEiACKAJ4IQsCQAJAA0AgCyARIAkgDSAFaiIKLQAAai0AAGpBAnRqKAIAIQggBUEDaiIHIAZPDQQgCEGAgIDAAE8NBCALIAggCSAKQQFqLQAAai0AAGpBAnRqKAIAIhFB////P0sNASALIBEgCSAKQQJqLQAAai0AAGpBAnRqKAIAIghB////P0sNAgJAIAsgCCAJIApBA2otAABqLQAAakECdGooAgAiEUH///8/Sw0AIAVBBGoiBSAGSQ0BDAgLCyAIIQogESEIDAQLIAVBAWohByAIIQogESEIDAMLIAVBAmohByARIQoMAgsCQAJAIAIoArABRQ0AIAIgBTYCuAECQCAFIBBJDQAgBSAQQbjjgwEQjBUACyARQf///z9xIAkgDSAFai0AACILai0AAGoiCCACKAJ8IgpPDQECQAJAIAIoAnggCEECdGooAgAiCEEASA0AQQAhCwwBCyAEIAI2AsgBIAQgATYCxAEgBEEQaiAEQcQBaiARIAtBCHQQgAEgBCgCFCEIIAQoAhAhCwsCQCALQQFxRQ0AIAUQrSMhBSAAQQI2AgAgACAFNgIEDBQLIAUhBwwEC0HY4YMBQR9B+OGDARCqFwALIAggCkHU4IMBEIwVAAsgESEKIAUhBwsgCEEATg0AAkACQCACKAKwAUUNACACIAc2ArgBIAogCSANIAdqLQAAIhFqLQAAaiIFIBJPDQECQAJAIAsgBUECdGooAgAiCEEASA0AQQAhBQwBCyAEIAI2AsgBIAQgATYCxAEgBEEYaiAEQcQBaiAKIBFBCHQQgAEgBCgCHCEIIAQoAhghBQsgBUEBcUUNAiAHEK0jIQUgAEECNgIAIAAgBTYCBAwRC0HY4YMBQR9B+OGDARCqFwALIAUgEkHU4IMBEIwVAAsCQCAIQYCAgMAASQ0AIAhBgICAgAFxDQACQAJAAkAgCEGAgIDAAHENACAIQYCAgIAEcQ0BIAhBgICAgAJxRQ0CIAIgBxDcGwJAIAcgEE8NACANIAdqLQAAIAcQqiEhBSAAQQI2AgAgACAFNgIEDBMLIAcgEEGk5IMBEIwVAAsgASgCgAUgASgChAUgAiAIEMYjIQUgAiAHENwbIAAgBzYCCCAAIAU2AgQgAEEBNgIADBELIAIgBxDcGyAAQQA2AgAMEAsgBEEBNgLIASAEQYzkgwE2AsQBIARCADcC0AEgBCAEQfwBajYCzAEgBEHEAWpBlOSDARDiIwALIAghESAHIQULIAVBAWoiBSAGTw0CDAALC0H04IMBQSRBmOGDARCqFwALAkACQAJAAkACQAJAAkACQCAGIBBPDQAgEUH///8/cSABIAMoAgggBmotAAAiCWotAOACaiIFIAIoAnwiCE8NA0EAIQgCQCACKAJ4IAVBAnRqKAIAIgVBAE4NACAEIAI2AsgBIAQgATYCxAEgBCAEQcQBaiARIAlBCHQQgAEgBCgCBCEFIAQoAgAhCAsgCEEBcUUNASAGEK0jIQUMBwsgAS0A3wRBAWoiCSARQf///z9xaiIFIAIoAnwiCE8NA0EAIQgCQCACKAJ4IAVBAnRqKAIAIgVBAE4NACAEIAI2AsgBIAQgATYCxAEgBEEIaiAEQcQBaiARIAlBEHRBAXIQgAEgBCgCDCEFIAQoAgghCAsCQCAIQQFxRQ0AIBAQrSMhBQwHCyAFQYCAgMAAcQ0BDAQLIAYhECAFQYCAgMAAcQ0AIAVBgICAgAJxRQ0DIAkgBhCqISEFDAULQQEhCCABKAKABSABKAKEBSACIAUQxiMhCQwDCyAFIAhB1OCDARCMFQALIAUgCEHk4IMBEIwVAAtBACEICyACKAKwASEFIAJBADYCsAECQCAFQQFxRQ0AIAIoArQBIQUgACAQNgIIIAAgCTYCBCAAIAg2AgAgAiACKAJwIAUgBmsgBiAFayAFIAZLG2o2AnAMDAtBiOKDAUEfQajigwEQqhcACyAAQQI2AgAgACAFNgIEDAoLIARB0ABqIAsgCEEDdkEQcWoiCykDACALQQhqKQMAIAhB/wBxEIkWIAQpA1BCAYNQDQAgCK0hHUIEIR4MAgsgASAIai0AYCELCyALQf8BcSEIAkACQCAJDgMEAAEECyAIQQZqIQgMAwsgAS0AWUEBcQ0BIAqtIR1CAiEeCyAdQiCGIB6EIR0MAgsCQCAKIAEoAoAFKALcAk8NACAKQQZsIAhqQQxqIQgMAQsgASgChAUQzhohCAwCCwJAIAggAigCiAEiEUkNACAIIBFBuOKDARCMFQALIAIoAoQBIAhBAnRqKAIAIghBAE4NASAEIAI2AuwBIAQgATYC6AEgBEG4AWogBEHoAWogCSAKIAsQigECQCAEKAK4AUEFRw0AIAQoArwBIQgMAgsgBCkDuAEhHQsgHUIgiKchAgJAAkACQAJAIB2nIghBfWoiBkECIAZBAkkbDgMAAQIACyAFEK0jIQUMAgsgBUUNAyACIAVBf2oQqiEhBQwBCyAIIAIQpyEhBQsgAEECNgIAIAAgBTYCBAwDCwJAIAIoArABQQFxRQ0AIAIgAigCtAEiCSACKAK4ASILayALIAlrIAkgC0sbIAIoAnBqNgJwCyACIAU2ArgBIAIgBTYCtAEgAkEBNgKwAQJAIAUgBkkNACADKAIMIRBBACEMDAILIAFB4AJqIQkgASgChAUhFSABKAKABSEOIAMoAgwhECADKAIIIQ1BACEMA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIQf///z9LDQAgBSAGSQ0BDAsLIAIoArABRQ0CIAIgBTYCuAEgBSAQSQ0BIAUgEEG444MBEIwVAAsgAigCfCEZIAIoAnghCwNAIAsgCCAJIA0gBWoiCi0AAGotAABqQQJ0aigCACERIAVBA2oiByAGTw0HIBFBgICAwABPDQcgCyARIAkgCkEBai0AAGotAABqQQJ0aigCACIIQf///z9LDQUgCyAIIAkgCkECai0AAGotAABqQQJ0aigCACIRQf///z9LDQYgCyARIAkgCkEDai0AAGotAABqQQJ0aigCACIIQf///z9LDQQgBUEEaiIFIAZPDQoMAAsLIAhB////P3EgCSANIAVqLQAAIhFqLQAAaiILIAIoAnwiCk8NAQJAAkAgAigCeCALQQJ0aigCACIKQQBIDQBBACEIDAELIAQgAjYCyAEgBCABNgLEASAEQcAAaiAEQcQBaiAIIBFBCHQQgAEgBCgCRCEKIAQoAkAhCAsCQCAIQQFxRQ0AIAUQrSMhBSAAQQI2AgAgACAFNgIEDA4LIAUhBwwHC0HY4YMBQR9B+OGDARCqFwALIAsgCkHU4IMBEIwVAAsgCCEKIBEhCAwDCyAFQQFqIQcgCCEKIBEhCAwCCyAFQQJqIQcgESEKDAELIBEhCiAFIQcLIApBAE4NAAJAAkAgAigCsAFFDQAgAiAHNgK4ASAIIAkgDSAHai0AACIRai0AAGoiBSAZTw0BAkACQCALIAVBAnRqKAIAIgpBAEgNAEEAIQUMAQsgBCACNgLIASAEIAE2AsQBIARByABqIARBxAFqIAggEUEIdBCAASAEKAJMIQogBCgCSCEFCyAFQQFxRQ0CIAcQrSMhBSAAQQI2AgAgACAFNgIEDAgLQdjhgwFBH0H44YMBEKoXAAsgBSAZQdTggwEQjBUACwJAIApBgICAwABJDQAgCkGAgICAAXENAAJAAkACQAJAIApBgICAwABxDQAgCkGAgICABHENASAKQYCAgIACcQ0CIARBATYCyAEgBEGM5IMBNgLEASAEQgA3AtABIAQgBEH8AWo2AswBIARBxAFqQZTkgwEQ4iMAC0EBIQxBACESIA4oAtwCQQFGDQIgFSACIAoQ7iEiBSgCACAFKAIEQQAQqBMhEgwCCyACIAcQ3BsgACAPNgIIIAAgEjYCBCAAIAw2AgAMCAsgAiAHENwbAkAgByAQTw0AIA0gB2otAAAgBxCqISEFIABBAjYCACAAIAU2AgQMCAsgByAQQaTkgwEQjBUACyAKIQggByEPDAILIAohCAwBCyAFIQcLIAdBAWoiBSAGTw0CDAALC0H04IMBQSRBmOGDARCqFwALAkACQAJAAkACQAJAAkACQAJAIAYgEE8NACAIQf///z9xIAEgAygCCCAGai0AACILai0A4AJqIgUgAigCfCIJTw0FQQAhCQJAIAIoAnggBUECdGooAgAiBUEATg0AIAQgAjYCyAEgBCABNgLEASAEQTBqIARBxAFqIAggC0EIdBCAASAEKAI0IQUgBCgCMCEJCyAJQQFxRQ0BIAYQrSMhBQwICyABLQDfBEEBaiILIAhB////P3FqIgUgAigCfCIJTw0FQQAhCQJAIAIoAnggBUECdGooAgAiBUEATg0AIAQgAjYCyAEgBCABNgLEASAEQThqIARBxAFqIAggC0EQdEEBchCAASAEKAI8IQUgBCgCOCEJCyAJQQFxRQ0BIBAQrSMhBQwHCyAGIRAgBUGAgIDAAHENASAFQYCAgIACcUUNAiALIAYQqiEhBQwGCyAFQYCAgMAAcUUNAQtBASEMIAEoAoAFIAEoAoQFIAIgBRDGIyESIBAhDwsgAigCsAEhBSACQQA2ArABIAVBAXFFDQIgAigCtAEhBSAAIA82AgggACASNgIEIAAgDDYCACACIAIoAnAgBSAGayAGIAVrIAUgBksbajYCcAwECyAFIAlB1OCDARCMFQALIAUgCUHk4IMBEIwVAAtBiOKDAUEfQajigwEQqhcACyAAQQI2AgAgACAFNgIECyAEQYACaiQAC81YAxl/A34BfCMAQbAHayICJAAgASgC2AEhAwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDgASIEQY1/akH/AXFBLkkNAAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEGcf2oODgwBAQERAQIBBQEMAQEMAAsgBEFAakEDSQ0BIARBtX9qQQNJDQsCQCAEDgUXAQYBBwALIARBu39qQQJJDQIgBEEORg0PIARBGkYNASAEQdoARg0BIARB3wBGDQMLIAJB+ANqQQRyIAEQzSYgAkGFATYCjAQgAkHM1ZsBNgKIBCACQbCAgIB4NgL4AyABKALY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jARBA0YNGyACQagDakEUaiACQfgDakEUaigCADYCACACQagDakEMaiACQfgDakEMaikCADcCACACIAIpAvwDNwKsA0EEIQUMGgsgAkH4A2ogARD5ASACKAL4AyEEIAItAKwEIgVBBEYNGgJAQTBFDQAgAkGoA2pBBHIgAkH4A2pBBHJBMPwKAAALIAJBqANqQcQAaiACQfgDakHEAGooAAA2AAAgAkGoA2pBPWogAkH4A2pBPWopAAA3AAAgAiACKQCtBDcA3QMMGQsgAkH4A2ogARDeASABIAEoAogBQQFyEJ8SIAEQoAsCQAJAIAEtAOABIgRBc2pBAk8NAEGRASEEDAELAkAgBEGRAUcNACABEKALIAEtAOABIQQLIARB/wFxQQRHDQ8gARCgCyABKAKIASABLQDgARCQJkUND0HgACEECyABEKALIAEtAOABIQMgASACQfgDahDHBSADIARHDQ8gASgC2AEhBiABLQDgAUECRg0NIAEoAtwBIQQgAkGoBWogARDNJiACQQE2AvwDIAJByL6cATYC+AMgAkIBNwKEBCACQbMHNgLkASACQQI6AKgHIAIgAkHgAWo2AoAEIAIgAkGABWo2AuABIAIgAkGoB2o2AoAFIAJBqANqIAJB+ANqEPQaIAJBvANqIAJBsAVqKAIANgIAIAIgAikCqAU3ArQDIAYgBCACQagDahDXGiEEIAEtAOABQaIBRw0WIAEgARCXLBCfFwwWCyABEKALIAJBADYCsAUgAkKAgICAgAE3AqgFIAJBqANqQQhqIQYgAkGVBGohESACQfgDakEEciESIAJBhAdqIRMgAkGlB2ohFEEwIQlBCCENQQAhCAJAAkADQCABLQDgASIEQQVGDQIgASgC2AEhCgJAAkAgAS0AkQFBIHENACACQQc2AqgDDAELIAEoAogBIQ4gAkHgBWogARDeASABIAEoAogBQQFyEJ8SIAEoAtgBIRUCQCABLQDgASIEQRxHDQAgARCgCyABKALUASELIAEoAtABIQ8LIAJB+AZqIAEQ2A4gAkGQB2ogAkH4BmoQ6yQgAigCkAchBwJAAkACQCACLQCkByIQQQJHDQAgAiAHNgL8AyACQQg2AvgDDAELIAJB6AZqQQJqIhYgFEECai0AADoAACACIBQvAAA7AegGIAIoAqAHIRcgAigCmAchBSACKAKU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dGoiCyATNgIIIAsgITcDACABIAhBAWo2AnBBAC0AoPCeARpBwAAQfSIIRQ0FIAhBADYCCCAIQjE3AwAgBCgCDCELIAQgCDYCDAJAICJCAFINACAhpyIIIAgoAgAiCEEBajYCACAIQQBIDQYgBCgCDCEICyAIELgBIAQoAgwiCEEAOgA8IAggCzYCOCAIQgA3AzAgCEEANgIgIAhBADoAHCAIIBM2AhggCCASNgIUIAggGDYCECAIICE3AwggCEEANgIAQQAtAKDwngEaIAQoAhQhCyAEKAIQIQhBwAAQfSIRRQ0FIBFBADoAHCARIBM2AhggESASNgIUIBEgGDYCECARICE3AgggEUEaNgIAQQMhEwsgAiAONgLMASACIBY2AsgBIAIgETYCtAEgAiATNgKwASACIAqtQiCGIBethDcDwAEgAiALrUIghiAIrYQ3A7gBIAQoAjwhCCAEQQA2AjwCQCAIRQ0AIAJBwAJqQThqIAhBOGopAwA3AwAgAkHAAmpBMGogCEEwaikDADcDACACQcACakEoaiAIQShqKQMANwMAIAJBwAJqQSBqIAhBIGopAwA3AwAgAkHAAmpBGGogCEEYaikDADcDACACQcACakEQaiAIQRBqKQMANwMAIAJBwAJqQQhqIAhBCGopAwA3AwAgAiAIKQMANwPAAiACQbABaiACQcACahChBCELIAhBwABBCBCsFiALIAQoAiggBCgCLBDgCgJAIAIoAlQiBCACKAJMRw0AIAJBzABqQayhmwEQzx0LIAIoAlAgBEECdGogCzYCACACIARBAWo2AlQMAgtBnKGbARDOLAALAkAgAigCWEEFRg0AIAJB2ABqEMQOIAIoApwBIgggAigCoAEQ/gwgAigCmAEgCBCYLSACKAJ4IghBgICAgHhGDQAgAigCfCILIAIoAoABEJclIAggCxCZLQsgAiAENgJYAkBB1ABFDQAgCSACQbABakHUAPwKAAALIBMhFAsgBkEBaiELIANBAEHYACADIBVGG2ohCCAGIBBGDQQMAAsLIAJBATYCxAIgAkG8n5sBNgLAAiACQgA3AswCIAIgAkGwAWo2AsgCIAJBwAJqQcSfmwEQ4iMACwALAkAgACgCFCIDRQ0AIAAoAhAhBCADQdgAbCEDA0ACQCAEKAIAQQVPDQAgAiALNgLIAiACIAY2AsQCIAIg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QQhqIDc3AgAgAkEBNgKkASACIAc2AqABIAIgATYCnAECQEEkRQ0AIAJBiANqIAJBgAJqQST8CgAACwJAA0AgAkHQAmogAkGIA2oQowQgAigC0AJBgYCAgHhGDQECQCAEIAIoApwBRw0AIAJBrAFqIAJBiANqENQhIAJBnAFqIAQgAigCrAFBAWoiAUF/IAEbQQRBIBD6CCACKAKgASEHCyAHIAhqIgEgAikC0AI3AgAgAUEYaiACQdACakEYaikCADcCACABQRBqIAJB0AJqQRBqKQIANwIAIAFBCGogAkHQAmpBCGopAgA3AgAgAiAEQQFqIgQ2AqQBIAhBIGohCAwACwsgAkHwAWpBCGogAkGcAWpBCGooAgAiJjYCACACIAIpApwBNwPwASACKAL0ASEpDAELQQAhJiACQQA2AvgBIAJCgICAgMAANwPwAUEEISkLICkgJkEFdGohCSAqIAVBFGxqIStBACEQICohBANAAkACQCAEICtGDQBBACEoICkhCANAIAgiASAJRg0CIAFBEGooAgAhByAEQRBqKAIAIQUCQCABQQxqKAIAIgsgBEEMaigCACIMSQ0AIAFBIGohCCAHIAtqIAUgDGpNDQELIAFBIGohCCAoIAwgBSALIAcQgBhqISgMAAsLA0ACQAJAAkACQAJAAkACQAJAICogK0YNACAQRQ0FQQAhJyACQQA2ArQBIAJCgICAgBA3AqwBICpBEGoiCygCACAqQQxqIgwoAgAiLGohLSApICZBBXRqIQUgKSEEA0ACQCAEIgEgBUcNAEEDIQEMBgsgAUEgaiEEIAwoAgAiByALKAIAIiggAUEMaigCACIIIAFBEGooAgAiCRCAGEUNAAJAAkACQCAIIAdPDQACQCAJIAhqIgkgB0kNACAJICggB2pNDQMLICdBAWohJwJAIAggLE8NACAJIC1LDQILIAJBrAFqQSAQqBcMAwsgAiAVNgKIAyAeIAEpABQ3AAAgHkEIaiIEIAFBHGoiCC8AADsAACACQYACaiACQYgDahDXEyACQawBaiACKAKEAiACKAKIAhDQKyACQYACahDJLCACQYACaiAAKAIAEKkXIAJB0AJqIAIoAoQCIAIoAogCQQAgECAnayIHIAcgEEsbEJEKIAIgAkHQAmo2AogDIB4gASkAFDcAACAEIAgvAAA7AAAgAkGwAmogAkGIA2oQ2BMgAkGsAWogAigCtAIgAigCuAIQ0CsgAkGwAmoQySwgAkHQAmoQySwgAkGAAmoQySwgAiAWNgKIAyAeIAEpABQ3AAAgBCAILwAAOwAAIAJBgAJqIAJBiANqENcTIAJBrAFqIAIoAoQCIAIoAogCENArIAJBgAJqEMksDAYLIAIgGTYCiAMgHiABKQAUNwAAIB5BCGogAUEcai8AADsAACACQYACaiACQYgDahDXEyACQawBaiACKAKEAiACKAKIAhDQKyACQYACahDJLAwBCwsgAkGIA2ogARCYBiABQRRqIQEgAigCiAMhBCACQYgDahCCKSAEQYCAgIB4Rg0BIAIgGDYCiAMgHiABKQAANwAAIB5BCGogAUEIai8AADsAACACQYACaiACQYgDahDXEyACQawBaiACKAKEAiACKAKIAhDQKyACQYACahDJLAwCCyACQfABahDFFSACQeQBahCYGyACQcwBahCCKSAlICQQvCMMDQsgAiAXNgKIAyAeIAEpAAA3AAAgHkEIaiABQQhqLwAAOwAAIAJBgAJqIAJBiANqENcTIAJBrAFqIAIoAoQCIAIoAogCENArIAJBgAJqEMksCyACQYACaiAAKAIAEKkXIAJB0AJqIAIoAoQCIAIoAogCQQAgECAnayIEIAQgEEsbEJEKIAIgAkHQAmo2AogDIB4gASkAADcAACAeQQhqIgQgAUEIaiIILwAAOwAAIAJBsAJqIAJBiANqENgTIAJBrAFqIAIoArQCIAIoArgCENArIAJBsAJqEMksIAJB0AJqEMksIAJBgAJqEMksIAIgFjYCiAMgHiABKQAANwAAIAQgCC8AADsAACACQYACaiACQYgDahDXEyACQawBaiACKAKEAiACKAKIAhDQKyACQYACahDJLAtBASEBCyACKAKwASEEAkACQCACKAK0ASIIQRBJDQAgBCAIEOcFIQQMAQsgBCAIEIohIQQLIAJB0AJqQZ2QnAFBAUEAIBAgBGsiBCAEIBBLGyABahCRCiACQQQ2AowCIAJBBDYChAIgAkECNgKMAyACQdyqmwE2AogDIAJCAjcClAMgAiACQdACajYCiAIgAiACQawBajYCgAIgAiACQYACajYCkAMgAkH8AGogAkGIA2oQhikhASACQdACahDJLCACQawBahDJLCABDQELICpBFGohLiAqKAIIIQQgKigCBCEBIAJBADoArAMgAkEANgKoAyACICE2AqQDIAIgASAEaiIENgKgAyACIAE2ApwDIAJBADYCmAMgAkIANwKQAyACIAQ2AowDIAIgATYCiAMDQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkGIA2oQlA0iCEGAgMQARg0AIB8QlA0iBEGAgMQARg0AAkACQAJAAkAgAi0ArAMNACAEQQlGDQIgBEEbRw0BIAJBAToArAMMDQsgBEHtAEYNAgwMCyAEQf8ASQ0FIARBnwFNDQsgBEENdkGAyJ0Bai0AACIBQRRPDQQgAUEGdCAEQQd2QT9xckGAyp0Bai0AACIBQbgBTw0DIAFBBXQgBEECdkEfcXJBgNSdAWotAAAgBEEBdEEGcXZBA3EiAUEDRw0MIARB/4N8aiIBQQ5LDQpBASABdEGBwAFxDQsMCgsCQCACKAKkAyIBRQ0AIAEgAigCqAMgAXBrIQEMDAtBzMqAARDVIQALQQAhASACQQA6AKwDDAoLIAJB/ABqQQoQqBcgKkEQaiIJKAIAIQEgKkEMaiIMKAIAIQsgAkEANgKIAiACQoCAgIDAADcCgAIgAkEANgKQAyACQoCAgIDAADcCiAMCQCAmDQBBBCEvQQAhMEEAITFBBCEyQQAhMwwECyABIAtqIShBBCEFA0ACQCAMKAIAIAkoAgAgKUEMaigCACIEIClBEGooAgAiBxChFUUNAEEAIQggAkGIA2ohAQJAIAQgC0kNACAHIARqIChLDQBBASEIIAJBgAJqIQELAkAgASgCCCIEIAEoAgBHDQAgAUHMz4ABQbzPgAEgCBsQux0gAigChAIhBQsgBSACKAKMAyAIGyAEQQJ0aiApNgIAIAEgBEEBajYCCAsgKUEgaiEpICZBf2oiJg0ACyACKAL4ASEmIAIoAvQBISkgAigCkAMhMyACKAKMAyEyIAIoAogDITEgAigChAIhLyACKAKAAiEwIAIoAogCIjRFDQMgACACQfwAaiAQIAwoAgAgCSgCACApICZBABC9BA0FQQAhASACQQA2AqwCIAJCgICAgBA3AqQCIAJBEGogNEEEQQhBgOmbARCcGSACQQA2AvgCIAIgAigCFCIENgL0AiACIAIoAhAiCDYC8AIgNEECdCEHQQAhLQJAIDQgCE0NACACQfACakEAIDRBBEEIEPoIIAIoAvQCIQQgAigC+AIhLQsgLyAHaiE1IAQgLUEDdGohCyAvIQUDQCAFKAIAIgdBEGoiKCgCACEIIAEgACgCuAEgKiAHQQxqKAIAIidBARCABCIEIAEgBEsbIQQCQAJAICgoAgANACAEQQFqIQgMAQsgBEEBaiIsIAAoArgBICogCCAnakEAEIAEIgggLCAISxshCAsgAkGcAWogFCgCABCVESACQbADaiACKAKgASI2IAIoAqQBIAggBGpBAXYiJyAEaxCRCiASISwCQCAoKAIARQ0AIAJBiANqIAcQmAYgFCEsIAIoAogDIihBgICAgHhGDQAgKCACKAKMAxDLLCATISwLIAIgLCgCADYCvAMgAkGwAmogFCgCABCVESACQawBaiACKAK0AiIsIAIoArgCIAggJ0F/c2oQkQoCQEEAIAQgAWsiKCAoIARLGyIEQYCABEkNACACQQA2ApgDIAJBATYCjAMgAkHwyIABNgKIAyACQgQ3ApADIAJBiANqQfzKgAEQ4iMACyACIAQ7AawDIAJBADYCqAMgAkEENgKkAyACQQU2ApwDIAJBBDYClAMgAkEGNgKMAyACQci+nAE2AogDIAJBBDYClAIgAkGMy4ABNgKQAiACQQQ2AoQCIAJB3MqAATYCgAIgAkEFNgKMAiACIAJBrAFqNgKgAyACIAJBvANqNgKYAyACIAJBsANqNgKQAyACIAJBiANqNgKIAiACQfwCaiACQYACahDpCSACKAKsASACKAKwARDLLCACKAKwAiAsEMssIAIoArADIAIoArQDEMssIAIoApwBIDYQyywgHUEIaiAHQRxqLwEAOwEAIB0gBykCFDcCACACIAJB/AJqNgLQAiACQYgDaiACQdACahDZEyACQaQCaiACKAKMAyIEIAIoApADENArIAIoAogDIAQQyywgAigC/AIgAigCgAMQyywgC0EEaiAnNgIAIAsgBTYCACAIIAEgCCABSxshASAFQQRqIQUgC0EIaiELIC1BAWohLSA0QX9qIjQNAAsgAigC8AIhCyACKAL0AiEFIAJBAjYCjAMgAkGQ/YcBNgKIAyACQgE3ApQDIAJBBDYChAIgAiACQYACajYCkAMgAiACQaQCajYCgAIgAkH8AGogAkGIA2oQhikNBANAAkACQCAvIDVGDQAgAkGIA2ogNUF8aiI1KAIA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GGogB0EYaikCADcDACACIAcpAgAiNzcDiAMCQCA3p0GBgICAeEYNACACQYgDahCCKSACKAKgAyACKAKkAxC8IwsgKSACQYACakEQaikDADcDACAMICgpAwA3AwAgAiACKQOAAjcDiAMgAiAFNgKkAyACIAs2AqADIAJBkAFqIAJBiANqQYTCgAEQwBQgCCAEELwjIAJB0AJqEIIpDAULIAJBgAJqEIIpIAIoArgCIQUgBw0CIAIoArQCIAUQvCMMAwtB9MGAARDOLAALIAJBiANqQRBqIAJB0AJqQRBqKQIANwMAIAJBiANqQQhqIAJB0AJqQQhqKQIANwMAIAIgAikC0AI3A4gDIAIgBDYCpAMgAiAINgKgAyACQZABaiACQYgDakGkwoABEMAUDAILIAItALQCIAUQwRoLIAJBiANqQRBqIAJB0AJqQRBqKQIANwMAIAJBiANqQQhqIAJB0AJqQQhqKQIANwMAIAIgAikC0AI3A4gDIAIgBDYCpAMgAiAINgKgAyACQZABaiACQYgDakGUwoABEMAUCyABQRhqIQEMAAsLIAIoApABIAwQzywMAQsgAkHMAWoQgikgJSAkELwjIAJBvAFqEMQQQQEhCwsgDiEBAkADQCAKRQ0BIAEoAgAgAUEEaigCABCHKSAKQX9qIQogAUEYaiEBDAALCyANIA5BBEEYEI0VIAsNASACKAJ8IQULIAIpAoABITcMAQsgAkH8AGoQySxBgICAgHghBQsgAEHAAWohBAsgAygCOCEHIAJBCGogAygCPCIBQQRBKEGA6ZsBEJwZIAJBADYCiAIgAiACKAIMNgKEAiACIAIoAggiCDYCgAICQAJAIAEgCE0NACACQYACakEAIAFBBEEoEPoIDAELIAENACACQdAAakEIaiACQYACakEIaigCADYCACACIAIpAoACNwNQAkACQCADKAIAQQJHDQBBACEBDAELIAMoAgwhCCADKAIIIQELAkACQAJAIANBJGooAgBFDQAgAkGIA2ogBCgCAEEIaiADQSBqKAIAKAIAEJYDAkACQCACKAKIA0UNACACQdACakEIaiACQYgDakEIaikCADcDACACIAIpAogDNwPQAgwBCyACQQA2AtACCyADQSRqKAIARQ0BIAJBiANqIAQoAgBBCGogA0EgaigCACgCBBCWAwJAIAIoAogDRQ0AIAJBgAJqQQhqIAJBiANqQQhqKQIANwMAIAIgAikCiAM3A4ACDAMLIAJBADYCgAIMAgsgAkEANgLQAgsgAkEANgKAAgsCQAJAAkACQCACKALQAiIHDQBBgICAgHghCwwBCyACQQA2ArgCIAJCgICAgBA3ArACIAJBgICAATYCjAMgAkKggICADjcCkAMgAiACQbACajYCiAMgB0HoAGogAkGIA2oQzigNASACKQK0AiE4IAIoArACIQsLAkACQCABRQ0AIAJBiANqIAEgCBD5EwwBCyACQYCAgIB4NgKIAwsgAygCGEUNASACQfAAaiADKAIUIgFBBGooAgAgAUEIaigCABCnFyACQeAAakEIaiIMIAJBiANqQQhqKAIANgIAIAIgAikCiAM3A2AgAigCjAIhCSACKAKEAiEKIAIoAoACISggAigC3AIhKSACKALUAiEQIAAoArwBIgRBCGoQiRchAAJAIAQoAhQiCCAEKAIMRw0AIARBDGoQvR0LIAQoAhAgCEHcAGxqIgEgCTYCHCABIChBAEciCTYCGCABIAo2AhQgASAJNgIQIAEgKTYCDCABIAdBAEciBzYCCCABIBA2AgQgASAHNgIAIAEgAikCcDcCICABIAIpA1A3AiwgASACKQNgNwI4IAFBKGogAkHwAGpBCGooAgA2AgAgAUE0aiACQdAAakEIaigCADYCACABQcAAaiAMKAIANgIAIAEgODcCVCABIAs2AlAgASA3NwJIIAEgBTYCRCAAQQA6AAAgBCAIQQFqNgIUIAJBgAJqELojIAJB0AJqELojIAJBwANqJAAPC0H8lZwBQTcgAkHMAWpBmICAAUGAl5wBEOISAAtBAEEAQZiBgAEQjBUACyACIAc2ArACIAJBATYCjAMgAkGYzIABNgKIAyACQgE3ApQDIAJBCDYC1AIgAiACQdACajYCkAMgAiACQbACajYC0AIgAkGIA2pBoMyAARDiIwALj0sDF38DfgF8IwBBwAFrIgIkAAJAIAAtACQiAw0AAkAgASgCAEF0aiIEQQcgBEEmSRtBe2oiBEEfSw0AQQEgBHRBrqKAgHhxDQEgBA0AIAEtABFFDQELIABBAzoAJAsgAC0AJSEFIAFBDGohBiABQQhqIQcgAUEEaiEIAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJA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AyAFNgKQASADIAg2AowBCyADQYAEaiABEKYXAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAKABCITQYCAgIB4RyIPRQ0AIANBqAFqQQhqIANBgARqQQhqKAIANgIAIAMgAykCgAQ3A6gBDAELAkAgARDeLSIIDQBB1IGAAUEjEAchBQwDCyADQbgCaiABEAgiERCmFyADKAK4AkGAgICAeEYNASADQagBakEIaiADQbgCakEIaigCADYCACADIAMpArgCNwOoASABENcqIBEQ1yoLQQAtAKDwngEaQQgQfSIIRQ0CIAhCADcCAEEEEOAnIhFBADYCACADQbQBakEYakEAKQOAhJ4BIhw3AgAgA0EBNgLAASADIAg2ArwBIANBATYCuAEgA0EAOgC0ASADQoGAgIDw/79/NwLgASADIBE2AtwBIANBATYC2AEgA0EAOgDUASADQQApA/iDngEiGzcCxAFBFSADQbQBahD1JCEXQYwBEN0nIghBADYCdCAIQoCAgIDAADcCbCAIQQA6AGggCEG43pgBNgJkIAhCgICAgBA3AlwgCEKAgICAwAA3AlQgCEELNgIIIAhCgoCAgBA3AgAgCEEBNgKIASAIIBs3AnggCEGAAWogHDcCACADIAg2AowCQQFFDQIgA0GQAmpBCGogA0GoAWpBCGooAgA2AgAgA0GkAmogA0GMAWpBCGopAgA3AgAgA0GsAmogA0GcAWopAgA3AgAgA0G0AmogA0GMAWpBGGooAgA2AgAgAyADKQOoATcDkAIgAyADKQKMATcCnAJBAC0AoPCeARpBGBB9IhFFDQIgEUEANgIUIBFCgICAgMAANwIMIBFBADoACCARQoGAgIAQNwIAAkACQEEALQDA654BDgQAAAUBAAtBAEECOgDA654BQQAtAKDwngEaQYAIEH0iCUUNA0EAQQM6AMDrngFBACAJNgK4654BCyADQYAEahCsFyADQYAEakHsAGoQ3A4gA0KBgICAwAA3ArQFIANBvAVqQcgAakEBQQAQ+RMgA0G8BWpB1ABqQQFBABD5EyADQbwFakHgAGpBAUEAEPkTIANB8AZqEKwXIAMpAoAHIRwgAykCoAchGyADKQKoByEdIAMpArAHIR4gA0G8BWpB7ABqENwOIAMgHjcC/AUgAyAdNwL0BSADIBs3AuwFIANCoICAgIAENwLkBSADQqCAgICABDcC3AUgA0KggICAgAQ3AtQFIAMgHDcCzAUgA0KggICAgAQ3AsQFIANCoICAgIAENwK8BSADQYAEakHIAGoQySwgA0GABGpB1ABqEMksIANBgARqQeAAahDJLCADKALsBCADKALwBBDKLAJAQbQBRQ0AIANBgARqIANBvAVqQbQB/AoAAAsCQEG8AUUNACADQbgCaiADQYAEakG8AfwKAAALIAMgCDYC+AMgAyARNgL0AyADQfAGahDZJiARIBEoAgAiCEEBajYCACAIQX9MDQIgAykCuAIhHCADKQLAAiEbIAMpAsgCIR0gAykC0AIhHiADKQLYAiEfIAMpAuACISAgAykC6AIhISADKQLwAiEiIAMpAvgCISMgA0HIBGogAygChAMgAygCiAMQpxcgA0HUBGogAygCkAMgAygClAMQpxcgA0HgBGogAygCnAMgAygCoAMQpxcgAyAjNwLABCADICI3ArgEIAMgITcCsAQgAyAgNwKoBCADIB83AqAEIAMgHjcCmAQgAyAdNwKQBCADIBs3AogEIAMgHDcCgAQgA0HwBmpBCGoiCCADQbgDai8BADsBACADIAMpArADNwPwBiADQfAIakEIaiISIANBwgNqLwEAOwEAIAMgAykBugM3A/AIIANBiAlqQQhqIgUgA0HMA2ovAQA7AQAgAyADKQLEAzcDiAkgA0HgCGpBCGoiECADQdYDai8BADsBACADIAMpAc4DNwPgCCADQdAIakEIaiIKIANB4ANqLwEAOwEAIAMgAykC2AM3A9AIIANBwAhqQQhqIg0gA0HqA2ovAQA7AQAgAyADKQHiAzcDwAggAygCqAMhDiADQdgAaiADKAKsAyIJQQFBCkHYu5wBEJoZIAMoAlghDCADKAJcIQYCQCAJQQpsIhhFDQAgBiAOIBj8CgAACwJAQewARQ0AIANBvAVqIANBgARqQewA/AoAAAsgA0GwCGpBCGogCC8BADsBACADQaAIakEIaiASLwEAOwEAIANBkAhqQQhqIAUvAQA7AQAgA0GACGpBCGogEC8BADsBACADQfAHakEIaiAKLwEAOwEAIAMgAykD8AY3A7AIIAMgAykD8Ag3A6AIIAMgAykDiAk3A5AIIAMgAykD4Ag3A4AIIAMgAykD0Ag3A/AHIANB4AdqQQhqIA0vAQA7AQAgAyADKQPACDcD4AcgAygC+AMiEiASKAIAIghBAWo2AgAgCEF/TA0CIAMoAvADIQUgAygC7AMhEAJAQewARSIKDQAgA0GABGogA0G8BWpB7AD8CgAACyADQfAGakEIaiINIANBsAhqQQhqLwEAOwEAIANB8AhqQQhqIg4gA0GgCGpBCGovAQA7AQAgA0GICWpBCGoiGCADQZAIakEIai8BADsBACADQeAIakEIaiILIANBgAhqQQhqLwEAOwEAIANB0AhqQQhqIhogA0HwB2pBCGovAQA7AQAgAyADKQOwCDcD8AYgAyADKQOgCDcD8AggAyADKQOQCDcDiAkgAyADKQOACDcD4AggAyADKQPwBzcD0AggA0HACGpBCGoiFSADQeAHakEIai8BADsBACADIAMpA+AHNwPACEHEARDdJyEIAkAgCg0AIAggA0GABGpB7AD8CgAACyAIIAk2AnQgCCAGNgJwIAggDDYCbCAIIAMpA/AGNwJ4IAhBgAFqIA0vAQA7AQAgCCADKQPwCDcBggEgCEGKAWogDi8BADsBACAIIAMpA4gJNwKMASAIQZQBaiAYLwEAOwEAIAggAykD4Ag3AZYBIAhBngFqIAsvAQA7AQAgCCAQNgK0ASAIIAU2ArgBIAggETYCvAEgCCASNgLAASAIQagBaiAaLwEAOwEAIAggAykD0Ag3AqABIAggAykDwAg3AaoBIAhBsgFqIBUvAQA7AQAgA0HHBWoiEUEAKQOAhJ4BIhw3AAAgA0EAKQP4g54BIhs3AL8FIANBqQRqIANBvAVqQQhqIgkpAAA3AAAgA0GwBGogA0HLBWoiEigAADYAACADQQA6AKAEIAMgAykAvAU3AKEEIBEgHDcAACADIBs3AL8FIANBADoAtAQgA0HEBGogEigAADYAACADQb0EaiAJKQAANwAAIAMgAykAvAU3ALUEIBEgHDcAACADIBs3AL8FIANBAToA3gQgA0EANgDfBCADQQA6AIQEIANBADYCgAQgA0GAAjsB3AQgA0G4gIABNgKMBCADIAg2AogEIANBADoAyAQgA0EANgKcBCADQoCAgIDAADcClAQgA0EAOgCQBCADQdgEaiASKAAANgAAIANB0QRqIAkpAAA3AAAgAyADKQC8BTcAyQQCQEEoRQ0AIANBvAVqIANBkAJqQSj8CgAACyADIANBgARqNgLoBSADIANBjAJqNgLkBUEWIANBgARqEPUkIREgA0HwCGogAygCjAIgA0GABGogA0G8BWogA0G8BWpBDGoQPwJAAkAgAygC8AhBgICAgHhHDQAgA0HwBmoQ4ScgA0GQCWoiCSADQfAGakEMaikCADcDACADQYgJakEQaiISIANBhAdqKAIANgIAIAMgAykC9AY3A4gJIAMoAvAGIQZBLBDiJyIIIAY2AgQgCEGg14ABNgIAIAggAykDiAk3AgggCEEQaiAJKQMANwIAIAhBGGogEigCADYCACAIIAMpAvQINwIcIAhBJGogA0HwCGpBDGopAgA3AgAgAyAINgL0BiADQYCAgIB4NgLwBgwBCyADQfAGakEQaiADQfAIakEQaikCADcDACADQfAGakEIaiADQfAIakEIaikCADcDACADIAMpAvAINwPwBgtByOKYASAREKYmAkACQCADKAKABA0AIAMoAvQGIQ0gAygC8AYiDEGAgICAeEYNBiADKQOAByEcIAMoAvwGIQ4gAygC+AYhCgwBCyADKAL0AyIIQQhqEIkXQQA6AAAgCCgCFCEOIAgoAhAhCiAIQgQ3AhAgCCgCDCENIAhBADYCDEGAgICAeCEMAkACQCADKALwBkGAgICAeEYNACADQfAGahDPKwwBCyADKAL0BiIIIAgoAgAoAgARAwALCwJAIAMoAoAEDQAgA0GABGpBEGoiCxDdJSADKAKYBCIRQdAAaiESIAMoApwEIRggA0EANgKcBEEAIBFrIQYgGEHQAGwiCEGwf2ohCSARIAhqIRoCQANAIAlBsH9GDQECQCARKAIAIgVBA0YNAAJAQcwARSIQDQAgA0G8BWogEUEEakHMAPwKAAALQQAtAKDwngEaQdAAEH0iCEUNBiAIIAU2AgACQCAQDQAgCEEEaiADQbwFakHMAPwKAAALIANBAToA+AYgAyAINgL0BiADIANBgARqNgLwBiADQfAGahD2ASADQfAGahCKFiADKAL0BiIIQRRqIgUoAgAgCEEYaigCABCaIyAIKAIQIAUoAgAQ0ywCQCAIKAIAQQJGDQAgCCgCBCAIQQhqKAIAENQsCyARQdAAaiERIAgoAhwgCEEgaigCABDVLCAIQSxqIgUoAgAgCEEwaigCABCbIyAIKAIoIAUoAgAQ1iwgCEE4aiIFKAIA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CyALQQFxRQ0CIAFBAXFFDQILIAYgAzYCVCADIAIoAlAiAU8NDwwACwsgAigCCCIDDQALCyAaIBxHDQALICVBAXENAQsgGUUgFnJBAXENAUEBIRkMBAtBASEZAkAgFUEBcQ0AICchKCAYISkMAgsgGCEpICchKAwDC0EAIBkgFUEBcRshGQtBDCEDAkADQCADQTxGDQEgAiADaiIBQTBqIgsoAgAhGyALIAEoAgA2AgAgASAbNgIAIANBBGohAwwACwsgAkEANgJUIBhBAWoiGCAITQ0ACwsgACApNgIIIAAgKDYCBCAAIBk2AgAMBwsgAyAhQZiqhAEQjBUACyADIAFByLSEARDdLAALIAZBADYChAEgBkEBNgJ4IAZB0KmEATYCdCAGQgQ3AnwgBkH0AGpB2KmEARDiIwALIABBADYCAAwDCyADIAFBqLSEARCMFQALIAMgAUGotIQBEIwVAAsgAEEANgIACyAGQZABaiQAC4A+Aw9/BX4CfCMAQaADayIDJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIAQXBqDhQABwEHAgcHBwcHCgMEBwcHBwcHEAcLIANBJGpBAmogAkETai0AADoAACADIAIvABE7ASQgAigCDCEEIAIoAgghBSACKAIEIQYCQAJAAkAgAi0AECIHQQNLDQAgB0ECRw0BC0EALQCg8J4BGkHAABB9IgFFDR0gASAHOgAQIAEgBDYCDCABIAU2AgggASAGNgIEIAFBEDYCACABIAMvASQ7ABEgACABNgIEIABBAjYCACABQRNqIANBJGpBAmotAAA6AAAMAQsgA0HwAGogASAGEFgCQCADKAJwQQFHDQAgAysDeCEXAkACQAJAAkAgBw4EAQMAAgALQcu4nAFBKEHMqpsBEMweAAsgF5ohFwwBCyAXEOQaIRcLIABBATYCACAAIBc5AwggA0HwAGoQsBgMAQsgA0HYAmogA0HwAGoQnwVBAC0AoPCeARpBwAAQfSIBRQ0cIAEgAykD2AI3AwAgAUE4aiADQdgCakE4aikDADcDACABQTBqIANB2AJqQTBqKQMANwMAIAFBKGogA0HYAmpBKGopAwA3AwAgAUEgaiADQdgCakEgaikDADcDACABQRhqIANB2AJqQRhqKQMANwMAIAFBEGogA0HYAmpBEGopAwA3AwAgAUEIaiADQdgCakEIaikDADcDAEEALQCg8J4BGkHAABB9IgZFDRwgBiAHOgAQIAYgBDYCDCAGIAU2AgggBiABNgIEIAZBEDYCACAAIAY2AgQgAEECNgIACyACKAIAQXBqIgBBE0sNIEEBIAB0QZWoIHENIiAAQQtGDR8MIAsgAigCECEIIAIoAgwhCSACLQAUIQQgAigCCCEFIAIoAgQhChD0JyEHIANB2AJqIAoQQiAHQThqIANB2AJqQThqIgspAwA3AwAgB0EwaiADQdgCakEwaiIMKQMANwMAIAdBKGogA0HYAmpBKGoiDSkDADcDACAHQSBqIANB2AJqQSBqIg4pAwA3AwAgB0EYaiADQdgCakEYaiIPKQMANwMAIAdBEGogA0HYAmpBEGoiECkDADcDACAHQQhqIANB2AJqQQhqIhEpAwA3AwAgByADKQPYAjcDABD0JyEGIANB2AJqIAUQQiAGQThqIAspAwA3AwAgBkEwaiAMKQMANwMAIAZBKGogDSkDADcDACAGQSBqIA4pAwA3AwAgBkEYaiAPKQMANwMAIAZBEGogECkDADcDACAGQQhqIBEpAwA3AwAgBiADKQPYAjcDAAJAIARBeGpBC0kNACAEQRdGDQBBAC0AoPCeARpBwAAQfSIBRQ0bIAEgBDoAFCABIAg2AhAgASAJNgIMIAEgBjYCCCABIAc2AgQgAUESNgIAIAAgATYCBCAAQQI2AgAgCiAFEIAnDB4LIANBgAFqIAEgChBYIANBgAFqQRBqIgsgASAFEFggAyAEOgCgASADKAKQASEKQQEhDAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAKAASIFDgIAATELIAoOAgECLwsgCg4CAgMuCyAEQQtGDRJBACEKDC0LAkAgBEELRg0AQQEhCgwtCyADIAMpA4gBNwPQASADQZACaiADKwOYARDHDiADQQI2AtwCIANB3KqbATYC2AIgA0ICNwLkAiADQaAHrUIghiADQZACaq2ENwOAAiADQcwErUIghiADQdABaq2ENwP4ASADIANB+AFqNgLgAiADQcgCaiADQdgCahCeDkEAIQEgA0HIAmoQ8SYhEiAAQQA2AgAgACASNwMIIAMoApACIAMoApQCENQsIAMpA9ABEMYhDBMLIARBC0YNAUEAIQoMKwsgAysDmAEhFyADKwOIASEYIARBeGoOEAIDBAUGBwgJCgsMAQEBAQ0BCyADKwOIASEXIAMgAykDmAE3A9ABIANBkAJqIBcQxw4gA0ECNgLcAiADQdyqmwE2AtgCIANCAjcC5AIgA0HMBK1CIIYgA0HQAWqthDcDgAIgA0GgB61CIIYgA0GQAmqthDcD+AEgAyADQfgBajYC4AIgA0HIAmogA0HYAmoQng4gA0HIAmoQ8SYhEiAAQQA2AgAgACASNwMIIAMoApACIAMoApQCENQsIAMpA9ABEMYhDA8LQcu4nAFBKEHsqpsBEMweAAsgGCAXENEQIRcMCwsgGCAXENIQIRcMCgsgGCAXENMQIRcMCQsgGCAXoCEXDAgLIBggF6EhFwwHCyAYIBeiIRcMBgsgGCAXoyEXDAULIBggFxDpBiEXDAQLIBggFxCfESEXDAMLIBggFxCgESEXDAILIBggFxChESEXDAELIBggFxCOIiEXCyAAQQE2AgAgACAXOQMIQQAhAQwCCyADIAMpA4gBNwPQASADIAMpA5gBNwOQAiADQQI2AtwCIANB3KqbATYC2AIgA0ICNwLkAiADQcwErUIghiISIANBkAJqrYQ3A4ACIAMgEiADQdABaq2ENwP4ASADIANB+AFqNgLgAiADQcgCaiADQdgCahCeDiADQcgCahDxJiESIABBADYCACAAIBI3AwggAykDkAIQxiEgAykD0AEQxiELQQEhAQsgBxDBASAHQcAAQQgQrBYgBhDBASAGQcAAQQgQrBYgBQ0EDBcLIANBKGpBIGogAkEoaikDADcDACADQShqQRhqIAJBIGopAwA3AwAgA0EoakEQaiACQRhqKQMANwMAIANBKGpBCGogAkEQaikDADcDACADIAIpAwgiEjcDKAJAIBKnIgRBAUcNACADQdgCakEkaiACQQhqIgFBIGopAgA3AgAgA0HYAmpBHGogAUEYaikCADcCACADQdgCakEUaiABQRBqKQIANwIAIANB2AJqQQxqIAFBCGopAgA3AgBBAC0AoPCeARogAyABKQIANwLcAkHAABB9IgFFDRogAUEUNgIAIAEgAykC2AI3AgQgAUEMaiADQeACaikCADcC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AAA2AvABIAMgB0EDaigAADYA8wEgBCgCACEHIAsgEzcDACANIBI3AwAgBSADKALwATYAACAKIAMoAPMBNgAAIAMgFDcDgAEgAyAGOgCYASADQZACaiABIAcQWAJAAkACQAJAAkAgAygCkAIOAgEAFAsgA0GgAmogAysDmAIQxw4MAQsgAyADKQOYAjcDsAIgA0EANgLEAiADQoCAgIAQNwK8AiADQaCpmwE2AswCIANCoICAgA43AtACIAMgA0G8Amo2AsgCIANBsAJqIANByAJqEOQiDQEgA0GgAmpBCGogA0G8AmpBCGooAgA2AgAgAyADKQK8AjcDoAIgAykDsAIiEkIDg0IAUg0AIBKnIgcgBygCACIGQX9qNgIAIAZBAUcNACAHIAcoAhAQwCQLIANB5AFqIAMoAqQCIgcgByADKAKoAmoQ0CAgA0EYaiADQYABahDqFSADQeQBaiADKAIYIgcgByADKAIcahDQICADKAKgAiADKAKkAhDULCADKAKQAkUNASADQZACahCwGAwBC0H8lZwBQTcgA0GfA2pBuKmbAUGAl5wBEOISAAsgA0GAAWoQxxMgAygC3AIiByADKALkAkcNAAwQCwtB/JWcAUE3IANBnwNqQbipmwFBgJecARDiEgALIAcQwQEMDwsgA0GAAWoQsBgMEgsgAEECNgIAIAAgAjYCBAwcCyAAQQE2AgAgACACKwMYOQMIIAIpAyAiElANAiASQgODQgBSDQIgEqciACAAKAIAIgFBf2o2AgAgAUEBRw0CIAAgACgCEBDAJAwCCyAAQQA2AgAgACACKQMQNwMIIAIpAyAiElANASASQgODQgBSDQEgEqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDAJAwBCyADQRBqIAJBCGoiBxDqFQJAAkACQCADKAIQIAMoAhRByKmbAUEDENwlRQ0AIAIoAhggASgCCEYNAQsgA0EIaiAHEOoVAkAgAygCCCADKAIMQcupmwFBCBDcJUUNACACKAIYIAEoAghGDQILIAEoAgQhBgJAIAEoAgAiASkDACISQgODQgBSDQAgEqciBCAEKAIAIgRBAWo2AgAgBEF/TA0UCyABKAIIIQQCQCAHKQMAIhNCA4NCAFINACATpyIHIAcoAgAiB0EBajYCACAHQX9MDRQLIAMgEzcDkAEgAyAENgKIASADIBI3A4ABIAYoAgxFDQQgA0GQAWohCyADQYABahDyEiISQhmIQoGChIiQoMCAAX4hEyAGKAIEIgogEqdxIQUgBigCACEGQQAhDANAAkAgBiAFaikAACIUIBOFIhJCf4UgEkL//fv379+//358g0KAgYKEiJCgwIB/gyISUA0AA0ACQCADQYABaiAGQQAgEnqnQQN2IAVqIApxa0EobGoiB0FYahCRDEUNACAEIAdBYGooAgBHDQAgCyAHQWhqEJEMDQcLIBJCf3wgEoMiElBFDQALCyAUIBRCAYaDQoCBgoSIkKDAgH+DUEUNBSAFIAxBCGoiDGogCnEhBQwACwsgAEKAgICAgICA/P8ANwMIIABBATYCACAHKQMAIhJCA4NCAFINASASpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMAkDAELIABCgICAgICAgPj/ADcDCCAAQQE2AgAgBykDACISQgODQgBSDQAgEqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDAJAsgAigCAEFwaiIAQRNLDRVBASAAdEGVqCBxDRcgAEELRg0UDBULAkACQAJAAkAgB0FwaiIGKAIAIgQOBAADAQIAC0EAIQYCQCAHQXhqKQMAIhJCA4NCAFENAAwGCyASpyIBIAEoAgAiB0EBajYCACAHQX9KDQUMEgsgB0F0aigCACEGEPQnIQcgA0HYAmogBhBCIAdBOGogA0HYAmpBOGopAwA3AwAgB0EwaiADQdgCakEwaikDADcDACAHQShqIANB2AJqQShqKQMANwMAIAdBIGogA0HYAmpBIGopAwA3AwAgB0EYaiADQdgCakEYaikDADcDACAHQRBqIANB2AJqQRBqKQMANwMAIAdBCGogA0HYAmpBCGopAwA3AwAgByADKQPYAjcDACADIAc2AvwBCyADIAQ2AvgBDAILIANB+AFqQQhqIAZBCGopAwA3AwAgAyAGKQMAIhI3A/gBIBKnIgZBAUsNASADKQOAAiESIAMoAvwBIQEMAgsgAEECNgIAIAAgAjYCBCADQYABahCUFAwWCwJAIAEpAwAiEkIDg0IAUg0AIBKnIgcgBygCACIHQQFqNgIAIAdBf0wNDgsgAigCFCEGIAIoAhAhBCABKAIIIQECQCACKQMIIhNCA4NCAFINACATpyIHIAcoAgAiB0EBajYCACAHQX9MDQ4LQQAtAKDwngEaQcAAEH0iB0UNDSAHQQA6ABwgByABNgIYIAdCADcCECAHIBI3AgggB0EaNgIAQQAtAKDwngEaQcAAEH0iAUUNDSABIAc2AiggAUIANwMgIAEgBjYCHCABIAQ2AhggASATNwMQIAFBADYCCCABQRQ2AgAgA0H4AWoQsBhBAiEGCyAAIBI3AwggACABNgIEIAAgBjYCACACEMEBIAJBwABBCBCsFiADQYABahCUFAwUCyAAIAEgAigCBBBYIAIoAgBBcGoiAEETSw0QQQEgAHRBlaggcQ0SIABBC0YNDwwQCyAAIAMpA6gBNwMAIABBCGogA0GoAWpBCGopAwA3AwAgA0HQAWoQhg4gByAKEOkiIAUgBxCcLQwCCyAAIAMpA6gBNwMAIABBCGogA0GoAWpBCGopAwA3AwAgA0GQAmoQsBggA0GAAWoQxxMgA0HYAmoQhg4gDxD3GSADKALkASADKALoARDULAwBCyADQdgCahCGDiAPEPcZIANB5AFqEPEmIRIgAEEANgIAIAAgEjcDCCADQagBahCwGAsgAigCAEFwaiIAQRNLDQxBASAAdEGVqCBxDQ4gAEELRw0MDAsLIAdBwABBCBCsFkEAIQdBASEGCwJAAkACQAJAIAUoAgBBGkcNACAFKAIYIQcCQCAFKQMIIhNCA4MiFEIAUg0AIBOnIgYgBigCACIGQQFqNgIAIAZBf0wNCgsgAyASNwPoAiADIAc2AuACIAMgEzcD2AIgECgCDEUNAiADQegCaiEMIANB2AJqEPISIhJCGYhCgYKEiJCgwIABfiEVIBAoAgQiCyASp3EhBiAQKAIAIQRBACENA0ACQCAEIAZqKQAAIhYgFYUiEkJ/hSASQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIhJQDQADQAJAIANB2AJqIARBACASeqdBA3YgBmogC3FrQShsaiIKQVhqEJEMRQ0AIAcgCkFgaigCAEcNACAMIApBaGoQkQwNBQsgEkJ/fCASgyISUEUNAAsLIBYgFkIBhoNCgIGChIiQoMCAf4NQRQ0DIAYgDUEIaiINaiALcSEGDAALCyAAIAE2AgQgAEECNgIAIBJCA4NCAFINAyASpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMAkDAMLIANBgAFqIApBcGoQ0wkCQAJAIAMoAoABIgdBfWoOAgECAAsgACADKQKEATcCBCAAQQxqIANBgAFqQQxqKAIANgIAIAAgBzYCACADIAE2AoQBIANBAjYCgAEgA0GAAWoQsBgMAgsgA0GAAWoQsBgLIABBCGogA0GAAWpBCGopAwA3AwAgAyABNgKEASADQQI2AoABIAAgAykDgAE3AwALAkAgFEIAUg0AIBOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQwCQLIANB2AJqEJQUAkAgBSgCAEEaRg0AIAUQwQELIAVBwABBCBCsFgwBCwJAAkAgBSgCAEEaRg0AIAUQwQEMAQsgBSkDCCISQgODQgBSDQAgEqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDAJAsgAygCSEHAAEEIEKwWAkACQAJAIAQOAwEAAgELIANBKGoQvhEMAgsgBkUNASADKQMwIhJCA4NCAFINASASpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMAkDAELIAdFDQAgAygCLCIAEMEBIABBwABBCBCsFgsgAigCAEFwaiIAQRNLDQhBASAAdEGVqCBxDQogAEELRg0HDAgLIAENBQwECyADQdgCaiADQYABahCfBUEALQCg8J4BGkHAABB9IgFFDQEgASADKQPYAjcDACABQThqIANB2AJqQThqKQMANwMAIAFBMGogA0HYAmpBMGopAwA3AwAgAUEoaiADQdgCakEoaikDADcDACABQSBqIANB2AJqQSBqKQMANwMAIAFBGGogA0HYAmpBGGopAwA3AwAgAUEQaiADQdgCakEQaikDADcDACABQQhqIANB2AJqQQhqKQMANwMAIAcQwQEgB0HAAEEIEKwWIAVBAUshDCABIQcLAkACQCAKQQFNDQAgBiEFDAELIANB2AJqIAsQnwVBAC0AoPCeARpBwAAQfSIFRQ0BIAUgAykD2AI3AwAgBUE4aiADQdgCakE4aikDADcDACAFQTBqIANB2AJqQTBqKQMANwMAIAVBKGogA0HYAmpBKGopAwA3AwAgBUEgaiADQdgCakEgaikDADcDACAFQRhqIANB2AJqQRhqKQMANwMAIAVBEGogA0HYAmpBEGopAwA3AwAgBUEIaiADQdgCakEIaikDADcDACAGEMEBIAZBwABBCBCsFgtBAC0AoPCeARpBwAAQfSIBRQ0AIAEgBDoAFCABIAg2AhAgASAJNgIMIAEgBTYCCCABIAc2AgQgAUESNgIAIAAgATYCBCAAQQI2AgAgCkEBTQ0BIAsQsBgMAQsACyADQYABaiELIAxFDQELIAsQsBgLIAIoAgBBcGoiAEETSw0BQQEgAHRBlaggcQ0DIABBC0cNAQsgAigCCA4EAgEBAgELIAIQwQEMAQsgAkEIahCCCQsgAkHAAEEIEKwWCyADQaADaiQAC+U9AhJ/BH4jAEGAA2siBCQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACDgwHAAgBAgsDBAUGDxAHCyAEQbABaiABKAIAIgEgA0EEaigCACADQQhqKAIAEKoIIAQQsho2AsgBIARBADYCsAEgASAEQbABahDUHgwjCyAEQdgAakEQaiADQRBqKQIANwMAIARB2ABqQQhqIANBCGopAgA3AwAgBCADKQIANwNYIAEoAgAiAywAFiEFIAMtABUhBiADLQAUIQIgAy0AEiEHIAMtABdFDR8CQCAFQQBIDQAgAkH/AXFBAkYgAnJBAXENIAsgBEGwAWogASgCBCABKAIIEIYUQQEhAQwgCyABKAIAIgEtABQiAkECRiACciEFIAEtABUhByABLQARIQZBASECAkACQAJAAkACQAJAAkACQCADLQAYDgwOAA8BAgMEBQQFBgcOC0EgQQggB0EBcRtBAiAGQQFxGyECDA4LQQIhAgwNC0GAAkHAACAFQQFxGyECDAwLQYAEQYABIAVBAXEbIQIMCwtBgCBBgAggBUEBcRshAgwKC0GAwABBgBAgBUEBcRshAgwJC0GAgARBgIABIAVBAXEbIQIMCAtBgIAIQYCAAiAFQQFxGyECDAcLIAEoAgAiBS0AFCICQQJGDQkgAkEBcQ0JIARBsAFqIAEgAxCVByAEQegCaiIBIARBsAFqQQxqKQIANwMAIAQgBCkCtAE3A+ACIAQoArABIgNBgICAgHhGDQggACAEKQLEATcCFCAAQSRqIARBsAFqQSRqKAIANgIAIABBHGogBEGwAWpBHGopAgA3AgAgAEEMaiABKQMANwIAIAAgBCkD4AI3AgQgACADNgIADCELIAEoAgAiAi0AFCIFQQJGDQkgBUEBcQ0JIARBsAFqIAIQpg8gBCgCsAFBEEYNEiAEQeACakEYaiAEQbABakEYaigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiAEQbABakEIaikCADcDACAEIAQpArABNwPgAiAEQbACaiAEQeACahCfFCAEQbABaiABIANB2ABqIAMtAHAgBEGwAmoQ+REgBCgCsAEiAUGAgICAeEYNFAJAQSRFDQAgAEEEaiAEQbABakEEakEk/AoAAAsgACABNgIAIAQoArACIAQoArQCEP4sDCALIARBsAFqIAEoAgAiBxCmDyAEKAKwAUEQRg0LIARB4AJqQRhqIgEgBEGwAWpBGGoiAigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiIFIARBsAFqQQhqIgYpAgA3AwAgBCAEKQKwATcD4AIgBEHYAWogBEHgAmoQtgwgBEGwAWogBxCmDyAEKAKwAUEQRg0MIAEgAigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAFIAYpAgA3AwAgBCAEKQKwASIWNwPgAiAWp0ELRw0NIARB4AJqELgaQQEhBkEBIQUCQAJAAkACQAJAIAMoAgAiCEF9aiIBQQMgAUEDSRsiAg4EHwIBAB8LQQEhBiADKAIEIgIhBSAIDgMeAgMeC0EAIQZBASECDBwLQQAhAgtBACEGDBoLIAMoAgghBUEBIQYMGgsgBEGwAWogASgCACICEKYPIAQoArABQRBGDQ0gBEHgAmpBGGoiBSAEQbABakEYaiIHKAIANgIAIARB4AJqQRBqIARBsAFqQRBqKQIANwMAIARB4AJqQQhqIgYgBEGwAWpBCGoiCCkCADcDACAEIAQpArABNwPgAiAEQfQBaiAEQeACahC2DCAEQbABaiACEKYPIAQoArABQRBGDQ4gBSAHKAIANgIAIARB4AJqQRBqIARBsAFqQRBqKQIANwMAIAYgCCkCADcDACAEIAQpArABIhY3A+ACIBanQQxHDQ8gBEGQAmpBBGoiBSAEQeACakEIai8BADsBACAEIAQoAuQCNgKQAiAEQeACahC4GiACQRRqIAUvAQA7AAAgAiAEKAKQAjYAEAJAAkACQAJAAkAgAygC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QEEAIAFBeWoiByAHIAFLGw4JCAABAgMEBQYHCAsgBEHYAGpBCGogBigCADYCACAEIAMpAgA3A1ggBEGwAmogBEHYAGoQ2BUMCAsgBEEBNgK0ASAEQbjqhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBwOqEARDiIwALIARBATYCtAEgBEGg64QBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQajrhAEQ4iMACyAEQQE2ArQBIARBiOyEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakGQ7IQBEOIjAAsgBEEBNgK0ASAEQezshAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB9OyEARDiIwALIARBATYCtAEgBEHY7YQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQeDthAEQ4iMACyAEQQg2ArACDAILIARBATYCtAEgBEHI7oQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQdDuhAEQ4iMACyAEQbACakEYaiAEQeACakEYaigCADYCACAEQbACakEQaiAEQeACakEQaikCADcDACAEQbACakEIaiAEQeACakEIaikCADcDACAEIAQpAuACNwOwAgsCQCABQQlJDQAgBEHgAmoQuBoLIAQoArACQQhGDQ4gBEGwAWogBRCmDyAEKAKwAUEQRg0LIARB4AJqQRhqIARBsAFqQRhqKAIANgIAIARB4AJqQRBqIARBsAFqQRBqKQIANwMAIARB4AJqQQhqIARBsAFqQQhqKQIANwMAIAQgBCkCsAEiFjcD4AIgFqdBD0cNDCAEQeACahC4GiAEQaQCaiAEQbACakGQ4YQBEMkUDAALCyAEQQA2AqACIARCgICAgMAANwKYAiABKAIAIQYgBEHgAmpBBGohAyAEQbABakEEaiECA0AgBEGwAWogBhCmDwJAIAQoArABIgFBEEcNACAEQQg2ArACDA0LIAMgAikCADcCACADQRBqIAJBEGopAgA3AgAgA0EIaiIHIAJBCGopAgA3AgAgBCABNgLgAgJAAkACQAJAAkACQAJAAkACQAJAQQAgAUF5aiIFIAUgAUsbDgkIAAECAwQFBgcICyAEQdgAakEIaiAHKAIANgIAIAQgAykCADcDWCAEQbACaiAEQdgAahDYFQwICyAEQQE2ArQBIARBtOWEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakG85YQBEOIjAAsgBEEBNgK0ASAEQaDmhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBqOaEARDiIwALIARBATYCtAEgBEGM54QBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQZTnhAEQ4iMACyAEQQE2ArQBIARB8OeEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakH454QBEOIjAAsgBEEINgKwAgwDCyAEQQE2ArQBIARB3OiEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakHk6IQBEOIjAAsgBEEBNgK0ASAEQczphAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB1OmEARDiIwALIARBsAJqQRhqIARB4AJqQRhqKAIANgIAIARBsAJqQRBqIARB4AJqQRBqKQIANwMAIARBsAJqQQhqIARB4AJqQQhqKQIANwMAIAQgBCkC4AI3A7ACCwJAIAFBCUkNACAEQeACahC4GgsgBCgCsAJBCEYNDCAEQbABakEYaiAEQbACakEYaigCADYCACAEQbABakEQaiAEQbACakEQaikDADcDACAEQbABakEIaiAEQbACakEIaikDADcDACAEIAQpA7ACIhY3A7ABAkAgFqdFDQAgBEGYAmogBEGwAmpBoOGEARDJFAwBCyAEQbABahDlEAwACwtBwOCEARDOLAALQdDghAEQziwACyAEQQE2ArQBIARBzN6EATYCsAEgBEIBNwK8ASAEQfYANgK0AiAEIARBsAJqNgK4ASAEIARB4AJqNgKwAiAEQbABakHU3oQBEOIjAAtB4OCEARDOLAALQfDghAEQziwACyAEQQE2ArQBIARBkN+EATYCsAEgBEIBNwK8ASAEQfYANgK0AiAEIARBsAJqNgK4ASAEIARB4AJqNgKwAiAEQbABakGY34QBEOIjAAtBoOCEARDOLAALQbDghAEQziwACyAEQewCaiAEQbACakEIaikCADcCACAEIAQpArACNwLkAiAEQQE2AuACIARBsAFqIARB4AJqEOcLIAIgBEGwAWoQ1B4MCgtBgOGEARDOLAALIARBATYCtAEg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JSgCACEMDAALCyAUKAIAIBMoAgAgCkECdCAOIBFqakGkvYMBELclIQIMBAsgDiAJQeS8gwEQ3SwACyAUKAIAIBMoAgAgDiARaiAKQQJ0akEBakGUvYMBELclIQIMAgsgFCgCACATKAIAIA4gEWogCkECdGpBAmpBhL2DARC3JSECDAELIBIgD0Gsn4ABEIwVAAsgAigCACEJCwJAIAkgASgCtAJLDQAgCUUNAiAJIAEoArgCSw0AIAEoAighDCADQThqIBQoAgAgEygCACAJQfS9gwEQqiIgAygCPCIHRQ0DAkACQCADKAI4IgstAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgDEECaiECCyACIAdPDQQCQAJAIAsgAkECdGooAgAiDEF/TA0AAkAgAkEBaiICIAdPDQAgCyACQQJ0aigCACECDAILIAIgB0GstYMBEIwVAAsgDEH/////B3EhAgsgA0GQAWogAiAEQQFqIgcgAUEQaigCACAIKAIAIAJB5L2DARC3JSgCAGsgBxDVF0EBIRULIARBAWohBAwACwsgACADKQKQATcCBCAAIBU2AgAgAEEMaiADQZgBaigCADYCAAwLC0EAQQBBzLWDARCMFQALIAIgB0GctYMBEIwVAAsgByALQZy1gwEQjBUAC0EAQQBBzLWDARCMFQALAkACQAJAAkACQCABKAK8AiIJRQ0AIAkgASgCuAJLDQAgASgCKCELIANBMGogAUEEaigCACABQQhqKAIAIAlB9L2DARCqIiADKAI0IglFDQICQAJAIAMoAjAiBy0AACICQf8BRg0AIAIgAkECdmogAkEDcUEAR2pBAmohAgwBCyALQQJqIQILIAIgCU8NAQJAAkAgByACQQJ0aigCACILQX9MDQACQCACQQFqIgIgCU8NACAHIAJBAnRqKAIAIQIMAgsgAiAJQay1gwEQjBUACyALQf////8HcSECCyADQZABaiACIAQgAUEQaigCACABQRRqKAIAIAJB5L2DARC3JSgCAGsgBBDVFwwDCyACKAIMIgggBCAIIARLGyESIAFBLGohBiACKAIIIQ0gAUEIaiETIAFBBGohFEEAIRUCQANAIAQgBUYNBQJAAkACQCAEIBJGDQAgBiANIARqLQAAai0AACICQQJqIRAgCSEMAkACQAJAAkADQAJAAkACQAJAIBQoAgAgEygCACAMQcS8gwEQtyUoAgAiCUH/AXFBgn5qDgIBAgALIANBKGogFCgCACATKAIAIAxBAmoiEUHUvIMBEKoiIAlBAnZBP3EgCUEDcUEAR2oiDiADKAIsIglLDQUgAygCKCELIA5BAnQhB0F/IQoDQCAHRQ0DIApBAWohCiACIAsoAgAiCUH/AXFGDQUgAiAJQQh2Qf8BcUYNByACIAlBEHZB/wFxRg0IIAtBBGohCyAHQXxqIQcgAiAJQRh2Rw0ACyAUKAIAIBMoAgAgDiARaiAKQQJ0akEDakH0vIMBELclIQIMCQsgAiAUKAIAIBMoAgAgDEGcuIABELclLQABRw0BIBQoAgAgEygCACAMQQJqQbS9gwEQtyUhAgwICyAUKAIAIBMoAgAgECAMakHEvYMBELclKAIAIglBAUcNCAsgFCgCACATKAIAIAxBAWpB1L2DARC3JSgCACEMDAALCyAUKAIAIBMoAgAgCkECdCAOIBFqakGkvYMBELclIQIMBAsgDiAJQeS8gwEQ3SwACyAUKAIAIBMoAgAgDiARaiAKQQJ0akEBakGUvYMBELclIQIMAgsgFCgCACATKAIAIA4gEWogCkECdGpBAmpBhL2DARC3JSECDAELIBIgCEGsn4ABEIwVAAsgAigCACEJCwJAAkAgCSABKAK0AksNACAJRQ0HIAkgASgCuAJLDQAgASgCKCELIANBIGogAUEEaigCACABQQhqKAIAIAlB9L2DARCqIiADKAIkIglFDQECQAJAIAMoAiAiBy0AACICQf8BRg0AIAIgAkECdmogAkEDcUEAR2pBAmohAgwBCyALQQJqIQILIAIgCU8NAwJAAkAgByACQQJ0aigCACILQX9MDQACQCACQQFqIgIgCU8NACAHIAJBAnRqKAIAIQIMAgsgAiAJQay1gwEQjBUACyALQf////8HcSECCyADQZABaiACIARBAWoiCSABQRBqKAIAIAFBFGooAgAgAkHkvYMBELclKAIAayAJENUXDAYLIARBAWohBAwBCwtBAEEAQcy1gwEQjBUACyACIAlBnLWDARCMFQALIAIgCUGctYMBEIwVAAtBAEEAQcy1gwEQjBUACyAAIAMpApABNwIEIABBDGogA0GYAWooAgA2AgBBASEVCyAAIBU2AgAMBgsCQAJAAkACQAJAIAEoArwCIglFDQAgCSABKAK4AksNACABKAIoIQsgA0HgAGogAUEEaigCACABQQhqKAIAIAlB9L2DARCqIiADKAJkIglFDQICQAJAIAMoAmAiBy0AACICQf8BRg0AIAIgAkECdmogAkEDcUEAR2pBAmohAgwBCyALQQJqIQILIAIgCU8NAQJAAkAgByACQQJ0aigCACILQX9MDQACQCACQQFqIgIgCU8NACAHIAJBAnRqKAIAIQIMAgsgAiAJQay1gwEQjBUACyALQf////8HcSECCyADQYABaiACIAQgAUEQaigCACABQRRqKAIAIAJB5L2DARC3JSgCAGsgBBDVFyAAQQE2AgAgAEEMaiADQYgBaigCADYCACAAIAMpAoABNwIEDAoLIANBkAFqIAcgAUEgaiIVKAIAIgsoAghBf2pBeHFqQQhqIAIoAggiBiACKAIMIhIgBCAFIAsoAhAREgACQCADKAKQASICDgMEAwAECyABQSxqIQ0gAygClAEhAiABQQhqIRMgAUEEaiEUAkACQAJAAkACQANAAkAgAiIEIAVJDQAgAEEANgIADBALAkACQAJAIAQgEk8NACANIAYgBGotAABqLQAAIgJBAmohECAJIQwCQAJAAkACQANAAkACQAJAAkAgFCgCACATKAIAIAxBxLyDARC3JSgCACIJQf8BcUGCfmoOAgECAAsgA0HYAGogFCgCACATKAIAIAxBAmoiEUHUvIMBEKoiIAlBAnZBP3EgCUEDcUEAR2oiDiADKAJcIglLDQUgAygCWCELIA5BAnQhB0F/IQoDQCAHRQ0DIApBAWohCiACIAsoAgAiCUH/AXFGDQUgAiAJQQh2Qf8BcUYNByACIAlBEHZB/wFxRg0IIAtBBGohCyAHQXxqIQcgAiAJQRh2Rw0ACyAUKAIAIBMoAgAgDiARaiAKQQJ0akEDakH0vIMBELclIQIMCQsgAiAUKAIAIBMoAgAgDEGcuIABELclLQABRw0BIBQoAgAgEygCACAMQQJqQbS9gwEQtyUhAgwICyAUKAIAIBMoAgAgECAMakHEvYMBELclKAIAIglBAUcNCAsgFCgCACATKAIAIAxBAWpB1L2DARC3JSgCACEMDAALCyAUKAIAIBMoAgAgCkECdCAOIBFqakGkvYMBELclIQIMBAsgDiAJQeS8gwEQ3SwACyAUKAIAIBMoAgAgDiARaiAKQQJ0akEBakGUvYMBELclIQIMAgsgFCgCACATKAIAIA4gEWogCkECdGpBAmpBhL2DARC3JSECDAELIAQgEkGsn4ABEIwVAAsgAigCACEJCwJAAkAgCSABKAK0AksNACAJRQ0FAkAgCSABKAK4AksNACABKAIoIQsgA0HQAGogAUEEaigCACABQQhqKAIAIAlB9L2DARCqIiADKAJUIglFDQcCQAJAIAMoAlAiBy0AACICQf8BRg0AIAIgAkECdmogAkEDcUEAR2pBAmohAgwBCyALQQJqIQILIAIgCU8NCCAHIAJBAnRqKAIAIgtBf0wNBAJAIAJBAWoiAiAJTw0AIAcgAkECdGooAgAhAgwGCyACIAlBrLWDARCMFQALIANBkAFqIAEoAhwgFSgCACICKAIIQX9qQXhxakEIaiAGIBIgBCAFIAIoAhAREgAgAygCkAFFDQEgAygClAEiAiAESw0CCyAEQQFqIQIMAQsLIABBADYCAAwOCyALQf////8HcSECCyADQYABaiACIARBAWoiCSABQRBqKAIAIAFBFGooAgAgAkHkvYMBELclKAIAayAJENUXIABBATYCACAAQQxqIANBiAFqKAIANgIAIAAgAykCgAE3AgQMDAsgAEEANgIADAsLQQBBAEHMtYMBEIwVAAsgAiAJQZy1gwEQjBUACyACIAlBnLWDARCMFQALQQBBAEHMtYMBEIwVAAsgACADKQKUATcCBCAAQQxqIANBkAFqQQxqKAIANgIACyAAIAI2AgAMBQsgCkECaiEHCyAHIAtPDQECQAJAIAwgB0ECdGooAgAiCkF/TA0AAkAgB0EBaiIHIAtPDQAgDCAHQQJ0aigCACEHDAILIAcgC0GstYMBEIwVAAsgCkH/////B3EhBwsgA0GAAWogByAEIAFBEGooAgAgAUEUaigCACAHQeS9gwEQtyUoAgBrIAQQ1RcgASgCHCEHQQEhCAsgA0GQAWogByABQSBqIg0oAgAiCygCCEF/akF4cWpBCGogAigCCCISIAIoAgwiESAEIAUgCygCEBESAAJAAkACQAJAIAMoApABIgIOAwIBAAILIAFBLGohFSADKAKUASECIAFBCGohEyABQQRqIRQgAUEUaiEPDAILIAAgAykClAE3AgQgAEEMaiADQZABakEMaigCADYCAAsg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AkGLgICAeDYCqAEgASADIAQgAkGoAWoQ1yMLIAJBBToAsAEgAiAFNgKoASACQeAAaiABIAJBqAFqQQFBABBiIAIoAmQhBCACKAJgIQUMGAtBASEFDBcLIAYtABANAQsgAS0A4AEhBEEAIQogAS0AkQFBIHFFDQQCQCAEQTVGDQAgBEESRw0FCyABKAKIASEEIAJB6AFqIAEQ3gEgASABKAKIAUEBchCfEiACQfAAaiABELATIAIoAnQhCiACKAJwQQFxRQ0BIAohBAwCCyAGKAIMIQQgBigCCCEDIAJB6ICAgHg2AqgBIAMgBCACQagBahDXGiEEIAEtAOABQaIBRw0EIAEgARCXLBCfFwwECyABEKALAkACQCABLQDgAUUNACABKALcASEEIAEoAtgBIQwgAkHwAmogARDNJiACQSg2ApgDIAJBqAFqIAJBmANqQQEQuRggAkG8AWogAkH4AmooAgA2AgAgAiACKQLwAjcCtAEgDCAEIAJBqAFqENcaIQQgAS0A4AFBogFHDQEgASABEJcsEJ8XDAELIAEgASgCiAFBfnEgBEEBcXIQnxIgAkHoAWoQjyYMAgsgChD8KwsgAiAENgKsAyACQQE2AqgDIAEgAkHoAWoQxwUgAkGoA2oQkSZBACEKCyABLQDgASEECwJAAkAgBEH/AXENACACQagBaiABQQAQlx8gAigCrAEhBCACKAKoASIMQYCAgIB4Rg0BIAIoArABIQUgASgC1AEhDRCvKiELIAJCADcCuAEgAiALNgK0ASACQgA3AsABIAJBgICAgHg2AqgBIAJBADYCiAMgAiANNgKEAyACIAM2AoADIAIgBjYC/AIgAiAKNgKMAyACIAU2AvgCIAIgBDYC9AIgAiAMNgLwAiACQfACahCXGSEEIAJBBToAmAEgAiAENgKQASACQagBahD5KCACQegAaiABIAJBkAFqQQFBABBiIAIoAmwhBCACKAJoIQUMEgsgASgC1AEhARCvKiEEIAJCADcCuAEgAiAENgK0ASACQgA3AsABIAJBgICAgHg2AqgBQQAhBSACQQA2AogDIAIgATYChAMgAiADNgKAAyACIAY2AvwCIAIgCjYCjAMgAkGAgICAeDYC8AIgAkHwAmoQlxkhBCACQagBahD5KAwRCyAKEIAsCyACQdAEahCnLAwPCyACQfACaiABEMkGAkAgAigC8AJBB0YNACACQcQBaiACQYgDaikDADcCACACQbwBaiACQYADaikDADcCACACQbQBaiACQfACakEIaikDADcCACACIAIpA/ACNwKsAUEIQcAAEJwsIgRFDRAgBEEbNgIAQSRFDQkgBEEEaiACQagBakEk/AoAAAwJC0EBIQYgAigC9AIhBAwLCyACQagBaiABQQAQogwgAigCrAEhBCACKAKoASIGQYCAgIB4Rg0JIAJB8AJqQRBqIgogAkHAAWopAgA3AwAgAkHwAmpBCGoiDCACQagBakEQaikCADcDACACIAIpArABNwPwAkEIQcAAEJwsIgVFDQ4gBSAENgIIIAUgBjYCBCAFQRw2AgAgBSACKQPwAjcCDCAFQRRqIAwpAwA3AgAgBUEcaiAKKQMANwIAQQAhBiAFIQQMCgsgAkEANgKoAyACQagDahCnKwwHCyACQagBaiABEKUgAkAgAigCqAFBMkYNAEEIQcAAEJwsIgRFDQ1BwABFDQYgBCACQagBakHAAPwKAAAMBgtBASEGIAIoAqwBIQQMCAsCQAJAAkACQAJAAkAgARDUCSIERQ0AIAQtAABB3QBHDQAgARCEJ0UNAQsgBUUNCiABLQCRAUEgcUUNAiABENQJIgRFDQIgBC0AAEESRw0CIAEtAJEBQSBxDQEgAkGAgICAeDYC8AIMAgsgASgC2AEhBCABLQDgAUH4AEYNAiABKALcASEKIAJBmANqIAEQzSZBASEGIAJBATYCrAEgAkHIvpwBNgKoASACQgE3ArQBIAJBswc2AtQEIAJB+AA6AMgEIAIgAkHQBGo2ArABIAIgAkHYBGo2AtAEIAIgAkHIBGo2AtgEIAJBqANqIAJBqAFqEI0QIAJBvANqIAJBoANqKAIANgIAIAIgAikCmAM3ArQDIAQgCiACQagDahDXGiEEIAEtAOABQaIBRw0DIAEgARCXLBCfFwwDCyABKAKIASEGIAJBwANqIAEQ3gEgASABKAKIAUEBchCfEiABKALYASEEIAEQoAsgAkGoAWogASAEELsCAkACQAJAIAIoAqgBQYCAgIB4ag4CAAIBCyABIAJBwANqEMcFIAJBgICAgHg2AvACDAILAkBBKEUNACACQfACaiACQagBakEo/AoAAAsgASABKAKIAUF+cSAGQQFxchCfEiACQcADahCPJiAC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ArABIAIgETcDqAEgAiABNgLAASACQRBqIAJB0ARqIAEgAkGoAWogBRCdAiACKAIUIQQgAigCECEGDAELIAEoAtQBIQUgAikDmAMhESACQQA6AMQBIAJBADoAvAEgAkEANgK4ASACIAU2ArQBIAIgBDYCsAEgAiARNwOoASACIAE2AsABIAJBGGogAkHQBGogASACQagBakEAEJ0CIAIoAhwhBCACKAIYIQYLIAJBqANqELEqDAILIAJBqANqELEqC0EBIQYLQQEhBSAGQQFxDQIgBCgCAEEeRw0BC0EAIQUMAQsCQCABLQCRAUEgcUUNACABLQDgAUH/AXFBEkcNACABEJUGIgVFDQAgAiADNgKwASACIAU2AqwBIAIgBDYCqAEgAiABKALUATYCtAEgAkGoAWoQnSIhBAsgAkEFOgCwASACIAQ2AqgBIAIgASACQagBakEBQQAQYiACKAIEIQQgAigCACEFCyAAIAU2AgAgACAENgIEIAJB8ARqJAAPCwALkzECCH8BfiMAQdABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEBcUUNAAJAAkACQAJAAkACQAJAAkACQCADKAIAIgEtABQiBUECRg0AIAVBAXENACAEQagBaiABEKYPIAQoAqgBQRBGDQogBEEgakEYaiIFIARBqAFqQRhqIgYoAgA2AgAgBEEgakEQaiAEQagBakEQaikCADcDACAEQSBqQQhqIgcgBEGoAWpBCGoiAykCADcDACAEIAQpAqgBNwMgIARB6ABqIARBIGoQnxQgBEGoAWogARCmDyAEKAKoAUEQRg0LIAUgBigCADYCACAEQSBqQRBqIgUgBEGoAWpBEGoiBikCADcDACAHIAMpAgA3AwAgBCAEKQKoATcDICAEQZgBaiAEQSBqEJ8UIARBqAFqIAEQpg8gBCgCqAFBEEYNDCAEQSBqQRhqIARBqAFqQRhqKAIANgIAIAUgBikCADcDACAEQSBqQQhqIARBqAFqQQhqKQIANwMAIAQgBCkCqAE3AyAgBEH4AGogBEEgahCfFAJAIAEtABBBAXFFDQAgBEHoAGoQoAwgBEGYAWoQoAwLIAItACAOAwECAwELIARBqAFqIAEQpg8gBCgCqAFBEEYNDCAEQSBqQRhqIgUg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IA1BLGooAgAhDyANQShqKAIAIRAgDUE8aigCACERIA1BOGooAgAhEgJAIA1BIGopAwAiIUIDg0IAUg0AICGnIhMgEygCACITQQFqNgIAIBNBf0wNEAtCAiEiIA1BNGotAAAhFAJAAkAgIEICUg0AIBUhEwwBCyANQRRqKAIAIRMgDUEQaigCACEWAkACQCANKAIAQQFHDQACQCANQQhqKQMAIiBCA4NCAFINACAgpyIXIBcoAgAiF0EBajYCACAXQX9MDRMLAkAgDUEYaikDACIjUA0AICNCA4NQRQ0AICOnIhcgFygCACIXQQFqNgIAIBdBf0wNEwsgE61CIIYgFq2EISRCASEiDAELIA1BGGo1AgAhIgJAIA1BCGopAwAiIEIDg0IAUg0AICCnIhcgFygCACIXQQFqNgIAIBdBf0wNEgsgI0KAgICAgGCDICKEIA1BHGoxAABCIIaEISMgE61CIIYgFq2EISRCACEiCyAgQiCIpyEYICOnIRkgIKchGiAjQiCIpyITIRULICFCKIinIRsgIUIgiKchHCANQcAAai0AACEdICGnIRYgGSEXICQhISAYIR4gGiEfDAILIA1BIGooAgAhFiANQRxqKAIAIRMgDUEYaigCACEXIA1BDGooAgAhHiANQQhqKAIAIR8CQCANQRBqKQMAIiFCA4NCAFINACAhpyIcIBwoAgAiHEEBajYCACAcQX9MDQ8LIA1BJGotAAAhHEIDISIMAQsgDUEgaigCACEWIA1BHGooAgAhEyANQRhqKAIAIRcgDUEMaigCACEeIA1BCGooAgAhHwJAIA1BEGopAwAiIUIDg0IAUg0AICGnIhwgHCgCACIcQQFqNgIAIBxBf0wNDgsgDUEkai0AACEcQgQhIgsgCSALaiINICI3AwAgDUHAAGogHToAACANQTxqIBE2AgAgDUE4aiASNgIAIA1BNGogFDoAACANQTBqIA42AgAgDUEsaiAPNgIAIA1BKGogEDYCACANQRxqIBM2AgAgDUEYaiAXNgIAIA1BEGogITcDACANQQxqIB42AgAgDUEIaiAfNgIAIA1BIGogHK1C/wGDQiCGIButQiiGhCAWrYQ3AwAgC0HIAGohCyAMQX9qIgwNAAsLQQAtAKDwngEaIAEoAhAhDUEYEH0iDEUNCiANKAIMIQsgDSgCCCETAkAgDSkDACIi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CCEWAkAgCykDACIiQgODQgBSDQAgIqciFyAXKAIAIhdBAWo2AgAgF0F/TA0KCwJAIAspAxAiIVANACAhQgODQgBSDQAgIaciCyALKAIAIgtBAWo2AgAgC0F/TA0KCyAFICE3AxAgBSATNgIMIAUgFjYCCCAFICI3AwALIAEtACAhCwJAIAEoAhwiAUUNABD6JyENIAEoAgwhEyABKAIQIRYgAkEIaiABEKIBIA1BEGogFjYCACANIAIpAgg3AgAgAiATNgIUIA1BCGogAkEIakEIaikCADcCAAtCACEhDAwLIAEoAjQhFiABKAIwIRMCQAJAAkACQCABKAIIIgkOAwABAgALAkACQCABLQAkIhdBAkcNAAwBCyABKAIgIQsgASgCHCENIAEoAhghBSABKQMQIiFCA4NCAFINACAhpyIIIAgoAgAiCEEBajYCACAIQX9MDQsLIAEoAigQggQhAQwCCwJAAkAgAS0AJCIXQQJHDQAMAQsgASgCICELIAEoAhwhDSABKAIYIQUgASkDECIhQgODQgBSDQAgIaciCCAIKAIAIghBAWo2AgAgCEF/TA0KCyABKAIoENEEIQEMAQsgASgCDBChCCEHCyAhQiCIpyEGICGnIQxCACEhDAoLIAEoAgwhByABKAIIIQkgASgCBCENEPQnIQggAkEIaiANEEIgCEE4aiACQQhqQThqKQMANwMAIAhBMGogAkEIakEwaikDADcDACAIQShqIAJBCGpBKGopAwA3AwAgCEEgaiACQQhqQSBqKQMANwMAIAhBGGogAkEIakEYaikDADcDACAIQRBqIAJBCGpBEGopAwA3AwAgCEEIaiACQQhqQQhqKQMANwMAIAggAikDCDcDAEIAISEMCgtBAC0AoPCeARogASgCBCENIAEoAgwhByABKAIIIQlBGBB9IghFDQUgDSgCDCELIA0oAgghDAJAIA0pAwAiIkIDg0IAUg0AICKnIgUgBSgCACIFQQFqNgIAIAVBf0wNBgsCQCANKQMQIiFQDQAgIUIDg0IAUg0AICGnIg0gDSgCACINQQFqNgIAIA1Bf0wNBgsgCCAhNwMQIAggCzYCDCAIIAw2AgggCCAiNwMAIAEtABQhBgJAIAEoAhAiDQ0AQQAhDEIAISEMCgsQ+ichDCANKAIMIQEgDSgCECELIAJBCGogDRCiASAMQRBq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tAFqNgLoASADIANBoAFqNgK0ASADQdQBaiADQeABahC7E0UNEEHIl5wBQSsgA0HgAWpBrISZAUGgh5kBEOISAAsgA0HUAWpB+IaZAUECEPAFIANBATYC5AEgA0HIvpwBNgLgASADQgE3AuwBIANB5wE2ArgBIAMgAToAoAEgAyADQbQBajYC6AEgAyADQaABajYCtAEgA0HUAWogA0HgAWoQuxNFDQ9ByJecAUErIANB4AFqQayEmQFBjIeZARDiEgALIANB1AFqIAEQmCEMDgsgAUH//QNGDQIgAUGAAUkNAyABQf//A0sNBSAJQQFxDQQgA0HUAWogARCYIQwNCyADQdQBakHEhZkBQQYQ8AUMDAsgA0HUAWpByoWZAUEGEPAFDAsLIANB1AFqQdCFmQFBBhDwBQwKCyADQdQBaiABEJghDAkLIANBATYC9AEgA0HghZkBNgLwASADQQE2AuQBIANB2IWZATYC4AEgA0EBNgLsASADQZwCNgK4ASADIAE7AaABIAMgA0G0AWo2AugBIAMgA0GgAWo2ArQBIANB1AFqIANB4AFqELsTRQ0IQciXnAFBKyADQeABakGshJkBQfiFmQEQ4hIACwJAAkAgDg0AIAlBAXENASADQdQBaiABEJghDAkLIAMgAUGAgHxqQQp2QYCwA2o2ArABIAMgAUH/B3FBgLgDcjYCoAEgA0ECNgL0ASADQbiGmQE2AvABIANBAjYC5AEgA0GohpkBNgLgASADQQI2AuwBIANB5AA2AsABIANB5AA2ArgBIAMgA0G0AWo2AugBIAMgA0GgAWo2ArwBIAMgA0GwAWo2ArQBIANB1AFqIANB4AFqELsTRQ0IQciXnAFBKyADQeABakGshJkBQeiGmQEQ4hIACyADQQE2AvQBIANB4IWZATYC8AEgA0ECNgLkASADQYiGmQE2AuABIANBATYC7AEgA0HkADYCuAEgAyABNgKgASADIANBtAFqNgLoASADIANBoAFqNgK0ASADQdQBaiADQeABahC7E0UNB0HIl5wBQSsgA0HgAWpBrISZAUGYhpkBEOISAAsgDw0CIANB1AFqIAEQmCEMBgsgA0HgAWpB+wAQjQoMAgsgA0HUAWpB3AAQmCEgA0HUAWogBBCYIQwECyADQdQBakH4hpkBQQIQ8AUgA0EBNgLkASADQci+nAE2AuABIANCATcC7AEgA0HnATYCuAEgAyABOgCgASADIANBtAFqNgLoASADIANBoAFqNgK0ASADQdQBaiADQeABahC7E0UNA0HIl5wBQSsgA0HgAWpBrISZAUH8hpkBEOISAAsgA0HgAWogASgCABCNCiADQbQBahDgJBpBAyEFAkACQAJAAkACQAJAAkACQANAIAVFDQEgA0G0AWoQ4CQiAUGAgMQARg0CAkAgAUFQakEKSQ0AIAFBn39qQQZJDQAgAUG/f2pBBUsNAwsgA0HgAWogARCNCiAFQX9qIQUMAAsLIAcNAUEGIQpBAiEFIAMoAugBIQYgAygC5AEhDAwECyAHRQ0BCyADQeABakH9ABCNCiAFRQ0BCyADQdQBakHLzpsBQQIQ8AUMAwtBAyEFIAMoAuQBIQwgAygC6AEiBkF/aiIKQQNJDQELAkACQCAFIAZJDQAgBSAGRg0BDAILIAwgBWosAABBQEgNAQsCQAJAIAogBkkNACAKIAZHDQIMAQsgDCAKaiwAAEG/f0wNAQsgDCAFaiEBAkACQAJAAkACQAJAIAogBWsiCg4CBAABC0EBIQUgAS0AAEFVag4DAwEDAQsCQCABLQAAQStHDQAgCkF/aiEFIAFBAWohASAKQQpJDQEMAgsgCiEFIApBCU8NAQtBACEKA0AgBUUNAyADQcAAaiABLQAAEOoiIAMoAkBBAXFFDQIgAUEBaiEBIAVBf2ohBSADKAJEIApBBHRqIQoMAAsLQQAhCgNAIAVFDQIgCkH/////AEsNASADQcgAaiABLQAAEOoiIAMoAkhBAXFFDQEgAUEBaiEBIAVBf2ohBSADKAJMIApBBHQiC2oiCiALTw0ACwsgA0HUAWpBy86bAUECEPAFDAILAkAgCkH//wNLDQACQCAKQYDwA3FBgLADRg0AIANB1AFqQcvOmwFBAhDwBQwDCyADQdQBakHcABCYIQwCCyADQdQBaiAMIAYQ8AVBB0EFIAcbIQEDQCABRQ0CIAFBf2ohASADQYgCahDgJBoMAAsLIAwgBiAFIApBtIWZARDeKgALIANB4AFqEKMtDAILAkAgA0GIAmoQyyMiAUUNACABKAIAQVBqQQpJDQELIANB1AFqQZ+FmQFBAhDwBQwBCyADQdQBakGhhZkBQQQQ8AUMAAsLIApBAWohCgwACwsgA0GqAWogAy0A4gE6AAAgAyAHNgKkASADIAg2AqABIAMgAy8B4AE7AagBIAMgAToAqwECQCACLQBQRQ0AIANBOGogA0GgAWoQlBggAygCOCEFIAMoAjwhASADQQg2ArABIAMgATYC0AEgAyAFNgLMAUEAIQcgA0EANgLEASADIAUgAWo2AsABIAMgBTYCvAEgA0ECNgK0ASADIANBsAFqNgLIASADQTBqIANBtAFqQQhqEK0IIAMgAygCNDYCuAEgAyADKAIwIgg2ArQBAkACQAJAIAhBAXFFDQACQAJAIAENAEGAgICAfCEIQQAhAQwBCwJAIAFBDUkNACADQeABaiABELwaIAMoAuABIQggAygC5AEhByABRQ0BIAcgBSAB/AoAAAwBCyADQQA2AOcBIANCADcD4AEgAyABQcABcjoA6wECQCABRQ0AIANB4AFqIAUgAfwKAAALIAMoAugBIQggAygC5AEhASADKALgASEHCyADIAg2AtwBIAMgATYC2AEgAyAHNgLUASADQeABakEYaiADQbQBakEYaikCADcDACADQeABakEQaiADQbQBakEQaikCADcDACADQeABakEIaiIGIANBtAFqQQhqKQIANwMAIAMgAykCtAE3A+ABIANBADYCgAIDQCADKALgASEBIANBAjYC4AECQAJAIAFBAkYNACADKALkASEFDAELIANBKGogBhCtCCADKAIsIQUgAygCKCEBCwJAIAFBAXFFDQAgAyADKAKAAkEBaiIBNgKAAiADQRBqIANB1AFqENEeAkAgASAFaiIBRQ0AAkAgASADKAIUIgVJDQAgASAFRg0BDAYLIAMoAhAgAWosAABBv39MDQULIAMtAN8BIQUgAygC2AEhByADQdQBakEBEJQHIANBCGogA0HUAWoQghsgAygCCCABaiEIAkAgByAFQcAAakH/AXEiCkEMIApBDEkbIAVB/gFGGyIFIAFrIgFFDQAgCEEBaiAIIAH8CgAACyAIQdwAOgAAIAVBAWohAQJAIAMtAN8BQf4BRg0AIAFBC0sNAiADIAFBwAFyOgDfAQwCCyADIAE2AtgBDAELCyADQYgCakEIaiADQdQBakEIaigCADYCACADIAMpAtQBNwOIAgwBCyADQf8BOgCTAiADIAE2AowCIAMgBTYCiAILIANBIGogA0GIAmoQlBggA0HgAWogAygCICADKAIkQcmHnAFBBEHNh5wBQQcQ9wwgA0G0AWogAygC5AEgAygC6AFB1IecAUEDQdeHnAFBBhD3DAJAAkACQCADKAK0ASIBQf7//wdLDQACQAJAIAENACADQagCakEAKALE/pgBNgIAIANBACkCvP6YATcDoAIgAygCuAEhCAwBCyADKAK4ASEIIAMoArwBIgVBDEsNAiADQQA2AKcCIANCADcDoAIgAyAFQcABcjoAqwIgBUUNACADQaACaiAIIAX8CgAACyABIAgQjxYMAgsgA0GgAmogAygCuAEiBSADKAK8ARDlDSABIAUQjxYMAQsgAyABQf///wcgAUH///8HSRtBgICAcHI2AqgCIAMgBTYCpAIgAyAINgKgAgsgA0GgAWoQxycgA0GgAWpBCGogA0GgAmpBCGooAgA2AgAgAyADKQOgAjcDoAEgA0HgAWoQySwgA0GIAmoQxycMAQsgA0EANgKYAiADQQE2AowCIANBxNyAATYCiAIgA0IENwKQAiADQYgCakHM3IABEOIjAAsgAyAEOgC0ASADQeABaiACIANBtAFqQQEQkxACQAJAIAMtAOABQQRGDQAgAykD4AEiEEL/AYNCBFINAQsgA0EYaiADQaABahCUGCADQeABaiACQQBBACADKAIYIAMoAhwQhA8CQCADLQDgAUEERg0AIAMpA+ABIhBC/wGDQgRSDQELIANB4AFqIAIgA0G0AWpBARCTEAJAIAMtAOABQQRGDQAgAykD4AEiEEL/AYNCBFINAQsgAEEEOgAAIANBoAFqEMcnDAELIAAgEDcCACADQaABahDHJwsgA0GwAmokAAumMQECfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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AyADQdQAajYCeEGg6p4BIANB+ABqQei7nAEQuwYLQQAoApTqngEhCAJAAkACQEEAEKMRKAIAIgogCCgC+AUiC0YNAAJAAkACQCALDQAgCCAIKAL4BSILQQEgCxs2AvgFIAtFDQELIAgoAoQGIgsNAUHgtpwBENUhAAsgA0H4AGogCCgC8AUgCCgC9AUoAhQRBgAgCBDzDAJAQfAFRQ0AIAggA0H4AGpB8AX8CgAAC0EAIQtBASENDAMLIAgoAoAGIAogC3BBBnRqIgstAAAhCiALQQE6AAACQCAKDQACQCALKAIMIgpFDQAgCyAKQX9qIgo2AgwgCygCCCAKQQJ0aigCACEKQQAhDSALQQA6AAAMAwtBACENIAtBADoAACADQfgAaiAIKALwBSAIKAL0BSgCFBEGAEHwBUEIEKIqIQpB8AVFDQIgCiADQfgAakHwBfwKAAAMAgsgA0H4AGogCCgC8AUgCCgC9AUoAhQRBgBB8AVBCBCiKiEKAkBB8AVFDQAgCiADQfgAakHwBfwKAAALQQEhC0EAIQ0MAgtBASENIAhBATYC+AULQQAhCwsgA0GHAWogA0E4akECai0AADoAACADQasBaiADQdQAakECai0AADoAACADIAs6AIQBIAMgCDYCgAEgAyAKNgJ8IAMgDTYCeCADIAMvADg7AIUBIANBADoAqAEgAyAJNgKkASADQQA2AqABIAMgCTYCnAEgAyAFNgKYASADQQA2ApABIAMgAy8AVDsAqQEgA0HTAWogA0HkAGpBAmotAAA6AAAgAyADLwBkOwDRASADQQA2AogBIANBkOqeATYCrAEgAyAFNgKwASADIAk2ArQBIANBCjYCuAEgAyARNgK8ASADIBA2AsABIANBADYCxAEgAyAQNgLIASADQQo2AswBIANBADYC3AEgA0IANwLUASADQQE6ANABIANBkAFqIRUgA0HLAWohFiADQcwBaiEXIANBiAFqIRhBACENQQEhCCARIQEgECEGIBAhDkEAIRlBACEaAkACQANAIBYgCEH/AXEiB2ohBAJAAkACQAJAA0AgDiANSQ0CIA4gBksNAiABIA1qIQogBC0AACELAkACQCAOIA1rIglBB0sNAEEAIQxBACEIA0ACQCAJIAhHDQAgCSEIDAMLAkAgCiAIai0AACALQf8BcUcNAEEBIQwMAwsgCEEB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vYMBELclIQEMAQsgEiAVQbyfgAEQjBUACyABKAIAIQgLAkACQCAIIAAoArQCSw0AIAIgCDYCFCACQQE2AhAgCEUNBCAIIAAoArgCSw0AIAJCgYCAgBA3AhggACgCKCEMIANBCGogAEEEaigCACAAQQhqKAIAIAhB9L2DARCqIiADKAIMIghFDQECQAJAIAMoAggiBy0AACIBQf8BRg0AIAEgAUECdmogAUEDcUEAR2pBAmohAQwBCyAMQQJqIQELIAEgCE8NAwJAAkAgByABQQJ0aigCACIMQX9MDQACQCABQQFqIgEgCE8NACAHIAFBAnRqKAIAIQEMAgsgASAIQay1gwEQjBUACyAMQf////8HcSEBCyADQegAaiABIARBAWoiCCAAQRBqKAIAIABBFGooAgAgAUHkvYMBELclKAIAayAIENUXIAJBATYCACAGIAMpAmg3AgAgBkEIaiADQegAakEIaigCADYCAAwECyACIARBAWoiBDYCIAwBCwtBAEEAQcy1gwEQjBUACyABIAhBnLWDARCMFQALIANBgAFqJAALziYCE38CfiMAQbABayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAhAiBSADKAIUIgZLDQACQCADLQAYDQAgBEGAAWogAxCpHyAEKAKEASEHIAQoAoABIQgCQCAELQCIAUEBRg0AQQIhCQwNCyAELQCJASEKIAFB4ARqIgkQgi1FDQoMCwsgBEGAAWogAxCpHyAEKAKEASELIAQoAoABIQgCQCAELQCIAUEBRg0AQQIhCQwECyAELQCJASEKIAFB4ARqIgkQgi1FDQEMAgsgAEEANgIADBELIARBMGogCSAKQQN2QRBxaiIJKQMAIAlBCGopAwAgCkH/AHEQiRYgBCkDMEIBg1ANACAKrSEXQgQhGAwCCyABIApqLQBgIQkLIAlB/wFxIQoCQAJAIAgOAwQAAQQLIApBBmohCgwDCyABLQBZQQFxDQEgC60hF0ICIRgLIBdCIIYgGIQhFwwCCwJAIAsgASgCgAUoAtwCTw0AIAtBBmwgCmpBDGohCgwBCyABKAKEBRDOGiEHDAILAkAgCiACKAKIASIHSQ0AIAogB0G44oMBEIwVAAsgAigChAEgCkECdGooAgAiB0EATg0BIAQgAjYCqAEg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rBogASgCACEEIAIpAwAhHyABQQA2AgAgASgCBCEFIAFBCDYCBCABQQA2AgggAkEANgIUIAIgHzcCDCACIAUgA0E4bGoiBjYCJCACIAQ2AiAgAiAFNgIcIAIgBTYCGCACQShqQRxqIQcgAkHIAWpBCGohCCACQZABakEEaiEJIAJB+ABqQQhqIQogAkGsAWpBBGohCyACQShqQRBqIQwgAkEoakEMaiENIAJBKGpBCGohDiACQShqQQRyIQ8gACkCDCEgIAAoAhQhECACQShqQRhqIhFBBWohEgJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSAGRg0AIAIgBUE4aiITNgIcIAUoAgAiA0EKRg0AIAIgAzYCKAJAQTRFDQAgDyAFQQRqQTT8CgAACyACICA3AmwgAiAQNgJ0IAJBADYCaCACQoCAgICAATcCYCADQQFGDQECQCADQQlHDQAgDiACQeAAahDqBQwPCwJAIAMOCQADDg0MCwoJCAALIAIoAjRByABsIQRBACEFIAIoAjAhFANAAkACQAJAIAQgBUYNAAJAAkACQCAUIAVqIgMpAwAiIUJ9fCIfp0EBakEAIB9CAlQbDgMAAQIACwJAICFCAlENACAQIANBIGoQqAgaDAULIANBMGooAgAhFSADQSxqKAIAIRYgA0EoaigCACEXAkAgA0EgaiIYKQMAIh9CA4NCAFINACAfpyIZIBkoAgAiGUEBajYCACAZQX9MDRcLIAIgFTYC2AEgAiAWNgLUASACIBc2AtABIAIgHzcDyAEgAiADQTRqLQAAOgDcASAQIBgQqAgNAwJAIBggAkHIAWoQkQwNACACQYACakEQaiIYIAJByAFqQRBqKQMANwMAIAJBgAJqQQhqIhUgCCkDADcDACACIAIpA8gBNwOAAiADENIqIANCADcDACADQQhqIAIpA4ACNwMAIANBEGogFSkDADcDACADQRhqIBgpAwA3AwAMBQsgAikDyAEQviEMBAsgECADQRBqEKgIGgwDCyAQIANBEGoQqAgaDAILIAcgAkHgAGoQ9ygMEQsgAikDyAEQviELIAVByABqIQUMAAsLIAJBGGoQ4wQgAkEMaiAAKAIEIAAoAggQyx8gAEEANgIIIAEQyiggAUEIaiACQQxqQQhqKAIANgIAIAEgAikCDDcCACACQcAC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BCABEJYZDAgLIAAoAgQgARCWGQwHCyAAKAIEIgMoAihBMGwhACADKAIkQShqIQMDQCAARQ0HAkAgAygCAEUNACADIAEQjy8LIABBUGohACADQTBqIQMMAAsLIAAoAgQiAy0ARUEDRg0FIANBIGogARD8GgwFCwALIAQgAkEQahDZDQwCCyAEIAJBEGoQ2Q0LAkAgAigChANFDQAgAkEANgLcASACQoCAgICAATcC1AEgAiABKQJANwLgASACIAJB+AJqNgLoASACQfgCaiAIEKgIGiAAKAIgIAJB1AFqEIgVIAJB1AFqELsoCyACQfgCahD0DCACKQMQEL8hDAELAkAgAigChANFDQAgAkEANgLcASACQoCAgICAATcC1AEgAiABKQJANwLgASACIAJB+AJqNgLoASACQfgCaiAAQQhqEKgIGiAAKAIgIgQoAgQgBCgCCCACQdQBahCRIyAEKAIUQdgAbCEGIAQoAhAhB0EAIQMCQANAIAYgA0YNAQJAAkACQAJAAkACQAJAAkACQCAHIANqIgAoAgAiAUF8akEAIAFBe2pBCEkbDgkAAQIDBAUIBgcACyAAIAJB1AFqELoMDAcLIABBCGogAkHUAWoQvigMBgsgAEEgaigCACACQdQBahCIFQwFCyAAQQhqKAIAIABBDGooAgAgAkHUAWoQoyogAEE8aigCACACQdQBahCxKyAAQcAAaiACQdQBahD0KCAAQTRqKAIAIABBOGooAgAgAkHUAWoQkSMMBAsgAEEkaigCACACQdQBahCxKyAAQShqIAJB1AFqEPQoIABBMGooAgAgAEE0aigCACACQdQBahCRIwwDCyAAQQRqIAJB1AFqEKoqDAILIABBCGooAgAgAEEMaigCACACQdQBahC2IwwBCyAAQcAAaiEBAkAgAEEIaigCACIIQQVGDQAgCCAAQQxqKAIAIAJB1AFqEKMqCyAAQTxqKAIAIAJB1AFqELErIAEgAkHUAWoQ9CggAEE0aigCACAAQThqKAIAIAJB1AFqEJEjCyADQdgAaiEDDAALCyAEKAIwIAJB1AFqELErAkAgBCgCNCIDRQ0AIAMgAkHUAWoQgiELAkAgBCgCOCIDRQ0AIAMgAkHUAWoQgyELIAQoAiBBBHQhACAEKAIcIQMCQANAIABFDQEgAygCACACQdQBahD4AyACQdQBaiAD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ACACQTBqIAEoAggiA0EEQRxBlM+EARCqGSACQQA2AkAgAiACKQMwNwI4IAEoAgAhBCACIAEoAgQiASADQRxsIgNqIgU2ArwBIAIgBDYCuAEgAiABNgKwASABQRxqIQYgAkHEAGpBBGohBAJAAkACQAJAAkACQAJAAkACQAJAAkADQAJAAkACQAJAAkAgA0UNACABKAIAIgdBCEcNASAGIQULIAIgBTYCtAEgAkGwAWoQoR4CQAJAAkAgAigCQCIIDgICAAELIAJBADYCQCACKAI8IgEoAgAiA0EIRg0DIAAgAzYCACAAIAEpAgQ3AgQgAEEMaiABQQxqKQIANwIAIABBFGogAUEUaikCADcCAAwJCyACKAI8IQFBACEEIAJBADYCmAIgAkKAgICAwAA3ApACIAhBHGwhA0EEIQlBACEHAkACQAJAA0AgA0UNASABKAIAQQFHDQIgAkHAAWogASgCBCABKAIIIgoQwQcgAi0AwAEiBkECRg0CIAZBAXENAgJAAkAgAigCxAEiBkGAAU8NAEEBIQsMAQsCQCAGQYAQTw0AQQIhCwwBC0EDQQQgBkGAgARJGyELCyAKIAtHDQICQCAHIAIoApACRw0AIAJBkAJqEKYcIAIoApQCIQkLIAFBHGohASAJIARqIAY2AgAgAiAHQQFqIgc2ApgCIANBZGohAyAEQQRqIQQMAAsLIAIoApACIgpBgICAgHhGDQEgAigClAIhBiACQShqIAhBBEEIQaiymwEQqxlBACEBIAJBADYCmAIgAiACKQMoNwOQAiACQZACaiAIEI4lIAhBAnQhByAIIAIoApgCIgNqIQsgAigClAIgA0EDdGohAwJAA0AgByABRg0BIANBBGogBiABaigCACIENgIAIAMgBDYCACADQQhqIQMgAUEEaiEBDAALCyAKIAYQhy0gAikDkAIhHyACQcgBaiIBIAs2AgAgAiALRToAzAEgAiAfNwPAASACQcABahD7BSACQZwCaiABKQMANwIAIAIgAikDwAE3ApQCIAJBADYCkAIgACACQZACahCqDgwKCyACKAKQAiACKAKUAhCHLQsgAigCPCEBIAIoAkAhBEEAIQMgAkEANgKYAiACQoCAgIAQNwKQAiAEQRxsIQRBASEKAkADQCAERQ0BAkAgASgCAEEBRg0AIAIoApACIQcMCQsgAigCkAIhByABKAIIQQFHDQggASgCBC0AACEGAkAgAyAHRw0AIAJBkAJqQYzRhAEQhQ8gAigClAIhCgsgAUEcaiEBIAogA2ogBjoAACACIANBAWoiAzYCmAIgBEFkaiEEDAALCyACKAKQAiIKQYCAgIB4Rg0HIAIoApQCIQYgAkEgaiADQQFBAkGospsBEKsZQQAhASACQQA2ApgCIAIgAikDIDcDkAIgAkGQAmogAxCPJSACKAKUAiACKAKYAiILQQF0aiEEAkADQCADIAFGDQEgBEEBaiAGIAFqLQAAIgc6AAAgBCAHOgAAIARBAmohBCABQQFqIQEMAAsLIAogBhCDLSACKQOQAiEfIAJByAFqIgMgCyABaiIBNgIAIAIgAUU6AMwBIAIgHzcDwAEgAkHAAWoQ7QUgAkGcAmogAykDADcCACACIAIpA8ABNwKUAiACQQE2ApACIAAgAkGQAmoQqg4MCAsgABCWFgwHCyAEIAEpAgQ3AgAgBEEIaiABQQxqKQIANwIAIARBEGogAUEUaikCADcCACACIAc2AkQgAkGQAmogAkHEAGoQpRsgAkHAAWpBEGoiByACQZACakEQaiILKQIANwMAIAJBwAFqQQhqIgkgAkGQAmpBCGoiCCkCADcDACACIAIpApACIh83A8ABIAIoAqgCIQogH6dBB0YNASALIAcpAwA3AwAgCCAJKQMANwMAIAIgAikDwAE3A5ACIAIgCjYCqAIgAkE4aiACQZACakG0z4QBEMkUDAILQaTPhAEQziwACyACKALMASELIAIoAsgBIQcgAiACKALEATYCmAIgAiAHNgKQAiACIAc2ApQCIAJBOGogCxCJJSACKAJAIQkCQCALQRxsIghFDQAgAigCPCAJQRxsaiAHIAj8CgAACyACIAc2ApwCIAIgCSALajYCQCACQZACahChHiAKEIkuCyABQRxqIQEgBkEcaiEGIANBZGohAwwACwsgByAKEIMtCyACKAI8IQwgAigCQCENIAJBADYCmAIgAkKAgICAwAA3ApACIAwgDUEcbGohCyACQbABaiACQZACahDUGCACQZACakEEciEGIAJBwAFqQQRqIQogDCEDAkACQAJAA0AgAyALRg0BIAMoAgBBAkcNAiADQRxqIQcCQAJAIAMoAgQNACACQbABaiADQQhqEN0eDAELAkACQCADQQxqKAIA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C0EBIQpBACEEQQAhEiABKAIIIhZBAUcNAAsgFSAWIBUgASgCDCIBIBtNcSIEGyESIBsgASAEGyEbQQAhBAwACwsgAyABEJQVAAtBy7icAUEoQczRhAEQzB4ACyACQbACaiQAC/IiAip/An4jAEGwAmsiAiQAIAEoAgQhAyACQdABaiABKAIIIgRBCEHYABCQDyACKALUASEFAkACQAJAAkACQCACKALQAUEBRg0AIAIoAtgBIQYCQCAFRQ0AIAMgBEHYAGxqIQcgAkHQAWpBHWohCCACQdABakEwaiEJIAJB2ABqQShqIQogAkHYAGpBJGohCyACQQRyIQwgAkEIaiENIAUhDkEAIQ8DQCADIAdGDQECQAJAAkACQAJAAkACQAJAAkACQCADKAIAIgFBfGpBACABQXtqQQhJGw4JAAECAwQFBgcIAAsgAygCTCEQIAMoAjwhESADKAI4IRIgAkHYAGogAxDDBCADKAJEIRMgAkHQAWogAygCSCIUQQhBwAAQkA8gAigC1AEhFSACKALQAUEBRg0MIAIoAtgBIRYCQCAVRQ0AIBRBBnQhF0EAIRggFSEZA0AgFyAYRg0BAkACQCATIBhqIgEoAgBBB0YNACABQShqKAIAIRogAUEsaigCACEbIAkgAUEwahDqCCACQdABaiABELwCIAJBzAFqQQJqIAhBAmotAAA6AAAgAkHAAWpBCGogCUEIaigCADYCACACIBs2AvwBIAIgGjYC+AEgAiAILwAAOwHMASACIAkpAwA3A8ABIAIoAtABIRwgAigC1AEhHSACKALYASEeIAIoAtwBIR8gAigC4AEhICACKALkASEhIAIoAugBISIgAi0A7AEhIyACKALwASEkIAIoAvQBISUgAi0AjwIhJiACLQCOAiEnIAItAI0CISggAi0AjAIhKQwBCyABQSxqKAIAIRsgAUEoaigCACEaIAJBoAFqIAFBMGoQ6gggAUE9ai0AACEoIAFBPGotAAAhKSABQT5qLQAAIScCQAJAIAFBHGotAAAiI0ECRw0AIAFBFGooAgAhISABQRBqKAIAISAgAUEIaigCACEfEPUnIR4gAkHQAWogHxC8AiAeQSBqIAJB0AFqQSBqIiIpAwA3AwAgHkEYaiACQdABakEYaiIjKQMANwMAIB5BEGogAkHQAWpBEGoiHCkDADcDACAeQQhqIAJB0AFqQQhqIiQpAwA3AwAgHiACKQPQATcDACABQQxqKAIAIQEQ9CchHyACQdABaiABEEIgH0E4aiACQdABakE4aikDADcDACAfQTBqIAkpAwA3AwAgH0EoaiACQdABakEoaikDADcDACAfQSBqICIpAwA3AwAgH0EYaiAjKQMANwMAIB9BEGogHCkDADcDACAfQQhqICQpAwA3AwAgHyACKQPQATcDAEECISMgKiEiDAELIAFBCGoiHCgCACEeIAFBFGooAgAhISABQRBqKAIAISAgAUEMaigCACEfIAFBGGooAgAhIgJAIBwpAwAiLEIDg0IAUg0AICynIhwgHCgCACIcQQFqNgIAIBxBf0wNEgsCQCABQSBqKAIAIgENAEEAISsMAQsQ9ichKyABKQIEISwgASgCACEcEPcnIQEgAkHQAWogHBB2AkBB4ABFDQAgASACQdABakHgAPwKAAALICsgLDcCBCArIAE2AgALIAJBwAFqQQhqIAJBoAFqQQhqKAIANgIAIAIgAikDoAE3A8ABQQchHCAiISogKyEkCyAWIBhqIgEgHDYCACABQRxqICM6AAAgAUEYaiAiNgIAIAFBFGogITYCACABQRBqICA2AgAgAUEMaiAfNgIAIAFBCGogHjYCACABQQRqIB02AgAgAUEdaiACLwHMATsAACABQR9qIAJBzAFqQQJqLQAAOgAAIAFBLGogGzYCACABQShqIBo2AgAgAUEkaiAlNgIAIAFBIGogJDYCACABQTBqIAIpA8ABNwMAIAFBOGogAkHAAWpBCGooAgA2AgAgAUE/aiAmOgAAIAFBPmogJzoAACABQT1qICg6AAAgAUE8aiApOgAAIBhBwABqIRggGUF/aiIZDQALC0GAgICAeCEiAkAgAygCIEGAgICAeEYNACADKAIkIRogAygCNCEhIAMoAjAhICADKAIsIRkgAkHQAWogAygCKCIjQQhBMBCQDyACKALUASEiIAIoAtABQQFGDQ8gAigC2AEhHgJAICINAEEAISIMAQsgI0EwbCEbQQAhGCAiIR8DQCAbIBhGDQEgAkHQAWogGiAYahBMIB4gGGoiAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwAgGEEwaiEYIB9Bf2oiHw0ACwsgDSACQdgAakEIaikDADcDACACQRBqIAJB2ABqQRBqKQMANwMAIAJBGGogAkHYAGpBGGopAwA3AwAgAiACKQNYNwMAIAIgFDYCSCACIBY2AkQgAiAVNgJAIAIgEDYCTCACIBE2AjwgAiASNgI4IAIgITYCNCACICA2AjAgAiAZNgIsIAIgIzYCKCACIB42AiQgAiAiNgIgIAIgAy8BUDsBUAwICyADKQMoISwgAkHQAWogA0EIahDDBCACQdABakEoaiIBIAMoAjAQ0QQ2AgAgAkHQAWpBIGogLDcDACANQSBqICw3AwAgDSACKQPQATcDACANQQhqIAJB0AFqQQhqKQMANwMAIA1BEGogAkHQAWpBEGopAwA3AwAgDUEYaiACQdABakEYaikDADcDACACIAMtADQ6APwBIAIgAygANTYA/QEgDUEoaiABKQMANwMAIAIgAy0AOToAgQIgDUEwaiAJKQMANwMAIAJBBTYCAAwHCyADKAIUIQEgAygCECEYIAMoAhwhHyADKAIYIR4CQCADKQMIIixCA4NCAFINACAspyIaIBooAgAiGkEBajYCACAaQX9MDQwLIAIgAygCIBDRBDYCICACIB82AhwgAiAeNgIYIAIgATYCFCACIBg2AhAgAiAsNwMIIAJBBjYCACACIAMvASg7ASggAiADKAIkNgIkDAYLIAMoAiwhHiADKAIoIRogAkGgAWogA0EIahDDBEEAIRhBACEBAkAgAygCPCIfRQ0AEPQnIQEgAkHQAWogHxBCIAFBOGogAkHQAWpBOGopAwA3AwAgAUEwaiAJKQMANwMAIAFBKGogAkHQAWpBKGopAwA3AwAgAUEgaiACQdABakEgaikDADcDACABQRhqIAJB0AFqQRhqKQMANwMAIAFBEGogAkHQAWpBEGopAwA3AwAgAUEIaiACQdABakEIaikDADcDACABIAIpA9ABNwMACwJAIAMoAkAiH0UNABD2JyEYIB8pAgQhLCAfKAIAIRsQ9ychHyACQdABaiAbEHYCQEHgAEUNACAfIAJB0AFqQeAA/AoAAAsgGCAsNwIEIBggHzYCAAsgAy0ARCEfIAogA0EwahDqCCACQdgAakEIaiACQaABakEIaikDADcDACACQdgAakEQaiACQaABakEQaikDADcDACACQdgAakEYaiACQaABakEYaikDADcDACACIB42AnwgAiAaNgJ4IAIgHzoAlAEgAiAYNgKQASACIAE2AowBIAIgAikDoAE3A1ggAiADLQBLOgCbASACIAMvAEk7AJkBIAIgAygARTYAlQECQEHIAEUNACANIAJB2ABqQcgA/AoAAAsgAkEHNgIADAULIAMoAhQhHiADKAIQIRogAygCICEbIAMoAhwhIiADKAIYISMCQCADKQMIIixCA4NCAFINACAspyIBIAEoAgAiAUEBajYCACABQX9MDQoLQQAhGEEAIQECQCADKAIkIh9FDQAQ9CchASACQdABaiAfEEIgAUE4aiACQdABakE4aikDADcDACABQTBqIAkpAwA3AwAgAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwALAkAgAygCKCIfRQ0AEPYnIRggHykCBCEtIB8oAgAhGRD3JyEfIAJB0AFqIBkQdgJAQeAARQ0AIB8gAkHQAWpB4AD8CgAACyAYIC03AgQgGCAfNgIACyADLQA5IR8gCyADQSxqEOoIIAJB2ABqQQhqIhkgGjYCACACQdgAakEQaiIaICM2AgAgAkHYAGpBGGoiIyAbNgIAIAJB2ABqQSBqIhsgGDYCACACQdgAakEwaiIYIAMtADg6AAAgDSAsNwMAIA1BKGogCikDADcDACACIB42AmQgDUEIaiAZKQMANwMAIAIgIjYCbCANQRBqIBopAwA3AwAgAiABNgJ0IA1BGGogIykDADcDACANQSBqIBspAwA3AwAgAiAfOgCJASACIAMoATo2AYoBIA1BMGogGCkDADcDACACICw3A1ggAkEINgIADAQLIAwgA0EEahC8CCACQQk2AgAMAwtB2ABFDQIgAiADQdgA/AoAAAwCCyADKAIIIRggAygCGCEjIAMoAhQhGSADKAIQISAgAygCICEhIAMoAhwhJyACQdABaiADKAIMIhtBCEEwEJAPIAIoAtQBIRogAigC0AFBAUYNCCACKALYASEiAkAgGkUNACAbQTBsIR8gIiEB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QQhqKQMANwMAIABBIGogAkEQaikDADcDAAwTCyABQRBqIQQgASgCDCEFIAEoAgghBgJAAkAgAS0AREEERg0AIAJBGGogBBDVBQwBCyACQRhqIAQQpwggAkEEOgBMCwJAAkAgASgCWCIEDQBBACEBDAELEPonIQEgBCgCDCEHIAQoAhAhAyACQaABaiAEENEMIAFBEGogAzYCACABIAIpAqABNwIAIAIgBzYCrAEgAUEIaiACQaABakEIaikCADcCAAsgACAFNgIMIAAgBjYCCAJAQcgARQ0AIABBEGogAkEYakHIAPwKAAALIABBBDYCACAAIAE2AlgMEgsgASgCECEEIAEoAhQhBSACQaABaiABQQRqEJgBIABBFGogBTYCACAAQQU2AgAgACACKQKgATcCBCACIAQ2AqwBIABBDGogAkGoAWopAgA3AgAMEQsgASkDCCEUEPcnIQQgAkGgAWogASgCBBB2AkBB4ABFDQAgBCACQaABakHgAPwKAAALIAAgFDcDCCAAIAQ2AgQgAEEGNgIADBALIAEoAgghCSABKAIUIQogASgCECELIAJBoAFqIAEoAgwiDEEIQTgQkA8gAigCpAEhDSACKAKgAUEBRg0QIAIoAqgBIQ4CQCANRQ0AIAxBOGwhDyACQaABakEEciEFQQAhBCANIQMDQCAPIARGDQEgCSAEaiIBQSxqKAIAIQggAUEoaigCACEQQQchBgJAIAEoAgBBB0YNACACQaABaiABELwCIAJB+ABqQQhqIAVBCGopAgA3AwAgAkH4AGpBEGogBUEQaikCADcDACACQfgAakEYaiAFQRhqKQIANwMAIAJB+ABqQSBqIAVBIGooAgA2AgAgAiAFKQIANwN4IAIoAqABIQYLIAFBMGooAgAhARD3JyEHIAJBoAFqIAEQdgJAQeAARQ0AIAcgAkGgAWpB4AD8CgAACyACQaABakEgaiACQfgAakEgaigCACIRNgIAIAJBoAFqQRhqIAJB+ABqQRhqKQMAIhQ3AwAgAkGgAWpBEGogAkH4AGpBEGopAwAiFTcDACACQaABakEIaiACQfgAakEIaikDACIWNwMAIAIgAikDeCIXNwOgASAOIARqIgEgBjYCACABQQRqIBc3AgAgAUEMaiAWNwIAIAFBFGogFTcCACABQRxqIBQ3AgAgAUEkaiARNgIAIAFB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NgIAIAlB2ABqIQkgB0EBaiEHDAELCyAAQYGAgIB4NgKQASAAIAg2AgALIAoQgCwgBEEYahCrHgsgBEGABGokAAvvIAIKfwJ+IwBBoANrIgIkACACIAEQ9g8iAzYCFAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQdwARw0AIAJBGGpBCGoiBCABKAIAIgNB2ABqKAIANgIAIAIgAykCUDcDGCADQdAAaiEFAkAgARCMCw0AIAJBtAFqIAVBCGooAgA2AgAgAkGgAWpBCGoiAyAEKAIANgIAIAIgAikDGDcDoAEgAiAFKQIANwKsASACQcgCaiABKAIEIAEoAggQhBQgAkHcAmogAykDADcCACACQeQCaiACQbABaikDADcCACACQQo2AqwCIAIgAikDoAE3AtQCQcAARQ0bIAAgAkGsAmpBwAD8CgAADBsLAkAgARD2DyIEQfj//wBxQTBGDQACQAJAAkACQAJAAkACQAJAIARB/v//AHFBOEYNAAJAAkAgBEGQf2oOCQQDAwEDBQMBBQALAkAgBEGwf2oOCAQDAwEDBQMBAAsgBEHEAEYNACAEQeQARw0CCyACQdgBaiABELgKIAJB2AFqQQhqIgEgAkEYakEIaigCADYCACAAQqKAgIDQgICAgH83AgAgACACKQMYIgw3AgggAEEYaiACQdgBakEQaikDADcCACAAQSBqIAJB2AFqQRhqKAIANgIAIABBEGogASkDADcCACACIAw3A9gBDCMLIAMtAGVBAUcNBQsgARCMCxogAkGMAmogBUEIaigCADYCACACQfgBakEIaiACQRhqQQhqKAIANgIAIAIgBSkCADcChAIgAiACKQMYNwP4ASAEQV1qIgZBHE0NBQwICyACQawCaiABEIsCIAIoAqwCIQECQEE4RQ0AIAJBoAFqIAJBsAJqQTj8CgAACyABQSJGDQEgAigC6AIhAwJAQThFDQAgAEEEaiACQaABakE4/AoAAAsgACADNgI8DAILIAJBrAJqIAEQjwsgAkGgAWpBCGoiASACQawCakEMaikCADcDACACQaABakEQaiIDIAJBrAJqQRRqKQIANwMAIAJBoAFqQRhqIgUgAkGsAmpBHGopAgA3AwAgAiACKQKwAjcDoAECQAJAIAIoAqwCIgRBIkYNACAAIAIpAtACNwIkIABBPGogAkGsAmpBPGooAgA2AgAgAEE0aiACQawCakE0aikCADcCACAAQSxqIAJBrAJqQSxqKQIANwIAIABBHGogBSkDADcCACAAQRRqIAMpAwA3AgAgAEEMaiABKQMANwIAIAAgAikDoAE3AgQMAQsgAkHIAGpBCGoiBiABKQMANwMAIAJByABqQRBqIAMpAwAiDDcDACACQcgAakEYaiAFKQMAIg03AwAgAkHIAGpBDGogAkEYakEIaigCADYCACACIAIpA6ABNwNIIABBgoCAgHg2AgQgAEEYaiAMNwIAIABBIGogDTcCACACIAIpAxg3AkwgACACKQNINwIIIABBEGogBikDADcCAAsgACAENgIADB8LAkBBOEUiAw0AIAJB6ABqIAJBoAFqQTj8CgAACyACQYwBaiACQSBqKAIANgIAIAIgAikDGDcChAEgAw0AIABBBGogAkHoAGpBOPwKAAALIAAgATYCAAwdCyACQaABaiABEKgNIAJBkAJqQRRqIAJBoAFqQRRqKAIANgIAIAJBkAJqQQhqIgMgAkEYakEIaigCADYCACACIAIpAqwBNwKcAiACIAIpAxg3A5ACIAJByAJqIAEoAgQgASgCCBCEFCACQdwCaiADKQMANwIAIAJB5AJqIAJBoAJqKQMANwIAIAJBIDYCrAIgAiACKQOQAjcC1AJBwABFDRwgACACQawCakHAAPwKAAAMHAtBASAGdEHrm4CAAXFFDQIMAwsCQCADLQBlDQAgAkGgAWogARCoDSACQZACakEUaiACQaABakEUaigCADYCACACQZACakEIaiIDIAJBGGpBCGooAgA2AgAgAiACKQKsATcCnAIgAiACKQMYNwOQAiACQcgCaiABKAIEIAEoAggQhBQgAkHcAmogAykDADcCACACQeQCaiACQaACaikDADcCACACQSA2AqwCIAIgAikDkAI3AtQCQcAARQ0bIAAgAkGsAmpBwAD8CgAADBsLIAJBKGogARCqCSACQTRqIAJBGGpBCGooAgA2AgAgAEKigICAoICAgIB/NwIAIABBGGogAkEoakEQaikCADcCACAAQSBqIAJBKGpBGGopAgA3AgAgAiACKQMYNwIsIAAgAikCKDcCCCAAQRBqIAJBKGpBCGopAgA3AgAMGgsgAkEANgKsAiACQRRqQaTDhAEgAkGsAmpBqMOEARCwIQALIARBpX9qQQRJDQAgBEGFf2pBBEkNAAJAIARB/wBLDQAgBEFQakEKSQ0AIARBv39qQRpJDQAgBEGff2pBGkkNACAEQf0AcUE8Rw0DCyAEQURqDgcPBBAEBAsOAQsgACACKQP4ATcCDCAAQQE6ACQgACAENgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMFwsCQCAEQY5/ag4JCAMGAwkDAwMLAAsgBEGff2oOBgMLAgICBAELIAAgAikD+AE3AgwgAEECOgAkIAAgBDYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADBULIARB7gBGDQQLIAJByAJqIAEoAgQgASgCCBCEFCACQdwCaiACQYACaikDADcCACACQeQCaiACQYgCaikDADcCACACQQs2AqwCIAIgAikD+AE3AtQCQcAARQ0TIAAgAkGsAmpBwAD8CgAADBMLIAAgAikD+AE3AgwgAEEGOwEkIABBBzYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADBILIAAgAikD+AE3AgwgAEGGAjsBJCAAQQw2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwRCyAAIAIpA/gBNwIMIABBhgQ7ASQgAEEJNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMEAsgACACKQP4ATcCDCAAQYYGOwEkIABBCjYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADA8LIAAgAikD+AE3AgwgAEGGCDsBJCAAQQ02AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwOCyAAIAIpA/gBNwIMIABBhgo7ASQgAEELNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMDQsgACACKQP4ATcCCCAAQQI6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkH4AWpBEGopAwA3AgAgAEEQaiACQYACaikDADcCAAwMCyAAIAIpA/gBNwIIIABBAzoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJBgAJqKQMANwIADAsLIAJBkAJqQRBqIgcgAkH4AWpBEGopAwA3AwAgAkGQAmpBCGoiCCACQfgBakEIaikDADcDACACIAIpA/gBNwOQAkEEIQYgBSgCACABKAIIIgRGDQkgARD2D0H7AEcNCSACIAEQ9g8iCTYC7AIgCUH7AEcNBCACQfACakEIaiAFQQhqIgkoAgA2AgAgAiAFKQIANwPwAiABEM4kDQMgAkG0AWogCSgCADYCACACQaABakEIaiIDIAJBGGpBCGooAgA2AgAgAiACKQMYNwOgASACIAUpAgA3AqwBIAJByAJqIAEoAgQgBBCEFCACQdwCaiADKQMANwIAIAJB5AJqIAJBsAFqKQMANwIAQR4hAyACQR42AqwCIAIgAikDoAE3AtQCIAItALACIQEMBwsgACACKQP4ATcCCCAAQQU6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkH4AWpBEGopAwA3AgAgAEEQaiACQYACaikDADcCAAwJCyAAIAIpA/gBNwIIIABBCDoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJB+AFqQQhqKQMANwIADAgLIAAgAikD+AE3AgggAEEJOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJB+AFqQRBqKQMANwIAIABBEGogAkGAAmopAwA3AgAMBwsgAkGAA2pBCGogCSgCADYCACACIAUpAgA3A4ADAkAgARD2DyIJQS1GDQAgCUHf//8AcUG/f2pBGkkNACAFIAIpA/ACNwIAIAVBCGogAkHwAmpBCGooAgA2AgAMBgsgAkEIaiADQcAAakG4w4QBEOUjIAIoAgwhCiACKAIIIglBADYCCANAAkACQAJAAkAgBSgCACAERg0AIAEQ9g8iA0EtRg0DIANB3///AHFBv39qQRpJDQMgBSgCACAERg0AIAEQ9g9B/QBGDQELIAJBtAFqIAVBCGooAgA2AgAgAkGgAWpBCGoiAyACQfAC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ASgC1AJLDQAgA0GIAWogASAJEKgmIAMgAykDiAE3AtwBIANBgAFqIANB3AFqQQAQjBYgAygCgAFBAXENAUGkvoMBEM4sAAsgA0HcAWogASgCPCAPKAIAIgIoAghBf2pBeHFqQQhqIAYgDCAEIAUgAigCEBESAAJAIAMoAtwBRQ0AIAMoAuABIgIgBEsNBAwDCyAAQQA2AgAMCwsgAygChAEhAiADQdABaiACIARBAWoiCSABQTRqKAIAIAFBOGooAgAgAkGUvoMBELclKAIAayAJENUXIABBATYCACAAQQxqIANB2AFqKAIANgIAIAAgAykC0AE3AgQMCgsgAEEANgIADAkLIARBAWohAgwACwtBpL6DARDOLAALIAAgAykC4AE3AgQgAEEMaiADQdwBakEMaigCADYCAAsgACACNgIADAQLIAAgAykC4AE3AgQgAEEMaiADQdwBakEMaigCADYCAAsgACACNgIADAILIAFByABqIQ8gAygC4AEhAiABQQhqIQsgAUEEaiEVIAFBOGohFCABQTRqIQ0gAUEgaiEQIAFBHGohEQJAA0ACQAJAAkAgAiIEIAVPDQACQAJAIAQgDE8NACAPIAYgBGotAAAiAmohDiAJIQcDQAJAAkACQCAVKAIAIAsoAgAgB0HkkYQBELglKAIEIglFDQAgESgCACAQKAIAIAkgDi0AAGpB9JGEARC3JSgCACEJDAELIANBuAFqIAEgBxCnJiADIAMpA7gBNwL0AQNAIANB3AFqIANB9AFqELgTIAMtANwBQQFHDQIgAiADLQDdASIJSw0ACyACIAlHDQEgAygA3gEhCQsgCUEBRw0DCyAVKAIAIAsoAgAgB0GsuIABELglKAIMIQcMAAsLIAQgDEGsn4ABEIwVAAsCQCAJIAEoAtACSw0AIAlFDQUCQCAJIAEoAtQCSw0AIANBsAFqIAEgCRCoJiADIAMpA7ABNwLcASADQagBaiADQdwBakEAEIwWIAMoAqgBQQFxDQRBpL6DARDOLAALIANB3AFqIAEoAjwgCigCACICKAIIQX9qQXhxakEIaiAGIAwgBCAFIAIoAhAREgAgAygC3AFFDQIgAygC4AEiAiAESw0ECyAEQQFqIQIMAwsgACADKQLQATcCBCAAIAg2AgAgAEEMaiADQdgBaigCADYCAAwFCyAAQQA2AgAMBAsgAygCrAEhB0EBIQggA0HQAWogByAEQQFqIgIgDSgCACAUKAIAIAdBlL6DARC3JSgCAGsgAhDVFwwACwsgACADKQLQATcCBCAAIAg2AgAgAEEMaiADQdgBaigCADYCAAwBCyAAIAo2AgAgACALKQIANwIEIABBDGogC0EIaigCADYCAAsgA0GAAmokAAugIwIDfwF+IwBB0ABrIgMkACADIAI2AhhB0ZCcASEEQQEhBQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQf8BcQ6kAagBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdDA0OHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7lAGVAZYBlwGYAZkBmQGZAZkBmgGbAZwBPD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGdAZIBqAELQdyDngEhBEEBIQUMpwELQceQnAEhBEEBIQUMpgELQciQnAEhBEEBIQUMpQELQYufnAEhBEEBIQUMpAELQcSQnAEhBEEBIQUMowELQYy7nAEhBEEBIQUMogELQfiHnAEhBEEBIQUMoQELQcD8mwEhBEEBIQUMoAELQcOQnAEhBEEBIQUMnwELQcWQnAEhBEEBIQUMngELQdCQnAEhBEEBIQUMnQELQZjkmwEhBEEB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KAIQIQQMCwsgAkUNCSACKAIAQQhHDQkgAyACQQRqNgI0IANBAjYCPCADQdChmgE2AjggA0IBNwJEIANB5AOtQiCGIANBNGqthDcDICADIANBIGo2AkAgACADQThqEJ4ODAsLIANBATYCTCADQbSemgE2AkggA0EBNgI8IANBxKCbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQcyemgEQ4iMACyADQQE2AkwgA0G0npoBNgJIIANBATYCPCADQcSgmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGIn5oBEOIjAAsgA0EBNgJMIANBtJ6aATYCSCADQQE2AjwgA0HEoJsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBwJ+aARDiIwALIANBATYCTCADQbSemgE2AkggA0EBNgI8IANBxKCbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQfifmgEQ4iMACyADQQE2AkwgA0G0npoBNgJIIANBATYCPCADQcSgmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGooJoBEOIjAAsgA0EBNgJMIANBtJ6aATYCSCADQQE2AjwgA0HEoJsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBuKCaARDiIwALIANBATYCTCADQbSemgE2AkggA0EBNgI8IANBxKCbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQeSgmgEQ4iMACyADQQE2AkwgA0G0npoBNgJIIANBATYCPCADQcSgmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGQoZoBEOIjAAsgA0EBNgJMIANBtJ6aATYCSCADQQE2AjwgA0HEoJsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBoKGaARDiIwALIANBATYCTCADQbSemgE2AkggA0EBNgI8IANBxKCbATYCOCAD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aiAJEIgBIAFBIGogAkEgakEgaikDADcDACABQRhqIAJBIGpBGGopAwA3AwAgAUEQaiACQSBqQRBqKQMANwMAIAFBCGogAkEgakEIaikDADcDACABIAIpAyA3AwAgCEFYaiEIIAFBKGohASAJQShqIQkgMEF/aiIwDQALCyAEKAIkIQggBCgCICEJCyArrUIghiAqrYQhNCAkrUIghiAlrYQhMgsgBEHYAGohBCAcIAdB2ABsaiIBICY2AlQgASAnNgJQIAEgKDYCTCABICk2AkggASA0NwNAIAEgMjcDOCABIDE3AzAgASAiNgIsIAEgIzYCKCABIAg2AiQgASAJNgIgIAEgLDYCHCABIC02AhggASAuNgIUIAEgLzYCECABIB82AgwgASAgNgIIIAEgBTYCBCABICE2AgAgB0EBaiEHIB5Bf2oiHg0ACwsgCi0AiAEhHgJAAkAgCigCeCIEDQBBACEgDAELEPonISAgBCgCBCEBIAQoAhAhLyAEKAIMIS4gAkEgaiAEKAIIIjBBBEEEEJAPIAIoAiQhHyACKAIgQQFGDQYgAigCKCEhAkAgH0UNACAwQQJ0IQQgISEFIB8hCQNAIARFDQEgASgCACEIEPcnIQcgAkEgaiAIEHYCQEHgAEUNACAHIAJBIGpB4AD8CgAACyAFIAc2AgAgBUEEaiEFIARBfGohBCABQQRqIQEgCUF/aiIJDQALCyAgIC82AhAgICAuNgIMICAgMDYCCCAgICE2AgQgICAfNgIACyACQQxqQQJqIgQgAkEQakECai0AADoAACACIAIvARA7AQwgAkEQaiAKQZABahCUCkEGIQECQAJAIAotADwiBUEGRw0ADAELIAooAgwhCCAKKAIIIQkCQAJAAkACQCAFQX1qIgFBASABQQNJG0H/AXEOAwABAgALIAooAiAhIyAKKAIcIQUgCigCGCEHAkAgCikDECIxQgODQgBSDQAgMaciASABKAIAIgFBAWo2AgAgAUF/TA0HCyAKLQAkIS5BAyEBQQAhIgwCCyAKKAIkIS4gCigCICEjIAJBIGogCkEoahCnCCAKKAIcIQUgCigCGCEHAkAgCikDECIxQgODQgBSDQAgMaciASABKAIAIgFBAWo2AgAgAUF/TA0GCyACQR5qIAJBN2otAAA6AAAgAiACLwA1OwEcIC5BCHYhIiACLQA0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AkHIvpwBNgLoASACQgE3AvQBIAJBswc2ArgBIAJBCToApwEgAiACQbQBajYC8AEgAiACQZwCajYCtAEgAiACQacBajYCnAIgAkHAAWogAkHoAWoQkhAgAkHUAWogAkGgAWooAgA2AgAgAiACKQKYATcCzAEgBCADIAJBwAFqENcaIRUgAS0A4AFBogFHDQEgASABEJcsEJ8XDAELIAEQoAsCQAJAIAEoAogBIhVBgIACcQ0AIAEgFUGAgAJyNgKIASACQSBqIAEQtRMgAigCICEUIAEgASgCiAFB//99cTYCiAEgAigCJCEVDAELIAJBKGogARC1EyACKAIsIRUgAigCKCEUCyAUQQFxRQ0ECyAAQQI2AgwgACAVNgIAIAJBlAFqEKcsCyACQZABahCnLAwPCyABEKALAkAgFUUNACABKALUASEDIAEoAtABIRcgAkH+gICAeDYC6AEgASAXIAMgAkHoAWoQ1yMLAkAgEigCAEEaRw0AQQEhFQwECyACQThqIBIQyAMgAigCPCEDAkACQCAVQQFxDQAgAigCOCEEDAELIBQgAyAUIANJGyEEIBQgAyAUIANLGyEDCyACQeaAgIB4NgLoASAEIAMgAkHoAWoQ1xohAyABLQDgAUGiAUcNDQsgASABEJcsEJ8XDAwLIAJBGGogFRDIAyACIA82AvQBIAIgFTYC8AEgAiADNgLsASACIBI2AugBIAIgAigCHDYC+AEgAiACQegBahD/HSISNgKAASACQQA2AnQgAS0A4AEhAwsgAS0AkQFBIHFFDQEgA0H/AXFBCUcNAUEAIRULIAJB6AFqIAFBACASEGsgAigC7AEhEiACKALoASIDQQdHDQEgAEECNgIMIAAgEjYCAAwKCyAQQQFxDQEMAwsgBCAKKQMANwMAIARBGGogCkEYaikDADcDACAEQRBqIApBEGopAwA3AwAgBEEIaiAKQQhqKQMANwMAIAIgEjYCxAEgAiADNgLAASAVRQ0BAkAgAw0AIAJBAToA3AEMAgtBy7icAUEoQez5mwEQzB4ACyABKALUASEDIAJBqIGAgHg2AugBIAEgDyADIAJB6AFqENcjDAELAkACQAJAAkACQAJAAkACQCACKAJ0RQ0AIAEoAtQBIRIgAikCeCEZQShBCBCwKiEDAkBBKEUNACADIAJBwAFqQSj8CgAACyACQQA2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AwA3AwAgAUEQaiACQcAAakEQaikDADcDACABQQhqIAJBwABqQQhqKQMANwMAIAEgAikDQDcDACABQShqIQEgEUFYaiERIAlBKGohCSASQX9qIhINAAsLQQAhAUEAIQkCQCADKAIYIhFFDQAQ9ichCSARKQIEIRogESgCACESEPcnIREgAkHAAGogEhB2AkBB4ABFDQAgESACQcAAakHgAPwKAAALIAkgGjcCBCAJIBE2AgALAkAgAygCHCIRRQ0AEPonIQEgESgCDCESIBEoAhAhEyACQcAAaiAREN4GIAFBEGogEzYCACABIAIpAkA3AgAgAiASNgJMIAFBCGogAkHAAGpBCGopAgA3AgALIAIgATYCJCACIAk2AiAgAiAMNgIcIAIgDTYCGCACIA42AhQgAiAQNgIQIAIgDzYCDCACQQQ2AggMBgsgAygCCCEJIAMoAhQhDCADKAIQIQ0gAkHAAGogAygCDCIOQQhBKBCQDyACKAJEIQ8gAigCQEEBRg0KIAIoAkghEAJAIA9FDQAgDkEobCERIBAhASAPIRIDQCARRQ0BIAJBwABqIAkQngMgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgAUEIaiACQcAAakEIaikDADcDACABIAIpA0A3AwAgAUEoaiEBIBFBWGohESAJQShqIQkgEkF/aiISDQALC0EAIQFBACEJAkAgAygCGCIRRQ0AEPYnIQkgESkCBCEaIBEoAgAhEhD3JyERIAJBwABqIBIQdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACwJAIAMoAhwiEUUNABD6JyEBIBEoAgwhEiARKAIQIRMgAkHAAGogERDeBiABQRBqIBM2AgAgASACKQJANwIAIAIgEjYCTCABQQhqIAJBwABqQQhqKQIANwIACyACIAE2AiQgAiAJNgIgIAIgDDYCHCACIA02AhggAiAONgIUIAIgEDYCECACIA82AgwgAkEFNgIIDAULIAMtABQhEiADKAIIIQ8gAygCBCEOIAMoAhAhCRD0JyEBIAJBwABqIAkQQiABQThqIAJBwABqQThqKQMANwMAIAFBMGogAkHAAGpBMGopAwA3AwAgAUEoaiACQcAAakEoaikDADcDACABQSBqIAJBwABqQSBqKQMANwMAIAFBGGogAkHAAGpBGGopAwA3AwAgAUEQaiACQcAAakEQaikDADcDACABQQhqIAJBwABqQQhqKQMANwMAIAEgAikDQDcDACADLQAWIRAgAy0AFSEMAkACQCADKAIMIhENAEEAIQkMAQsQ9ichCSARKQIEIRogESgCACENEPcnIREgAkHAAGogDRB2AkBB4ABFDQAgESACQcAAakHgAPwKAAALIAkgGjcCBCAJIBE2AgALIAIgEDoAHiACIAw6AB0gAiASOgAcIAIgATYCGCACIAk2AhQgAiAPNgIQIAIgDjYCDCACQQY2AggMBAsgAygCDCESIAMoAgghDyADKAIEIQkQ9CchASACQcAAaiAJEEIgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgAUEIaiACQcAAakEIaikDADcDACABIAIpA0A3AwAgAy0AFCEOAkACQCADKAIQIhENAEEAIQkMAQsQ9ichCSARKQIEIRogESgCACEQEPcnIREgAkHAAGogEBB2AkBB4ABFDQAgESACQcAAakHgAPwKAAALIAkgGjcCBCAJIBE2AgALIAIgDjoAHCACIAk2AhggAiASNgIUIAIgDzYCECACIAE2AgwgAkEHNgIIDAMLIAMpAyghGiADKAIwIQkQ9CchASACQcAAaiAJEEIgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqIgkpAwA3AwAgAUEoaiACQcAAakEoaikDADcDACABQSBqIAJBwABqQSBqIhEpAwA3AwAgAUEYaiACQcAAakEYaiISKQMANwMAIAFBEGogAkHAAGpBEGoiDykDADcDACABQQhqIAJBwABqQQhqIg4pAwA3AwAgASACKQNANwMAIAMtADQhECACQcAAaiADEJ4DIAkgATYCACACQQhqQShqIBo3AwAgAkEIakEIaiAOKQMANwMAIAJBCGpBEGogDykDADcDACACQQhqQRhqIBIpAwA3AwAgAkEIakEgaiARKQMANwMAIAIgEDoAdCACQQhqQTBqIAkpAwA3AwAgAiACKQNANwMIDAILIAMoAhghFCADKAIUIRUgAygCECEBEPQnIQ0gAkHAAGogARBCIA1BOGogAkHAAGpBOGopAwA3AwAgDUEwaiACQcAAakEwaikDADcDACANQShqIAJBwABqQShqKQMANwMAIA1BIGogAkHAAGpBIGoiDikDADcDACANQRhqIAJBwABqQRhqIhApAwA3AwAgDUEQaiACQcAAakEQaiIMKQMANwMAIA1BCGogAkHAAGpBCGoiDykDADcDACANIAIpA0A3AwAgAygCCCEJIAMtACUhFiADLQAkIRcgAkHAAGogAygCDCIYQQhBKBCQDyACKAJEIRMgAigCQEEBRg0HIAIoAkghGQJAIBNFDQAgGEEobCERIBkhASATIRIDQCARRQ0BIAJBwABqIAkQngMgAUEgaiAOKQMANwMAIAFBGGogECkDADcDACABQRBqIAwpAwA3AwAgAUEIaiAPKQMANwMAIAEgAikDQDcDACABQShqIQEgEUFYaiERIAlBKGohCSASQX9qIhINAAsLQQAhAUEAIQkCQCADKAIcIhFFDQAQ9ichCSARKQIEIRogESgCACESEPcnIREgAkHAAGogEhB2AkBB4ABFDQAgESACQcAAakHgAPwKAAALIAkgGjcCBCAJIBE2AgALAkAgAygCICIRRQ0AEPonIQEgESgCDCESIBEoAhAhDiACQcAAaiAREN4GIAFBEGogDjYCACABIAIpAkA3AgAgAiASNgJMIAFBCGogDykCADcCAAsgAiAWOgAtIAIgFzoALCACIAE2AiggAiAJNgIkIAIgFDYCICACIBU2AhwgAiANNgIYIAIgGDYCFCACIBk2AhAgAiATNgIMIAJBCTYCCAwBCyAIIANBBGoQvAggAkEKNgIICyALQQFqIQkgA0E4aiEDIAYgC0E4bGoiASACKQMINwMAIAFBMGogAkEIakEwaikDADcDACABQShqIAJBCGpBKGopAwA3AwAgAUEgaiACQQhqQSBqKQMANwMAIAFBGGogAkEIakEYaikDADcDACABQRBqIAJBCGpBEGopAwA3AwAgAUEIaiACQQhqQQhqKQMANwMAIApBf2oiCg0ACwsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkGgAWokAA8LIAUgAigCSEH08ZoBEIUpAAsgDyACKAJIQfTxmgEQ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QQFxOgAFIAAgEUEBcToABCAAIBJBAXE6AAMgACATQQFxOgACIAAgFEEBcToAAUEAIQIgAEEAIBAgEEH/AXFBBEYbOgAGIAMgATYCGAwECyADKAKYASEZIAMoApQBIRoLIBUhGCAEIQIDQCAYRQ0BIBhBeGohGCACKAIEIRsgAigCACEcIAJBCGohAiAcIBsgGiAZEOQlRQ0ACyADQaABakEIaiABQQxqKQIANwMAIANBoAFqQRBqIAFBFGopAgA3AwAgA0GgAWpBGGogAUEcaigCADYCACADIBc2AoABIAMgASkCBDcDoAEgASEWCyABQSBqIQEgFkGVgICAeDYCACADKAKAASICQZWAgIB4Rg0ACyAKIAMpA6ABNwIAIApBCGogA0GgAWpBCGoiGCgCADYCACADIAE2AhggAyACNgIwIANBCGoQoCkgA0EIakEIaiAJQQhqKQIANwMAIAMgCSkCADcDCAJAAkACQAJAAkACQAJAAkACQCACQYCAgIB4cyICQRUgAkEVSRtBf2oODwEAAAIAAAAAAAAAAwQFBgALIANBMGogA0HwAGpBgMeAARC+IyECIANBAToAkAEgAyACNgKUAQwHCyADQQA6AJABIAMgAy0ANCICQQYgAkEGSRs6AJEBDAULIANBADoAkAEgAyADKQM4Ih1CBiAdQgZUGzwAkQEMBAsgAygCNCECIANBkAFqIAMoAjgiGyADKAI8EIEQIAIgGxDLLAwECyADQZABaiADKAI0IAMoAjgQgRAMAgsgAygCNCECIANBkAFqIAMoAjgiGyADKAI8ENYCIAIgGxDLLAwCCyADQZABaiADKAI0IAMoAjgQ1gILIANBMGoQyxULAkACQCADLQCQAUUNACADKAKUASEYDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADLQCRAQ4HAQIDBAUGAAELIAMoAgghAiADQZWAgIB4NgIIAkACQCACQZWAgIB4Rg0AIAsgDikCADcCACALQQhqIA5BCGooAgA2AgAgAyACNgKgASADQaABahDLFUEAIQIMAQtBASECQdDTgAFBEBCZFCEYCyACQQFxRQ0PDA0LAkAgFEH/AXFBAkYNAEGA0YABQRQQihchGAwNCyADQaABaiADQQhqEN0OIAMtAKABDQUgAy0AoQEhFAwOCwJAIBNB/wFxQQJG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ByAMOgAAIAcgCUE/cUGAAXI6AAIgByALQT9xQYABcjoAAQsgACAAKAJ4IAZqIgM2AnggACAAKAJwIgcgACgCdGo2AmwgACAHIAMgACgCfGtqNgJoIAEgAiAIajYCOAsgACgCaCICIAAoAmwiBkcNAAwCCwsgAyABKAJwQaSJnAEQhSkACyABKAIwIQIgAUEYaiABKAI0IgMgAyABKAI4ahDQICACIAMQ1CwgACgCeCAKRg0EIAAoAmwhBiAAKAJoIQILIAIgBkcNAAwDCwtBuJqaARDOLAALIAMgASgCcEGkiZwBEIUpAAsgASgCIA0BCwJAIARBtH9qQf8BcUHVAE8NACABQegAaiAEQQAQhgEgACgChAFBCGogASgCbCIDIAEoAnAQ5AMhDSABKAJoIAMQ6ykMAgsgACgCCCEDIABBCTYCCAJAIANBCUYNACADQQJHDQAgACkDECENDAILIAFBATYCbCABQZybmgE2AmggAUIBNwJ0IAFBtgetQiCGIABBCGqthDcDMCABIAFBMGo2AnAgAUHoAGpBpJuaARDiIwALAkACQAJAIARBjX9qQf8BcUEuSQ0AIAApAwghDSAAQQk2AgggAUEwakEQaiAAQRhqKQMANwMAIAFBOGogAEEQaikDADcDACABIA03AzACQAJAAkAgDaciA0EJRg0AQQIhAiADQQJGDQELIAFB2ABqIARBABCGASABQaAHrUIghiINIAFBGGqthDcDUCABIA0gAUHYAGqthDcDSCABQQI2AmwgAUHcqpsBNgJoIAFCAjcCdCABIAFByABqNgJwIAFBJGogAUHoAGoQnQ4gASgCWCABKAJcENQsQQEhBwwBCyABIAEpAzg3A1ggAUECNgJsIAFB3KqbATYCaCABQgI3AnQgAUGgB61CIIYgAUEYaq2ENwNQIAFBzAStQiCGIAFB2ABqrYQ3A0ggASABQcgAajYCcCABQSRqIAFB6ABqEOkJAkAgASkDWCINQgODQgBSDQAgDaciAyADKAIAIgJBf2o2AgACQCACQQFHDQAgAyADKAIQEMAkCyABKAIwIQILQQAhByACIQMLIANBCUYNAiADQQJHDQEgB0UNAiABKQM4Ig1CA4NCAFINAiANpyIDIAMoAgAiAkF/ajYCACACQQFHDQIgAyADKAIQEMAkDAILIAFByABqIARBABCGASABQaAHrUIghiINIAFBGGqthDcDOCABIA0gAUHIAGqthDcDMCABQQI2AmwgAUHcqpsBNgJoIAFCAjcCdCABIAFBMGo2AnAgAUEkaiABQegAahCdDiABKAJIIAEoAkwQ1CwMAQsgAUEwahDABQsgASgCJCEDIAAoAoQBQQhqIAEoAigiAiABKAIsEOQDIQ0gA0GAgICAeEYNACADIAIQ1CwLIAFBAjYCaCABIA03A3AgACABQegAahCUBSABQQxqQQhqIgNByQA6AAAgASAFNgIMIAEgAC0AKDoAFSABIAAoAng2AhAgASgCGCABKAIcENQsIAAgAUEMahDwDiAAQdgBaiICQQhqIAMoAgA2AgAgAiABKQIMNwIACyABQYABaiQAC5YXARJ/IwBBIGsiAyQAAkACQAJAAkACQAJAAkAgAigCACIEIAIoAgQiBUsNACABLQDYAkUgAi0AEXIhBgJAIAItABANACABKAIoIgdFDQIgBkEBcQ0DIAEoAtACIggNBBCIMCECIABBAjYCACAAIAI2AgQMBwsCQCABKALUAiIIDQAQiTAhAiAAQQI2AgAgACACNgIEDAcLQQAhCQJAIAggASgCzAJLDQAgAUEQaigCACABQRRqKAIAIAggASgCPHZBfmpBwLqDARC8JSIHKAIEIAcoAghBABC9JSgCACEHIAMgByAEIAFBHGooAgAgAUEgaigCACAHQbC6gwEQtyUoAgBrIAQQ1RdBASEJIAZBAXENBQsgAigCDCIKIAQgCiAESxshByABQcAAaiELIAIoAgghDCABQQhqIQ0gAUEEaiEOIAFBFGohDyABQRBqIRAgAUEgaiERIAFBHGohEiAEIQIDQAJAIAUgAkcNACAAIAMpAwA3AgQgACAJNgIAIABBDGogA0EIaigCADYCAAwICwJAAkAgByACRg0AIA4oAgAgDSgCACAIIAsgDCACai0AAGotAABqQaC6gwEQtyUoAgAiCCABKALIAksNASAIRQ0HIAggASgCzAJLDQEgECgCACAPKAIAIAggASgCPHZBfmpBwLqDARC8JSITKAIEIBMoAghBABC9JSgCACETIANBEGogEyACQQFqIhQgEigCACARKAIAIBNBsLqDARC3JSgCAGsgFBDVFyADKAIQIARLDQEgA0EIaiADQRBqQQhqKAIANgIAIAMgAykCEDcDAEEBIQkgBkEBcUUNASADQRBqIQIMCAsgByAKQayfgAEQjBUACyACQQFqIQIMAAsLIABBADYCAAwFCwJAIAZBAXENAAJAIAEoAtACIggNABCIMCECIABBAjYCACAAIAI2AgQMBgtBACEGAkAgCCABKALMAksNACABQRBqKAIAIAFBFGooAgAgCCABKAI8dkF+akHAuoMBELwlIgcoAgQgBygCCEEAEL0lKAIAIQcgA0EQaiAHIAQgAUEcaigCACABQSBqKAIAIAdBsLqDARC3JSgCAGsgBBDVF0EBIQYLIAIoAgwiEiAEIBIgBEsbIQcgAUHAAGohCyACKAIIIQIgAUEIaiEMIAFBBGohDSABQRRqIRQgAUEQaiEPIAFBIGohECABQRxqIREDQAJAIAUgBEcNACAAIAMpAhA3AgQgACAGNgIAIABBDGogA0EYaigCADYCAAwHCwJAAkAgByAERg0AIA0oAgAgDCgCACAIIAsgAiAEai0AAGotAABqQaC6gwEQtyUoAgAiCCABKALIAksNAQJAAkAgCEUNACAIIAEoAswCTQ0BDAMLIAAgAykCEDcCBCAAIAY2AgAgAEEMaiADQRhqKAIANgIADAkLIA8oAgAgFCgCACAIIAEoAjx2QX5qQcC6gwEQvCUiDigCBCAOKAIIQQAQvSUoAgAhDkEBIQYgA0EQaiAOIARBAWoiEyARKAIAIBAoAgAgDkGwuoMBELclKAIAayATENUXDAELIAcgEkGsn4ABEIwVAAsgBEEBaiEEDAALCwJAIAEoAtACIggNABCIMCECIABBAjYCACAAIAI2AgQMBQsCQAJAIAggASgCzAJNDQAgAigCDCIOIAQgDiAESxshByABQcAAaiELIAIoAgghAiABQQhqIQwgAUEEaiENA0ACQCAFIARHDQAgAEEANgIADAgLAkACQCAHIARGDQAgDSgCACAMKAIAIAggCyACIARqLQAAai0AAGpBoLqDARC3JSgCACIIIAEoAsgCSw0BAkAgCA0AQQAhAgwFCyAIIAEoAswCSw0BIARBAWohBAwDCyAHIA5BrJ+AARCMFQALIARBAWohBAwACwsgAUEQaigCACABQRRqKAIAIAggASgCPHZBfmpBwLqDARC8JSICKAIEIAIoAghBABC9JSgCACECIANBEGogAiAEIAFBHGooAgAgAUEgaigCACACQbC6gwEQtyUoAgBrIAQQ1RcgAEEMaiADQRhqKAIANgIAIAAgAykCEDcCBEEBIQILIAAgAjYCAAwECwJAIAEoAtACIggNABCIMCECIABBAjYCACAAIAI2AgQMBAsCQCAIIAEoAswCSw0AIAFBEGooAgAgAUEUaigCACAIIAEoAjx2QX5qQcC6gwEQvCUiAigCBCACKAIIQQAQvSUoAgAhAiADIAIgBCABQRxqKAIAIAFBIGooAgAgAkGwuoMBELclKAIAayAEENUXIABBATYCACAAQQxqIANBCGooAgA2AgAgACADKQIANwIEDAQLIANBEGogByABQSxqIhMoAgAiDCgCCEF/akF4cWpBCGogAigCCCILIAIoAgwiByAEIAUgDCgCEBESAAJAAkACQCADKAIQIgIOAwIBAAILIAFBwABqIQwgAygCFCEEIAFBCGohDSABQQRqIQ4CQAJAAkADQAJAIAQiAiAFSQ0AIABBADYCAAwKCyACIAdPDQICQAJAIA4oAgAgDSgCACAIIAwgCyACai0AAGotAABqQaC6gwEQtyUoAgAiCCABKALIAksNACAIRQ0FIAggASgCzAJNDQMgA0EQaiABKAIoIBMoAgAiBCgCCEF/akF4cWpBCGogCyAHIAIgBSAEKAIQERIAIAMoAhBFDQEgAygCFCIEIAJLDQILIAJBAWohBAwBCwsgAEEANgIADAgLIAFBEGooAgAgAUEUaigCACAIIAEoAjx2QX5qQcC6gwEQvCUiCCgCBCAIKAIIQQAQvSUoAgAhCCADIAggAkEBaiICIAFBHGooAgAgAUEgaigCACAIQbC6gwEQtyUoAgBrIAIQ1RcgAEEBNgIAIABBDGogA0EIaigCADYCACAAIAMpAgA3AgQMBwsgAiAHQayfgAEQjBUACyAAQQA2AgAMBQsgACADKQIUNwIEIABBDGogA0EQakEMaigCADYCAAsgACACNgIADAMLQQAhBgJAIAggASgCzAJLDQAgAUEQaigCACABQRRqKAIAIAggASgCPHZBfmpBwLqDARC8JSIHKAIEIAcoAghBABC9JSgCACEHIAMgByAEIAFBHGooAgAgAUEgaigCACAHQbC6gwEQtyUoAgBrIAQQ1RcgASgCKCEHQQEhBgsgA0EQaiAHIAFBLGoiDCgCACINKAIIQX9qQXhxakEIaiACKAII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KALQASEIIANBloGAgHg2AsABIAIgCCAFIANBwAFqENcjIANBwAFqIAIQ2wsgAygCxAEhBQJAIAMoAsABIggNACAAQQM6ABQgACAFNgIADAMLIAMgCDYCwAEgBiEJAkACQAJAAkACQCAGDQAgA0HIAGoQrisgAyAINgJIIAUNASAIIQkLIAUQgCwgBg0BDAILIAcQgCwgBSEHDAILIANBwAFqEKMsCyAJIQgLIAItAOABIQUMAQsgBiEICwJAAkACQAJAAkAgBUH/AXFBAkYNACACKALcASEFIAIoAtgBIQYgA0HYAGogAhDNJiADQQE2AsQBIANByL6cATYCwAEgA0IBNwLMASADQbMHNgJoIANBAjoAkAEgAyADQeQAajYCyAEgAyADQYgBajYCZCADIANBkAFqNgKIASADQZgBaiADQcABahCNECADQawBaiADQeAAaigCADYCACADIAMpAlg3AqQBIAYgBSADQZgBahDXGiEFIAItAOABQaIBRg0BDAQLIAIQoAsgCEUNAQJAAkAgAigCiAEiBUGAgIACcQ0AIAIgBUGAgIACcjYCiAEgA0HAAWogAhCrByACIAIoAogBQf///31xNgKIAQwBCyADQcABaiACEKsHCyADKALEASEFIAMoAsABIgZBgICAgHhHDQIgAEEDOgAUIAAgBTYCAAwECyACIAIQlywQnxcMAgsCQAJAIAIoAogBIgVBgICAAnFFDQAgAiAFQf///31xNgKIASADQcABaiACEKsHIAIgAigCiAFBgICAAnI2AogBDAELIANBwAFqIAIQqwcLIAMoAsQBIQUgAygCwAEiBkGAgICAeEcNACAAQQM6ABQgACAFNgIADAILIAMgAygCyAE2AmwgAyAFNgJoIAMgBjYCZAJAAkACQCACLQDgASIFQQNGDQACQCAFQaMBRw0AIANB8ABqIAIQzSYgAigC3AEhBSACKALYASEGIANBATYCxAEgA0HIvpwBNgLAASADQgE3AswBIANBtAc2AowBIANBAzoAkAEgAyADQYgBajYCyAEgAyADQZABajYCiAEgA0GYAWogA0HAAWoQjRAgA0GsAWogA0H4AGooAgA2AgAgAyADKQJwNwKkASACIAYgBSADQZgBahDXIwwCCyACKALcASEFIAIoAtgBIQYgA0H8AGogAhDNJiADQQE2AsQBIANB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IgNFDQwgACADEKgBDAwLIAAgASgCBBCoAQwLCyAAIAEoAgQQqAEMCgsgACABQSBqEKwFDAkLIAEoAgQgABC0BQwICyABKAIMIgNFDQcgA0EobCEEIAEoAghBBGohAwNAAkACQAJAAkACQCADQXxqKAIADgUEAAECAwQLIAMoAgBBAUcNAyAAIANBBGooAgAQqAEMAwsgACADKAIAEKgBDAILIAAgAygCABDACQwBCyADIAAQ7gsLIANBKGohAyAEQVhqIgQNAAwICwsgACABKAIEEKgBDAYLIAAgASgCBBCoAQwFCyAAIAEoAgQQqAEMBAsgACABKAIEEKgBDAMLIAAgASgCBBCoAQwCCyAAIAEoAgQQqAEMAQsCQCABKAIEIgMoAgBBA0cNACAAIAMoAhAQqAEgAygCDCIERQ0BIARBBHQhBCADKAIIQQxqIQMDQCAAIAMoAgAQqAEgA0EQaiEDIARBcGoiBA0ADAILCyAAIAMQjSILAkAgACgCAEUNACABKAIAQRpHDQAgACABQQhqIgMQqgUiAEUNACABENEBIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAMgAEEIaikDADcDACABIAApAwA3AwAgAEHAAEEIEKwWCyACQYABaiQAC8oUAQR/A0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4UEBAAAQIDBAUGBgcICQoKCwwNDg8QCwJAIAAoAgRBgICAgHhGDQACQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaikDACADQRhqKAIAIAEQ+yIMAwsgA0EEaiABENEXDAILIANBBGogARDSJQwBCyADQQRqIAEQxQ4LIANBKGohAyACQVhqIgINAAsLAkAgACgCHCIDRQ0AIANBCGooAgAiAkUNACACQTBsIQIgA0EEaigCAEEkaiEDA0ACQCADQXxqKAIAIgRFDQAgBCABEKkBCwJAIAMoAgAiBEUNACAEIAEQqQELIANBMGohAyACQVBqIgINAAsLIABBEGohAAwRCwJAIAAoAhAiAkUNACAAKAIMIQMgAkEobCECA0ACQAJAAkACQAJAIAMoAgAOBAABAgMACyADQQhqKQMAIANBGGooAgAgARD7IgwDCyADQQRqIAEQ0RcMAgsgA0EEaiABENIlDAELIANBBGogARDFDgsgA0EoaiEDIAJBWGoiAg0ACwsCQCAAKAIgIgNFDQAgA0EIaigCACICRQ0AIAJBMGwhAiADQQRqKAIAQSRqIQMDQAJAIANBfGooAgAiBEUNACAEIAEQqQELAkAgAygCACIERQ0AIAQgARCpAQsgA0EwaiEDIAJBUGoiAg0ACwsgAEEUaiEADBALAkAgAC0AJEECRw0AIAAoAhAQvicLIAAoAigiAEUNDiAAQQhqKAIAIgNFDQ4gAEEEaigCACEAIANBAnQhAwNAIAAoAgAgARCpASAAQQRqIQAgA0F8aiIDDQAMDwsLAkACQCAALQBEIgNBBEYNAAJAIANBAkcNACAAKAIwEL4nCwJAIAAoAkgiA0UNACADKAIIIgJFDQAgAygCBCEDIAJBAnQhAgNAIAMoAgAgARCpASADQQRqIQMgAkF8aiICDQALCyAAKAJMIgNFDQEgAyABEIcZDAELIAAtACRBAkcNACAAKAIQEL4nCyAAKAJYIgBFDQ0gAEEIaigCACIDRQ0NIABBBGooAgAhACADQQJ0IQMDQCAAKAIAIAEQqQEgAEEEaiEAIANBfGoiAw0ADA4LCyAAKAIMIgJFDQwgACgCCCIDIAJBOGxqIQUDQAJAAkACQAJAAkACQAJAAkAgAygCACICQXxqIgBBBCAAQQdJGw4HAAECAwQFBgALAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEPsiDAMLIABBBGogARDRFwwCCyAAQQRqIAEQ0iUMAQsgAEEEaiABEMUOCyAAQShqIQAgAkFYaiICDQALCwJAIAMoAhgiAEUNACAAKAIAIAEQqQELIAMoAhwiAEUNBiAAQQhqKAIAIgJFDQYgAkEwbCECIABBBGooAgBBJGohAANAAkAgAEF8aigCACIERQ0AIAQgARCpAQsCQCAAKAIAIgRFDQAgBCABEKkBCyAAQTBqIQAgAkFQaiICDQAMBwsLAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEPsiDAMLIABBBGogARDRFwwCCyAAQQRqIAEQ0iUMAQsgAEEEaiABEMUOCyAAQShqIQAgAkFYaiICDQALCwJAIAMoAhgiAEUNACAAKAIAIAEQqQELIAMoAhwiAEUNBSAAQQhqKAIAIgJFDQUgAkEwbCECIABBBGooAgBBJGohAANAAkAgAEF8aigCACIERQ0AIAQgARCpAQsCQCAAKAIAIgRFDQAgBCABEKkBCyAAQTBqIQAgAkFQaiICDQAMBgsLIAMoAhAgARCmASADKAIMIgBFDQQgACgCACABEKkBDAQLIAMoAgQgARCmASADKAIQIgBFDQMgACgCACABEKkBDAMLIAMoAjAgARCmAQJAAkACQAJAIAIOBAABAgMACyADKQMIIANBGGooAgAgARD7IgwFCyADQQRqIAEQ0RcMBAsgA0EEaiABENIlDAMLIANBBGogARDFDgwCCyADKAIQIAEQpgECQCADKAIMIgJFDQAgAygCCCEAIAJBKGwhAgNAAkACQAJAAkACQCAAKAIADgQAAQIDAAsgAEEIaikDACAAQRhqKAIAIAEQ+yIMAwsgAEEEaiABENEXDAILIABBBGogARDSJQwBCyAAQQRqIAEQxQ4LIABBKGohACACQVhqIgINAAsLAkAgAygCHCIARQ0AIAAoAgAgARCpAQsgAygCICIARQ0BIABBCGooAgAiAkUNASACQTBsIQIgAEEEaigCAEEkaiEAA0ACQCAAQXxqKAIAIgRFDQAgBCABEKkBCwJAIAAoAgAiBEUNACAEIAEQqQELIABBMGohACACQVBqIgINAAwCCwsCQCADKAIMIgJFDQAgAygCCCEAIAJBKGwhAgNAAkACQAJAAkACQCAAKAIADgQAAQIDAAsgAEEIaikDACAAQRhqKAIAIAEQ+yIMAwsgAEEEaiABENEXDAILIABBBGogARDSJQwBCyAAQQRqIAEQxQ4LIABBKGohACACQVhqIgINAAsLIAMoAhAiAEUNACAAKAIAIAEQqQELIANBOGoiAyAFRw0ADA0LCyAAKAIEIQAMDQsgACgCDCIDRQ0KIAAoAgghACADQThsIQMDQAJAIAAoAgBBB0YNACAAIAEQswgLIABBMGooAgAgARCp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akEIaiADQTBqQSj8CgAACyADQZgCaiADQaACakEQaikDACIQNwIAIANB2AFqQThqIANBoAJqQQhqKQMANwIAIAMgAykDoAI3AogCAkAgAi0AkQFBIHFFDQAgAi0AkgFB/wFxDQAgBigCBCEEIAYoAgAhByADQYCBgIB4NgLQAiACIAcgBCADQdACahDXIwsgA0GgAWpBCGogAUEIaikDADcDACADQaABakEQaiABQRBqKQMANwMAIANBoAFqQRhqIAFBGGopAwA3AwAgA0HIAWogA0EwakEYaikCADcDACADQdABaiADQTBqQSBqKQIANwMAIAMgAykCQDcDwAEgAyABKQMANwOgASAFKAIAIQQgAigC1AEhAgJAQThFDQAgA0HQAmpBBGogA0GgAWpBOPwKAAALIBCnIQVB8ABBCBCZKiIBQQg2AgACQEE8RQ0AIAFBBGogA0HQAmpBPPwKAAALIAEgBTYCSCABIAI2AkQgASAENgJAIANB2AFqELIoIANB5AFqEI0oIAMoApQCEJ8sIAAgATYCCCAAQgA3AgAMAgsgASgCJCIIKAIAIQQgAyABKAIoIgk2AugBIANBADYC4AEgA0KAgICAwAA3AtgBIANBADoAoAEgA0EAOgBYIAMgBDYC0AIgAigCiAEhBCADIANBoAFqNgL0ASADIANB0AJqNgLwASADIANB2ABqNgLsASADIANBoAFqNgLkAQJAAkAgBEGAAXFFDQAgAiAEQf9+cTYCiAEgA0EYaiADQdgBaiACEJoMIAMoAhghBCACIAIoAogBQYABcjYCiAEgAygCHCEFDAELIANBEGogA0HYAWogAhCaDCADKAIUIQUgAygCECEECwJAAkAgBEEBcUUNACAFIQRBgICAgHghBgwBCyAFKAIIIQcgBSgCBCEEIAUoAgAhBgJAQSRFDQAgA0EwaiAFQQxqQST8CgAACyADQZgBaiAFQcAAaikCADcDACADQZABaiAFQThqKQIANwMAIAMgBSkCMDcDiAEgBRCGLwsgA0GgAWpBCGogAUEIaikDADcDACADQaABakEQaiABQRBqKQMANwMAIANBoAFqQRhqIAFBGGopAwA3AwAgAyAINgLIASADIAk2AsQBIAMgAjYCwAEgAyABKQMANwOgAQJAIAZBgICAgHhHDQAgAEEBNgIAIAAgBDYCBCADQaAB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IgQgASgCBCIFSw0AIAJBBGohBgJAAkACQAJAAkACQAJAAkACQAJAIAAoAjwiB0UNACABLQAQQQFHDQELAkACQCACKAIQQQFHDQAgAigCFCEIIAIoAhgNASACKAIgIQQMCgsgAEHcAkHYAiABLQAQG2ooAgAiCEUNCCAIIAAoAtQCSw0IIAIoAhwhByACKAIYIQkgA0HIAGogACAIEKgmIAdBACAJGyIHIAMoAkggAygCTBDNG08NCCACQQE2AhggAiAHQQFqNgIcIANBwABqIAAgCBCoJiADIAMpA0A3ApgBIANBOGogA0GYAWogBxCMFiADKAI4QQFxRQ0CIAMoAjwhASADQZgBaiABIAQgAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgBBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAoLIAIoAhwhByADQTBqIAAgCBCoJgJAIAcgAygCMCADKAI0EM0bSQ0AIAJBADYCGCACQQA2AgAgAiACKAIgQQFqIgQ2AiAMCQsgAkEBNgIYIAIgB0EBajYCHCACKAIgIQkgA0EQaiAAIAgQqCYgAyADKQMQNwKYASADQQhqIANBmAFqIAcQjBYgAygCCEEBcUUNAiADKAIMIQEgA0GYAWogASAJQQFqIgggAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgCBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAkLAkACQCACKAIQQQFHDQAgAigCFCEIIAIoAhgNASACKAIgIQQMBwsgACgC2AIiCEUNBSAIIAAoAtQCSw0FIAIoAhwhCSACKAIYIQogA0GQAWogACAIEKgmIAlBACAKGyIJIAMoApABIAMoApQBEM0bTw0FIAJBATYCGCACIAlBAWo2AhwgA0GIAWogACAIEKgmIAMgAykDiAE3ApgBIANBgAFqIANBmAFqIAkQjBYgAygCgAFBAXFFDQMgAygChAEhASADQZgBaiABIAQgAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgBBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAkLIAIoAhwhCSADQfgAaiAAIAgQqCYCQCAJIAMoAnggAygCfBDNG0kNACACQQA2AhggAkEANgIAIAIgAigCIEEBaiIENgIgDAYLIAJBATYCGCACIAlBAWo2AhwgAigCICEHIANB2ABqIAAgCBCoJiADIAMpA1g3ApgBIANB0ABqIANBmAFqIAkQjBYgAygCUEEBcUUNAyADKAJUIQEgA0GYAWogASAHQQFqIgggAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgCBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAgLQaS+gwEQziwAC0GkvoMBEM4sAAtBpL6DARDOLAALQaS+gwEQziwACyACQQA2AhggAiAINgIUIAJBATYCECACIAQ2AiAgAkEANgIACyAAQTxqQQAgBxshCyAAQcgAaiEMIAEoAgwhDSABKAIIIQ4gAEEIaiEJIABBBGohCiAAQSBqIQ8gAEEcaiEQA0ACQCAEIAVJDQAgAiAINgIUIAJBATYCEAwECwJAAkACQAJAIAQgDU8NACAMIA4gBGotAAAiAWohESAIIQcCQANAAkACQAJAIAooAgAgCSgCACAHQeSRhAEQuCUoAgQiCEUNACAQKAIAIA8oAgAgCCARLQAAakH0kYQBELclKAIAIQgMAQsgA0HwAGogACAHEKcmIAMgAykDcDcCqAEDQCADQZgBaiADQagBahC4EyADLQCYAUEBRw0CIAEgAy0AmQEiCEsNAAsgASAIRw0BIAMoAJoBIQgLIAhBAUcNAgsgCigCACAJKAIAIAdBrLiAARC4JSgCDCEHDAALCyAIIAAoAtACTQ0BIAQhAQwCCyAEIA1BvJ+AARCMFQALIAIgCDYCFCACQQE2AhAgCEUNBQJAAkAgCCAAKALUAksNACACQoGAgIAQNwIYIANB6ABqIAAgCBCoJiADIAMpA2g3ApgBIANB4ABqIANBmAFqQQAQjBYgAygCYEEBcUUNASADKAJkIQEgA0GYAWogASAEQQFqIgggAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgCBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAcLIANBmAFqIAsoAgAgC0EEaigCACIBKAIIQX9qQXhxakEIaiAOIA0gBCAFIAEoAhAREgAgAygCmAFFDQYgAygCnAEiBCACKAIgIgFNDQEMAgtBpL6DARDOLAALIAFBAWohBAsgAiAENgIgDAALCyACQQA2AhggAiAINgIUIAJBATYCECACIAQ2AiAgAkEANgIACyAEIAUgBCAFSxshDSAEIAEoAgwiEiAEIBJLGyEOIABByABqIQwgASgCCCELIABBCGohCSAAQQRqIQogAS0AEEEBcSERIABBIGohECAAQRxqIQUDQAJAIAQgDUcNACACIAg2AhQgAkEBNgIQDAILAkACQCAEIA5GDQAgDCALIARqLQAAIgFqIQ8gCCEHA0ACQAJAAkAgCigCACAJKAIAIAdB5JGEARC4JSgCBCIIRQ0AIAUoAgAgECgCACAIIA8tAABqQfSRhAEQtyUoAgAhCAwBCyADQShqIAAgBxCnJiADIAMpAyg3AqgBA0AgA0GYAWogA0GoAWoQuBMgAy0AmAFBAUcNAiABIAMtAJkBIghLDQALIAEgCEcNASADKACaASEICyAIQQFHDQMLAkAgEUUNACACQgE3AhAMBQsgCigCACAJKAIAIAdBrLiAARC4JSgCDCEHDAALCyAOIBJBvJ+AARCMFQALAkAgCCAAKALQAksNACACIAg2AhQgAkEBNgIQIAhFDQIgCCAAKALUAksNACACQoGAgIAQNwIYIANBIGogACAIEKgmIAMgAykDIDcCmAEgA0EYaiADQZgBakEAEIwWAkAgAygCGEEBcUUNACADKAIcIQEgA0GYAWogASAEQQFqIgggAEE0aigCACAAQThqKAIAIAFBlL6DARC3JSgCAGsgCBDVFyACQQE2AgAgBiADKQKYATcCACAGQQhqIANBmAFqQQhqKAIANgIADAMLQaS+gwEQziwACyACIARBAWoiBDYCIAwACwsgA0GwAWokAAv0EAENfyMAQTBrIgYkACACQX5qIQcCQAJAAkACQANAAkACQAJAAkAgAUEhSQ0AIAQNASAAIAEgAiADQQEQqgIMCAsgAUECSQ0HIAMgAUEQakkNBCABQQF2IQggAUEPSw0BAkAgAUEHTQ0AIAAgAhCfCCAAIAhBAXQiCWogAiAJahCfCEEEIQoMBwsgAiAALwAAOwAAQQEhCiACIAhBAXQiCWogACAJai8AADsAAAwGCyAAIAFBeHFqIQkgACABQQN2IgtBDmxqIQwCQAJAIAFBwABJDQAgACAJIAwgCxDECyEN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QcAAQQgQrBYgACgCCCIAEM4DIABB4ABBCBCsFg8LIAApAwgiA0IDg0IAUg0BIAOnIgAgACgCACICQX9qNgIAIAJBAUcNASAAIAAoAhAQwCQPCwJAAkAgACgCBCIAKAIAQQNGDQAgABDqDwwBCyAAQQRqELobCyAAQShBCBCsFgsPCyAAKAIcIgJFDQAgAigCACIBEM4DIAFB4ABBCBCsFiACQQxBBBCsFgsgACgCOCIAEMEBIABBwABBCBCsFgunEwIFfwJ+IwBB4ABrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOFBISAAECAwQFBgcICQoLDA0ODxAREgsgAS0ANEEBRw0RIAFBLGohAwJAIAAoAgRBgICAgHhGDQAgASgCMBD1FSEEIAJBwABqQRhqQQApA4CEngEiBzcDACACQcAAakEQakEAKQP4g54BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIANBCGooAgA2AgAgAkEIaiAHNwMAIAJBEGogCDcDACACQRhqIAc3AwAgAiAINwNAIAIgAykCADcCLCACIAg3AwAgAS0AOCEDIAEtAD0hBSACIAEvADs7ADsgAkGBAjsAOSACQQE6ACggAiAENgIkIAIgATYCICACIAU6AD0gAiADOgA4AkAgACgCHCIBRQ0AIAItADRBAUcNACACQQA6ADkgAiABEKwLIAJBAToAOgsCQCAAKAIMIgNFDQAgAi0ANEEBRw0AIAAoAgghASADQShsIQMDQAJAIAItADRBAUcNACABIAIQth4LIAFBKGohASADQVhqIgMNAAsLAkAgAi0ANEEBRw0AIAAoAhAhASACLwA5IQAgAkGBAjsAOSABKAIAIAIQwgEgAiAAOwA5CyACEK0KIAJBEGoQygoMEgsgASgCMBD1FSEEIAJBwABqQRhqQQApA4CEngEiBzcDACACQcAAakEQakEAKQP4g54BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIANBCGooAgA2AgAgAkEIaiAHNwMAIAJBEGogCDcDACACQRhqIAc3AwAgAiAINwNAIAIgAykCADcCLCACIAg3AwAgAS0AOCEDIAEtAD0hBSACIAEvADs7ADsgAkGBAjsAOSACQQE6ACggAiAENgIkIAIgATYCICACIAU6AD0g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QCACKAIADggAAQQAAgYDBQALIANBAToATCADQQA2AkggA0KAgICAEDcCQCAAIANBwABqEMcgDAkLIAIoAgQhBCADQQhqIAIoAggiAkEBQQFB2LucARCsGSADKAIIIQUgAygCDCEGAkAgAkUNACAGIAQgAvwKAAALIANBAToATCADIAI2AkggAyAGNgJEIAMgBTYCQCADQSBqIANBwABqEMcgIAEoAgggAS0AECADQSBqELYmIABBCGogA0EgakEIaigCADYCACAAIAMpAiA3AgAMCAsgA0EUaiABIAIoAgwQwwEgAigCBCEEAkAgAigCECIFDQAgAi0AFCEGAkACQCAERQ0AIAIoAghBAUYNAQsgA0EUahCiHgsgA0EANgJIIANCgICAgBA3AkAgA0EBOgBMIANBIGogA0HAAGoQxyACQCAGQQFxDQAgA0EUaiADQSBqQQMQhh8LIANBwABqQQhqIANBFGpBCGooAgA2AgAgAyADKQIUNwNAIAAgASgCDCABLQAQIANBwABqIANBIGoQtgggA0EgahDEKQwICyABKAIEIgcgBSAHIAVJGyEGAkAgBEUNACAFIAIoAghHDQAgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIANBNGogA0HAAGoQxyACQANAIAZFDQEgA0E0ahCFFA0BIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0HAAGogA0EUahDfCyADQTRqIAEgA0EgaiADQcAAahDCAiAGQX9qIQYgA0HAAGoQxCkMAAsLIAUgB00NBiADQTRqEKIeDAYLIANBAToATCADQQA2AkggA0KAgICAEDcCQCADQTRqIANBwABqEMcgA0ACQAJAIAZFDQAgA0E0ahCFFEUNAQsgA0E0ahCiHiAAIAMpAjQ3AgAgAEEIaiADQTRqQQhqKAIANgIADAgLIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0HAAGogA0EUahDfCyADQTRqIAEgA0EgaiADQcAAahDCAiAGQX9qIQYgA0HAAGoQxCkMAAsLIAIoAgwhBSACKAIIIQYCQCABLQAQDQAgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIAVBHGwhAiADQTRqIANBwABqEMcgAkADQCACRQ0BIANBNGoQhRQNASADQSBqQQhqIANBNGpBCGooAgA2AgAgAyADKQI0NwMgIANBwABqIAEgBhDDASADQTRqIAEgA0EgaiADQcAAahDCAiACQWRqIQIgBkEcaiEGIANBwABqEMQpDAALCyAAIAMpAjQ3AgAgAEEIaiADQTRqQQhqKAIANgIADAcLIANBAToATCADQQA2AkggA0KAgICAEDcCQCAFQRxsIQIgBkFkaiEGIANBNGogA0HAAGoQxyACQANAIAJFDQEgA0E0ahCFFA0BIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0HAAGogASAGIAJqEMMBIANBNGogASADQSBqIANBwABqEMICIAJBZGohAiADQcAAahDEKQwACwsgACADKQI0NwIAIABBCGogA0E0akEIaigCADYCAAwGCwJAIAIoAgQNACACQQxqKAIAIgQgAkEQaigCAEEDdCIGaiEIIAEoAgAhB0EAIQUgBCECAkACQANAIAZFDQEgBSAHSw0CIAZBeGohBiACQQRqKAIAIAIoAgBrIAVqQQFqIQUgAkEIaiECDAALCyAFIAdLDQAgA0EANgIcIANCgICAgMAANwIUA0ACQAJAAkAgBCAIRg0AIARBCGohByAEKAIEIQUgBCgCACECQQAhBgNAIAZBAXENAyACIAVLDQMgA0EANgIwQQEhBgJAIAJBgAFJDQBBAiEGIAJBgBBJDQBBA0EEIAJBgIAESRshBgsgAiADQTBqEOQNIANBADYCPCADQoCAgIAQNwI0IANB8NOEATYCRCADQqCAgIAONwJIIAMgA0E0ajYCQCADQcAAaiADQTBqIAYQggYNAiACQYDAAyACQQFqIAJB/68DRhsgAiAFTyIGGyECIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0EBOgAsIANBFGogA0EgahDdEQwACwsgASgCCCABLQAQIANBFGoQtiYgAEEIaiADQRRqQQhqKAIANgIAIAAgAykCFDcCAAwKC0H8lZwBQTcgA0EgakGI1IQBQYCXnAEQ4hIACyAHIQQMAAsLIABBgICAgHg2AgAMBgsgAkEMaigCACIIIAJBEGooAgBBAXQiBmohCSABKAIAIQpBACEFIAghAgJAAkACQAJAA0AgBkUNASAFIApLDQIgAkEBai0AACIEIAItAAAiB0kNBCACQQJqIQIgBkF+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IAE2AsABAkACQCABEOwtRQ0AIAEQBCEBIAJBADYCdCACIAE2AnAgAkEANgJsIAIgAkHAAWo2AmggAkHQAWogAUGAgAQgAUGAgARJGxDTHyACQcABaiEBAkACQANAIAFFDQEgAkEIaiACQegAahDDHSACKAIIQQFxRQ0BIAIoAgwhASACIAIoAnRBAWo2AnQgAkHgAWogARDQAQJAAkACQCACKALgAUGVgICAeEcNACACKALkASEBDAELIAJBkAFqQQhqIAJB4AFqQQhqKQMANwMAIAIgAikD4AEiCDcDkAEgCKciAUGWgICAeEcNASACKAKUASEBCyAAQZWAgIB4NgIAIAAgATYCBCACQdABahDgKgwFCyABQZWAgIB4Rg0CIAJB0AFqIAJBkAFqEM8bIAIoAmghAQwACwsgAkGVgICAeDYCkAELIAJBkAFqEJkpIABBlICAgHg2AgAgACACKQLQATcCBCAAQQxqIAJB2AFqKAIANgIADAELIAJB4AFqIAEQpAwgAigC4AEhAQJAAkACQCACLQDkASIDQX5qDgICAAELIABBlYCAgHg2AgAgACABNgIEDAILIAIgA0EBcToA1AEgAiABNgLQASACQegAakEAENMfAkACQANAIAJBEGogAkHQAWoQyREgAigCECIDQQJGDQEgAigCFCEBAkACQCADQQFxDQAgAkHgAWogARDQASACKALkASEBIAIoAuABIgNBlYCAgHhHDQELIABBlYCAgHg2AgAgACABNgIEIAJB6ABqEOAqDAMLIAIgAikD6AE3A5gBIAIgATYClAEgAiADNgKQASACQegAaiACQZABahDPGwwACwsgAkGVgICAeDYCkAEgAkGQAWoQmSkgAEGUgICAeDYCACAAQQxqIAJB8ABqKAIANgIAIAAgAikCaDcCBAsgAigC0AEQ1yoMAQsgACACQcABahC1IgsgAigCwAEQ1yoMBgsgARDcLUUNAxATIgMgARDQLCEEIAMQ1yoCQCAERQ0AIAEQFEUNBAsgAiABNgJgIAJB4AFqIAEQpAwgAigC4AEhAwJAAkACQCACLQDkASIEQX5qDgICAAELIABBlYCAgHg2AgAgACADNgIEDAYLIAIgBDoAzAEgAiADNgLIASACQQA2AsABIAJBtAFqQQAQ0h8gAkHwAWohBSACQcABakEIaiEGAkADQCACQSBqIAYQyRFBlYCAgHghAwJAIAIoAiAiB0ECRg0AIAIoAiQhBAJAAkAgB0EBcQ0AIAJBGGogBBD0JCACKAIYIQMgAigCHCEEIAIoAsABIAIoAsQBENQrIAIgBDYCxAEgAkEBNgLAASACQZABaiADENABIAIoApQBIQQgAigCkAEiA0GVgICAeEYNACACIAIpA5gBIgg3A3AgAiAENgJsIAIgAzYCaCACQZABaiACQcABahDcJiACKAKQAUGVgICAeEcNASACKAKUASEEIAJB6ABqEMsVCyAAQZWAgIB4NgIAIAAgBDYCBCACQbQBahDfKgwDCyACQdABakEIaiACQZABakEIaikDADcDACACIAIpA5ABNwPQAQsgBSACKQPQATcDACAFQQhqIAJB0AFqQQhqKQMANwMAIAIgCDcD6AEgAiAENgLkASACIAM2AuABAkAgA0GVgICAeEYNACACQbQBaiACQeABahDCFAwBCwsgAkHgAWoQ4CYgAEEIaiACQbQBakEIaigCADYCACAAIAIpArQBNwIACyACKALIARDXKiACKALAASACKALEARDUKwwFCyACQShqIAEQmSMCQCACKAIoQQFxRQ0AIAIgAigCLCIDNgJkIAIgAxAEIgM2AnggAkEANgJ0IAJBADYCfCACQQA2AmggAiACQeQAajYCcCACQYQBaiADQYCAAiADQYCAAkkbENIfIAJB4AFqQRBqIQMCQAJAAkADQCACQbQBaiACQegAahCiFSACKAK0AUEBRw0BIAIoArwBIQQgAkHQAWogAigCuAEQ0AECQAJAAkAgAigC0AFBlYCAgHhHDQAgAigC1AEhAyAEENcqDAELIAJBwAFqQQhqIgUgAkHQAWpBCGoiBykDADcDACACIAIpA9ABNwPAASACQdABaiAEENABAkAgAigC0AFBlYCAgHhHDQAgAigC1AEhAyACQcABahCREwwBCyADIAIpA9ABNwMAIANBCGogBykDADcDACACQZABakEIaiAFKQMANwMAIAJBkAFqQRBqIAMpAwA3AwAgAkGQAWpBGGogAkHgAWpBGGopAwA3AwAgAiACKQPAASIINwPgASACIAg3A5ABIAinIgRBloCAgHhHDQEgAigClAEhAwsgAEGVgICAeDYCACAAIAM2AgQgAkGEAWoQ3yoMBAsgBEGVgICAeEYNAiAC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AToApAEgAiACQcgBajYCQCACIAJBsAFqNgLIASACIAJBpAFqNgKwASACQfgCaiACQThqEPQaIAJBjANqIAJBxAFqKAIANgIAIAIgAikCvAE3AoQDIAYgBSACQfgCahDXGiEFIAEtAOABQaIBRw0PIAEgARCXLBCfFwwPCyABEKALIAJBOGogARDYDiACKAJAIQUgAikDOCIKUA0OIAIoAkQhA0EAIQQgAS0AkQFBIHFFDQ0gASgCiAEhByACQfABaiABEN4BIAEgASgCiAFBAXIQnxICQAJAAkACQAJAIAEtAOABQdkARg0AIAEoAtwBIQQgASgC2AEhCCACQcgBaiABEM0mIAJBATYCPCACQci+nAE2AjggAkIBNwJEIAJBswc2ArQBIAJB2QA6AOgBIAIgAkGwAWo2AkAgAiACQeABajYCsAEgAiACQegBajYC4AEgAkH4AmogAkE4ahD0GiACQYwDaiACQdABaigCADYCACACIAIpAsgBNwKEAyAIIAQgAkH4AmoQ1xohBAJAIAEtAOABQaIBRw0AIAEgARCXLBCfFwsgAiAENgKoAUEBIQggAkEBNgKkASACQagBaiEEDAELIAEQoAsgAkEoaiABEMADIAIgAigCLCIENgI8IAIgAigCKCIINgI4AkAgASgCiAEiCUGAgIDAAHENACABLQDgAUH/AXFBCkcNACACQThqQQRqIQQgCA0CIAQQ9AYMAwsgAiAENgKoASACIAg2AqQBIAhBAXFFDQMgAkGkAWpBBGohBAsgASACQfABahDHBQJAIAgNACAEEJ4rDBALIAQQ5wcMDwsgBBDnBwsgASACQfABahDHBQwNCyABIAlBfnEgB0EBcXIQnxIgAkHwAWoQjyYMDQtBASEEIAJBOGogAUGEqZwBQQFBABDCBCACKAI8IQUgAigCOA0JIAJBCGogARBQIAIoAgwhBiACKAIIQQFxDQpBACEEIAVBAEchCQNAIAEtAOEBDQsgAS0A4AFB/wFxQQRHDQsgARCgCwJAAkAgAS0A4AFBBUYNACACIAEQvxIgAigCBCEFAkAgAigCAEEBcQ0AIAIgBTYCpAEgAS0A4AFBBUYNAiACIAY2AuABIAEoAtgBIQUgASgC3AEhBCACQcgBaiABEM0mIAJBATYCPCACQci+nAE2AjggAkIBNwJEIAJBswc2AsABIAJB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KAIQIgEQswEgAUHAAEEIEKwWIAAoAggiASAAKAIMEJoSIAAoAgQgARCgLQ8LIAAoAgQiABCzASAAQcAAQQgQrBYPCyAAKAIEIgBBzABqIgEoAgAgAEHQAGooAgAQlyUgACgCSCABKAIAEJktAkACQAJAIAAoAgBBeWoOAgECAAsgABCACwsgAEEsaiIBKAIAIABBMGooAgAQlyUgACgCKCABKAIAEJktCwJAIAAoAmBBgICAgHhGDQAgAEHkAGoiASgCACAAQegAaigCABCXJSAAKAJgIAEoAgAQmS0LIABBgAFBCBCsFg8LIAAoAgQiARCzASABQcAAQQgQrBYgACgCCCIAENsBIABBMEEIEKwWDwsgACgCBCIBELMBIAFBwABBCBCsFiAAKAIIIgAQ2wEgAEEwQQgQrBYPCwJAIAAoAgQiAkECRg0AIAAoAgghAQJAIAINACABQQRqIgIoAgAgAUEIaigCABClHiABKAIAIAIoAgAQny0gAUEcQQQQrBYMAQsgARCzASABQcAAQQgQrBYLAkAgACgCGCIBRQ0AIAEQswEgAUHAAEEIEKwWCwJAIAAoAhwiAUUNACABELMBIAFBwABBCBCsFgsgACgCDCIAENsBIABBMEEIEKwWDwsgACgCBCAAKAIIELsUIAAoAgwiARCzASABQcAAQQgQrBYgACgCECIAENsBIABBMEEIEKwWDwsgACgCBCAAKAIIELsUIAAoAgwiARCzASABQcAAQQgQrBYgACgCECIAENsBIABBMEEIEKwWDwsCQAJAAkACQAJAAkACQAJAIAAoAggOCAECAwQFBgcAAQsgACgCDCIAQQhqIQECQAJAIAAoAgANACABKQMAIgNCA4NCAFINASADpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMAkDAELIAEQwRMLAkAgAC0ARSIBQQNGDQACQCABQQJHDQAgAEEkaiIBKAIAIABBKGooAgAQlCUgACgCICABKAIAEJ8tDAELAkAgACkDKCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDAJAsgAEHAAGoQ6xILIABB2ABBCBCsFg8LAkAgACkDECIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDAJAsgACgCKCIAQQRqIgEoAgAgAEEIaigCABDnIiAAKAIAIAEoAgAQly0gAEEMahD8ASAAKAIMIABBEGooAgAQni0CQCAAKAIwIgFFDQAgARCzASABQcAAQQgQrBYLAkAgACgCNCIBRQ0AIAEQyQ8gASgCACABQQRqKAIAEJktIAFBFEEEEKwWCwJAIAAoAjgiAUUNACABELEfIAEoAgAgAUEEaigCABCcLSABQRRBBBCsFgsgAEEcaiIBKAIAIABBIGooAgAQ+w8gACgCGCABKAIAEJstIABBwABBBBCsFg8LAkAgACkDECIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDAJAsgACgCKBDWDQ8LIAAoAgwiAEEEaiIBKAIAIABBCGooAgAQpR4gACgCACABKAIAEJ8tIABBHEEEEKwWDwsgACgCDCIAQQRqIgEoAgAgAEEIaigCABClHiAAKAIAIAEoAgAQny0gAEEYQQQQrBYPCwJAIAAoAgwiACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDAJAsCQCAAKAIgIgFFDQAgARDJDyABKAIAIAFBBGooAgAQmS0gAUEUQQQQrBYLIABBPGoiASgCACAAQcAAaigCABD7DyAAKAI4IAEoAgAQmy0gAEEoaiIBKAIAIABBLGooAgAQliUgACgCJCABKAIAEJ8tIABByABBCBCsFg8LAkAgACgCDCIAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMAkCwJAIAAoAiAiAUUNACABEMkPIAEoAgAgAUEEaigCABCZLSABQRRBBBCsFgsgACgCJCIBEOEDIAFB4ABBCBCsFiAAQTBBCBCsFg8LAkAgACgCDCIAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMAkCyAAQSBqEMsQIAAoAiAgAEEkaigCABCZLSAAQTBBCBCsFg8LC6cQAgh/An4jAEGwAWsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAItAOABIgRBsH9qDgIBAgALIARB3QBHDQIgA0HgAGpBCGogAUEIaigCADYCACADIAEpAgA3A2AgA0EYaiACIANB4ABqEJ0sAkACQAJAIAMoAhgiBEEIRg0AIANBGGpBCGohBSADKAI4IQIgBEEBRw0BIAEoAgwhASADQeAAakEIaiACQQhqKAIANgIAIANB4ABqQRRqIAJBFGooAgA2AgAgA0HgAGpBIGogAkEgaikCADcDACADQeAAakEoaiACQShqKQIANwMAIAMgAikCADcDYCADIAIpAgw3AmwgAyACKQIYNwN4IAEoAgAhBiACKQI0IQsgAikCPCEMIAIvAUQhB0HIAEEEEJYqIQECQEEwRQ0AIAEgA0HgAGpBMPwKAAALIAEgBzsBRCABIAw3AjwgASALNwI0IAEgBjYCMCADQcgAakEIaiAFQQhqKQMANwMAIANByABqQRBqIAVBEGopAwA3AwAgAyAFKQMANwNIIAIQhi9BASEGDAILIAMoAhwhAiAAQQk2AgAgACACNgIEDAwLIAMtADwhBiADQcgAakEIaiAFQQhqKQMANwMAIANByABqQRBqIAVBEGopAwA3AwAgA0HGAGogA0E/ai0AADoAACADIAMvAD07AUQgAyAFKQMANwNIIAMoAhwhBSACIQELIAAgBTYCBCAAIAQ2AgAgACADKQNINwMIIAAgBjoAJCAAIAE2AiAgACADLwFEOwAlIABBEGogA0HQAGopAwA3AwAgAEEYaiADQcgAakEQaikDADcDACAAQSdqIANBxgBqLQAAOgAADAoLIANB4ABqIAIgASgCECgCACIEIAQgAUEAEIoEAkACQAJAIAMoAmAiBEEIRg0AIANB4ABqQQhqIQUgAygCgAEhAiAEDQEgASgCDCEBIANBGGpBCGogAkEIaigCADYCACADQRhqQRRqIAJBFGooAgA2AgAgA0EYakEgaiACQSBqKAIANgIAIAMgAikCADcDGCADIAIpAgw3AiQgAyACKQIYNwMwIAEoAgAhBiACKQIoIQsgAikCMCEMIAIoAjghByACLQA8IQhBwABBBBCWKiEBAkBBJEUNACABIANBGGpBJPwKAAALIAEgCDoAPCABIAc2AjggASAMNwIwIAEgCzcCKCABIAY2AiQgA0GYAWpBCGogBUEIaikDADcDACADQZgBakEQaiAFQRBqKQMANwMAIAMgBSkDADcDmAEgAhCHL0EBIQYMAgsgAygCZCECIABBCTYCACAAIAI2AgQMCwsgAy0AhAEhBiADQZgBakEI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BAtBASEEQQIhC0EAIQwLAkACQCAFKAIAIAlGDQAgARD2D0H9AEYNAQsgA0GMAmogBUEIaigCADYCACADQfgBakEIaiIGIANBEGpBCGooAgA2AgAgAyADKQMQNwP4ASADIAUpAgA3AoQCIABBHGogASgCBCAJEIQUIABBGjYCACAAIAMpA/gBNwIoIABBMGogBikDADcCACAAQThqIANBiAJqKQMANwIADAMLQQEhDgJAIAEQziRFDQAgARD2D0E/Rw0AIAEQjAsaQQAhDgsgA0HgAWpBFGogBUEIaiIPKAIANgIAIANB4AFqQQhqIhAgA0EQakEIaigCADYCACADIAMpAxA3A+ABIAMgBSkCADcC7AECQCAMIAogDU1yDQAgAEEcaiABKAIEIAkQhBQgAEEYNgIAIAAgAykD4AE3AiggAEEwaiAQKQMANwIAIABBOGogA0HwAWopAwA3AgAMAwsgA0GgAWpBFGogDygCADYCACADQfgBakEUaiAQKQMANwIAIANBlAJqIANB4AFqQRBqKQMANwIAIANBoAFqQQhqIgQgBiAHELcWIgFBCGooAgA2AgAgAyAFKQIANwKsASADIAEpAgA3A6ABIAMgAykD4AE3AoQCQQgQ6yciASAHNgIEIAEgBjYCACADQagCaiAEKQMANwIAIANBsAJqIANBoAFqQRBqKQMANwIAIAMgDjoAuAIgAyANNgKAAiADIAo2AvwBIAMgCzYC+AEgAyABNgKcAiADIAMpA6ABNwKgAiACQQggA0H4AWoQ7SZB8MGEARCAHwJAQSRFDQAgAEEEaiACQST8CgAACyAAQSI2AgAMBQsgACANNgIAC0EAIQRBACEICyAIRQ0AIARFDQAgAygCKEEiRg0AIAMoAkQgAygCSBCDLQsgA0EgahDkCwsgAhDiKgsgA0HAAmokAAuWEAIVfwF+IwBBsAJrIgIkACABKALYASEDIAEQoAsgAkEYakEIQQhBOEHg3ZsBEKMaIAJBADYCLCACIAIoAhwiBDYCKCACIAIoAhg2AiQgAkHoAWpBCGohBSACQegBakEEaiEGIAJBMGpBEGohByACQegBakEEciEIIAJByAFqQQhqIQkgAkEwakEIaiEKIAJBMGpBBHIhCyABLQDgASEMQQAhDUEAIQ4DQCANQThsIQ8CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQCAMQf8BcSIMQQNGDQAgASgC2AEhEAJAIAxBHEYNACACQegBaiABEPsgIAIoAuwBIREgAigC6AEiDEEFRg0LIAkgBSkDADcDACAJQRBqIAVBEGoiEikDADcDACAJQQhqIAVBCGoiEykDADcDACACIBE2AswBIAIgDDYCyAECQAJAAkAgAS0A4AEiFEEJRg0AIAwNAUEAIRECQCAUQRdHDQAgARCgCyACQRBqIAEQyRMgAigCFCERIAIoAhBBAXENAwsgASgC1AEhDCAHIAkQ2SQgAiARNgJgIAIgDDYCPCACIBA2AjhBASERIAJBATYCMAwMCyABEKALIAJB6AFqIAEQkgggAigC7AEhESACKALoASIQQQdGDQQgAkGQAmpBGGoiFCAFQRhqKQMANwMAIAJBkAJqQRBqIhUgEikDADcDACACQZACakEIaiISIBMpAwA3AwAgAiAFKQMANwOQAkEoEKkrIgwgETYCBCAMIBA2AgAgDCACKQOQAjcDCCAMQRBqIBIpAwA3AwAgDEEYaiAVKQMANwMAIAxBIGogFCkDADcDACAGQRhqIAJByAFqQRhqKQMANwIAIAZBEGogAkHIAWpBEGopAwA3AgAgBkEIaiAJKQMANwIAIAYgAikDyAE3AgBBACERIAJBADYCMAJAQSRFDQAgCyACQegBakEk/AoAAAsgAiAMNgJYDAsLIAggARDNJiACQQ02AvwBIAJB+aucATYC+AEgAkGwgICAeDYC6AEgASgC2AEgASgC3AEgAkHoAWoQ1xohBSABLQDgAUGiAUYNBwwICyACKQPQARC/IQwLCyABEKALIAEoAtQBIRQgAkHoAWogAUEAENECIAIoAuwBIREgAigC6AEiEkEHRg0KIAJBqAFqQRhqIhMgBUEYaikDADcDACACQagBakEQaiIVIAVBEGopAwA3AwAgAkGoAWpBCGoiFiAFQQhqKQMANwMAIAIgBSkDADcDqAFBKBCpKyIMIBE2AgQgDCASNgIAIAwgAikDqAE3AwggDEEQaiAWKQMANwMAIAxBGGogFSkDADcDACAMQSBqIBMpAwA3AwAgAkEANgJIIAIgFDYCRCACIBA2AkAgAiAQNgI4IAIgDDYCNEECIREgAkECNgIwIAIgASgC1AE2AjwMCAsgARCgCyABKALUASEQIAJBMGpBCGogAkEk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aiIFIAJBiAJqQRhqKQIANwMAIAJByAFqQRhqIgYgAkGoAmooAgA2AgAgAiACKQKQAjcDyAEgAigCjAIhAQJAIAIoAogCIgdBIkYNACAAIAIpAqwCNwIoIABBwABqIAJBxAJqKAIANgIAIABBOGogAkG8AmopAgA3AgAgAEEwaiACQbQCaikCADcCACAAQSRqIAYoAgA2AgAgAEEcaiAFKQMANwIAIABBFGogAkHQAWopAwA3AgAgACACKQPIATcCDCAAIAE2AgggACAHNgIEIABBiIDEADYCACACQcAAahDsJwwECwJAQThFDQAgAkHIAmogAkHAAGpBOPwKAAALIAJBiAJqIAJByAJqIAMgBBDYCyACQegBakEIaiIGIAJBiAJqQRBqKQIANwMAIAJB6AFqQRBqIgcgAkGIAmpBGGopAgA3AwAgAkHoAWpBGGoiCCACQagCaigCADYCACACIAIpApACNwPoASACKAKMAiEFAkAgAigCiAIiCUEiRg0AIAAgAikCrAI3AiggAEHAAGogAkHEAmooAgA2AgAgAEE4aiACQbwCaikCADcCACAAQTBqIAJBtAJqKQIANwIAIABBJGogCCgCADYCACAAQRxqIAcpAwA3AgAgAEEUaiAGKQMANwIAIAAgAikD6AE3AgwgACAFNgIIIAAgCTYCBCAAQYiAxAA2AgAMBAsgAkH4AGpBCGogBikDADcDACACQfgAakEQaiAHKQMANwMAIAJB+ABqQRhqIAgoAgA2AgAgAkH4AGpBJGogAkGwAWpBCGopAwA3AgAgAkGkAWogAkGwAWpBEGopAwA3AgAgAiACKQPoATcDeCACIAIpA7ABNwKUAQJAIAEgBU0NACAAQSBqIAMgBBCEFCAAQoiAxIAgNwIAIAAgAikDsAE3AiwgAEE0aiACQbgBaikDADcCACAAQTxqIAJBwAFqKQMANwIADAQLIABBBGoiAyACKQPIATcCACADQRhqIAJByAFqQRhqKAIANgIAIANBEGogAkHIAWpBEGopAwA3AgAgA0EIaiACQcgBakEIaikDADcCAAJAQTRFDQAgAEEkaiACQfgAakE0/AoAAAsgACAFNgIgIAAgATYCAAwDCyAAQQRqIAEQ+gkgAEGIgMQANgIACyACQQhqEOwnDAELIAJBLGohBSACQQhqQQRqIQMCQAJAAkACQCACKAIIIgdB/v///wdqIgZBBCAGQQRJGw4FAQAAAgMACyACQZQCaiADQQhqKQIANwIAIAJBnAJqIANBEGopAgA3AgAgAkGkAmogA0EYaikCADcCACACQbQCaiAFQQhqKQIANwIAIAJBiAJqQTRqIAVBEGooAgA2AgAgAiAHNgKIAiACIAMpAgA3AowCIAIgBSkCADcCrAIgAkHIAmpBEGoiBSACQYgCahDQJCIDQRBqKQIANwMAIAJByAJqQQhqIgYgA0EIaikCADcDACACIAMpAgA3A8gCIABBIGogASgCBCAEEIQUIABBATYCBCAAIAIpA8gCNwIsIABBNGogBikDADcCACAAQTxqIAUpAwA3AgAgAEGIgMQANgIAIAJBiAJqEOwnDAMLIABBgYDEADYCACAAIAMpAgA3AgQgAEEcaiADQRhqKQIANwIAIABBFGogA0EQaikCADcCACAAQQxqIANBCGopAgA3AgAMAgsgAEGFgMQANgIAIAAgAykCADcCBCAAQRxqIANBGGooAgA2AgAgAEEUaiADQRBqKQIANwIAIABBDGogA0EIaikCADcCAAwBCyAAIAc2AgQgAEGEgMQANgIAIAAgAykCADcCCCAAIAUpAgA3AiggAEEQaiADQQhqKQIANwIAIABBGGogA0EQaikCADcCACAAQSBqIANBGGopAgA3AgAgAEEwaiAFQQhqKQIANwIAIABBOGogBUEQaigCADYCAAsgAkGAA2okAAvIDwEMfyMAQRBrIgMkAEEAIQQgAkEANgIAAkAgASgCACIFIAEoAgQiBksNACACQQRqIQcCQAJAAkACQAJAAkAgACgCKCIIRQ0AIAEtABBBAUcNAQsCQAJAIAIoAhBBAUcNACACKAIUIQkgAigCGA0BIAIoAiAhBQwECwJAAkAgAS0AEEEBRw0AIAAoAtQCIgkNARCJMCEEDAgLIAAoAtACIglFDQYLIAkgACgCzAJLDQJBACEEIAIoAhxBACACKAIYGyIIIABBEGoiCigCACAAQRRqIgsoAgAgCSAAKAI8dkF+akHguoMBELwlKAIITw0CIAJBATYCGCACIAhBAWo2AhwgCigCACALKAIAIAkgACgCPHZBfmpBwLqDARC8JSIJKAIEIAkoAgggCBC9JSgCACEJIAMgCSAFIABBHGooAgAgAEEgaigCACAJQbC6gwEQ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IAIgAikDUDcDeCACIAEQ9g8iBjYClAEgARCMCxoCQAJAIAZBKUYNACAGQTpHDQEgACAENgIMIAAgCDYCCCAAIAk2AgQgACACKQN4NwIQIABBGGogAkH4AGpBCGopAwA3AgAgAEEgaiACQfgAakEQaikDADcCACACQcQBaiADQQhqKAIAIgE2AgAgAkGwAWpBCGogATYCACACIAMpAgAiCzcCvAEgAiALNwOwASACQQhqIAJBsAFqEIEfIAIoAgwhA0EIEOsnIgEgAzYCBCABQQA2AgAgACABNgIsIABBgoCAgHg2AgAgACACKQIgNwIwIABBOGogAkEgakEIaikCADcCACAAQcAAaiACQSBqQRBqKQIANwIADAYLAkAgBEUNACACQawBaiADQQhqKAIANgIAIAAgAikDeDcCECAAIAQ2AgwgACAINgIIIAAgCTYCBCAAQYOAgIB4NgIAIAJBmAFqQQhqIgEgAkEgakEIaigCADYCACAAQRhqIAJB+ABqQQhqKQMANwIAIABBIGogAkH4AGpBEGopAwA3AgAgAiADKQIANwKkASACIAIpAiA3A5gBIABBOGogAkGYAWpBEGopAwA3AgAgAEEwaiABKQMANwIAIAAgAikDmAE3AigMBgsgAEEgaiABKAIEIAUQhBQgAEKEgICAuAM3AgAgACACKQM4NwIsIABBNGogAkHAAGopAwA3AgAgAEE8aiACQcgAaikDADcCACAJIAgQ8iwMBQsgAkEANgKwASACQZQBakG8woQBIAJBsAFqQcDChAEQsCEACyACQbABaiABIAQQ8gEgAigCsAEhAQJAQShFDQAgAkHQAGogAkG0AWpBKPwKAAALAkAgAUEiRg0AIAAgAikC3AE3AjAgAEHAAGogAkHsAWooAgA2AgAgAEE4aiACQeQBaikCADcCAAJAQShFDQAgAEEIaiACQdAAakEo/AoAAAsgAEGEgICAeDYCACAAIAE2AgQMBAsCQEEoRQ0AIAAgAkHQAGpBKPwKAAALIAJBxAFqIANBCGooAgAiATYCACACQbABakEIaiABNgIAIAIgAykCACILNwK8ASACIAs3A7ABIAIgAkGwAWoQgR8gAigCBCEDQQgQ6yciASADNgIEIAFBADYCACAAIAE2AiwgACAFOgAoIAAgAikCIDcCMCAAQThqIAJBIGpBCGopAgA3AgAgAEHAAGogAkEwaikCADcCAAwDCyACQQA2ArABIAJBHGpBmLyEASACQbABakHQwoQBELAhAAsgAkGwAWpBCGoiAyACQSBqQQhqKAIANgIAIAJBxAFqIAEoAgAiBEHYAGooAgA2AgAgAiACKQIgNwOwASACIAQpAlA3ArwBIABBIGogASgCBCABKAIIEIQUIABBITYCBCAAIAIpA7ABNwIsIABBNGogAykDADcCACAAQTxqIAJBwAFqKQMANwIAIABBhICAgHg2AgAMAQsgAEEgaiABKAIEIAQQhBQgAEKEgICA2AI3AgAgACACKQIgNwIsIABBNGogAkEoaikCADcCACAAQTxqIAJBMGopAgA3AgALIAJB8AFqJAAL4xABCn8jAEHAAWsiAyQAAkACQCABKAIAIgQtABQiBUECRg0AIAVBAXENACAAIAEoAgQgASgCCBCGFCAAQQA6ACQgACACKQIcNwIMIABBFGogAkEkaikCADcCACAAQRxqIAJBLGopAgA3AgAMAQsCQAJAAkACQAJAAkACQCACKAIAQYCAgIB4cyIFQQIgBUECSRsOAwIAAQILIANB8ABqIAIoAgggAigCDBDBCCACQRxqIQYMAgsgAigCFCEFIAIoAhAhByADQagBaiACKAIEIAIoAggQvwUgA0G0AWogByAFEL8FIANBmAFqIAMoAqwBIgcgAygCsAEQrQwgAkEcaiEGAkACQCADLQCYAUEBRg0AAkAgAygCnAEiCA0AQQAhBQwCCwJAAkAgCCADKAKgASIJQfSGiAFBEBDkJQ0AAkAgCCAJQYSHiAFBBhDkJQ0AIANBmAFqIAggCRCuDCADLQCYAQ0DQQEhBSADKAKcASIKRQ0EIANBMGogCiADKAKgASADKAK4ASILIAMoArwBEPQOIAMoAjAiCkUNBCADKAI0IQxBAyEFDAILIANBmAFqIAMoArgBIgsgAygCvAEQmhMgAy0AmAENAgJAIAMoApwBIghFDQAgAygCoAEhCUECIQUMAgtBASEFDAMLIANBmAFqIAMoArgBIgsgAygCvAEQlQwgAy0AmAENAUEBIQUgAygCnAEiCEUNAiADKAKgASEJCyADIAw2AoABIAMgCjYCfCADIAk2AnggAyAINgJ0IAMgBTYCcCADKAK0ASALEMYvIAMoAqgBIAcQxi8MAwsgAy0AmQEh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IBM3AxggAEEcaiABKAIEIAcQhBQgAEEUNgIAIAAgAykDGDcCKCAAQTBqIAopAwA3AgAgAEE4aiADQShqKQMANwIADAMLIANBADYCGCADQRRqQeDChAEgA0EYakH0woQBELAhAAsgA0EYaiADKAIIIAEQhBQCQAJAIAQoAjANACADKAIgIQ4gAygCHCENIAMoAhghESAEQX82AjACQCAEKAI8IgENAEEAIQEMAgsgBCgCOCESQQAhCgNAAkAgAUEBSw0AAkAgDSAOIBIgCkEobGoiAUEEaigCACABQQhqKAIAENoiQf8BcSILRQ0AIAogC0H/AUZqIQEMBAsgA0HoAGoiCiABQRxqKQIANwMAIANB2ABqQQhqIgsgAUEUaikCADcDACADIAEpAgw3A1ggA0EYakEcaiAQIAcQhBQgA0EYakEUaiAKKQMANwIAIANBJGogCykDADcCACADIBM3AlAgAyAPNgJMIAMgCDYCSCADIAk2AkQgAyAGNgJAIAMgAykDWDcCHCAEIAQoAjBBAWo2AjACQEE8RQ0AIABBBGogA0EYakEEakE8/AoAAAsgAEERNgIAIBEgDRCDLQwFCyABQQF2IgUgCmohCyAKIAsgDSAOIBIgC0EobGoiDEEEaigCACAMQQhqKAIAENoiQf8BcUEBRhshCiABIAVrIQEMAAsLQbi5hAEQyRoACyADIBM3AnQgAyAPNgJwIAMgCDYCbCADIAk2AmggAyAGNgJkIANB2ABqIA0gDhCnFyADIAI2AnwCQCAEKAI8IgogAUkNAAJAIAogBEE0aiILKAIARw0AIAsQoxwLIAQoAjggAUEobGohCwJAIAogAU0NACAKIAFrQShsIgFFDQAgC0EoaiALIAH8CgAACwJAQShFDQAgCyADQdgAakEo/AoAAAsgBCAKQQFqNgI8IAQgBCgCMEEBajYCMCAAIAI2AiggACATNwIgIAAgDzYCHCAAIAg2AhggACAJNgIUIAAgBjYCECAAIA42AgwgACANNgIIIAAgETYCBCAAQSI2AgAMAgsgASAKQci5hAEQkhUACyADQRhqQRRqIAVBCGooAgAiBDYCACADQRhqQQhqIgogBDYCACADIAUpAgAiEzcCJCADIBM3AxggAEEcaiABKAIEIAYQhBQgAEEUNgIAIAAgAykDGDcCKCAAQTBqIAopAwA3AgAg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GCEMIAcgCkIZiKciCToAACADIAQoAlAgBkF4anFqQQhqIAk6AAAgBCAEKAJYQQFqNgJYIAQgBCgCVCAIQQFxazYCVCADIAZBBHRrQXBqIgMgDDcDCCADIAs3AwAgBRD2JCAEQQRqIgMQ3SUgBCgCCCAAIAQoAgwoAgwRBgAgAxD2JCAAKAIEIgItAExBDHFBBEYNASAELQBfQQFGDQMgBCAEKAIAQQFqNgIAIAAoAgQhAgwBCyAFEPYkCyACQQc6AEwLIAFBkAFqJAAPCyABQQA2AiAgAUEBNgIUIAFBsOKYATYCECABQgQ3AhggAUEQakG44pgBEOIjAAuKDwENfyMAQaABayIDJAACQAJAIAEtAJABQQRxDQAgAEEANgIIIABCgICAgMAANwIADAELIANBADYCLCADQoCAgIDAADcCJCADQdAAakEMaiEEIANBiAFqQQxqIQUgASgC2AEhBkEAIQcCQAJAAkADQAJAAkACQAJAAkACQCABLQDgASIIQRhGDQAgB0UNASAIQdgARw0JIAEoAogBIgdBgIAIcUUNAgwJCyABKALYASEJIAEQoAsCQCABLQDgAUUNACADQYgBaiABQQBBABDKAwJAIAMtAJwBQQJHDQAgAygCiAEhCAwICyADQdAAakEQaiADQYgBakEQaikDADcDACADQdAAakEIaiADQYgBakEIaikDADcDACADIAMpA4gBNwNQQcAAQQgQpyoiB0EaNgIAAkBBOEUNACAHQQhqIANB0ABqQTj8CgAACyADQQU6AFggAyAHNgJQIANBGGogASADQdAAakEAQQEQYiADKAIcIQggAygCGEEBcQ0HDAULIAEQoAsgA0EQaiABEPsJIAMoAhQhCCADKAIQQQFxDQYgAyAINgIwIAEtAOABQQFGDQIgASgC3AEhByABKALYASEIIANBNGogARDNJiADQQE2AlQgA0HIvpwBNgJQIANCATcCXCADQbMHNgJEIANBAToATyADIANBwABqNgJYIAMgA0HIAGo2AkAgAyADQc8AajYCSCADQYgBaiADQdAAahCNECAFQQhqIANBNGpBCGooAgA2AgAgBSADKQI0NwIAIAggByADQYgBahDXGiEIIAEtAOABQaIBRw0DIAEgARCXLBCfFwwDCyAAIAMpAiQ3AgAgAEEIaiADQSRqQQhqKAIANgIADAgL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ATYCpAEgAkHIvpwBNgKgASACQgE3AqwBIAJBswc2AlggAkHwADoA+AEgAiACQdQAajYCqAEgAiACQfABajYCVCACIAJB+AFqNgLwASACQegAaiACQaABahD0GiACQfwAaiACQcQAaigCADYCACACIAIpAjw3AnQgAyAEIAJB6ABqENcaIQQgAS0A4AFBogFHDQIMAQsgARCgCwJAIAEtAOABQQlGDQAgASgC3AEhBCABKALYASEDIAJByABqIAEQzSYgAkEBNgKkASACQci+nAE2AqABIAJCATcCrAEgAkGzBzYCWCACQQk6APgBIAIgAkHUAGo2AqgBIAIgAkHwAWo2AlQgAiACQfgBajYC8AEgAkHoAGogAkGgAWoQ9BogAkH8AGogAkHQAGooAgA2AgAgAiACKQJINwJ0IAMgBCACQegAahDXGiEEIAEtAOABQaIBRg0BDAILIAEQoAsgAkGgAWogARClICACKAKkASEEIAIoAqABIgVBMkYNAQJAQThFDQAgAkHoAGogAkGoAWpBOPwKAAALAkACQCAFQQ5HDQAgAkHgAGogAkHwAGopAwA3AgAgAiACKQNoNwJYIAIgBDYCVAJAIAEtAOABIgRBB0cNACABEKALIAEtAOABIQQLAkAgBEH/AXFBA0YNACABKALcASEEIAEoAtgBIQMgAkHkAWogARDNJiACQQE2AqQBIAJByL6cATYCoAEgAkIBNwKsASACQbMHNgL0ASACQQM6AP8BIAIgAkHwAWo2AqgBIAIgAkH4AWo2AvABIAIgAkH/AWo2AvgBIAJB6ABqIAJBoAFqEPQaIAJB/ABqIAJB7AFqKAIANgIAIAIgAikC5AE3AnQgAyAEIAJB6ABqENcaIQQgAS0A4AFBogFHDQIgASABEJcsEJ8XDAILIAEQoAsgASgC1AEhB0EUQQQQlioiBUEQaiACQdQAakEQaigCADYCACAFQQhqIAJB1ABqQQhqKQIANwIAIAUgAikCVDcCACABLQDgASEEDAULQcu4nAFBKEGs1ZsBEMweAAsgAkHUAGoQ8ioMAQsgASABEJcsEJ8XCyAAQQQ6ADQgACAENgIADAILCwJAAkACQAJAAkACQCAEQf8BcUEBRg0AIAEoAtwBIQQgASgC2AEhAyACQTBqIAEQzSYgAkEBNgKkASACQci+nAE2AqABIAJCATcCrAEgAkGzBzYCWCACQQE6AEggAiACQdQAajYCqAEgAiACQeQBajYCVCACIAJByABqNgLkASACQegAaiACQaABahD0GiACQfwAaiACQThqKAIANgIAIAIgAikCMDcCdCADIAQgAkHoAGoQ1xohBCABLQDgAUGiAUYNAQwECyABEKALAkAgAS0A4AEiBEEIRg0AIAJBAzoAfAwDCyABEKALIAJBoAFqIAFBABDCBSACKAKgASEEIAItALQBIghBA0YNASACQegAakEMaiACQaABakEMaikCADcCACACQegAakEXaiACQaABakEXai0AADoAACACIAIpAqQBNwJsIAIgAi8AtQE7AH0gAiAIOgB8IAIgBDYCaCABLQDgASEEDAILIAEgARCXLBCfFwwCCyAAQQQ6ADQgACAENgIADAILQQAhCAJAIARB/wFxQRJHDQAgAiABELATIAIoAgQhCAJAIAIoAgBBAXFFDQAgAEEEOgA0IAAgCDYCACACQegAahCVKgwDCyABEKALCyAAIAIpAxg3AwggACACKQNoNwMgIAAgBzYCRCAAIAY2AkAgACAFNgI8IAAgCDYCOCAAIAM2AgAgACABKALUATYCBCAAQRBqIAJBGGpBCGopAwA3AwAgAEEYaiACQRhqQRBqKQMANwMAIABBKGogAkHoAGpBCGopAwA3AwAgAEEwaiACQegAakEQaikDADcDAAwECyAAQQQ6ADQgACAENgIACyAFEK4oCyACKQMYIAIpAygQpy4MAQsgAEEEOgA0IAAgBDYCAAsgAkGAAmokAAvCDAEOfyMAQTBrIgYkACACQXxqIQcCQAJAAkADQAJAAkACQAJAIAFBIUkNACAEDQEgACABIAIgA0EBEOsCDAcLIAFBAkkNBiADIAFBEGpJDQQgAUEBdiEIIAFBD0sNAQJAIAFBB00NACAAIAIQ6gwgACAIQQJ0IglqIAIgCWoQ6gxBBCEKDAYLIAIgACgCADYCACACIAhBAnQiCWogACAJaigCADYCAEEBIQoMBQsgACABQQN2IglBHGxqIQsgACAJQQR0aiEMAkACQCABQcAASQ0AIAAgDCALIAkQlhEhCgwBCyAAIAsgDCAAKAIAIgkgDCgCACINSSIKIA0gCygCACIISXMbIAogCSAISXMbIQoLIARBf2ohBCAGIAooAgAiCTYCFCAKIABr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CyACIAE2AlAgACACQcgAahB0DAYLIAUgAigCXEHYu5wBEIUpCwALIAEgAigCXEGA6ZsBEIUpAAsgASACKAJcQYDpmwEQhSkACyAEIQYLAkACQAJAAkAgAw4CAAECCyAGRQ0BIAUNASAAELIaNgIYIABBADYCACABENsoDAILIAZFDQAgBUEBRw0AIAAgASkCADcCACAAQRhqIAFBGGooAgA2AgAgAEEQaiABQRBqKQIANwIAIABBCGogAUEIaikCADcCAAwBCyAAIAJBFGoQqwg2AhggAEEENgIAIAAgAikCFDcCBCAAQRRqIAJBJGooAgA2AgAgAEEMaiACQRxqKQIANwIADAELIAFBHEEEEKwWCyACQfAAaiQAC6sOAgV/An4jAEHgAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQXxqIgNBBCADQQdJGw4HAAECAwQFBgALIAEtADRBAUcNDCABKAIwEPUVIQMgAkHAAGpBGGpBACkDgISeASIHNwMAIAJBwABqQRBqQQApA/iDngEiCDcDACACQcAAakEIaiAHNwMAIAJBNGogAUE0aigCADYCACACQQhqIAc3AwAgAkEQaiAINwMAIAJBGGogBzcDACACIAg3A0AgAiABKQIsNwIsIAIgCDcDACABLQA4IQQgAS0APSEFIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAM2AiQgAiABNgIgIAIgBToAPSACIAQ6ADgCQCAAKAIcIgFFDQAgAi0ANEEBRw0AIAJBADoAOSACIAEQrAsgAkEBOgA6CwJAIAAoAgwiA0UNACACLQA0QQFHDQAgACgCCCEBIANBKGwhAwNAAkAgAi0ANEEBRw0AIAEgAhC2HgsgAUEoaiEBIANBWGoiAw0ACwsCQCAAKAIYIgFFDQAgAi0ANEEBRw0AIAIvADkhACACQYECOwA5IAEoAgAgAhDCASACIAA7ADkLIAIQrQogAkEQahDKCgwMCyABLQA0QQFHDQsgASgCMBD1FSEDIAJBwABqQRhqQQApA4CEngEiBzcDACACQcAAakEQakEAKQP4g54BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIAFBNGooAgA2AgAgAkEIaiAHNwMAIAJBEGogCDcDACACQRhqIAc3AwAgAiAINwNAIAIgASkC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QegAakEIaiADQdgAaigCADYCACACIAMpAlA3A2ggARD2DyIFQdwARg0BIAEQziQaQYCAgIB4IQcgAkHoAGohAQwDC0HgyYQBQTpBnMqEARDMHgALIAJBqAFqIAEQqA0gAEEcaiABKAIEIAEoAggQhBQgAEEfNgIAIAAgAikCqAE3AiggAEEwaiACQagBakEIaikCADcCACAAQThqIAJBuAFqKQIANwIADAQLIAMoAlAiCCABKAIIRg0CIAIgARD2DyIINgJkAkAgCEH9AEYNACACQQA2AqgBIAJB5ABqQcjGhAEgAkGoAWpB0MmEARCwIQALIAEQjAsaIAJBqAFqIAUoAgQiCSAFKAIIIgpBoOKbAUECENMCAkACQAJAIAIoAqgBQQFHDQAgAkGwAWohASACKALkASEFIAIoAuABIQggAigC3AEhByACKALYASELIAIoAswBQX9GDQEgAkGcAWogASALIAcgCCAFQQAQ4QYMAgtBACEMAkAgAi0AtgENACACKALcASELIAIoAtgBIQ0gAigCrAEhBSACLQC0ASEIAkADQCACQcgAaiAFIA0gCxCMGCACKAJIIgFFDQkgAigCTCEHIAIgATYC6AEgAiABIAdqNgLsASACQcAAaiACQegBahCfDAJAIAIoAkBBAXFFDQAgCEEBcQ0CQQEhCEEBIQECQCACKAJEIgdBgAFJDQBBAiEBIAdBgBBJDQBBA0EEIAdBgIAESRshAQsgASAFaiEFDAELCyAIQQFxRQ0BCyACIAU2AqABQQEhDAsgAiAMNgKcAQwBCyACQZwBaiABIAsgByAIIAVBARDhBgsCQCACKAKcAUUNACACQQhqIAkgCiACKAKgASIBQfDIhAEQihsgAkGcAWogAigCCCACKAIMEIQUQQIhCCACIAkgCiABQQJqQYDJhAEQtxogAkGoAWogAigCACACKAIEEIQUIAI1AqgBQiCGIAI1AqQBhCEOIAIpAqwBIQ8gAigCoAEhBSACKAKcASEHIAJB2ABqIQEMAgsgAkE4aiAJIApBOhCTCUEBIQgCQCACKAI4QQFxRQ0AIAJBGGogCSAKIAIoAjwiAUGQyYQBEIobIAJBnAFqIAIoAhggAigCHBCEFCACQRBqIAkgCiABQQFqQaDJhAEQtxogAkGoAWogAigCECACKAIUEIQUIAI1AqgBQiCGIAI1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EhMUFRYXGBkaGxwdHh8gIQALIAJBAjYCHCACQYjshwE2AhggAkIBNwIkIAJBCzYCFCACQdC+nAE2AhAgAiACQRBqNgIgIAEgAyACQRhqEIwpIQEMIQsgAkEANgIoIAJBATYCHCACQcjshwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMIAsgAkEANgIoIAJBATYCHCACQYzthwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMHwsgAkEANgIoIAJBATYCHCACQcDthwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMHgsgAkEANgIoIAJBATYCHCACQeDthwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMHQsgAkEANgIoIAJBATYCHCACQYDuhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMHAsgAkEANgIoIAJBATYCHCACQaDuhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMGwsgAkEANgIoIAJBATYCHCACQcTuhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMGgsgAkEANgIoIAJBATYCHCACQYDvhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMGQsgAkEANgIoIAJBATYCHCACQaTvhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMGAsgAkEANgIoIAJBATYCHCACQezvhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMFwsgAkEANgIoIAJBATYCHCACQZDwhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMFgsgAkEANgIoIAJBATYCHCACQbjwhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMFQsgAkEANgIoIAJBATYCHCACQdDwhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMFAsgAkEANgIoIAJBATYCHCACQfjwhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMEwsgAkEANgIoIAJBATYCHCACQaTxhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMEgsgAkEANgIoIAJBATYCHCACQcDxhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMEQsgAkEANgIoIAJBATYCHCACQeTxhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMEAsgAkEANgIoIAJBATYCHCACQYTyhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMDwsgAkEANgIoIAJBATYCHCACQazyhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMDgsgAkEANgIoIAJBATYCHCACQdDyhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMDQsgAkEANgIoIAJBATYCHCACQejyhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMDAsgAkEANgIoIAJBATYCHCACQYDzhwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMCwsgAiAAQQRqKAIANgIMIAJBAjYCHCACQcTzhwE2AhggAkIBNwIkIAJBCzYCFCACIAJBEGo2AiAgAiACQQxqNgIQIAEgAyACQRhqEIwpIQEMCgsgAkEANgIoIAJBATYCHCACQZD0hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMCQsgAkEANgIoIAJBATYCHCACQcj0hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMCAsgAkEANgIoIAJBATYCHCACQez0hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMBwsgAkEANgIoIAJBATYCHCACQZz1hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMBgsgAkEANgIoIAJBATYCHCACQfj1hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMBQsgAkEANgIoIAJBATYCHCACQeT2hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMBAsgAkEANgIoIAJBATYCHCACQfD3hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMAwsgAkEANgIoIAJBATYCHCACQZj4hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMAgsgAkEANgIoIAJBATYCHCACQcD4hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQEMAQsgAkEANgIoIAJBATYCHCACQYz5hwE2AhggAkIENwIgIAEgAyACQRhqEIwpIQELIAJBMGokACABC6YNAgl/AX4jAEHgAWsiAyQAIANCBDcCNCADQgA3AiwgA0KAgICAwAA3AiQgA0EANgJAIAMgATYCPCADQaABakEIaiEEIANBoAFqQQRqIQUgA0HUAGpBBGohBiADQTBqIQcCQANAIAJBBGoiASgCACEIQdgAIQkCQAJAAkACQAJAIAIoAgAODAQEBAQEBAQDAAECAgQLQSghCQwCC0EwIQkMAQtBDCEJCyADQaABaiADQTxqIAggCWoQ6wogAygCoAEiCUEiRg0AAkBBPEUNACAAQQRqIANBoAFqQQRqQTz8CgAACyAAIAk2AgAMAgsgASgCACEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBeWoOBQAFAQYECAsgASABKAIAQYiAxABGIglBAnRqIQEDQAJAAkAgCUEBcUUNACADQaABaiADQTxqIAFBCGoQ6wogAygCoAEiCEEiRg0BIAMpAqwBIQwgAygCqAEhASADKAKkASEJQSxFDQ0gA0HkAGogA0G0AWpBLPwKAAAMDQsCQAJAAkAgASgCAEGAgLx/aiIIQQIgCEEISRsOCAMDAwMDAwABAwsgASgCBEHYAGohCAwBCyABQRBqIQgLIANBoAFqIANBPGogCBDrCiADKAKgASIIQSJGDQAgAykCrAEhDCADKAKoASEBIAMoAqQBIQlBLEUNDCADQeQAaiADQbQBakEs/AoAAAwMCyADQZABaiAJIAEQqQ4CQCADKAKQAUEERg0AIAQgAykCkAE3AgAgBEEIaiADQZABakEIaikCADcCACADQQhqIANBkAFqEJoUIAMgATYCpAEgAyAJNgKgASADKAIMIQEgAygCCCEJIAcgA0GgAWpBlIGIARC5FwwBCyADQaABaiAJIAEgA0E8ahCNJQJAIAMoAqABIghBIkYNACADKQKsASEMIAMoAqgBIQEgAygCpAEhCUEsRQ0MIANB5ABqIANBtAFqQSz8CgAADAwLIAMoAjQgAygCOCIJQRhsakFoaiEBA0ACQCAJDQBBACEBDAULIAEoAgAiCEECRg0DIAlBf2ohCSABQQRqKAIAIQogA0GQAWogAUEIahC8EwJAIAMoApABQQRGDQAgAyAJNgI4IARBCGogA0GQAWpBCGopAgA3AgAgBCADKQKQATcCACADIANBkAFqEJoUIAMgCjYCpAEgAyAINgKgASADKAIEIQEgAygCACEJIAcgA0GgAWpBpIGIARC5FwwCCyADQaABaiAIIAogA0E8ahCNJQJAIAMoAqABIghBIkYNACADIAk2AjggAygCpAEhCSADKAKo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KAE6NgG6ASACIAEtADg6ALgBIAJBADoAuQECQCAAKAIEIgFBAkYNACAAKAIIIQMCQCABQQFxRQ0AIAJBgAFqIAMQ+SYMAQsgAkGAAWogAxCHEAsgAkEBOgC5AQJAIAAoAhgiAUUNACABIAJBgAFqENkBCyACQQE6ALkBAkAgACgCHCIBRQ0AIAEgAkGAAWoQ2QEgAkEBOgC5AQsgAkGAAWogACgCDBDADCACQYABahCtCiACQZABahDKCgwECyABKAIwEPUVIQMgAkGAAWpBNGogAUE0aigCADYCACACQQA6AKgBIAJBiAFqQQApA4CEngEiBjcDACACQZABaiIEQQApA/iDngEiBzcDACACQZgBaiAGNwMAIAIgATYCoAEgAiADNgKkASACQQE6ALkBIAIgASkCLDcCrAEgAiABKAE6NgG6ASACIAEtADg6ALgBIAIgBzcDgAEgAEEEaiACQYABahDRIyACLQC5ASEBIAJBAToAuQEgACgCDCACQYABahDZASACIAE6ALkBIAJBgAFqIAAoAhAQwAwgAkGAAWoQrQogBBDKCgwDCyABKAIwEPUVIQMgAkGAAWpBNGogAUE0aigCADYCACACQQA6AKgBIAJBiAFqQQApA4CEngEiBjcDACACQZABaiIEQQApA/iDngEiBzcDACACQZgBaiAGNwMAIAIgATYCoAEgAiADNgKkASACQQE6ALkBIAIgASkCLDcCrAEgAiABKAE6NgG6ASACIAEtADg6ALgBIAIgBzcDgAEgAEEEaiACQYABahDRIyACLQC5ASEBIAJBAToAuQEgACgCDCACQYABahDZASACIAE6ALkBIAJBgAFqIAAoAhAQwAwgAkGAAWoQrQogBBDKCgwCCyAAQQhqIAEQjwIMAQsgASAAKAIEEPkmCyACQeABaiQAC5QNAQx/IwBB4ABrIgEkAEEMIQICQCAAKAIAIgMtAFlBAXFFDQAgAygCgAUoAtwCQQZsQQxqIQILIAAoAgQiBEGAAWogAhDvFSABQTBqENYVIAEoAjQhBSABKAIwIgIgAigCACIGQQFqNgIAAkACQAJAAkAgBkF/TA0AAkACQAJAIAQQihggBWpBBCADQYQFaigCAHRqQRRqIAMoAogFTQ0AIAAQhA4NAQsgAUEoaiAAENwTIAEoAihBAXFFDQELIAIgAigCACIEQX9q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IAEoAggNBiACQQA2AiggAkKAgICAEDcCICACQbytmwE2AgwgAkKggICADjcCECACIAJBIGo2AgggAUEQaiACQQhqEOQiDQUgACACKQIgNwIAIABBCGogAkEgakEIaigCADYCAAwHCyAAQYCAgIB4NgIADAYLIAJB0ABqIAEoAiAQogICQAJAIAIoAlBBgICAgHhGDQAgAkHAAGpBCGogAkHQAGpBCGooAgA2AgAgAiACKQJQNwNADAELIAJBADYCSCACQoCAgIAQNwNACyACQQI2AgwgAkHsrZsBNgIIIAJCAjcCFCACQcwErUIghiABQQhqrYQ3AyggAkGgB61CIIYgAkHAAGqthDcDICACIAJBIGo2AhAgACACQQhqEOkJIAIoAkAgAigCRBDULAwFCyACQQhqIAEoAiAQogICQAJAIAIoAghBgICAgHhGDQAgAkEwakEIaiACQQhqQQhqKAIANgIAIAIgAikCCDcDMAwBCyACQQA2AjggAkKAgICAEDcDMAsgAkHQAGogASgCBBCiAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQeytmwE2AgggAkICNwIUIAJBoAetQiCGIgQgAkHAAGqthDcDKCACIAQgAkEwaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQ6QkgAigCQCACKAJEENQsIAIoAjAgAigCNBDULAwECyADIAIoAhBB2LucARCFKQALQfyVnAFBNyACQdAAakHUrZsBQYCXnAEQ4hIAC0H8lZwBQTcgAkHQAGpB1K2bAUGAl5wBEOISAAsgAEGAgICAeDYCAAsgAkHgAGokAAuHDAINfwJ+IwBBwABrIgQkAAJAA0ACQAJAAkACQCABQSFJDQACQCADDQAgACABEJgHDAILIAAgAUEDdiIFQcQBbGohBiAAIAVB8ABsaiEHAkACQCABQcAASQ0AIAAgByAGIAUQ8gwhBQwBCyAAIQUgACgCBCIIIAcoAgQiCUkgACgCACIKIAcoAgAiC0kgCiALRhsiDCAIIAYoAgQiDUkgCiAGKAIAIghJIAogCEYbRw0AIAYgByAMIAkgDUkgCyAISSALIAhGG3MbIQULIANBf2ohAyAFIABrIgdB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QAJAIAItAJEBQSBxDQAMAQsgASgCDCEFIAEoAgghBiABKAIEIQcgASgCACEBIAIoAogBIQggA0EYaiACEN4BIAIgAigCiAFBAXIQnxICQAJAAkACQAJAAkACQAJAAkACQCABLQAADQAgBygCACIJLQAIIgpBBkYNASAKQQVHDQEgAigC7AEhCyACKALoASEKIANBEGogCSgCACIJEMgDIApBAUcNACALIAMoAhBHDQAgCUHuqpwBQQUQmSVFDQAgA0HYAWogAiAGKAIAELsCIAMoAtwBIQoCQCADKALYASIJQYGAgIB4Rw0AIANBAzoAqAEgAyAKNgKkAQwICyADQawBakEgaiADQdgBakEgaikCADcCACADQawBakEYaiADQdgBakEYaikCADcCACADQawBakEQaiADQdgBakEQaikCADcCACADIAMpAuABNwK0ASADIAo2ArABIAMgCTYCrAEgCUGAgICAeEYNAEEBIQQgA0GsAWoQlCIhAQwICyADQQhqIAIQzAcgAygCDCEKIAMoAghBAXENBSACEKALIAItAOABIQkCQAJAAkACQAJAAkAgAS0AACIBDQAgCUUNAQsCQAJAIAlBaWoOBAEDAwYACyAJQbt/akECSQ0FIAlB9QBGDQAgCUGeAUcNAgsCQCAHKAIAIgQtAAgiAUEGRg0AIAFBBUYNBAtBy7icAUEoQcDZmwEQzB4ACyADQdgBaiACIAUtAAAQly8gAygC3AEhBSADKALYASIJQYCAgIB4Rg0BIAMoAuABIQsgBygCACIBLQAIIQQgAUEGOgAIIARBBkYNBSABKAIEIQwgASgCACEHAkACQCAEQQVHDQAgBygCAEEwRg0BCyACKALUASENIAYoAgAhBiADQdQBakECaiIOIAFBCWoiAUECai0AADoAACADQgA3AvABIANBAzoA7AEgA0EANgLoASADQgA3AvgBIANCADcC4AEgA0KAgICAwAA3AtgBIAMgAS8AADsB1AFBCEHAABCYLCIBRQ0HIAEgBDoAGCABIAw2AhQgASAHNgIQIAEgCzYCDCABIAU2AgggASAJNgIEIAFBFzYCACABIAMvAdQBOwAZIAEgCjYCKCABQQA2AiQgASANNgIgIAEgBjYCHCABQRtqIA4tAAA6AAAgA0HYAWoQ1iUMCQsgBigCACEGIAIoAtQBIQwQ9CciAUEANgIIIAFCMTcDACADQgA3AugBIAMgATYC5AEgA0IANwLwASADQQA2AuABIANCgICAgMAANwLYAUEoQQgQlioiBCAKNgIgIARBADYCHCAEIAw2AhggBCAGNgIUIAQgBzYCECAEIAs2AgwgBCAFNgIIIAQgCTYCBCAEQQM2AgBBCEHAABCYLCIBRQ0GIAFBADoAECABIAw2AgwgASAGNgIIIAEgBDYCBCABQTA2AgAgA0HYAWoQ7CgMCAsCQCABDQAgA0HYAWpBBHIgAhDNJiADQQY2AuwBIANBuNmbATYC6AEgA0GwgICAeDYC2AEgAigC2AEgAigC3AEgA0HYAWoQ1xohBSACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgA0HYAWpBBHIgAhDNJiADQQE2AuwBIANBgPObATYC6AEgA0GwgICAeDYC2AEgAigC2AEgAigC3AEgA0HYAWoQ1xohBSACLQDgAUGiAUcNACACIAIQlywQnxcLIANBAzoAqAEgAyAFNgKkASAKEPwrDAgLIAIoAtQBIQcgBigCACEGIAQQzCMhBEEIQcAAEJgsIgFFDQMgASAHNgIQIAEgBjYCDCABIAo2AgggASAENgIEIAFBLTYCAEEAIQQMCQsgBygCACIHLQAIIgFBBkYNAyABQQVHDQMgA0HYAWogAiAHEMwjIAoQlgYCQCADKALYAUUNAEEIQcAAEJgsIgFFDQMgAUEdNgIAIAEgAykC2AE3AgQgAUEMaiADQdgBakEIaikCADcCACABQRRqIANB6AFqKQIANwIAQQEhBAwICyADQQM6AKgBIAMgAygC3AE2AqQBDAYLQcu4nAFBKEGY2ZsBEMweAAtBqNmbARDOLAsAC0HLuJwBQShB0NmbARDMHgALQQEhBAwDCyADQQM6AKgBIAMgCjYCpAELIAIgA0EYahDHBSADQaQBahDnBwwCCyADIAQ6AKgBIAMgATYCpAELIAIgAigCiAFBfnEgCEEBcXIQnxIgA0EYahCPJgsgACAEOgAEIAAgATYCACADQYACaiQAC4INAgZ/A34jAEGwFWsiBCQAIARB8AhqIAEQhwcCQAJAIAQoAqQMIgFBgICAgHhHDQAgBEGwBWpBEGogBEHwCGpBEGopAwAiCjcDACAEIAQpA/gIIgs3A7gFIAQgBCkD8AgiDDcDsAUgAEEYaiAKNwMAIABBEGogCzcDACAAIAw3AwggAEEBNgIADAELAkBBtANFIgUNACAEQbAFaiAEQfAIakG0A/wKAAALAkBB6AJFDQAgBEGQD2pBuANqIARB8AhqQbgDakHoAvwKAAALAkAgBQ0AIARBkA9qIARBsAVqQbQD/AoAAAsgBCABNgLEEiAEQdASaiEGAkAgBCgC2BIiASAEKALQEkcNACAGQeyShAEQ9RsLIAQoAtQSIAFBCWxqIgVCADcAACAFQQhqQQA6AAAgBCABQQFqNgLYEiAEQegSaiEHAkAgBCgC8BIiBSAEKALoEkcNACAHQfyShAEQ9hsLIARBkA9qQbQDaiEBIAQoAuwSIAVBA3RqQgA3AgAgBCAFQQFqNgLwEiAEQdwSaiEIAkAgBCgC5BIiBSAEKALcEkcNACAIQYyThAEQ+hsLIAQoAuASIAVBAnRqQQA2AgAgBCAFQQFqNgLkEiAEQfAIaiABQQAQwQ0CQAJAAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAELIARB8AhqIAFBABDBDQJAIAQoAvAIIgVBA0YNACAEQagFaiAEQYAJaikDADcDACAEIAQpA/gINwOgBQwBCyAEQfAIaiABQQAQwQ0gBCgC9AghCQJAIAQoAvAIIgVBA0YNACAEQagFaiAEQYAJaikDADcDACAEIAQpA/gINwOgBQwCCyAEIAk2ApwVIARB8AhqIAFBABDBDSAEKAL0CCEJAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAILIAQgCTYCoBUgBEHwCGogBEGQD2oQxQwCQCAEKALwCCIFQQNGDQAgBEGoBWogBEGACWopAwA3AwAgBCAEKQP4CDcDoAUMAQsgBEHwCGogBEGQD2oQ+xMCQCAEKALwCCIFQQNGDQAgBEGoBWogBEGACWopAwA3AwAgBCAEKQP4CDcDoAUMAQsgBEHwCGogBEGQD2ogAiADEIkDAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAELIAEQyRggBEHwCGogBEGQD2oQyxECQEGAAkUNACAEQYwTaiAEQfAIakGAAvwKAAALIARB8AhqIARBkA9qEKMJAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAELIARBkA9qEMcSIARB8AhqIARBkA9qEO8GAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAELIARB8AhqIARBkA9qEJ4CAkAgBCgC8AgiBUEDRg0AIARBqAVqIARBgAlqKQMANwMAIAQgBCkD+Ag3A6AFDAELIARBkA9qEMELIARBkA9qEN4CIARB8AhqIARBsA9qIgkQmgEgBEGAE2ohAQJAIAQoAoATIgVFDQAgBSAFKAIAIgNBf2o2AgAgA0EBRw0AIAEQyBILIAEgBCkC8Ag3AgAgAUEIaiAEQfAIakEIaigCADYCACAEIARBkA9qQZAGQYgGIAQoAoATG2ooAgA2ApQVIAYQyhggCBDLGCAHEMwYIARB9BJqEM0YIARBoAVqQQhqIgUgBEHYEmopAwA3AwAgBCAEKQPQEjcDoAUgBCkCxBIhCiAEKALMEiEDAkBByAJFIgENACAEQdgCaiAEQeASakHIAvwKAAALIAkQ2R8gBEHIAmpBCGoiCSAFKQMANwMAIAQgBCkDoAU3A8gCAkAgAQ0AIAQgBEHYAmpByAL8CgAACyAAIAM2AgwgACAKNwIEIAAgBCkDyAI3AhAgAEEYaiAJKQMANwIAAkAgAQ0AIABBIGogBEHIAvwKAAALIABBADYCAAwCCyAEKAL0CCEJCyAEQbAPahDZHyABEO0VIARByAJqQQhqIARBoAVqQQhqKQMAIgo3AwAgBCAEKQOgBSILNwPIAiAAIAk2AgwgACAFNgIIIAAgCzcCECAAQRhqIAo3AgAgAEEBNgIACyAEQbAVaiQAC9AMAgh/BX4jAEGQAWsiACQAIABBKGpBuN+eARCpCyAAKAIsIQECQAJAIAAoAigiAkEBcUUNACABIQMgAiEEDAELIABBIGpBxN+eARCpCyAAKAIkIQMgACgCICEEIAIgARDUKwsCQAJAIARBAXFFDQAgAyECIAQhAQwBCyAAQRhqQazfngEQqQsgACgCHCECIAAoAhghASAEIAMQ1CsLAkACQCABQQFxRQ0AIAIhBCABIQMMAQsgAEEQakHQ354BEKkLIAAoAhQhBCAAKAIQIQMgASACENQrCwJAAkAgA0EBcUUNACAEEBlBAUcNASAEENcqCwJAQQApA/DvngEiCKcNAAJAAkBBAC0A2O+eAUUNAEEAKQPo754BIQlBACkD4O+eASEKDAELIABBMGoQgxtBAEEBOgDY754BQQAgACkDOCIJNwPo754BIAApAzAhCkEAKQPw754BIQgLIABBPGpBACkDgISeATcCAEEAQgE3A/DvngFBACAJNwOY8J4BQQAgCjcDkPCeAUEAIApCAXw3A+DvngEgAEEAKQP4g54BNwI0QQAoAoDwngEhBUEAIAApAjA3AvzvngFBACgChPCeASEGQQAgAEE4aikCADcChPCeAUEAKAKM8J4BIQNBACAAQcAAaigCADYCjPCeAUEAQQA2AvjvngEgCFANACAGRQ0AAkAgA0UNACAFQQhqIQQgBSkDAEJ/hUKAgYKEiJCgwIB/gyEIIAUhAUEBIQcDQCAHRQ0BAkADQCAIQgBSDQEgAUGAf2ohASAEKQMAQn+FQoCBgoSIkKDAgH+DIQggBEEIaiEEDAALCyABIAh6p0EBdEHwAXFrIgJBcGooAgAgAkF0aigCABDuLCAIQn98IAiDIQggA0F/aiIDIQcgAkF8aigCACICQYQBSQ0AIAIQDSADIQcMAAsLIABB8ABqQRAgBkEBahD+EiAAKAJ0IgRFDQAgBSAAKAJ4ayAEIAAoAnAQrBYLAkACQAJAQQAoAvjvngEiBEH/////B08NAEEAIQZBACAEQQFqNgL4754BQQAoAozwngFFDQFBACkDkPCeASEIIABBMGpBGGoiBEEAKQOY8J4BIgpC88rRy6eM2bL0AIU3AwAgAEEwakEQaiIBIApC7d6R85bM3LfkAIU3AwAgAEEwakEIaiICIAhC4eSV89bs2bzsAIU3AwAgAEHoAGoiA0IANwMAIABCADcDYCAAIAo3A1ggACAINwNQIAAgCEL1ys2D16zbt/MAhTcDMCAAQTBqQd2SggFBCxDxCiAAQf8BOgBwIABBMGogAEHwAGpBARDxCiAAQfAAakEQaiIHIAEpAwA3AwAgAEHwAGpBCGoiASACKQMANwMAIABB8ABqQRhqIgIgAzUCAEI4hiAAKQNghCIIIAQpAwCFNwMAIAAgACkDMDcDcCAAQfAAahD/E0EAKAKE8J4BIgMgAikDACIKIAEpAwBC/wGFfCIJIAcpAwAiC0INiSALIAApA3AgCIV8IgiFIgt8IgwgC0IRiYUiC0INiSAKQhCJIAmFIgogCEIgiXwiCCALfCIJhSILQhGJIApCFYkgCIUiCCAMQiCJfCIKIAt8IguFIgxCDYkgCEIQiSAKhSIIIAlCIIl8IgogDHyFIglCEYkgCEIViSAKhSIIIAtCIIl8IgogCXwiCUIgiIUgCEIQiSAKhUIViYUgCYUiCKdxIQEgCEIZiEL/AINCgYKEiJCgwIABfiEKQQAoAoDwngEhBANAIAQgAWopAAAiCSAKhSIIQn+FIAhC//379+/fv/9+fINCgIGChIiQoMCAf4MhCAJAAkADQCAIUA0BQd2SggFBCyAEIAh6p0EDdiABaiADcSIHQQR0ayICQXRqKAIAIAJBeGooAgAQ5CUNAiAIQn98IAiDIQgMAAsLIAkgCUIBhoNCgIGChIiQoMCAf4NQRQ0DIAEgBkEIaiIGaiADcSEBDAELCyAEIAdBBHRrQXxqKAIAIQJBACEBDAILQdCHngEQyhoAC0HdkoIBIQFBCyECC0EAQQAoAvjvngFBf2o2AvjvngFBgAEhBCAAQQhqIAEgAhAjIgFBgAEQ0RsgACgCDCECAkACQCAAKAIIQQFxDQAgAiEEDAELIAIQ1yoLIAEQ1yoLIABBkAFqJAAgBAv7CgISfwJ+IwBBgANrIgUkACABrSIXQv//////////P3wgF4AhGAJAAkAgAUGBIEkNACABELkkIQYMAQsgASABQQF2ayIHQcAAIAdBwABJGyEGCyAAQXhqIQhBASEHQQAhCUEAIQoDQEEBIQtBACEMAkAgCSABTw0AIAVBKGogCSAAIAFB9JKcARDeIiAFKAIoIQ0CQAJAIAUoAiwiDiAGSQ0AQQAhDwJAAkAgDkECSQ0AAkACQAJAIA0oAggiECANKAIAIhFHDQAgDSgCDCANKAIETw0BDAILIBAgEUkNAQsgDUEUaiEQQQIhEQNAIA4gEUYNAgJAAkAgEEF8aigCACISIBBBdGooAgAiE0cNACAQKAIAIBBBeGooAgBJDQUMAQsgEiATSQ0ECyAQQQhqIRAgEUEBaiERDAALCyANQRRqIRBBAiERA0BBASEPIA4gEUYNAQJAAkAgEEF8aigCACISIBBBdGooAgAiE0cNACAQKAIAIBBBeGooAgBPDQQMAQsgEiATTw0DCyAQQQhqIRAgEUEBaiERDAALCyAOIRELIBEgBkkNAAJAIA9FDQAgBUEgaiARIA0gDkHEkpwBELckQQAhEkEAIAUoAiQiE0EBdiINayEPIAUoAiAiECATQQN0akF4aiEOA0AgDyASRg0BIBJBf2ohEgJAIBNBAkkNACAQKQIAIRcgECAOKQIANwIAIA4gFzcCACAOQXhqIQ4gEEEIaiEQDAELCyASIA1ByJGcARCMFQALIBFBAXRBAXIhCwwBCwJAIAQNACAOIAYgDiAGSRtBAXQhCwwBCyAFQRhqIA5BICAOQSBJGyIQIA0gDkG0kpwBELckIAUoAhggBSgCHCACIANBAEEAEL8BIBBBAXRBAXIhCwsgC0EBdiAJaq0gCa0iF3wgGH4gCSAHQQF2a60gF3wgGH6FeachDAsgCCAJQQN0IhBqIRQgACAQaiEVA0ACQAJAAkACQAJAAkACQCAKQQJJDQAgBUG+AmogCkF/aiITai0AACAMTw0BCyAFQb4CaiAKaiAMOgAAIAVBNGogCkECdGogBzYCACAJIAFPDQEgCkEBaiEKIAtBAXYgCWohCSALIQcMBwsCQCAFQTRqIBNBAnRqKAIAIgpBAXYiECAHQQF2Ig5qIg8gA0sNACAKIAdyQQFxRQ0CCyAAIAkgD2tBA3RqIRICQCAKQQFxDQAgBUEQaiAQIBIgD0HUkpwBELckIAUoAhAgBSgCFCACIAMQ+iULAkAgB0EBcQ0AIAVBCGogECASIA9B5JKcARDeIiAFKAIIIAUoAgwgAiADEPolCyAKQQJJDQQgB0ECSQ0EIAMgDiAQIA4gEEkiChsiDkkNBCASIBBBA3RqIhAgEiAKGyEHAkAgDkEDdCIORQ0AIAIgByAO/AoAAAsgAiAOaiEOIAoNAiACIQoDQCAKIA5GDQQgECAVRg0EAkACQCAQKAIAIhEgCigCACISRg0AIBEgEkkhEQwBCyAQKAIEIAooAgRJIRELIAcgECAKIBEbKQIANwIAIAdBCGohByAQIBFBA3RqIRAgCiARQQFzQQN0aiEKDAALCwJAIAdBAXENACAAIAEgAiADEPolCyAFQYADaiQADwsgD0EBdCEHIBMhCgwDCyAUIQoDQAJAAkAgDkF4aiIQKAIAIg0gB0F4aiIRKAIAIhZGDQAgDSAWSSEHDAELIA5BfGooAgAgB0F8aigCAEkhBwsgCiARIBAgBxspAgA3AgAgECAHQQN0aiEOAkAgESAHQQFzQQN0aiIHIBJGDQAgCkF4aiEKIA4gAkcNAQsLIAIhCgsgDiAKayIQRQ0AIAcgCiAQ/AoAAAsgD0EBdEEBciEHIBMhCgwACwsL/QoCEn8CfiMAQYADayIFJAAgAa0iF0L//////////z98IBeAIRcCQAJAIAFBgSBJDQAgARC5JCEGDAELIAEgAUEBdmsiB0HAACAHQcAASRshBgsgAEF+aiEIQQEhB0EAIQlBACEKA0BBASELQQAhDAJAIAkgAU8NACAFQShqIAkgACABQfSSnAEQ4CIgBSgCKCENAkACQCAFKAIsIg4gBkkNAEEAIQ8CQAJAIA5BAkkNAAJAAkACQCANLQACIhAgDS0AACIRRw0AIA0tAAMgDS0AAU8NAQwCCyAQIBFJDQELQQIhESANQQJqIRADQCAOIBFGDQICQAJAIBBBAmoiEi0AACITIBAtAAAiFEcNACAQQQNqLQAAIBBBAWotAABJDQUMAQsgEyAUSQ0ECyARQQFqIREgEiEQDAALC0ECIREgDUECaiEQA0BBASEPIA4gEUYNAQJAAkAgEEECaiISLQAAIhMgEC0AACIURw0AQQEhDyAQQQNqLQAAIBBBAWotAABPDQQMAQsgEyAUTw0DCyARQQFqIREgEiEQDAALCyAOIRELIBEgBkkNAAJAIA9FDQAgBUEgaiARIA0gDkHEkpwBENIkQQAhEkEAIAUoAiQiE0EBdiINayEUIAUoAiAiDiATQQF0akF+aiEQA0AgFCASRg0BIBJBf2ohEgJAIBNBAkkNACAOLwAAIQ8gDiAQLwAAOwAAIBAgDzsAACAQQX5qIRAgDkECaiEODAELCyASIA1ByJGcARCMFQALIBFBAXRBAXIhCwwBCwJAIAQNACAOIAYgDiAGSRtBAXQhCwwBCyAFQRhqIA5BICAOQSBJGyIQIA0gDkG0kpwBENIkIAUoAhggBSgCHCACIANBAEEAEL4BIBBBAXRBAXIhCwsgC0EBdiAJaq0gCa0iGHwgF34gCSAHQQF2a60gGHwgF36FeachDAsgCCAJQQF0Ig5qIRUgACAOaiEWA0ACQAJAAkACQAJAAkACQCAKQQJJDQAgBUG+AmogCkF/aiIPai0AACAMTw0BCyAFQb4CaiAKaiAMOgAAIAVBNGogCkECdGogBzYCACAJIAFPDQEgCkEBaiEKIAtBAXYgCWohCSALIQcMBwsCQCAFQTRqIA9BAnRqKAIAIgpBAXYiDiAHQQF2IhBqIhMgA0sNACAKIAdyQQFxRQ0CCyAAIAkgE2tBAXRqIRICQCAKQQFxDQAgBUEQaiAOIBIgE0HUkpwBENIkIAUoAhAgBSgCFCACIAMQ+yULAkAgB0EBcQ0AIAVBCGogDiASIBNB5JKcARDgIiAFKAIIIAUoAgwgAiADEPslCyAKQQJJDQQgB0ECSQ0EIAMgECAOIBAgDkkiChsiEEkNBCASIA5BAXRqIg4gEiAKGyEHAkAgEEEBdCIQRQ0AIAIgByAQ/AoAAAsgAiAQaiEQIAoNAiACIQoDQCAKIBBGDQQgDiAWRg0EAkACQCAOLQAAIhEgCi0AACISRg0AIBEgEkkhEQwBCyAOLQABIAotAAFJIRELIAcgDiAKIBEbLwAAOwAAIAdBAmohByAOIBFBAXRqIQ4gCiARQQFzQQF0aiEKDAALCwJAIAdBAXENACAAIAEgAiADEPslCyAFQYADaiQADwsgE0EBdCEHIA8hCgwDCyAVIQoDQAJAAkAgEEF+aiIOLQAAIhQgB0F+aiIRLQAAIg1GDQAgFCANSSEHDAELIBBBf2otAAAgB0F/ai0AAEkhBwsgCiARIA4gBxsvAAA7AAAgDiAHQQF0aiEQAkAgESAHQQFzQQF0aiIHIBJGDQAgCkF+aiEKIBAgAkcNAQsLIAIhCgsgECAKayIORQ0AIAcgCiAO/AoAAAsgE0EBdEEBciEHIA8hCgwACwsLqwsCG38DfiMAQdABayICJAAgASgCBCEDIAJBMGogASgCCCIEQQhB2AAQkA8gAigCNCEFAkACQCACKAIwQQFGDQAgAigCOCEGAkAgBUUNACAEQdgAbCEHIAJBCGpBEGohCCACQQhqQQhqIQkgAkEIakEEciEKQQAhCyAFIQwDQCAHIAtGDQECQAJAIAMgC2oiASgCACINQQVHDQAgAUEMaigCACEOIAFBCGooAgAhDyABQQRqKAIAIQEQ9CchDSACQTBqIAEQQiANQThqIAJBMGpBOGopAwA3AwAgDUEwaiACQTBqQTBqKQMANwMAIA1BKGogAkEwakEoaikDADcDACANQSBqIAJBMGpBIGopAwA3AwAgDUEYaiACQTBqQRhqKQMANwMAIA1BEGogAkEwakEQaikDADcDACANQQhqIAJBMGpBCGopAwA3AwAgDSACKQMwNwMAQQUhEAwBCyABQSxqKAIAIREgAUEoaigCACESAkACQCABQTBqKQMAIh1QDQAgAUE8aigCACETIAFBOGooAgAhDyABQdQAaigCACEUIAFB0ABqKAIAIRUCQCAdQgODQgBSDQAgHaciECAQKAIAIhBBAWo2AgAgEEF/TA0HCyABQcwAaigCACEWIAFByABqKAIAIRcgAUHAAGopAwAiHqchDgJAIB5CA4NCAFINACAOIA4oAgAiEEEBajYCACAQQX9MDQcLIB5CIIinIRgMAQsgAUHEAGooAgAhGCABQcAAaigCACEOIAFBOGopAwAiHachDwJAIB1CA4NCAFINACAPIA8oAgAiEEEBajYCACAQQX9MDQYLIB1CIIinIRNCACEdC0EEIRACQCANQQRGDQACQAJAAkACQAJAIAEoAgAiEA4EAAECAwALIAkgAUEIahDzAwwDCyABQQhqKAIAIRkgAUEUaigCACEaIAFBEGooAgAhGwJAAkAgAUEEaigCACINQQFHDQAQ9CchASACQTBqIBkQQiABQThqIAJBMGpBOGopAwA3AwAgAUEwaiACQTBqQTBqKQMANwMAIAFBKGogAkEwakEoaikDADcDACABQSBqIAJBMGpBIGopAwA3AwAgAUEYaiACQTBqQRhqKQMANwMAIAFBEGogAkEwakEQaikDADcDACABQQhqIAJBMGpBCGopAwA3AwAgASACKQMwNwMAQQEhDQwBCyABQQxqKAIAIRwgGSEBCyACIBo2AhwgAiAbNgIYIAIgHDYCFCACIAE2AhAgAiANNgIMDAILEPsnIQ0gAkEwaiABQQRqKAIAEO4BAkBBoAFFDQAgDSACQTBqQaAB/AoAAAsgAiANNgIMDAELIAFBEGopAgAhHiABQRhqKQIAIR8gCiABQQRqEJQKIAIgHzcDICACIB43AxggAiABQSBqKQIANwMoCyACQTBqQQhqIAhBCGopAgA3AwAgAkEwakEQaiAIQRBqKQIANwMAIAIgCCkCADcDMCACKAIUIRkgAigCECEaIAIoAgwhGwsgCCACQTBqQRBqKQMANwMAIAkgAkEwakEIaikDADcDACACIAIpAzA3AwggGK1CIIYgDq2EIR4gE61CIIYgD62EIR8gGSEOIBohDyAbIQ0LIAYg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AkEIahCjJCABQQUQsQIgARCJASABQQA6AJMBAkAgASgCbCABKAJoIgVHDQAgAEGAxgI7AQAMAgsgACABIAUtAABBAnRBlKKaAWooAgARBgAMAQsgAEEAOgAAIAAgCDoAAQsgAkEgaiQAC/sLAQN/A0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4UEBAAAQIDBAUGBgcICQoKCwwNDg8QCwJAIAAoAgRBgICAgHhGDQACQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKEoDAMLIANBBGogARDPFwwCCyADQQRqIAEQ0yUMAQsgA0EEaiABEOAaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAhwiA0UNACADQQhqKAIAIgJFDQAgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIERQ0AIAQgARCwAgsCQCADKAIAIgRFDQAgBCABELACCyADQTBqIQMgAkFQaiICDQALCyAAQRBqIQAMEQsCQCAAKAIQIgJFDQAgACgCDCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKEoDAMLIANBBGogARDPFwwCCyADQQRqIAEQ0yUMAQsgA0EEaiABEOAaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAiAiA0UNACADQQhqKAIAIgJFDQAgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIERQ0AIAQgARCwAgsCQCADKAIAIgRFDQAgBCABELACCyADQTBqIQMgAkFQaiICDQALCyAAQRRqIQAMEAsCQCAALQAkQQJHDQAgACgCEBC+JwsgACgCKCIARQ0OIABBCGooAgAiA0UNDiAAQQRqKAIAIQAgA0ECdCEDA0AgACgCACABELACIABBBGohACADQXxqIgMNAAwPCwsCQAJAIAAtAEQiA0EERg0AAkAgA0ECRw0AIAAoAjAQvicLAkAgACgCSCIDRQ0AIAMoAggiAkUNACADKAIEIQMgAkECdCECA0AgAygCACABELACIANBBGohAyACQXxqIgINAAsLIAAoAkwiA0UNASADIAEQihkMAQsgAC0AJEECRw0AIAAoAhAQvicL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QSj8CgAACyAFQShqIQUgAkHAAGohAgwACwsgA0EINgLAAiADQQA2AsgCQQBBCBCYLSADQQg2AswCIANBCDYCxAIgCkEobiEFIAYhAgJAIAdFDQAgBiECIAogBUEobCINRg0AIAYgCiANEK0kIgJFDQILIAMgAjYCzAEgAyAFNgLIASADIAwgBmtBKG42AtABIANBwAJqEK0eAkACQAJAAkAgAS0A4AFBAUYNACABKALcASECIAEoAtgBIQUgA0HUAWogARDNJiADQQE2AsQCIANByL6cATYCwAIgA0IBNwLMAiADQbMHNgL0ASADQQE6AOABIAMgA0HwAWo2AsgCIAMgA0H4AWo2AvABIAMgA0HgAWo2AvgBIANBgAJqIANBwAJqEPQaIANBlAJqIANB3AFqKAIANgIAIAMgAykC1AE3AowCIAUgAiADQYACahDXGiECIAEtAOABQaIBRg0BDAcLIAEQoAtBACECIAEtAOABIgVBCUcNAiADQQk6AMACIANBCGogASADQcACahDSESADKAIMIQIgAygCCEEBcUUNASADQYGAgIB4NgKoASADIAI2AqwBDAcLIAEgARCXLBCfFwwFCyABLQDgASEFCyADIAI2AuABAkAgBUH/AXFBG0YNACABKALcASECIAEoAtgBIQUgA0HkAWogARDNJiADQQE2AsQCIANByL6cATYCwAIgA0IBNwLMAiADQbMHNgL0ASADQRs6AP8BIAMgA0HwAWo2AsgCIAMgA0H4AWo2AvABIAMgA0H/AWo2AvgBIANBgAJqIANBwAJqEPQaIANBlAJqIANB7AFqKAIANgIAIAMgAykC5AE3AowCIAUgAiADQYACahDXGiECIAEtAOABQaIBRw0DIAEgARCXLBCfFwwDCyABEKALIANBqAFqQQhqIANByAFqQQhqKAIANgIAIAMgAjYCuAEgAyAENgK0ASADIAMpAsgBIg83A6gBAkACQCAPpyIFQYCAgIB4ag4CAAoBCyABIANBIGoQxwUMCgsgAykCrAEhDyABIAEoAogBQX5xIAhyEJ8SIANBIGoQjyYgAyACNgLUAiADIAQ2AtACIAMgDzcCxAIgAyAFNgLAAiABKAKIASECIAMgA0EcajYCzAICQCACQYABcQ0AIAEgAkGAAXI2AogBIAAgA0HAAmogARDcEiABIAEoAogBQf9+cTYCiAEMCwsgACADQcACaiABENwSDAoLIAEgARCXLBCfFwwFCwALIANBgYCAgHg2AqgBIAMgAjYCrAEgA0HgAWoQnysMAQsgA0GBgICAeDYCqAEgAyACNgKsAQsgA0HIAWoQsCgMAgsgAyAGNgKsASADQYGAgIB4NgKoAQwBCyADQYGAgIB4NgKoASADIAI2AqwBCyAEEJYsCyABIANBIGoQxwUgA0GoAWpBBHIQ5wcLIABBgICAgHg2AgALIANBgANqJAALvgsCCH8CfiMAQYABayICJAACQAJAAkACQAJAAkACQAJAAkAgASgCAA4HAAECAwQFBgALIAEoAhghAyABKAIUIQQgASgCECEFAkAgASkDCCIKQgODQgBSDQAgCqciBiAGKAIAIgZBAWo2AgAgBkF/TA0ICyABLQAcIQdBACEGAkAgASgCICIBRQ0AEPYnIQYgASkCBCELIAEoAgAhCBD3JyEBIAJBIGogCBB2AkBB4ABFDQAgASACQSBqQeAA/AoAAAsgBiALNwIEIAYgATYCAAsgACAGNgIgIAAgBzoAHCAAIAM2AhggACAENgIUIAAgBTYCECAAIAo3AwggAEEANgIADAYLIAEoAhQhAyABKAIQIQQgAkEIaiABQQRqEMIJIAEtABwhBQJAAkAgASgCGCIGDQBBACEBDAELEPYnIQEgBikCBCEKIAYoAgAhBxD3JyEGIAJBIGogBxB2AkBB4ABFDQAgBiACQSBqQeAA/AoAAAsgASAKNwIEIAEgBjYCAAsgACACKQIINwIEIAAgBToAHCAAIAE2AhggACADNgIUIAAgBDYCECAAQQE2AgAgAEEMaiACQRBqKAIANgIADAULIAEoAhQhBCABKAIQIQUgASgCDCEHIAEoAgghCBD1JyEGIAJBIGogASgCBBC8AiAGQSBqIAJBIGpBIGopAwA3AwAgBkEYaiACQSBqQRhqKQMANwMAIAZBEGogAkEgakEQaikDADcDACAGQQhqIAJBIGpBCGopAwA3AwAgBiACKQMgNwMAAkACQCABKAIYIgMNAEEAIQEMAQsQ9ichASADKQIEIQogAygCACEJEPcnIQMgAkEgaiAJEHYCQEHgAEUNACADIAJBIGpB4AD8CgAACyABIAo3AgQgASADNgIACyAAIAE2AhggACAENgIUIAAgBTYCECAAIAc2AgwgACAINgIIIAAgBjYCBCAAQQI2AgAMBAsgASgCFCEDIAEoAhAhBCACQRRqIAFBBGoQ4AIgAS0AHCEFAkACQCABKAIYIgYNAEEAIQEMAQsQ9ichASAGKQIEIQogBigCACEHEPcnIQYgAkEgaiAHEHYCQEHgAEUNACAGIAJBIGpB4AD8CgAACyABIAo3AgQgASAGNgIACyAAIAIpAhQ3AgQgACAFOgAcIAAgATYCGCAAIAM2AhQgACAENgIQIABBAzYCACAAQQxqIAJBHGooAgA2AgAMAwsgASkCDCEKEPUnIQYgAkEgaiABKAIEELwCIAZBIGogAkEgakEgaiIDKQMANwMAIAZBGGogAkEgakEYaiIEKQMANwMAIAZBEGogAkEgakEQaiIFKQMANwMAIAZBCGogAkEgakEIaiIHKQMANwMAIAYgAikDIDcDACABKAIIIQgQ9CchASACQSBqIAgQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAMpAwA3AwAgAUEYaiAEKQMANwMAIAFBEGogBSkDADcDACABQQhqIAcpAwA3AwAgASACKQMgNwMAIAAgCjcCDCAAIAE2AgggACAGNgIEIABBBDYCAAwCCyAAIAEpAwA3AwAgAEEgaiABQSBqKQMANwMAIABBGGogAUEYaikDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqKQMANwMADAELIAEoAgQhBhD0JyEBIAJBIGogBhBCIAFBOGogAkEgakE4aikDADcDACABQTBqIAJBIGpBMGopAwA3AwAgAUEoaiACQSBqQShqKQMANwMAIAFBIGogAkEgakEgaikDADcDACABQRhqIAJBIGpBGGopAwA3AwAgAUEQaiACQSBqQRBqKQMANwMAIAFBCGogAkEgakEIaikDADcDACABIAIpAyA3AwAgAEEGNgIAIAAgATYCBAsgAkGAAWokAA8LAAuHCwIdfwV+IwBBwABrIgEkABCAKCECIAAoAgAiACgCFCEDIAAoAhAhBCAALQBSIQUgAC0AUSEGIAAtAFAhByAAKAJMIQggACgCSCEJAkACQAJAIAAoAgBBAUcNAAJAIAApAwgiHkIDg0IAUg0AIB6nIgogCigCACIKQQFqNgIAIApBf0wNAwtCASEfIAApAxgiIFANASAgQgODUEUNASAgpyIKIAooAgAiCkEBajYCACAKQX9KDQEMAgtCACEfIAA1AhghIAJAIAApAwgiHkIDg0IAUg0AIB6nIgogCigCACIKQQFqNgIAIApBf0wNAgsgADEAHEIghiAghCEgCwJAAkACQAJAAkAgAC0ARSILQX5qDgIBAgALIAAoAjghDCAAKAI0IQ0gACgCMCEOIAAtAEQhDyAAKAIkIRAgACgCICERAkAgACkDKCIhQgODQgBSDQAgIaciCiAKKAIAIgpBAWo2AgAgCkF/TA0FCyAALQA8IRIQ9SchCgJAAkAgACgCQCIALQAlIhNBAkYNACAAKAIYIRQgACgCFCEVIAAoAhAhFiAALQAkIRcgACgCBCEYIAAoAgAhGSAAKQMIIiKnIRoCQCAiQgODQgBSDQAgGiAaKAIAIhtBAWo2AgAgG0F/TA0HCyAALQAcIRwQ9SchGyABQQhqIAAoAiAQqAUgG0EgaiABQQhqQSBqKQMANwMAIBtBGGogAUEIakEYaikDADcDACAbQRBqIAFBCGpBEGopAwA3AwAgG0EIaiABQQhqQQhqKQMANwMAIBsgASkDCDcDACAiQiCIpyEdDAELIAAoAgQhGyAAKAIQIRYgACgCDCEdIAFBCGogACgCCCIaQQhBOBCQDyABKAIMIRkgASgCCEEBRg0DIAEoAhAhGAJAIBlFDQAgGkE4bCEUIBghACAZIRUDQCAURQ0BIAFBCGogGxBmIABBMGogAUEIakEwaikDADcDACAAQShqIAFBCGpBKGopAwA3AwAgAEEgaiABQQhqQSBqKQMANwMAIABBGGogAUEIakEYaikDADcDACAAQRBqIAFBCGpBEGopAwA3AwAgAEEIaiABQQhqQQhqKQMANwMAIAAgASkDCDcDACAAQThqIQAgFEFIaiEUIBtBOGohGyAVQX9qIhUNAAsLCyAKIBM6ACUgCiAXOgAkIAogGzYCICAKIBw6ABwgCiAUNgIYIAogFTYCFCAKIBY2AhAgCiAdNgIMIAogGjYCCCAKIBg2AgQgCiAZNgIAICFCIIinIRkgIachFQwBCyAAKAIkIQogACgCMCEOIAAoAiwhGSABQQhqIAAoAigiFUEIQTgQkA8gASgCDCERIAEoAghBAUYNAiABKAIQIRACQCARRQ0AIBVBOGwhGyAQIQAgESEUA0AgG0UNASABQQhqIAoQZiAAQTBqIAFBCGpBMGopAwA3AwAgAEEoaiABQQhqQShqKQMANwMAIABBIGogAUEIakEgaikDADcDACAAQRhqIAFBCGpBGGopAwA3AwAgAEEQaiABQQhqQRBqKQMANwMAIABBCGogAUEIakEIaikDADcDACAAIAEpAwg3AwAgG0FIaiEbIABBOGohACAKQThqIQogFEF/aiIUDQALC0ECIQsLIAIgBToAUiACIAY6AFEgAiAHOgBQIAIgCDYCTCACIAk2AkggAiALOgBFIAIgDzoARCACIAo2AkAgAiASOgA8IAIgDDYCOCACIA02AjQgAiAONgIwIAIgGTYCLCACIBU2AiggAiAQNgIkIAIgETYCICACICA3AxggAiADNgIUIAIgBDYCECACIB43AwggAiAfNwMAIAFBwABqJAAgAg8LIBkgASgCEEH08ZoBEIUpAAsgESABKAIQQfTxmgEQhSkACwALvQwCEH8BfiMAQfAAayIEJAAgAygC2AEhBQJAAkACQAJAIAMtAOABIgZBEkYNACAGQT5HDQELIAMQoAsgBEEANgIYIARCgICAgIABNwIQIAItAAAhByABLQAAIQhBCCEJIARB1QBqQQJqIQogBEHUAGohC0EAIQwDQCADLQDgAUETRg0CIAMoAtgBIQ1BACEOQQAhBkEAIQ8CQANAIARB2ABqIANBsNSbAUEJQQAQwgQgBCgCXCECAkACQCAEKAJYQQFGDQACQAJAAkACQAJAAkACQCACRQ0AIAIgBCgCYCIBQbvymwFBBRDcJQ0DIAIgAUGwpZwBQQIQ3CUNAiACIAFB2fKbAUEDENwlDQEgAygC1AEhECADKALQASERIAIgARDPDCEUIARBo4GAgHg2AlggBCAUNwNgIAMgESAQIARB2ABqENcjDAkLAkACQCADKAKIASICQYAgcQ0AIAMgAkGAIHI2AogBIARB2ABqIAMQ2A4gAyADKAKIAUH/X3E2AogBDAELIARB2ABqIAMQ2A4LIAQoAmAhAiAEKQNYIhRQDQYgBCgCZCERIARBCGogA0HZABCfEyAEKAIMIRAgBCgCCEEBcUUNAyAQIQIMBAsgCEEBcUUNBiAGQQFxIQJBASEGIAJFDQcgAygC1AEhAiADKALQASEBIARB+oCAgHg2AlggBEKx3tWjBzcDYCADIAEgAiAEQdgAahDXI0EBIQYMBwsCQCAIQQFxDQAgAygC1AEhAiADKALQASEBIARBpIGAgHg2AlggBEKh0rkDNwNgIAMgASACIARB2ABqENcjQQEhDwwHCwJAIA9BAXENAEEBIQ8gBkEBcSECQQAhBiACRQ0HIAMoAtQBIQIgAygC0AEhASAEQrHe1aMHNwNoIARCodK5AzcDYCAEQfmAgIB4NgJYIAMgASACIARB2ABqENcjQQEhBkEBIQ8MBwsgAygC1AEhAiADKALQASEBIARB+oCAgHg2AlggBEKh0rkDNwNgIAMgASACIARB2ABqENcjQQEhDwwGC0EBIQ4gB0EBcQ0FIAMoAtQBIQIgAygC0AEhASAEQaWBgIB4NgJYIARC0ca987aOHTcDYCADIAEgAiAEQdgAahDXIwwFCyAEIBA2AlggBCADQRcQnxMgBCgCBCESIAQoAgBBAXFFDQEgBEHYAGoQnisgEiECCyAUEL4hDAELIAMoAtQBIRMCQCAMIAQoAhBHDQAgBEEQahDYHSAEKAIUIQkLIAkgDEEwbGoiAUEAOgAcIAFBADYCGCABIBE2AhQgASACNgIQIAEgEzYCBCABIA02AgAgASASNgIkIAEgEDYCICAKLQAAIQIgBC8AVSENIAEgDkEBcToAKiABIAZBAXE6ACkgASAPQQFxOgAoIAEgDTsAHSABQR9qIAI6AAAgASAUNwIIIAFBL2ogCy0AADoAACABIAQoAFA2ACsgBCAMQQFqIgw2AhggAy0A4AEiAkEHRg0DIAJBE0YNBiADKALcASECIAMoAtgBIQEgBEEcaiADEM0mIARBATYCXCAEQci+nAE2AlggBEIBNwJkIARBswc2AkQgBEEHOgBPIAQgBEHAAGo2AmAgBCAEQcgAajYCQCAEIARBzwBqNgJIIARBKGogBEHYAGoQ9BogBEE8aiAEQSRqKAIANgIAIAQgBCkCHDcCNCABIAIgBEEoahDXGiECIAMtAOABQaIBRw0AIAMgAxCXLBCfFwsgBEEQahCgK0EBIQEMBgsgAygC1AEhAiADKALQASEBIARBpIGAgHg2AlggBEKx3tWjBzcDYCADIAEgAiAEQdgAahDXI0EBIQYMAAsLIAMQoAsMAAsLIARB2ABqQQRyIAMQzSYgBEERNgJsIARBiNWbATYCaCAEQbCAgIB4NgJYIAMoAtgBIAMoAtwBIARB2ABqENcaIQJBASEBIAMtAOABQaIBRw0BIAMgAxCXLBCfFwwBCyAEKAIUIQZBASEBAkAgBCgCECIOQYCAgIB4Rw0AIAYhAgwBCyADEKALIAMoAtQBIQFBFEEEEJYqIgIgATYCECACIAU2AgwgAiAMNgIIIAIgBjYCBCACIA42AgBBACEBCyAAIAI2AgQgACABNgIAIARB8ABqJAALtAwBCn8jAEGQAmsiAiQAIAEoAtgBIQMgARCgCwJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0A4AFFDQAgASgC3AEhBCABKALYASEFIAJBJGogARDNJiACQQE2AuQBIAJByL6cATYC4AEgAkIBNwLsASACQbMHNgKAASACQQA6ADAgAiACQfwAajYC6AEgAiACQcQAajYCfCACIAJBMGo2AkQgAkHIAGogAkHgAWoQ9BogAkHcAGogAkEsaigCADYCACACIAIpAiQ3AlQgBSAEIAJByABqENcaIQQgAS0A4AFBogFGDQEMCQsgASgC1AEhBSABKALQASEGIAEQoAsCQAJAIAEoAogBIgRBgICAIHFFDQAgASAEQf///19xNgKIASACQRhqIAEQyhMgAigCGCEEIAEgASgCiAFBgICAIHI2AogBIAIoAhwhBwwBCyACQRBqIAEQyhMgAigCFCEHIAIoAhAhBAsCQCAEQQFxRQ0AIAcoAgQhASAHKAIAIQRBBEEEEMYqIgggBzYCACACIAU2AvQBIAIgBjYC8AEgAiAINgLkASACQTA2AuwBIAJBjK2cATYC6AEgAkG4gYCAeDYC4AEgBCABIAJB4AFqENcaIQEgAEEANgIAIAAgATYCBAwKCyACIAc2AjACQCABLQDgAUEBRg0AIAEoAtwBIQQgASgC2AEhBSACQTRqIAEQzSYgAkEBNgLkASACQci+nAE2AuABIAJCATcC7AEgAkGzBzYCgAEgAkEBOgBDIAIgAkH8AGo2AugBIAIgAkHEAGo2AnwgAiACQcMAajYCRCACQcgAaiACQeABahD0GiACQdwAaiACQTxqKAIANgIAIAIgAikCNDcCVCAFIAQgAkHIAGoQ1xohBCABLQDgAUGiAUYNAgwHCyABEKALIAJB4AFqIAFBgICAoAIQwB8gAkEIaiACQeABahDSISACKAIMIQkgAigCCEEBcQ0FIAIgCTYCRCABLQCLAUEEcQ0DIAJBADYCfCACQfwAakEIaiEKIAJB4AFqQQhqIQYDQAJAIAEtAOABIgRB1wBGDQBBEyEGDAQLIAEQoAsCQAJAAkAgAS0A4AFB3gBGDQAgAkHgAWogAUGAgICgAhDAHyACKALkASEFIAIoAuABIgZBE0YNAUEoRQ0GIAJBkAFqIAJB6AFqQSj8CgAADAYLAkACQCABKAKIASIEQYCAgCBxDQAgASAEQYCAgCByNgKIASACQeABaiABEL8CIAEgASgCiAFB////X3E2AogBDAELIAJB4AFqIAEQvwILIAIoAuQBIQUgAigC4AEiCA0BCyAAQQA2AgAgACAFNgIEIAJB/ABqEMgrIAJBxABqELgFDAkLIAJBuAFqQQhqIgsgBkEIaigCADYCACACIAYpAgA3A7gBAkAgAigCfEUNAEEwQQgQxioiBCAFNgIIIAQgCDYCBCAEQQg2AgAgBCACKQO4ATcCDCAEQRRqIAsoAgA2AgAgASgC1AEgAkH8AGogBBDJHwwBCyACQfwAahDIKyAKIAIpA7gBNwIAIApBCGogCygCADYCACACIAU2AoABIAIgCDYCfAwACwsgASABEJcsEJ8XDAcLIAEgARCXLBCfFwwECwJAAkAgAigCfEUNACACQcgBakEQaiIIIAJB/ABqQRBqKAIANgIAIAJByAFqQQhqIgsgAkH8AGpBCGopAgA3AwAgAiACKQJ8NwPIAQJAIARB1wBHDQBBMEEIEMYqIgQgBTYCBCAEIAY2AgACQEEoRQ0AIARBCGogAkGQAWpBKPwKAAALIAEoAtQBIAJByAFqIAQQyR8LIAJB3ABqIAgoAgA2AgAgAkEINgJIIAJB1ABqIAspAwA3AgAgAiACKQPIATcCTAwBCyACIAU2AkwgAiAGNgJIAkBBKEUNACACQdAAaiACQZABakEo/AoAAAsgBkETRg0BCyACQcgAahDXJiEEDAELQQAhBAsgACAENgIQIAAgAzYCCCAAIAk2AgQgACAHNgIAIAAgASgC1AE2AgwMBAsgAEEANgIAIAAgCTYCBAwBCyAAQQA2AgAgACAENgIECyACQTBqEMAsDAELIABBADYCACAAIAQ2AgQLIAJBkAJqJAALrAsCEH8CfiMAQdABayIEJAAgBEHgAGogAxCLJSAEKAJkIQUCQAJAIAQoAmAiBkEqRg0AAkBBOEUNACAAQQhqIARB4ABqQQhqQTj8CgAACyAAIAU2AgQgACAGNgIADAELIARBADYCFCAEQoCAgIDAADcCDAJAAkACQCACRQ0AIARBGGogARDsDCAEQRhqQRhqIQdBBCEIIARBGGpBBGohCSAFrSEUIARBGGpBDGohCiAEQaABakEQaiELQQAhDANAAkACQAJAAkACQAJAAkAgBCgCSCIGIAQoAkxGDQAgBCAGQQhqNgJIAkAgBigCACINIAJPDQAgBjEABCEVIAQoAiQhDiAEKAIsIQ8CQCABIA1BGGxqKAIIRQ0AAkAgDyAORw0AIApBjPSDARCQHAsgBCgCKCAPQQN0aiAVQiiGIBVCIIaENwIAIAQgD0EBajYCLAJAIAwgBCgCDEcNACAEQQxqEI8cIAQoAhAhCAsCQEE4RQ0AIAggDEE4bGogBEEYakE4/AoAAAsgBCAMQQFqIgw2AhQgBigCACIGIAJPDQMgBEEYaiABIAZBGGxqEOwMDAkLAkAgDyAORw0AIApBvPSDARCQHAsgBCgCKCAPQQN0aiAVQiCGIBSEIBVCKIaENwIAIAQgD0EBajYCLAwICyANIAJB/PODARCMFQALIAQoAiwOAgUCAQsgBiACQaz0gwEQjBUACyAEQdAAakEIaiAKQQhqKAIANgIAIAQgCikCADcDUCAEQQA2AiwgBEKAgICAwAA3AiQgBEHgAGogAyAEQdAAahD9HiAEKAJkIQ8gBCgCYCIGQSpGDQJBOEUNASAAQQhqIARB4ABqQQhqQTj8CgAADAELIARBADYCLCAEQeAAaiADIAQoAigpAgAQ9SMgBCgCZCEPIAQoAmAiBkEqRg0BQThFDQAgAEEIaiAEQeAAakEIakE4/AoAAAsgACAPNgIEIAAgBjYCACAEKAIYIAQoAhwQ9ywMBQsCQCAEKAIgIgYgBCgCGEcNACAEQRhqQcz0gwEQjRwLIAQoAhwgBkECdGogDzYCACAEIAZBAWo2AiALIAQgBxCZEQJAIAQoAgAiBkUNACAEKAIEIQ0CQCAEKAIgIg8gBCgCGEcNACAEQRhqQdz0gwEQjRwLIAQoAhwgD0ECdGogBTYCACAEIA9BAWo2AiAgBCAGNgJIIAQgBiANQQN0ajYCTAwBCyAEQeAAaiADIARBGGoQ/h4gBCgCZCEOAkAgBCgCYCIGQSpGDQACQEE4RQ0AIABBCGogBEHgAGpBCGpBOPwKAAALIAAgDjYCBCAAIAY2AgAMBAsCQCAMDQBBACEMDAMLIAQgDEF/aiIMNgIUIAggDEE4bGoiBigCACIQQYCAgIB4Rg0CIAYoAhQhDyAGKAIQIQ0gBEHAAWpBCGoiESAGQQxqKAIANgIAIAYpAgQhFSALIAZBKGopAgA3AwAgBEGgAWpBGGoiEiAGQTBqKQIANwMAIARBoAFqQQhqIhMgBkEgaikCADcDACAEIBU3A8ABIAQgBikCGDcDoAECQCAPRQ0AIA0gD0EDdGpBeGoiBkUNACAGIA42AgAgBCgCJCAEKAIoEPwsIAkgBCkDwAE3AgAgCUEIaiARKAIANgIAIAcgBCkDoAE3AgAgB0EIaiATKQMANwIAIAdBEGogCykDADcCACAHQRhqIBIpAwA3AgAgBCAQNgIYIAQgDzYCLCAEIA02AigMAQsLQez0gwEQziwAC0EAQQBB7PODARCMFQALIAAgBTYCCCAAIA42AgQgAEEqNgIACyAEKAIkIAQoAigQ/CwCQCAMRQ0AIAghBgNAIAYoAgAgBkEEaigCABD3LCAGQQxqKAIAIAZBEGooAgAQ/CwgBkE4aiEGIAxBf2oiDA0ACwsgBCgCDCAIQQRBOBCLFgsgBEHQAWokAAvhCwEFfyMAQSBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDQXRqIgRBByAEQSZJGw4mHwABAgMEBQYHCAkKCwwfHw0ODxARHxITFB8fFRYXGBkaGxwfHR8fCyAAKAIMQQR0IQQgACgCCCEAA0AgBEUNHwJAIAAoAgBBAkYNACAAQQxqIAEQkC8LIABBEGohACAEQXBqIQQMAAsLIABBBGogARC8BgwdCyAAQQhqIAEQkS8MHAsgAEEEaiABEJAvDBsLIABBDGogARCQLwwaCyAAQQRqIAEQkC8gAEEIaiABEJAvDBkLIABBOGohBAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDgwBAgMEBQYHCAkKCwABCyAAQQhqIQMCQAJAIAAoAgQOAwABDAALIAEgAxCQEQwLCyABIAMQ6AwMCgsgAEEIaiABEMMVDAkLIABBCGogARC0JQwICyAAQQhqIAEQyScMBwsgAEEEaiABEJAvDAYLIABBBGogARCqIAwFCyABIABBBGoQoBIMBAsgASAAQQRqEKASDAMLIAEgAEEEahCOIwwCCyABIABBBGoQyw4MAQsgASAAQQRqEPoaCyAEIAEQkC8MGAsgAEEIaiABELQlDBcLIABBCGogARDJJwwWCyAAQQRqIAEQkC8gAEEIaiABEJAvIABBDGogARCQLwwVCyAAQQRqIQQCQCAALQAYQQVHDQAgAEEQaiABEJAvCyAEIAEQwh8gACgCKCABEJcmDBQLIABBEGogARCQLwJAIAAoAgRBgICAgHhGDQAgAEEEaiABEMIfCyAAKAIgIAEQlyYMEwsgAEEEaiABEP4gDBILIABBBGogARD+IAwRCyAAQQRqIAEQkC8gACgCGCABEJcmIAAoAgggARD+IAwQCyAAKAIgIgRFDQ4gASAEKAIMIAQoAhAQwx8gAC0AKEUNDiACQQhqIAEoAiggASgCLCAEKAIMIAQoAhAQtR0gAiACKAIIIgMgAigCDGo2AhwgAiADNgIYIAJBGGoQhhZFDQ4gASgCHCABKAIgIAQoAhAQnyohAyAEKAIMIQQgASADKAIAQSAQ6x4gASAEQSgQ6x4MDgsgAEEIaiABEJIvDA4LIAAoAgwiBEUNDSAAQQxqIAEQkC8gBCgCAEEeRw0NIAQtACgNDSABIARBIGooAgAQohAMDQsgAEEEaiABEJAvDAwLIABBBGogARCQLwwLCyAAQSBqENMmDAoLIAAoAgQgARDuDQwJCyAAQQRqIAEQ8hMMCAsgASAAQQRqEMsODAcLIAJBEGogACgCBBDIAyABIAIoAhQiBCAAKAIMIgMgBCADSRsgBCADIAQgA0sbEMMfIABBBGogARCQLwwGCyABIABBBGoQjiMMBQsgASAAQQRqEKASDAQLIAEgAEEEahD6GgwDCyABIABBBGoQoBIMAgsgAEEEaiABEKogDAELAkAgACgCJCIERQ0AIAEgBCgCBCAEKAIIEMMfIAEoAhwiAyABKAIgIgUgBCgCBEF/ahCgKiEGIAMgBSAEKAIIEJ8qIQUgAiABKAIoIAEoAiwgBigCACIDIAUoAgAiBSADIAVJGyADIAUgAyAFSxsQtR0gAiACKAIAIgMgAigCBGo2AhwgAiADNgIYIAJBGGoQhhZFDQAgASAGKAIAIAYoAgQQwx8gBCgCCEF+aiEEAkADQCAEIAEoAiwiA08NASAEQQFqIQMCQCABKAIoIARqLAAAQb9/Sg0AIAEgA0EgEOseIARBf2ohBAwBCwsgASADQSkQ6x4MAQsgBCADQZClnAEQjBUACyAAKAIMQShsIQQgACgCCCEDAkADQCAERQ0BIAMgARCGFSAEQVhqIQQgA0EoaiEDDAALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAQQRqIAEQkC8MAQsgACABEP8gCyACQSBqJAALtwsCEH8BfiMAQeAAayIEJAACQAJAAkAgAigCAEGAgICAeEYNACADKAIAQYCAgIB4Rw0BCyABKAIMIQUMAQtBfyACKAIIrSADNQIIfiIUpyAUQiCIpxsgASgCDCIFTQ0AIAMQiS0LIAEtABAhBgJAAkAgAygCAEGAgICAeEYNACACIQcgAigCAEGAgICAeEcNASADKAIIIQhBACEHIANBADYCCCAEQQA2AiggBCADNgIgIAQgCDYCJCAEIAMoAgQiCTYCGCAEIAkgCEEEdGo2AhwgBEEYahDRDgwBCyAEIAIQqRICQAJAAkAgBCgCAEEBcUUNACAEKAIERQ0BCyACEKIeDAELIAIQxCkgAkGAgICAeDYCAAtBACEHCwJAAkAgBkEBcUUNACAHRQ0BIARBGGpBfyAHQQhqIgg1AgAgAzUCCH4iFKcgFEIgiKcbQcDWhAEQ4B8gBEEIakEIaiAIKAIAIgk2AgAgBykCACEUIAcgBCkCGDcCACAIIARBGGpBCGooAgA2AgAgBCAUNwMIIAMoAgghCiADQQA2AgggBEEANgIoIAQgAzYCICAEIAo2AiQgBCADKAIEIgggCkEEdGoiCzYCHCAJQQR0IQwgBCgCDEEMaiENQQAhDgNAAkACQCAIIAtGDQAgCEEQaiEPIAgoAgAiEEGAgICAeEcNASAOIQogDyELCyAEIAo2AiwgBCALNgIYIARBGGoQ0Q4gAhDFKSAEQQhqEO8nDAMLIAgoAgghESAIKAIEIRIgCC0ADEEBcSEDIAwhCSANIQgCQANAIAlFDQECQAJAIAgtAAANACAODQEgBEEwaiAIQXhqKAIAIAhBfGooAgAQjhggBCAILQAAOgA8IAcgBEEwakHQ1oQBEKYbDAELIARBwABqIAhBfGoiEygCACARakHg1oQBEOEfIARBAToATCAEQcAAaiASIBEQ8CcgBEHAAGogCEF4aigCACATKAIAEPAnAkAgAw0AIARBADoATAsgByAEQcAAakHw1oQBEKYbCyAJQXBqIQkgCEEQaiEIDAALCyAQIBIQgy0gDkEBaiEOIA8hCAwACwsgB0UNACAEQRhqQX8gB0EIaiIINQIAIAM1Agh+IhSnIBRCIIinG0GA1oQBEOAfIAcoAgAhDSAHKAIEIQwgByAEKQIYNwIAIAgoAgAhCSAIIARBGGpBCGooAgA2AgAgDCAJQQR0aiEQIARBGGpBDWohCyAMIQgCQANAAkAgCCAQRw0AIBAhEgwCCyAIQRBqIRIgCCgCACIPQYCAgIB4Rg0BIAgoAgghESAIKAIEIQ4CQCAILQAMIglBAXENACALIAhBDWoiCC8AADsAACALQQJqIAhBAmotAAA6AAAgBCAJOgAkIAQgETYCICAEIA42AhwgBCAPNgIYIAcgBEEYakGQ1oQBEKYbIBIhCAwBCyADKAIIQQR0IQkgAygCBCEIAkADQCAJRQ0BIARB0ABqIAhBCGoiEygCACARakGg1oQBEOEfIARBAToAXCAEQdAAaiAOIBEQ8CcgBEHQAGogCEEEaigCACATKAIAEPAnAkAgCC0ADA0AIARBADoAXAsgCEEQaiEIIAcgBEHQAGpBsNaEARCmGyAJQXBqIQkMAAsLIA8gDhCDLSASIQgMAAsLIBAgEmtBBHYhCAJAA0AgCEUNASASKAIAIBJBBGooAgAQgy0gCEF/aiEIIBJBEGohEgwACwsgDSAMEPgsIAMoAgghCCADQQA2AgggBEEANgIoIAQgAzYCICAEIAg2AiQgBCADKAIEIgk2AhggBCAJIAhBBHRqNgIcIARBGGoQ0Q4gAhDFKQsCQAJAIAIoAgBBgICAgHhGDQAgAigCCCAFSw0BCyABKAIIIAYgAhC2JiAAQQhqIAJBCGooAgA2AgAgACACKQIANwIAIARB4ABqJAAPC0GK1YQBQcQAQdDVhAEQzB4AC/ILARN/IwBB0AFrIgIkACACQQA2AiggAkKAgICAgAE3AiAgAkHIAGpBCGohAyACQfAAakEIaiEEIAJB8ABqQRxqIQVBACEGQQghB0EAIQhBACEJQQAhCgJAAkACQANAAkACQAJAIAEtAOABQQFGDQACQCAKQf7/e0sNACAKIAlyRQ0AIAJB94CAgHg2AnAgASAKIAkgAkHwAGoQ1yMLIAEoAtgBIQsgAkHwAGogAUEAEPcBIAIoAnQhDAJAIAIoAnAiDUGAgICAeEcNACAAQYCAgIB4NgIAIAAgDDYCBAwGCyACIAIoAng2AjQgAiAMNgIwIAIgDTYCLAJAAkAgAS0A4AFBHEYNACACQfAAaiABEOECIAIoAnQhDgJAIAIoAnAiD0EHRw0AIABBgICAgHg2AgAgACAONgIEDAILIAJBOGpBCGogBUEIaigCADYCACACIAUpAgA3AzggAigCiAEhECACKAKEASERIAIoAoABIRIgAigCfCETIAIoAnghDQwECyABKALYASENIAEQoAsgASgC1AEhESACQfAAaiABQQAQ0QIgAigCdCEMAkAgAigCcCIKQQdGDQAgAyAEKQMANwMAIANBGGogBEEYaikDADcDACADQRBqIARBEGopAwA3AwAgA0EIaiAEQQhqKQMANwMAIAIgDDYCTCACIAo2AkgCQAJAIAEtAOABIgxBF0cNACABEKALIAJBGGogARC6GCACKAIcIRAgAigCGEEBcQ0BIAJBEGogAkHIAGoQog8gAigCFCEMIAIoAhAhCiACQf+AgIB4NgJwIAEgCiAMIAJB8ABqENcjIAEoAtQBIQpBKBCpKyEMAkBBKEUNACAMIAJByABqQSj8CgAACyACIAo2AlggAiANNgJUIAIgEDYCUCACIAw2AkwgAkEENgJIIAEtAOABIQwLQQAhEAJAIAEtAJEBQSBxRQ0AIAxB/wFxQQlHDQAgAkEIaiABQQEgASgC2AEQ+RIgAigCDCEQIAIoAghBAXENAQsgASgC1AEhE0EoEKkrIQ4CQEEoRQ0AIA4gAkHIAGpBKPwKAAALQQIhDyABLQCRAUEgcUUNBCABLQDgAUH/AXFBCkcNBCABEKALIAEoAtQBIQwgASgC0AEhCiACQf6AgIB4NgJwIAEgCiAMIAJB8ABqENcjDAQLIABBgICAgHg2AgAgACAQNgIEIAJByABqEOIVDAELIABBgICAgHg2AgAgACAMNgIECyACQSxqEI0oDAULIAAgAikCIDcCACAAQQhqIAJBIGpBCGooAgA2AgAMBQsgDSESIBMhCSANIQoLIAEoAtQBIRQCQCAIIAIoAiBHDQAgAkEgahDqHSACKAIkIQcLIAcgBmoiDCAPNgIAIAxBGGogEDYCACAMQRRqIBE2AgAgDEEQaiASNgIAIAxBDGogEzYCACAMQQhqIA02AgAgDEEEaiAONgIAIAxBHGogAikDODcCACAMQSRqIAJBOGpBCGooAgA2AgAgDEEsaiAUNgIAIAxBKGogCzYCACAMQTBqIAIpAiw3AgAgDEE4aiACQSxqQQhqKAIANgIAIAIgCEEBaiIINgIoAkACQCABLQDgASIMQQFGDQACQCAMQQdGDQAgASgC3AEhDCABKALYASEIIAJBnAFqIAEQzSYgAkEBNgJ0IAJByL6cATYCcCACQgE3AnwgAkGzBzYCxAEgAkEHOgDPASACIAJBwAFqNgJ4IAIgAkHIAWo2AsABIAIgAkHPAWo2AsgBIAJBqAFqIAJB8ABqEI4QIAJBvAFqIAJBpAFqKAIANgIAIAIgAikCnAE3ArQBIAggDCACQagBahDXGiEMIAEtAOABQaIBRg0CDAQLIAEQoAsgD0ECRw0AIAEtAOABQf8BcUEBRw0AIAEoAtQBIQwgASgC0AEhDSACQbqAgIB4NgJwIAEgDSAMIAJB8ABqENcjCyAGQcAAaiEGDAELCyABIAEQlywQnxcLIABBgICAgHg2AgAgACAMNgIECyACQSBqELIoCyACQdABaiQAC4oMAQl/IwBB0ABrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgMoAgAOCQABCAIDBAUGBwALIANBBGogARDSCiEADAgLIAMoAgQhBEEAIQAgAkEYaiADKAIIIgVBAEEEQQwQpgwgAigCHCEGIAIoAhhBAUYNCSACKAIgIQcCQCAFRQ0AIAchACAFIQMDQCACIAQ2AkwgAkEBNgIcIAJByL6cATYCGCACQgE3AiQgAkHJATYCRCACIAJBwABqNgIgIAIgAkHMAGo2AkAgAiACQRhqEOkJIABBCGogAkEIaigCADYCACAAIAIpAgA3AgAgAEEMaiEAIARBCGohBCADQX9qIgMNAAsgBSEACyACIAcgAEGanpoBQQIQkQUgByAAEJ8jIAYgBxDfLCACQQI2AhwgAkG01oMBNgIYIAJCATcCJCACQcoBNgJEIAIgAkHAAGo2AiAgAiACNgJAIAEoAgAgASgCBCACQRhqEN4FIQAgAigCACACKAIEEOAsDAcLIAIgA0EIajYCTCADKAIEIQAgAkECNgIcIAJB0NaDATYCGCACQgI3AiQgAkH4ADYCDCACQcsBNgIEIAIgADYCQCACIAI2AiAgAiACQcAAajYCCCACIAJBzABqNgIAIAEoAgAgASgCBCACQRhqEN4FIQAMBgsgAygCBCEEQQAhACACQRhqIAMoAggiBUEAQQRBDBCmDCACKAIcIQYgAigCGEEBRg0GIAIoAiAhBwJAIAVFDQAgByEAIAUhAwNAIAJBATYCHCACQci+nAE2AhggAkIBNwIkIAJB+AA2AkQgAiAEKAIANgJMIAIgAkHAAGo2AiAgAiACQcwAajYCQCACIAJBGGoQ6QkgAEEIaiACQQhqKAIANgIAIAAgAikCADcCACAAQQxqIQAgBEEEaiEEIANBf2oiAw0ACyAFIQALIAIgByAAQZqemgFBAhCRBSAHIAAQnyMgBiAHEN8sIAJBAjYCHCACQejWgwE2AhggAkIBNwIkIAJBygE2AkQgAiACQcAAajYCICACIAI2AkAgASgCACABKAIEIAJBGGoQ3gUhACACKAIAIAIoAgQQ4CwMBQsgAygCCCEAIAIgAygCBDYCTCACQQM2AhwgAkGI14MBNgIYIAJCAjcCJCACQQs2AgwgAkELNgIEIAIgADYCQCACIAI2AiAgAiACQcAAajYCCCACIAJBzABqNgIAIAEoAgAgASgCBCACQRhqEN4FIQAMBAsgAygCBCEAIAMoAhAhBCADKAIMIQcgAiADKAIINgI4IAIgBzYCPCACIAQ2AkwgAkEANgIQIAJBBDYCBCACQcDXgwE2AgAgAkH4ADYCNCACQfgANgIsIAJB+AA2AiQgAkH4ADYCHCACIAA2AkAgAiACQcAAajYCMCACIAJBzABqNgIoIAIgAkE8ajYCICACIAJBOGo2AhggAkEENgIMIAIgAkEYajYCCCABKAIAIAEoAgQgAhDeBSEADAMLIAEoAgBB4NeDAUEEIAEoAgQoAgwRCwAhAAwCCyADKAIEIQAgAkECNgIcIAJB7NeDATYCGCACQgE3AiQgAkH4ADYCBCACIAA2AkAgAiACNgIgIAIgAkHAAGo2AgAgASgCACABKAIEIAJBGGoQ3gUhAAwBC0EBIQAgASgCACIGQcTWgwFBBiABKAIEIggoAgwiCRELAA0AIAMoAgQiACADKAIIQQJ0aiEHQQAhBEEAIQoCQANAIAQhAwJAAkAgACAHRg0AIANBAWohBCAAKAIAIQEgAEEEaiIFIQAgAUUNAiACIANB/wFxrUKAgICAkCB+IAGthDcDQCAKRQ0BIAZBmp6aAUECIAkRCwBFDQEMAwsgBkHcg54BQQEgCRELACEADAMLIAJBATYCHCACQci+nAE2AhggAkIBNwIkIAJBzAE2AgQgAiACNgIgIAIgAkHAAGo2AgAgBiAIIAJBGGoQ3gUNASAKQQFqIQogBSEADAALC0EBIQALIAJB0ABqJAAgAA8LIAYgAigCIEGA6ZsBEIUpAAsgBiACKAIgQYDpmwEQhSkAC+cLAQx/IwBB4AFrIgQkAAJAAkAgAigCCCIFDQAgAEEANgIIIABCgICAgIABNwIADAELIARBGGogBUEIQShBmKqcARCfGiAEQQA2AiwgBCAEKQMYNwIkIAVBf2ogAigCCCIGQfyumwEQ6CYhByACQQA2AgggBCAHNgKMASAEIAI2AogBIAQgBiAHazYCkAEgBCACKAIEIgYgB0EobGoiCDYChAEgBUEobEFYaiEHIAZBKGohCSAEQdgAakEIaiEKIARBuAFqQQhqIQsgBEEwakEQaiEMIARBMGpBBHIhDQNAAkACQAJAAkACQAJAAkACQAJAAkAgB0UNACAGKAIAIgVBCEcNASAJIQgLIAQgCDYCgAEgBEGAAWoQmA8CQCACKAIIIgZFDQAgAiAGQX9qIgY2AgggAigCBCAGQShsaiIFKAIAIgZBCEcNAgtBqKqcARDOLAALIAQgBTYCMAJAQSRFDQAgDSAGQQRqQST8CgAACyAFQQdGIg4NASAFQQJHDQIMBgsgBCAGNgKAAQJAQSRFDQAgBEGAAWpBBHIgBUEEakEk/AoAAAsgBEEIaiAEQYABahCqFgJAIAZBB0YNACAEQbABaiAFQSRqKAIANgIAIAQgBSkCHDcDqAEgBCgCmAEhDiAEKAKUASEHIAQoApABIQkgBCgCjAEhCiAEKAKIASELIAQoAoQBIQUgBkECRw0DIAMoAgBFDQMgAygCBCEGIAMoAgghDSAEQbqAgIB4NgK4ASABIAYgDSAEQbgBahDXI0ECIQYMAwsCQCAEKAKEAUEBRw0AIAQoAowBIQcgBCgCiAEhCQJAIAQoApABIgYoAgBBdGpBJU0NACAEKAIMIQUgBCgCCCEKIARB/4CAgHg2ArgBIAEgCiAFIARBuAFqENcjCwJAIAMoAgBBAUcNACADKAIIIQUgAygCBCEKIARBuoCAgHg2ArgBIAEgCiAFIARBuAFqENcjCyAEIAYQyAMgBCgCBCEKIAQoAgAhCyAEQbgBaiABQQAgBhBrAkAgBCgCuAFBB0cNACAEKAK8ASEFDAULQSgQqSshBQJAQShFDQAgBSAEQbgBakEo/AoAAAtBAiEGQQAhDgwDCyAEQbgBaiABQQAgBCgCkAEQayAEKAK8ASEFIAQoArgBIgZBB0YNAyAEQbABaiAEQdwBaigCADYCACAEIAQpAtQBNwOoASAEKALQASEOIAQoAswBIQcgBCgCyAEhCSAEKALEASEKIAQoAsABIQsMAgsgBCgCNA0EIARBuAFqIAFBACAEKAJAEGsgBCgCvAEhBQJAIAQoArgBIg5BB0cNACAEIAk2AoABIABBgICAgHg2AgAgACAFNgIEIARBgAFqEJgPDAQLIAogCykDADcDACAKQRhqIAtBGGopAwA3AwAgCkEQaiALQRBqKQMANwMAIApBCGogC0EIaikDADcDACAEIAU2AlwgBCAONgJYIARBJGogBEHYAGpByKqcARDuHgwFCyAEQSRqIARBMGpB2KqcARDuHgwECyAEQdwBaiAEQagBakEIaigCADYCACAEIA42AtABIAQgBzYCzAEgBCAJNgLIASAEIAo2AsQBIAQgCzYCwAEgBCAFNgK8ASAEIAY2ArgBIAQgBCkDqAE3AtQBIARBJGogBEG4AWpBuKqcARDuHgJAIAEtAIgBQQhxRQ0AIAQoAixBKGwhBiAEKAIoIQUDQCAGRQ0BIAEgBRDXCSAGQVhqIQYgBUEoaiEFDAALCyAAIAQpAiQ3AgAgAEEIaiAEQSRqQQhqKAIANgIADAULIABBgICAgHg2AgAgACAFNgIECyAEQSRqELAoDAMLIARBEGogBEEwahCqFiAEKAIUIQUgBCgCECEPIARB94CAgHg2ArgBIAEgDyAFIARBuAFqENcjAkAgDkUNACAMELwsDAELIARBMGoQ4hULIAZBKGohBiAJQShqIQkgB0FYaiEHDAALCyACKAIEIgYgAigCCBCbJSACKAIAIAYQpy0gBEHgAWokAAuICgIQfwJ+IwBBgANrIgUkACABrSIVQv//////////P3wgFYAhFQJAAkAgAUGBIEkNACABELkkIQYMAQsgASABQQF2ayIHQcAAIAdBwABJGyEGCyAAQXRqIQhBASEHQQAhCUEAIQoDQEEBIQtBACEMAkAgCSABTw0AIAVBKGogCSAAIAFB9JKcARCTIyAFKAIoIQ0CQAJAIAUoAiwiDiAGSQ0AQQAhDwJAAkAgDkECSQ0AAkAgDSgCECANKAIESSANKAIMIhAgDSgCACIRSSAQIBFGGw0AIA1BHGohEUECIRADQCAOIBBGDQIgESgCACARQXRqKAIASSARQXxqKAIAIhIgEUFwaigCACITSSASIBNGGw0DIBFBDGohESAQQQFqIRAMAAsLIA1BHGohEUECIRADQAJAIA4gEEcNAEEBIQ8MAgtBASEPIBEoAgAgEUF0aigCAEkgEUF8aigCACISIBFBcGooAgAiE0kgEiATRhtBAUcNAiARQQxqIREgEEEBaiEQDAALCyAOIRALIBAgBkkNAAJAIA9FDQAgBUEgaiAQIA0gDkHEkpwBELckIAUoAiAgBSgCJBCWFAsgEEEBdEEBciELDAELAkAgBA0AIA4gBiAOIAZJG0EBdCELDAELIAVBGGogDkEgIA5BIEkbIhAgDSAOQbSSnAEQtyQgBSgCGCAFKAIcIAIgA0EAQQAQrQEgEEEBdEEBciELCyALQQF2IAlqrSAJrSIWfCAVfiAJIAdBAXZrrSAWfCAVfoV5pyEMCyAIIAlBDGwiEGohFCAAIBBqIQ0DQAJAAkACQAJAAkACQAJAIApBAkkNACAFQb4CaiAKQX9qIhNqLQAAIAxPDQELIAVBvgJqIApqIAw6AAAgBUE0aiAKQQJ0aiAHNgIAIAkgAU8NASAKQQFqIQogC0EBdiAJaiEJIAshBwwHCwJAIAVBNGogE0ECdGooAgAiCkEBdiIQIAdBAXYiEWoiDyADSw0AIAogB3JBAXFFDQILIAAgCSAPa0EMbGohEgJAIApBAXENACAFQRBqIBAgEiAPQdSSnAEQtyQgBSgCECAFKAIUIAIgAxCgJgsCQCAHQQFxDQAgBUEIaiAQIBIgD0HkkpwBEJMjIAUoAgggBSgCDCACIAMQoCYLIApBAkkNBCAHQQJJDQQgAyARIBAgESAQSSIKGyIRSQ0EIBIgEEEMbGoiECASIAobIQcCQCARQQxsIhFFDQAgAiAHIBH8CgAACyACIBFqIRECQCAKDQAgAiEKA0AgCiARRg0FIBAgDUYNBSAHIBAgCiAQKAIEIAooAgRJIBAoAgAiDiAKKAIAIhJJIA4gEkYbIg4bIhIpAgA3AgAgB0EIaiASQQhqKAIANgIAIBAgDkEMbGohECAKIA5BAXNBDGxqIQogB0EMaiEHDAALCyAUIQoDQCAKIAdBdGoiECARQXRqIg4gEUF4aigCACAHQXhqKAIASSAOKAIAIgcgECgCACIRSSAHIBFGGyIHGyIRKQIANwIAIApBCGogEUEIaigCADYCACAOIAdBDGxqIREgECAHQQFzQQxsaiIHIBJGDQMgCkF0aiEKIBEgAkcNAAwDCwsCQCAHQQFxDQAgACABIAIgAxCgJgsgBUGAA2okAA8LIA9BAXQhByATIQoMAwsgAiEKCyARIAprIhBFDQAgByAKIBD8CgAACyAPQQF0QQFyIQcgEyEKDAALCwuICgIQfwJ+IwBBgANrIgUkACABrSIVQv//////////P3wgFYAhFQJAAkAgAUGBIEkNACABELkkIQYMAQsgASABQQF2ayIHQcAAIAdBwABJGyEGCyAAQXRqIQhBASEHQQAhCUEAIQoDQEEBIQtBACEMAkAgCSABTw0AIAVBKGogCSAAIAFB9JKcARCTIyAFKAIoIQ0CQAJAIAUoAiwiDiAGSQ0AQQAhDwJAAkAgDkECSQ0AAkAgDSgCECANKAIESSANKAIMIhAgDSgCACIRSSAQIBFGGw0AIA1BHGohEUECIRADQCAOIBBGDQIgESgCACARQXRqKAIASSARQXxqKAIAIhIgEUFwaigCACITSSASIBNGGw0DIBFBDGohESAQQQFqIRAMAAsLIA1BHGohEUECIRADQAJAIA4gEEcNAEEBIQ8MAgtBASEPIBEoAgAgEUF0aigCAEkgEUF8aigCACISIBFBcGooAgAiE0kgEiATRhtBAUcNAiARQQxqIREgEEEBaiEQDAALCyAOIRALIBAgBkkNAAJAIA9FDQAgBUEgaiAQIA0gDkHEkpwBELckIAUoAiAgBSgCJBCWFAsgEEEBdEEBciELDAELAkAgBA0AIA4gBiAOIAZJG0EBdCELDAELIAVBGGogDkEgIA5BIEkbIhAgDSAOQbSSnAEQtyQgBSgCGCAFKAIcIAIgA0EAQQAQrgEgEEEBdEEBciELCyALQQF2IAlqrSAJrSIWfCAVfiAJIAdBAXZrrSAWfCAVfoV5pyEMCyAIIAlBDGwiEGohFCAAIBBqIQ0DQAJAAkACQAJAAkACQAJAIApBAkkNACAFQb4CaiAKQX9qIhNqLQAAIAxPDQELIAVBvgJqIApqIAw6AAAgBUE0aiAKQQJ0aiAHNgIAIAkgAU8NASAKQQFqIQogC0EBdiAJaiEJIAshBwwHCwJAIAVBNGogE0ECdGooAgAiCkEBdiIQIAdBAXYiEWoiDyADSw0AIAogB3JBAXFFDQILIAAgCSAPa0EMbGohEgJAIApBAXENACAFQRBqIBAgEiAPQdSSnAEQtyQgBSgCECAFKAIUIAIgAxChJgsCQCAHQQFxDQAgBUEIaiAQIBIgD0HkkpwBEJMjIAUoAgggBSgCDCACIAMQoSYLIApBAkkNBCAHQQJJDQQgAyARIBAgESAQSSIKGyIRSQ0EIBIgEEEMbGoiECASIAobIQcCQCARQQxsIhFFDQAgAiAHIBH8CgAACyACIBFqIRECQCAKDQAgAiEKA0AgCiARRg0FIBAgDUYNBSAHIBAgCiAQKAIEIAooAgRJIBAoAgAiDiAKKAIAIhJJIA4gEkYbIg4bIhIpAgA3AgAgB0EIaiASQQhqKAIANgIAIBAgDkEMbGohECAKIA5BAXNBDGxqIQogB0EMaiEHDAALCyAUIQoDQCAKIAdBdGoiECARQXRqIg4gEUF4aigCACAHQXhqKAIASSAOKAIAIgcgECgCACIRSSAHIBFGGyIHGyIRKQIANwIAIApBCGogEUEIaigCADYCACAOIAdBDGxqIREgECAHQQFzQQxsaiIHIBJGDQMgCkF0aiEKIBEgAkcNAAwDCwsCQCAHQQFxDQAgACABIAIgAxChJgsgBUGAA2okAA8LIA9BAXQhByATIQoMAwsgAiEKCyARIAprIhBFDQAgByAKIBD8CgAACyAPQQF0QQFyIQcgEyEKDAALCwvsCwEGfyMAQZABayIEJAAgBCACNgJUAkACQAJAIAEtAJEBQSBxRQ0AIAEtAOEBQQFGDQAgAS0A4AEhBQJAAkACQAJAAkACQCADQf8BcUEGSw0AIAVB/wFxQfUARg0BCyAFQf8BcUGeAUcNBSAEQcgAaiACEMgDIAQoAkghBiAEIAI2AnggBEHAAGogARDwBiAEKAJEIQcgBCgCQEEBcUUNASAAQQI6AAQgACAHNgIAIARB+ABqEKcsDAYLIARBOGogAhDIAyAEKAI4IQcgBCACNgJYAkAgARDUCSIFRQ0AIAUtAABB0QBGDQILIARBMGogARDwBiAEKAI0IQUgBCgCMEEBcUUNAiAAQQI6AAQgACAFNgIAIARB2ABqEKcsDAULIAEoAtQBIQhBCEHAABD7KyIFRQ0FIAUgCDYCECAFIAY2AgwgBSAHNgIIIAUgAjYCBCAFQS42AgAgACABIAUgAxDIAgwECyABEKALIAEQoAsgASgC1AEhBkEIQcAAEPsrIgVFDQQgBSAGNgIMIAUgBzYCCCAFIAI2AgQgBUEqNgIADAELIAQgBzYCgAEgBCAFNgJ8IAQgAjYCeCAEIAEoAtQBNgKEASAEQfgAahCaIiEFCyAAIAEgBSADEMgCDAELQQchBUEAIQcCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDgASIGQXNqDi8RAQIDBAUGExQVGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaEgcICQoLDA0OFw8WEAALQRYhCUEAIQgCQCAGQaB/ag4CABkaCyABLQCIAUHAAHFFDRlBFSEJDBcLQQkhBUEMIQkMFgtBCiEFQQ0hCQwVC0EKIQVBDiEJDBQLQQohBUEPIQkMEwtBBCEJDBILQQYhCQwRC0EGIQVBASEJDBALQQYhBUECIQkMDwtBBiEFQQMhCQwOC0EFIQkMDQtBByEJQQAhCEEHIQUMDQtBCCEJQQAhCEEIIQUMDAtBCCEFQQkhCQwKC0EIIQVBCiEJDAkLQQEhBUETIQkMCAtBASEIQRghCUEBIQUMCAtBCSEFQQshCQwGC0EGIQVBACEJQQAhCEEAIQcMBgtBAyEFQRAhCQwEC0EEIQVBESEJDAMLQQUhBUESIQkMAgtBAiEFQRQhCQwBC0ELIQVBASEHQRchCQtBACEICyAFIANB/wFxTQ0BIAEQoAsCQCACKAIAIgZBEEYNACAGQSJHDQQLIAdFDQMgASgC3AEhAiABKALYASEFIARBATYCfCAEQci+nAE2AnggBEIBNwKEASAEQYkDNgJ0IAQgBEHwAGo2AoABIAQgBEHUAGo2AnAgBEHYAGpBBHIgBEH4AGoQkhAgBEEoaiAEKAJUEMgDIARBrICAgHg2AlggBCAEKQMoNwNoIAUgAiAEQdgAahDXGiEGIAEtAOABQaIBRw0EIAEgARCXLBCfFwwECyAAQQA6AAQMAQsgAEEAOgAECyAAIAI2AgAMBQsgBEEgaiABEJUCIAQoAiQhBiAEKAIgQQFxDQAgBEEYaiABIAYgBSAHaxDfDSAEKAIcIQYgBCgCGEEBcQ0AIAhFDQMgAigCAEESRw0CIAItABRBbWpB/wFxQQJJDQEMAgsgAEECOgAEIAAgBjYCACAEQdQAahCnLAwDCyACKAIQIQUgAigCDCEHIARBuICAgHg2AnggASAHIAUgBEH4AGoQ1yMLIAYoAgBBEkcNACAGLQAUQW1qQf8BcUEBSw0AIAYoAhAhBSAGKAIMIQcgBEG4gICAeDYCeCABIAcgBSAEQfgAahDXIwsgBEEQaiACEMgDIAQoAhAhBSAEQQhqIAYQyAMgBCgCDCEHQQhBwAAQ+ysiAUUNASABIAk6ABQgASAFNgIMIAEgBjYCCCABIAI2AgQgAUESNgIAIAAgAzoABSAAQQE6AAQgACABNgIAIAEgBzYCEAsgBEGQAWokAA8LAAukCwMKfwN+AXwjAEHAAGsiAiQAAkACQAJAAkACQAJAAkACQCAALQAADgYCAAEFBAMCCyABKAIAKAIAQa2HnAFBqIecASAALQABIgAbQQRBBSAAGxCLCSACQQQ6ABAgAkEQahDKJiEDDAYLIAEoAgAhBAJAAkAgACgCCA4DAAEGAAsgAkEIaiAAKQMQIAJBEGoQ9gkgBCgCACACKAIIIAIoAgwQiwkgAkEEOgA4IAJBOGoQyiYhAwwGCyAAKQMQIgwgDEI/hyINhSANfSENQRQhAANAAkAgDUKPzgBWDQACQCANQuMAWA0AIAJBEGogAEF+aiIAaiANpyIFIAVB//8DcUHkAG4iBUHkAGxrQf//A3FBAXRB9PyYAWovAAA7AAAgBa0hDQsCQAJAIA1CClQNACACQRBqIABBfmoiAGogDadBAXRB9PyYAWovAAA7AAAMAQsgAkEQaiAAQX9qIgBqIA2nQTByOgAACwJAIAxCf1UNACACQRBqIABBf2oiAGpBLToAAAsgBCgCACACQRBqIABqQRQgAGsQiwkgAkEEOgA4IAJBOGoQyiYhAwwHCyACQRBqIABqIgVBfGogDSANQpDOAIAiDkKQzgB+faciA0H//wNxQeQAbiIGQQF0QfT8mAFqLwAAOwAAIAVBfmogAyAGQeQAbGtB//8DcUEBdEH0/JgBai8AADsAACAAQXxqIQAgDiENDAALCyABKAIAKAIAENMjIQMMBAsgACgCDCEGIAEoAgAoAgBBx5CcAUEBEIsJIAJBBDoAECACQRBqEMomIgMNA0GAAiEHAkAgBg0AIAJBEGogASgCACgCABDALSACQRBqEMomIgMNBEEAIQcLIAAoAgghBSACIAZBACAAKAIEIgAbIgg2AjAgAiAFNgIsIAIgADYCKCACQQA2AiQgAiAAQQBHIgk2AiAgAiAFNgIcIAIgADYCGCACQQA2AhQgAiAJNgIQQQAhAAJAAkACQANAIAhFDQEgAiAIQX9qIgg2AjACQAJAAkACQCAJQQFxIgNFDQAgAA0AIAIoAhghAANAAkAgBQ0AIAJCADcCGCACIAA2AhRBASEJQQAhBQwDCyAFQX9qIQUgACgCmAMhAAwACwsgA0UNAQsgAigCGCEDA0AgBSAALwGSA0kNAgJAIAAoAogCIgZFDQAgA0EBaiEDIAAvAZADIQUgBiEADAELC0HwvZsBEM4sAAtBgL6bARDOLAALIAVBAWohCgJAAkAgAw0AIAAhCwwBCyAAIApBAnRqQZgDaiEGQQAhCkEAIQQDQCAGKAIAIgtBmANqIQYgAyAEQQFqIgRHDQALCyACIAo2AhwgAkEANgIYIAIgCzYCFCAHQQFxDQIgAkE4aiABKAIAIAdBgP4DcUGAAkYQzCYgAkE4ahDKJiIDDQcgASgCACAAIAVBDGxqQYwCaiIDKAIEIAMoAggQgCMiAw0HIAJBBDoAOCACQThqEMomIgMNByACQThqIAEoAgAoAgAQui0gAkE4ahDKJiIDDQcgACAFQRhsaiABEMkCIgMNByAHQf+BfHFBgARyIQcgAkEEOgA4IAohBSALIQAgAkE4ahDKJiIDRQ0ADAcLCyAHQQFxDQECQCAHQYD+A3ENAEEAIQMMBgsgAkEQaiABKAIAKAIAEMAtIAJBEGoQyiYhAwwFC0HLuJwBQShB2M6bARDMHgALQcu4nAFBKEH4zpsBEMweAAsgASAAQQRqELoLIQMMAgsgASgCACAAKAIIIAAoAgwQgCMhAwwBCwJAIAArAxAiD71C////////////AINC//////////f/AFUNACAPIAJBEGoQ9AEhACAEKAIAIAJBEGogABCLCSACQQQ6ADggAkE4ahDKJiEDDAELIAJBEGogBCgCABC/LSACQRBqEMomIQMLIAJBwABqJAAgAwudCgENfyMAQSBrIgIkAEEBIQMgASABKAJoIgRBAWoiBTYCaCABKAJ4IQYCQCAELAAAIgdBf0oNACABIARBAmoiBTYCaCAELQABQT9xIQggB0EfcSEJAkACQCAHQWBPDQAgCUEGdCAIciEEDAELIAEgBEEDaiIFNgJoIAhBBnQgBC0AAkE/cXIhCAJAIAdBcE8NACAIIAlBDHRyIQQMAQsgASAEQQRqIgU2AmggCEEGdCAELQADQT9xciAJQRJ0QYCA8ABxciEECyAEQYABSQ0AQQIhAyAEQYAQSQ0AQQNBBCAEQYCABEkbIQMLIAEoAmwhBCABLQAoIQggASADIAZqIgc2AngCQAJAIAEtAJEBQSBxRQ0AIAEoAogBQYDgAHFBgCBHDQAgAEGAJjsBAAwBC0ETIQNBACEJAkAgBSAERg0AAkACQAJAAkAgBSwAACIKQX9KDQAgCkEfcSILQQZ0IAUtAAFBP3EiDHIhDQJAIApBYEkNACAMQQZ0IAUtAAJBP3FyIQ4CQAJAIApBcE8NACAOIAtBDHRyIQ4MAQsgDkEGdCAFLQADQT9xciALQRJ0QYCA8ABxciEOCyAOQT5HDQUgASAFQQJqIg42AmggCkFgSQ0DIAEgBUEDaiIONgJoIAxBBnQgBS0AAkE/cXIhAyAKQXBPDQIgAyALQQx0ciENDAMLIA1BPkcNBCABIAVBAmoiDjYCaEEBIQMMAwsgCkE+Rw0DQQEhAyABIAVBAWoiDjYCaAwCCyABIAVBBGoiDjYCaCADQQZ0IAUtAANBP3FyIAtBEnRBgIDwAHFyIQ0LAkAgDUGAAU8NAEEBIQMMAQsCQCANQYAQTw0AQQIhAwwBC0EDQQQgDUGAgARJGyEDCyABIAMgB2oiBzYCeEE2IQMCQAJAAkACQAJAIA4gBEYNAAJAIA4sAAAiCkF/Sg0AIApBH3EiC0EGdCAOLQABQT9xIgxyIQ0CQCAKQWBJDQAgDEEGdCAOLQACQT9xciEFAkACQCAKQXBPDQAgBSALQQx0ciEFDAELIAVBBnQgDi0AA0E/cXIgC0ESdEGAgPAAcXIhBQsgBUE+Rw0CIAEgDkECaiIFNgJoIApBYEkNBCABIA5BA2oiBTYCaCAMQQZ0IA4tAAJBP3FyIQMgCkFwTw0DIAMgC0EMdHIhDQwECyANQT5HDQEgASAOQQJqIgU2AmhBASEDDAULIApBPkYNAwsgDiEFDAQLIAEgDkEEaiIFNgJoIANBBnQgDi0AA0E/cXIgC0ESdEGAgPAAcXIhDQsCQCANQYABTw0AQQEhAwwCCwJAIA1BgBBPDQBBAiEDDAILQQNBBCANQYCABEkbIQMMAQtBASEDIAEgDkEBaiIFNgJoCyABIAMgB2oiBzYCeEE3IQNBASEJCwJAAkACQAJAIAQgBUYNACAFLQAAQT1HDQAgASAHQQFqNgJ4IAEgBUEBaiIFNgJoQSYhBwJAAkAgA0FKag4CAQMAC0E0IQcgA0ETRg0DQcu4nAFBKEHgnJoBEMweAAtBJSEHDAILIAMhBwsgCSAIcUUNACAFIAQgBWtB2pyaAUEFEOMlRQ0AIAJBm4GAgHg2AgggASAGIAZBB2ogAkEIahCjJCABQQUQsQIgARCJASABQQA6AJMBIAEoAmwgASgCaCIFRw0BIABBgMYCOwEADAILIABBADoAACAAIAc6AAEMAQsgACABIAUtAABBAnRBlKKaAWooAgARBgALIAJBIGokAAudCgEQfyMAQSBrIgQkACABKAJsIQUgASgCaCEGIAIoAgghByACKAIAIQggASgCeCIJIQpBgIDEACELQQAhDAJAA0ACQAJAAkAgBiAFRg0AIAtBqH9qIQ0gC0EuRiEOIAtB+ABGIQ8DQAJAAkAgBiwAACIQQX9KIhENACAGLQABQT9xIQsgEEEfcSESAkAgEEFgTw0AIBJBBnQgC3IhCwwCCyALQQZ0IAYtAAJBP3FyIQsCQCAQQXBPDQAgCyASQQx0ciELDAILIAtBBnQgBi0AA0E/cXIgEkESdEGAgPAAcXIhCwwBCyAQQf8BcSELCwJAIAtB3wBGDQAgC0GAgMQARg0CIAtBv39qQV9xQQpqIAtBUGogC0E5SxsiEkEPSw0CQQEhDSABIAZBAWoiDjYCaCARRQ0DIA4hBgwECyADQQE6AAACQAJAIAYsAAAiC0F/TA0AIAZBAWohEAwBCwJAIAtBYE8NACAGQQJqIRAMAQsgBkEEQQMgC0FvSxtqIRALAkACQCAQIAVGDQACQAJAIBAsAAAiCkF/Sg0AIBAtAAFBP3EhESAKQR9xIRICQCAKQWBPDQAgEkEGdCARciEQDAILIBFBBnQgEC0AAkE/cXIhEQJAIApBcE8NACARIBJBDHRyIRAMAgsgEUEGdCAQLQADQT9xciASQRJ0QYCA8ABxciIQQYCAxABHDQEMAgsgCkH/AXEhEAsgEEG/f2pBXnFBCmogEEFQaiAQQTlLG0EPSw0AAkACQCANDggCAQEBAQEBAgALIA4NASAPDQELAkAgEEGof2oOCAECAgICAgIBAAsgEEH4AEYNACAQQS5HDQELIARB7oCAgHg2AgggASAJIARBCGoQiywgASgCbCEFIAEoAmgiBi0AACELCyABIAZBAWoiCjYCaAJAAkAgC8BBf0oNACABIAZBAmoiCjYCaCAGLQABQT9xIRAgC0EfcSERAkACQCALQf8BcSILQeABTw0AIBFBBnQgEHIhBgwBCyABIAZBA2oiCjYCaCAQQQZ0IAYtAAJBP3FyIRACQCALQfABTw0AIBAgEUEMdHIhBgwBCyABIAZBBGoiCjYCaCAQQQZ0IAYtAANBP3FyIBFBEnRBgIDwAHFyIQYLIAEoAnghCwJAIAZBgAFPDQBBASEQIAohBgwCCwJAIAZBgBBPDQBBAiEQIAohBgwCC0EDQQQgBkGAgARJGyEQIAohBgwBCyABKAJ4IQtBASEQIAohBgsgASAQIAtqIgo2AnggBiAFRw0ACwsgACATNgIEIAAgDDYCAAwDCyABIAZBAmoiETYCaCAGLQABQT9xIQ4gEEEfcSEPAkACQCAQQWBPDQAgD0EGdCAOciEGDAELIAEgBkEDaiIRNgJoIA5BBnQgBi0AAkE/cXIhDgJAIBBBcE8NACAOIA9BDHRyIQYMAQsgASAGQQRqIhE2AmggDkEGdCAGLQADQT9xciAPQRJ0QYCA8ABxciEGCwJAIAZBgAFJDQBBAiENIAZBgBBJDQBBA0EEIAZBgIAESRshDQsgESEGCyABIA0gCmoiCjYCeCAIIAgtAABBAWoiEDoAAAJAIBNBACAMQQFxGyIRQYCAgIABSQ0AIAIoAgQoAgAhBiAEQaOAgIB4NgIIIAYgBiAEQQhqENcaIQYgAEECNgIAIAAgBjYCBAwCCyASIBFBBHRyIRNBASEMIBBB/wFxIActAABHDQALIAAgEzYCBCAAQQE2AgALIARBIGokAAvlCwIFfwF+IwBB0AFrIgYkAAJAAkACQCABLQDgAUEXRg0AIAEoAtwBIQcgASgC2AEhBSAGQQRqIAEQzSYgBkEBNgKsASAGQci+nAE2AqgBIAZCATcCtAEgBkGzBzYCbCAGQRc6AFwgBiAGQegAajYCsAEgBiAGQYQBajYCaCAGIAZB3ABqNgKEASAGQZABaiAGQagBahD0GiAGQaQBaiAGQQxqKAIANgIAIAYgBikCBDcCnAEgBSAHIAZBkAFqENcaIQcgAS0A4AFBogFHDQEgASABEJcsEJ8XDAELIAEQoAsCQAJAAkACQCABLQDgAUGSAUcNACABENQJIgdFDQAgBy0AAEUNAQsgBkGoAWogAUEAEMIFIAYoAqgBIQcgBi0AvAFBA0YNAyAGQThqIAZBtAFqKAIANgIAIAYgBikCrAE3AzAgBigCuAEhCCAGKAK8ASEJQgAhCwwBCyABKALYASEIAkAgAS0A4AFBkgFGDQAgASgC3AEhByAGQdAAaiABEM0mIAZBATYCrAEgBkHIvpwBNgKoASAGQgE3ArQBIAZBswc2AmwgBkGSAToAyAEgBiAGQegAajYCsAEgBiAGQcABajYCaCAGIAZByAFqNgLAASAGQZABaiAGQagBahD0GiAGQaQBaiAGQdgAaigCADYCACAGIAYpAlA3ApwBIAggByAGQZABahDXGiEHIAEtAOABQaIBRw0DIAEgARCXLBCfFwwDCyABEKALAkAgAS0A4AFFDQAgASgC3AEhByABKALYASEFIAZB3ABqIAEQzSYgBkEBNgKsASAGQci+nAE2AqgBIAZCATcCtAEgBkGzBzYCbCAGQQA6AMgBIAYgBkHoAGo2ArABIAYgBkHAAWo2AmggBiAGQcgBajYCwAEgBkGQAWogBkGoAWoQ9BogBkGkAWogBkHkAGooAgA2AgAgBiAGKQJcNwKcASAFIAcgBkGQAWoQ1xohByABLQDgAUGiAUcNAyABIAEQlywQnxcMAwsgARCgCwJAAkAgAS0A4AEiB0GiAUYNAAJAIAdBwABGDQAgBkGoAWpBBHIgARDNJiAGQRA2ArwBIAZBtLmcATYCuAEgBkGwgICAeDYCqAEgASgC2AEgASgC3AEgBkGoAWoQ1xohByABLQDgAUGiAUcNBSABIAEQlywQnxcMBQsgBkHoAGogARD1GiABLQDgAUEBRg0BIAEoAtwBIQcgASgC2AEhBSAGQYQBaiABEM0mIAZBATYCrAEgBkHIvpwBNgKoASAGQgE3ArQBIAZBswc2AsQBIAZBAToAzwEgBiAGQcABajYCsAEgBiAGQcgBajYCwAEgBiAGQc8BajYCyAEgBkGQAWogBkGoAWoQ9BogBkGkAWogBkGMAWooAgA2AgAgBiAGKQKEATcCnAEgBSAHIAZBkAFqENcaIQcgAS0A4AFBogFHDQMgASABEJcsEJ8XDAMLIAEQlywhBwwDCyABEKALIAZBwABqQQhqIgogBkH8AGooAgA2AgAgBiAGKQJ0NwNAIAYoAnAhByAGKQNoIgtCAFENAiABKALUASEJIAZBMGpBCGogCigCADYCACAGIAYpA0A3AzALIAZBJGogBkEwakEIaigCADYCACAGIAc2AhggBiALNwMQIAYgBikDMDcCHCAGIAk2AiwgBiAINgIoIAZBEGpBCGohCAJAIAEQwBIiB0UNAAJAIAtCAFINACAIEIMiDAMLIAsgBikDIBCnLgwCCyABKALUASEBQcgAQQgQlioiByABNgIkIAcgAjYCICAHIAU6AEEgByAEOgBAIAdBGGogBkEQakEYaikDADcDACAHQRBqIAZBEGpBEGopAwA3AwAgB0EIaiAIKQMANwMAIAcgBikDEDcDACAHIAMpAwA3AyggB0EwaiADQQhqKQMANwMAIAdBOGogA0EQaikDADcDAEEAIQEMAgsgBikDaCAGKQN4EKcuCyADKQMAEL4hQQEhAQsgACAHNgIEIAAgATYCACAGQdABaiQAC4YLAgx/AX4jAEGQA2siAiQAIAIgARD2DyIDNgIIAkACQCADQdsARw0AIAJBoAFqQQhqIgMgASgCACIEQdgAaigCACIFNgIAIAJBoAFqQRRqIAU2AgAgAiAEKQJQIg43AqwBIAJBDGpBFGogAykDADcCACACQShqIAJBoAFqQRBqKQMANwIAIAJCgICAgMAANwIMIAJBADYCFCACIA43AhggBEEgaiEGIARB0ABqIQUgAkG4AmpBxABqIQcgAkG4AmpBBGohCCACQaABakHEAGohCSACQaABakEEaiEKIAJBMGpBJGohCyABKAII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CyEBDAULIAIgAEEEajYCDCABQcyHmwFBDyACQQxqQaYFEP0LIQEMBAsgAiAAQQRqNgIMIAFB24ebAUELIAJBDGpBpwUQ/QshAQwDCyACIABBCGo2AgwgAUHFmZsBQQsgAkEMakGoBRD9CyEBDAILIAIgAEEEajYCDCABQeaHmwFBCCACQQxqQakFEP0LIQEMAQsgAiAAQQRqNgIMIAFBvrOcAUEHIAJBDGpBqgUQ/QshAQsgAkEQaiQAIAELsQsBDX8jAEHAAWsiAyQAAkACQAJAAkACQAJAAkACQCABLQDgASIEEKAVDQAgBEF+ag4DBgMBAgsgA0E4aiABIAIQswUCQAJAIAMtAExBAkcNACAAIAMoAjg2AgRBByEBDAELIANB/ABqIANB0ABqKQMANwIAIANB9ABqIANByABqKQMANwIAIANB7ABqIANBwABqKQMANwIAIAMgAykDODcCZAJAQSRFDQAgAEEEaiADQeAAakEk/AoAAAtBACEBCyAAIAE2AgAMBgsgASgC2AEhBSABEKALIANBADYCFCADQoCAgICAATcCDCADQThqQQhqIQIgA0HgAGpBCGohBkEAIQdBACEIA0ACQAJAAkACQAJAAkACQCABLQDgASIEQXtqDgMBAAIACwJAIAhB/v97Sw0AIAggB3JFDQAgA0G7gICAeDYCOCABIAggByADQThqENcjIAEtAOABIQQLAkAgBEH/AXEiCUEcRg0AIANBOGogARCSCCADKAI8IQogAygCOCIEQQdGDQUgBiACKQMANwMAIAZBGGogAkEYaikDADcDACAGQRBqIAJBEGopAwA3AwAgBkEIaiACQQhqKQMANwMAIAMgCjYCZCADIAQ2AmAgA0EMaiADQeAAakG8qJwBEO4eDAQLIAEoAtgBIQggARCgCyABKALUASELIANBOGogAUEAENECIAMoAjwhCiADKAI4IgxBB0YNBCADQRhqQRhqIg0gAkEYaikDADcDACADQRhqQRBqIg4gAkEQaikDADcDACADQRhqQQhqIg8gAkEIaikDADcDACADIAIpAwA3AxggASgC1AEhB0EoEKkrIgQgCjYCBCAEIAw2AgAgBCADKQMYNwMIIARBEGogDykDADcDACAEQRhqIA4pAwA3AwAgBEEgaiANKQMANwMAIANBADYCUCADIAs2AkwgAyAINgJI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GgsgA0HIAGogAiAFIAQgCSAMIA0QjgIgAy0ASEEERg0DIAMpA0giDkL/AYNCBFINBAwDCyACKAJERQ0AQQAhDAJAIAYoAgAiDUEHRg0AAkACQAJAAkACQAJAIA0OBwACAQIDBAUACyADQRBqIApBdGoQrxkgAygCFCEMDAULIApBeGooAgAhDAwECyAKKAIAIQwMAwsgCkF8aigCACEMDAILIApBdGooAgAhDAwBCyADQRhqIApBcGooAgAQyAMgAygCHCEMCyADQcgAaiACIAxBABDxAyADLQBIQQRGDQAgAykDSCIOQv8Bg0IEUg0DCwJAIAMtAEBFDQAgAiACKAIsQX9qNgIsIANBADoAQAsgA0EIaiAGEPgaIAtBf2ohCyAKQShqIQpBASEMIAMoAgwhDQwACwsgA0HIAGogAiAEIAdFIAkQ1BMgAy0ASEEERg0BIAMpA0giDkL/AYNCBFENAQsgDkL/AYNCBFENACAAIA43AgAMAQsgA0HIAGogAiADQTRqQcSQnAFBARC3DQJAIAMtAEhBBEYNACADKQNIIg5C/wGDQgRRDQAgACAONwIADAELAkAgAS0AGEUNACADQcgAaiACIANBNGpBxZCcAUEBELcNIAMtAEhBBEYNACADKQNIIg5C/wGDQgRRDQAgACAONwIADAELAkAgASgCFEUNACADIAFBFGo2AkAgA0HIAGogAiADQTRqQcOQnAFBARC3DQJAAkAgAy0ASEEERg0AIAMpA0giDkL/AYNCBFINAQsgA0HIAGogAhCOEQJAIAMtAEhBBEYNACADKQNIIg5C/wGDQgRSDQELIANByABqIANBwABqIAIQoiwgAy0ASEEERg0BIAMpA0giDkL/AYNCBFENAQsgACAONwIADAELAkACQCAERQ0AIANByABqIAIgBBCLIyADLQBIQQRGDQAgAykDSCIOQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAONwIACyADQdAAaiQAC60LAQV/IwBBoAJrIgUkAAJAAkAgAS0A4AFBBEcNACAFQZgBaiABEN4BIAEgASgCiAFBAXIQnxIgARCgCwJAIAEoAogBIAEtAOABEJAmDQAgASAFQZgBahDHBQwBCyABEKALIAEtAOABIQYgASAFQZgBahDHBQJAIAZBeWoOAwABAAELAkACQAJAAkAgAS0A4AFBBEYN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QYACahDXGiEJIAEtAOABQaIBRw0BIAEgARCXLBCfFwwBCyABEKALIANBgAI7ARxBACEJQQAhBgwBC0EBIQYgA0EBOgAcIAMgCTYCIAsgASADQegAahDHBSAGDQAgCUEBcUUNAQsgA0EcahD/KAwBCyADQZCBgIB4NgJoIAEgCCAIIANB6ABqENcjIAEoAtQBIQYgA0H6AGpCADcBACADQgA3AnQgA0KAgICAgAE3AmhBACEBIANBADYCcEEcQQQQxioiBSAHOgAZIAVBADoAGCAFQQA2AhQgBSAGNgIQIAUgBDYCDCAFQQA2AgggBUKAgICAgAE3AgAgA0HoAGoQyyggA0EcahD/KAwBCyACIAVxIQkgA0EIakEEQQhBOEGUrpwBEJ8aIANBADYCLCADIAMpAwg3AiQgA0EwakEIaiEKIANB6ABqQQhqIQsCQAJAA0AgAS0A4AFBBkYNAQJAAkAgCUUNACADQegAaiABQQEgBxDpBAwBCwJAIAEoAogBIgVBwABxDQAgASAFQcAAcjYCiAEgA0HoAGogASACIAcQ6QQgASABKAKIAUG/f3E2AogBDAELIANB6ABqIAEgAiAHEOkECyADKAJsIQUCQCADKAJoIgZBB0cNACADQSRqEMsoQQEhAQwECwJAQTBFDQAgCiALQTD8CgAACyADIAU2AjQgAyAGNgIwIANBJGogA0EwakGkrpwBEO8eIAEtAOABQQdHDQIgARCgCwwACwsgASgC0AEhBSABKALUASEGIANB9oCAgHg2AmggASAGIAUgBiAIRhsgBSAFIARGGyAGIANB6ABqENcjCwJAIAINACABEKMgDQAgASgC3AEhBSABKALYASEGIANB9YCAgHg2AmggASAGIAUgA0HoAGoQ1yMgAyABEPsJIAMgAygCBDYCbCADIAMoAgAiBTYCaCADQewAaiEGAkACQCAFDQAgBhDALAwBCyAGELYHCwNAIAEQoyANASABEKALIAEtAOABQaIBRw0ACwsgASgC1AEhBiADQfoAakIANwEAIANCADcCdCADQoCAgICAATcCaEEAIQEgA0EANgJwQRxBBBDGKiIFIAc6ABkgBUEAOgAYIAVBADYCFCAFIAY2AhAgBSAENgIMIAVBCGogA0EkakEIaigCADYCACAFIAMpAiQ3AgAgA0HoAGoQyygLIAAgBTYCBCAAIAE2AgAgA0HAAmokAAubCgEJfyMAQeAAayIGJABBACEHAkACQAJAAkACQAJAAkACQEEAIAEtAA0iCCAIQQNGGw4DAQACAQsgAg0BCwJAAkAgAw0ADAELIAZBCGogAyAEEKoQIAYoAgwhCSAGKAIIIQcLAkAgASgCIA0AIAFBfzYCIAJAIAEoAiRFDQAgAUEkaiEKAkAgAkH/////B0kNACAGIAI2AhRBKCEIIAZBKDYCEAJAIAcNACABQQA2AiAMCAsgByAHKAIAIghBf2o2AgAgCEEBRw0GDAULIAEoAigiCyABKAJUIgNJDQMgAUHMAGohDCADQQxsIQQgCyADayENQQAhCANAAkAgAyAMKAIARw0AIAxBnIGEARCXHAsgASADQQFqIgM2AlQgASgCUCAEaiIOQoCAgIDAADcCACAOQQhqQQA2AgAgCCANTw0EIARBDGohBCAIIAggDUlqIgggDU0NAAwECwtBrICEAUEfQcyAhAEQqhcAC0HsoIQBEMkaAAsgACABIAUQTQwECwJAAkAgCyADTw0AAkAgAiABKAJQIAtBDGxqKAIIIghPDQAgBkEANgJcIAYgAjYCWCAGIAs2AlQgBkEENgJQIAZBEGogCiAGQdAAahC+DCAHRQ0EIAcgBygCACIIQX9qNgIAIAhBAUYNAwwECwJAIAIgCEYNACACIAhrIQQgASgCUCALQQxsaiEIA0ACQCAIKAIIIgMgCCgCAEcNACAIQYyBhAEQkBwLIAgoAgQgA0EDdGpBADYCACAIIANBAWo2AgggBEF/aiIEDQALIAEoAlQhAwsgCyADTw0BAkAgASgCUCALQQxsaiIIKAIIIgMgCCgCAEcNACAIQfyAhAEQkBwLIAgoAgQgA0EDdGoiBCAJNgIEIAQgBzYCACAIIANBAWo2AgggBkEANgJcIAYgAjYCWCAGIAs2AlQgBkEENgJQIAZBEGogCiAGQdAAahC+DAwDCyALIANB3ICEARCMFQALIAsgA0HsgIQBEIwVAAsgByAJEPseCyABIAEoAiBBAWo2AiAgBigCFCEDAkAgBigCECIIQSpGDQAgAyECDAELIAZBEGogASAFEE0gBigCGCEEIAYoAhQhCAJAIAYoAhAiDUEqRg0AAkBBNEUNACAAQQxqIAZBEGpBDGpBNPwKAAALIAAgBDYCCCAAIAg2AgQgACANNgIADAILAkACQCABKAIgDQAgAUF/NgIgIAEoAiRFDQECQAJAAkAgAkH/////B0kNACABQQA2AiBBKCENDAELIAEoAighDSAGQQA2AlwgBiACNgJYIAYgDTYCVCAGQQU2AlAgBkEQaiAKIAZB0ABqEL4MIAEgASgCIEEBajYCICAGKAIUIQIgBigCECINQSpGDQELAkBBOEUNACAAQQhqIAZBEGpBCGpBOPwKAAALIAAgAjYCBCAAIA02AgAMBAsgBkEQaiABIAMgCBCyCAJAIAYoAhAiCEEqRg0AAkBBPEUNACAAQQRqIAZBEGpBBHJBPPwKAAALIAAgCDYCAAwECyAGQRBqIAEgBCACELIIAkAgBigCECIIQSpGDQACQEE8RQ0AIABBBGogBkEQakEEckE8/AoAAAsgACAINgIADAQLIAAgAjYCCCAAIAM2AgQgAEEqNgIADAMLQfyghAEQyRoAC0GsgIQBQR9BzICEARCqFwALAkBBOEUNACAAQQhqIAZBEGpBCGpBOPwKAAALIAAgAjYCBCAAIAg2AgALIAZB4ABqJAALiQkCCH8BfkIAIQoCQCABKAJoIgIgASgCbCIDRg0AAkACQAJAIAIsAAAiBEF/Sg0AIAItAAFBP3EhBSAEQR9xIQYgAkEBaiEHAkAgBEFgSQ0AIAVBBnQgAi0AAkE/cXIhBQJAAkAgBEFwTw0AIAUgBkEMdHIhBQwBCyAFQQZ0IAItAANBP3FyIAZBEnRBgIDwAHFyIQULIAVBI0cNBCAEQWBPDQIgAkECaiEFDAMLIAZBBnQgBXJBI0cNAyACQQJqIQUMAgsgBEEjRw0CIAJBAWoiByEFDAELIAJBBEEDIARBb0sbaiEFCyAFIANGDQACQAJAIAUsAAAiBkF/TA0AIAZB/wFxIQUMAQsgBS0AAUE/cSEIIAZBH3EhCQJAIAZBX0sNACAJQQZ0IAhyIQUMAQsgCEEGdCAFLQACQT9xciEIAkAgBkFwTw0AIAggCUEMdHIhBQwBCyAIQQZ0IAUtAANBP3FyIAlBEnRBgIDwAHFyIQULIAVBIUcNAAJAAkACQAJAIARBf0oNACACLQABQT9xIQUgBEEfcSEHIARBX0sNASAHQQZ0IAVyIQUgAkECaiEHDAILIAEoAnghBEEBIQUMAgsgBUEGdCACLQACQT9xciEFAkAgBEFwTw0AIAUgB0EMdHIhBSACQQNqIQcMAQsgBUEGdCACLQADQT9xciAHQRJ0QYCA8ABxciEFIAJBBGohBwsgASgCeCEEAkAgBUGAAU8NAEEBIQUMAQsCQCAFQYAQTw0AQQIhBQwBC0EDQQQgBUGAgARJGyEFC0EBIQIgASAHQQFqIgY2AmggBSAEaiEEAkAgBywAACIFQX9KDQAgASAHQQJqIgY2AmggBy0AAUE/cSEIIAVBH3EhCQJAAkAgBUFgTw0AIAlBBnQgCHIhBQwBCyABIAdBA2oiBjYCaCAIQQZ0IActAAJBP3FyIQgCQCAFQXBPDQAgCCAJQQx0ciEFDAELIAEgB0EEaiIGNgJoIAhBBnQgBy0AA0E/cXIgCUESdEGAgPAAcXIhBQsgBUGAAUkNAEECIQIgBUGAEEkNAEEDQQQgBUGAgARJGyECCyABIAIgBGoiCTYCeEEAIQUCQCAGIANGDQAgBiECA0ACQAJAIAIsAAAiBEF/TA0AIAJBAWohAiAEQf8BcSEEDAELIAItAAFBP3EhByAEQR9xIQgCQCAEQV9LDQAgCEEGdCAHciEEIAJBAmohAgwBCyAHQQZ0IAItAAJBP3FyIQcCQCAEQXBPDQAgByAIQQx0ciEEIAJBA2ohAgwBCyAHQQZ0IAItAANBP3FyIAhBEnRBgIDwAHFyIgRBgIDEAEYNAiACQQRqIQILAkACQCAEQXZqDgQDAQEDAAsgBEHYv39qQQJJDQILAkACQCAEQYABTw0AQQEhBAwBCwJAIARBgBBPDQBBAiEEDAELQQNBBCAEQYCABEkbIQQLIAQgBWohBSACIANHDQALCyABIAM2AmwgASAFIAZqNgJoIAEgCSAFajYCeCABKAKEAUEIaiAGIAUQ5AMhCgsgAEEANgIAIAAgCjcDCAvUCgEQfyMAQdAAayIBJAACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAowGIgIgACgCkAYiA08NACABIAM2AhwgA0EDRw0BIAFBEGogACgCvAMiBEEEQQRBgOmbARC+GEEAIQMgAUEANgIoIAEgASkDEDcCICABQSBqIAQQ9yQgASgCJCABKAIoIgVBAnRqIQYCQANAIAQgA0YNASAGIAM2AgAgBkEEaiEGIANBAWohAwwACwsgAUHAAGogBSADajYCACABIAEpAiA3AzggAUEANgJEIAAoArgDIQZBBCEHQQQhAwNAIAMgBCADIARLGyEFAkADQCAFIANGDQEgAUEgaiADEJ0jIAEoAiBBAUYNBSADQQFqIQMgBiAEIAEoAiQiCEGsjYABELglKAIIRQ0ACyABQThqIAYgBCAIIAcQuQkgAUEgaiAHQQFqEJ0jIAEoAiBBAUYNCyABKAIkIQcMAQsLIAdFDQMgAUEgaiAHQX9qEJ0jIAEoAiBBAUYNBCABQThqIAYgBEEDIAEoAiQiAxC5CSAHQQFGDQUgAUEgaiAHQX5qEJ0jIAEoAiBBAUYNBiABQThqIAYgBCACIAEoAiQiBRC5CSAHQQJNDQcgAUEgaiAHQX1qEJ0jIAEoAiBBAUYNCCABKAIkIQggACADNgKQBiAAIAU2AowGIAAgCDYCiAYgBiAEIANBjI2AARC4JSgCCEUNCiAAIAM2AogGDAoLQeiLgAFBL0GYjIABEMweAAsgAUIANwIsIAFCgYCAgMAANwIkIAFB+I2AATYCIEEAQaiMgAEgAUEcaiABQSBqQYCOgAEQjiEACyABIAEpAyg3A0hByJecAUErIAFByABqQeiCgAFBnI2AARDiEgALQayMgAEQziwACyABIAEpAyg3A0hByJecAUErIAFByABqQeiCgAFBvIyAARDiEgALQcyMgAEQziwACyABIAEpAyg3A0hByJecAUErIAFByABqQeiCgAFB3IyAARDiEgALQeyMgAEQziwACyABIAEpAyg3A0hByJecAUErIAFByABqQeiCgAFB/IyAARDiEgALIAEgASkDKDcDSEHIl5wBQSsgAUHIAGpB6IKAAUG8jYABEOISAAsgASgCOCEJIAEoAjwhBSABQQhqIAEoAkAiBkEEQQRB2LucARC+GCABKAIIIQogASgCDCECAkAgBkECdCIDRQ0AIAIgBSAD/AoAAAsgACgCvAMhC0EAIQcCQAJAAkADQCAHIgQgC0YNASAEQQFqIQcgBCACIAYgBEHwrIABELclKAIAIgNGDQADQCAEIAIgBiADIghBgK2AARC3JSgCACIDRw0ACyAEIAZPDQIgBSAEQQJ0aiAINgIADAALCyAAKAK4AyIEIAtBFGxqIQwgAC0A+wUiDUEBaiEOIA1BAnRBBGohDyAAKALIAyEIIAAoAsQDIQcgACgC0AMhECAAKALUAyEAAkADQCAEIAxGDQMgBCAFIAZBACAEKAIMEIspNgIMIAQhAwJAA0ACQCADKAAAIgMNACAEKAIEIQMgBEEUaiILIQQgA0UNAyAAIANJDQIgACADayIEIA1NDQQgECADQQJ0aiEDIA8hBANAAkAgBA0AIAshBAwFCyADIAUgBkEAIAMoAgAQiyk2AgAgBEF8aiEEIANBBGohAwwACwsgByAIIANBqIOAARC5JSEDIAMgBSAGQQAgAygAARCLKTYAASADQQVqIQMMAAsLCyADIABBiIOAARDcLAALIA4gBEGYg4ABEN0sAAsgBCAGQZCtgAEQjBUACyAKIAIQ2ywgCSAFENssIAFB0ABqJAALmwkCEX8CfiMAQYADayIGJAAgAa0iF0L//////////z98IBeAIRcCQAJAIAFBgSBJDQAgARC5JCEHDAELIAEgAUEBdmsiCEHAACAIQcAASRshBwsgAEF8aiEJQQEhCEEAIQpBACELA0BBASEMQQAhDQJAIAogAU8NACAGQShqIAogACABQfSSnAEQriIgBigCKCEOAkACQCAGKAIsIg8gB0kNAEEAIRACQAJAIA9BAkkNAAJAIAUoAgAoAgAgDigCBCAOKAIAENchDQAgDkEEaiERQQIhEgNAIA8gEkYNAiAFKAIAKAIAIBFBBGoiEygCACARKAIAENchDQMgEkEBaiESIBMhEQwACwsgDkEEaiERQQIhEgNAQQEhECAPIBJGDQEgBSgCACgCACARQQRqIhMoAgAgESgCABDXIUUNAiASQQFqIRIgEyERDAALCyAPIRILIBIgB0kNAAJAIBBFDQAgBkEgaiASIA4gD0HEkpwBELckIAYoAiAgBigCJBCkEwsgEkEBdEEBciEMDAELAkAgBA0AIA8gByAPIAdJG0EBdCEMDAELIAZBGGogD0EgIA9BIEkbIhIgDiAPQbSSnAEQtyQgBigCGCAGKAIcIAIgA0EAQQAgBRDqASASQQF0QQFyIQwLIAxBAXYgCmqtIAqtIhh8IBd+IAogCEEBdmutIBh8IBd+hXmnIQ0LIAkgCkECdCISaiEUIAAgEmohFQNAAkACQAJAAkACQAJAAkAgC0ECSQ0AIAZBvgJqIAtBf2oiDmotAAAgDU8NAQsgBkG+AmogC2ogDToAACAGQTRqIAtBAnRqIAg2AgAgCiABTw0BIAtBAWohCyAMQQF2IApqIQogDCEIDAcLAkAgBkE0aiAOQQJ0aigCACILQQF2IhIgCEEBdiIPaiIWIANLDQAgCyAIckEBcUUNAgsgACAKIBZrQQJ0aiEQAkAgC0EBcQ0AIAZBEGogEiAQIBZB1JKcARC3JCAGKAIQIAYoAhQgAiADIAUQviULAkAgCEEBcQ0AIAZBCGogEiAQIBZB5JKcARCuIiAGKAIIIAYoAgwgAiADIAUQviULIAtBAkkNBCAIQQJJDQQgAyAPIBIgDyASSSILGyIPSQ0EIAUoAgAhEyAQIBJBAnRqIhIgECALGyEIAkAgD0ECdCIPRQ0AIAIgCCAP/AoAAAsgAiAPaiEPAkAgCw0AIAIhCwNAIAsgD0YNBSASIBVGDQUgCCASIAsgEygCACASKAIAIAsoAgAQ1yEiERsoAgA2AgAgEiARQQJ0aiESIAsgEUEBc0ECdGohCyAIQQRqIQgMAAsLIBQhEgNAIAhBfGohCCAPQXxqIQsgEiAIIAsgEygCACALKAIAIAgoAgAQ1yEiERsoAgA2AgAgCyARQQJ0aiEPIAggEUEBc0ECdGoiCCAQRg0DIBJBfGohEiAPIAJHDQAMAwsLAkAgCEEBcQ0AIAAgASACIAMgBRC+JQsgBkGAA2okAA8LIBZBAXQhCCAOIQsMAwsgAiELCyAPIAtrIhJFDQAgCCALIBL8CgAACyAWQQF0QQFyIQggDiELDAALCwvACQIXfwJ+IwBBkAFrIgIkACABKAIEIQMgAkEwaiABKAIIIgRBCEE4EJAPIAIoAjQhBQJAAkAgAigCMEEBRg0AIAIoAjghBgJAIAVFDQAgBEE4bCEHIAJBJWohCEEAIQkgBSEKA0AgByAJRg0BAkACQAJAAkAgAyAJaiIBKAIAIgsOAwABAgALIAJBCGogAUEIahDDBCABQShqKAIAIQEQ9SchDCACQTBqIAEQvAIgDEEgaiACQTBqQSBqKQMANwMAIAxBGGogAkEwakEYaikDADcDACAMQRBqIAJBMGpBEGopAwA3AwAgDEEIaiACQTBqQQhqKQMANwMAIAwgAikDMDcDACACKAIIIQ0gAigCDCEOIAIoAhAhDyACKAIUIRAgAigCGCERIAIoAhwhEiACKAIgIRMgAi0AJCEUIAJBBGpBAmogCEECai0AADoAACACIAgvAAA7AQQgAigCLCEVDAILIAFBIGooAgAhEyABQRxqKAIAIRIgAUEYaigCACERIAFBDGooAgAhDiABQQhqKAIAIQ0CQCABQRBqKQMAIhlCA4NCAFINACAZpyIMIAwoAgAiDEEBajYCACAMQX9MDQYLIAFBJGotAAAhFEEAIRZBACEMAkAgAUEoaigCACIPRQ0AEPYnIQwgDykCBCEaIA8oAgAhEBD3JyEPIAJBMGogEBB2AkBB4ABFDQAgDyACQTBqQeAA/AoAAAsgDCAaNwIEIAwgDzYCAAsCQCABQTBqKAIAIgFFDQAQ9CchFiACQTBqIAEQQiAWQThqIAJBMGpBOGopAwA3AwAgFkEwaiACQTBqQTBqKQMANwMAIBZBKGogAkEwakEoaikDADcDACAWQSBqIAJBMGpBIGopAwA3AwAgFkEYaiACQTBqQRhqKQMANwMAIBZBEGogAkEwakEQaikDADcDACAWQQhqIAJBMGpBCGopAwA3AwAgFiACKQMwNwMACyAZQiCIpyEQIBmnIQ8MAQsgAUEUaigCACEQIAFBEGooAgAhDyABQQxqKAIAIQ4gAUEIaigCACENIAFBBGooAgAhERD1JyEXIAJBMGogERC8AiAXQSBqIAJBMGpBIGopAwA3AwAgF0EYaiACQTBqQRhqKQMANwMAIBdBEGogAkEwakEQaikDADcDACAXQQhqIAJBMGpBCGopAwA3AwAgFyACKQMwNwMAAkAgAUEYaigCACIBDQBBACERDAELEPYnIREgASkCBCEZIAEoAgAhGBD3JyEBIAJBMGogGBB2AkBB4ABFDQAgASACQTBqQeAA/AoAAAsgESAZNwIEIBEgATYCAAsgBiAJaiIBIAs2AgAgAUEkaiAUOgAAIAFBIGogEzYCACABQRxqIBI2AgAgAUEYaiARNgIAIAFBFGogEDYCACABQRBqIA82AgAgAUEMaiAONgIAIAFBCGogDTYCACABQQRqIBc2AgAgAUElaiACLwEEOwAAIAFBJ2ogAkEEakECai0AADoAACABQTBqIBY2AgAgAUEsaiAVNgIAIAFBKGogDDYCACAJQThqIQkgCkF/aiIKDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQZABaiQADwsgBSACKAI4QfTxmgEQhSkLAAvCCgEKfyMAQZABayICJAAgASgC2AEhAyACQdAAaiABEPMPAkACQCACLQBQQQFHDQAgAigCVCEBIABBBzYCACAAIAE2AgQMAQsgAi0AUSEEIAEoAtgBIQUgAkHQAGogARCSCCACKAJUIQYCQCACKAJQIgdBB0cNACAAQQc2AgAgACAGNgIEDAELIAJBKGpBIGogAkHQAGpBIGopAwA3AwAgAkEoakEYaiACQdAAakEYaikDADcDACACQShqQRBqIAJB0ABqQRBqKQMANwMAIAIgAikDWDcDMCACIAY2AiwgAiAHNgIoQQAhCAJAAkACQAJAAkACQAJAAkAgAS0AkQFBIHFFDQBBACEIAkACQAJAAkACQAJAAkACQAJAIAEtAOABQQpHDQAgARCgCwJAAkAgB0EDSw0AIAdBAkcNAQsgAS0AkQFBBHENASABLQCJAUHAAHENASABKALUASEGIAEoAtABIQcgAkHmgICAeDYCUCAHIAYgAkHQAGoQ1xohBiABLQDgAUGiAUYNAgwQC0EBIQggAkEBOgBECyAHDgcEBQECBwgDBAsgASABEJcsEJ8XDA0LIAJBMGohCSACQcAAaiEKDAQLIAJBOGohCSACQcAAaiEKDAMLIAJBATYCVCACQfivnAE2AlAgAkIBNwJcIAJBqAQ2AnwgAiACQfgAajYCWCACIAJBKGo2AnggAkHQAGpBrKicARDiIwALIAJBEGogARCUGSACKAIUIQUgAigCEEEBcQ0EIAJByABqEL8rIAIgBTYCSAwDCyACQThqIQkgAkHAAGohCgsgAkEYaiABEJQZIAIoAhwhCwJAIAIoAhhBAXFFDQAgAEEHNgIAIAAgCzYCBAwJCwJAIAtFDQAgCSAFNgIAIAkgASgC1AE2AgQLIAoQvysgAiALNgJADAELIAJBIGogARCUGSACKAIkIQsgAigCIEEBcQ0FIAIgCzYCUCACQdAAahC/KyALRQ0AIAIgBTYCNCACIAEoAtQBIgs2AjggAkG2gYCAeDYCUCABIAUgCyACQdAAahDXIwsCQCABLQDgAUEXRg0AIAJBgAFqIAJBxABqKQIANwMAIAJBiAFqIAJBzABqKAIANgIAIAIgAikCPDcDeCACKAI4IQUgAigCNCELIAIoAjAhCAwECyABEKALIAgNAQwCCyAAQQc2AgAgACAFNgIEDAULIAJBCGogAkEoahCiDyACKAIMIQYgAigCCCEHIAJB+ICAgHg2AlAgASAHIAYgAkHQAGoQ1yMLIAIgARC6GCACKAIEIQgCQCACKAIAQQFxRQ0AIABBBzYCACAAIAg2AgQMBAsCQCABLQCJAUHAAHFFDQAgASgC1AEhBiACQamBgIB4NgJQIAEgAyAGIAJB0ABqENcjCyABKALUASEFQSgQqSshBgJAQShFDQAgBiACQShqQSj8CgAAC0EEIQcgAyELCwJAIARBAXENACAAIAIpA3g3AhQgACAFNgIQIAAgCzYCDCAAIAg2AgggACAGNgIEIAAgBzYCACAAQSRqIAJBiAFqKAIANgIAIABBHGogAkGAAWopAwA3AgAMBAsgASgC1AEhBCACQaiBgIB4NgJQIAEgAyAEIAJB0ABqENcjIABBJGogAkGIAWooAgA2AgAgAEEcaiACQYABaikDADcCACAAIAIpA3g3AhQgACAFNgIQIAAgCzYCDCAAIAg2AgggACAGNgIEIAAgBzYCAAwDCyAAQQc2AgAgACALNgIEDAELIABBBzYCACAAIAY2AgQLIAJBKGoQ4hULIAJBkAFqJAALngoCB38CfiMAQeAAayICJAACQAJAAkAgACgCACIDQQlHDQAgAEEIaiABEJsCDAELAkACQAJAAkACQAJAAkACQAJAIAMOCQABAgMEBQYHCAALIAFBADoAOSABLQA6IQQgASAALQAgOgA6AkAgACgCDCIDRQ0AIANByABsIQUgACgCCEEgaiEDIAFBEGohBgNAIAFBADoAOQJAAkAgA0FgaikDACIJQn58QgJWDQACQAJAAkAgCUJ9fCIJp0EBakEAIAlCAlQbDgMAAQIACyABIAMQrRMgAS0ANEEBRw0DAkAgAykDACIJQgODQgBSDQAgCaciByAHKAIAIgdBAWo2AgAgB0F/TA0QCyAGIAkQwwYMAwsgASADQXBqEK0TDAILIAEgA0FwahCtEwwBCyABIAMQrRMLIAFBADoAOSADQcgAaiEDIAVBuH9qIgUNAAsLAkAgACgCHCIDRQ0AIAEgAxC8AwsgASAEOgA6DAgLIABBCGogARCPAgwHCyAAKAIYDQYCQCAAKAIMIgNFDQAgACgCCCEGIANB0ABsIQQgAS0AOSEHQQAhAwNAIAFBAToAOQJAAkACQAJAIAYgA2oiBSkDACIKQn58IglCAiAJQgJUG6cOAwABAgALIAVBCGooAgANAiABIAVBEGoQrRMMAgsgASAFQQhqEK0TDAELAkAgCqdBAXENACABIAVBCGoQrRMLAkAgBUEgaikDACIJQgJRDQAgCadBAXENACABIAVBKGoQrRMLIAEtADRBAUcNACAFKAIADQAgBUEIaiEIAkAgBUEYaiIFKAIAEMcXIAEoAixHDQAgBUEANgIACyABQQE6ADogASAIEK0TIAFBADoAOgsgASAHOgA5IAQgA0HQAGoiA0cNAAsLIAAoAhwiA0UNBiABIAMQvAMMBgsCQAJAAkAgACgCCA4DAAIBAAsgASAAKAIoEKcBDAcLIABBCGogARD6IgwGCwJAIAAtACRBAkYNACAAKAIoIQMgASgCMBD1FSEAIAJBNGogAUE0aigCADYCACACQQhqQQApA4CEngEiCTcDACACQRBqIgVBACkD+IOeASIKNwMAIAJBGGogCTcDACACIAE2AiAgAiAANgIkIAJBAToAOSACQQE6ACggAiABKQIsNwIsIAIgCjcDACACIAEoATo2ATogAiABLQA4OgA4IAIgAxDUBCACEK0KIAUQygoMBgsgASAAQRBqEOkFDAULIAEtADkhBSABQQE6ADkgACgCBCIDIAEQ2QEgASAFOgA5IAEtADRBAUcNBCADKAIAQRpHDQQgA0EIaiEAAkAgAygCGBDHFyABKAIsRw0AIANBADYCGAsgAUEBOgA6IAEgABCtEyABQQA6ADoMBAsgACgCECIDRQ0DIAEgAxC8AwwDCyABIAAoAgQiA0EoakEAEPwPIAMpAwBCAFINAiADQQhqIQACQCADLQAcQQJGDQAgASAAEK0TDAMLIAEgACgCABD4IgwCCyABLQA5IQUgAUEBOgA5IAAoAgQiAyABENkBIAEgBToAOSABLQA0QQFHDQECQANAQQQhAAJAAkAgAygCAEFsag4QAAUFBQUFAwUFBQUFBQUFAQULQSghAAsgAyAAaigCACEDDAALCyADQQhqIQACQCADKAIYEMcXIAEoAixHDQAgA0EANgIYCyABQQE6ADogASAAEK0TIAFBADoAOgwBCyABLQA0QQFHDQAgASAAQRBqEK0TCyACQeAAaiQADwsAC9sJAgZ/BH4jAEHwAGsiAiQAAkACQAJAAkAgASgCBCIDIAEoAgwiBEYNACABKAIQIQUDQCABIANBIGoiBjYCBCACQTBqQRhqIANBGGopAwA3AwAgAkEwakEQ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BCAFQUBqIQUMAAsLIANBjAFqIAFBCGooAgA2AgAgA0H4AGpBCGoiBSADQShqQQhqKAIANgIAIAMgAykCKDcDeCADIAEpAgA3AoQBIAEoAhgoAgAhASACKALUASEJIActAAAhAiAILQAAIQdByABBBBCZKiIEIAs2AhwgBCAMNgIYIAQgBzoARSAEIAI6AEQgBCAKNgJAIAQgBjYCPEEAIQIgBEEANgI4IAQgCTYCNCAEIAE2AjAgBEEQaiAOKQMANwIAIARBCGogBSkDADcCACAEIAMpA3g3AgAgBCADKQNoNwIgIARBKGogDSkDADcCAAwECyAKIQQLIANBKGoQsigLIAYQnywLIAEQjShBASECCyAAIAQ2AgQgACACNgIAIANBkAFqJAALqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQwhUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMIVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACEM0mIANBATYCfCADQci+nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCNECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ1xohBCACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQliIgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCWIgsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQzSYgA0EBNgJ8IANByL6cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCNECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ1xohBCACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDSESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEO0fEOELIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahClKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ1yMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQmSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELIoCyAGEJ8sCyABEI0oQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC6oKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMIVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDCFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDNJiADQQE2AnwgA0HIvpwBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQjRAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqENcaIQQgAi0A4AFBogFHDQEgAiACEJcsEJ8XDAELIAIQoAsgASgCDCEHIAMgASgCEDYCgAEgAyAHNgJ8IAMgASgCFCIINgJ4AkACQCACKAKIASIEQYCAgAFxDQAgAiAEQYCAgAFyNgKIASADQcAAaiADQfgAaiACEJciIAIgAigCiAFB////fnE2AogBDAELIANBwABqIANB+ABqIAIQlyILIAMoAkQhBCADKAJAIgVBgICAgHhGDQAgAyADKAJIIgk2AjAgAyAENgIsIAMgBTYCKAJAAkAgAi0A4AFBAUYNACACKALcASEEIAIoAtgBIQUgA0E0aiACEM0mIANBATYCfCADQci+nAE2AnggA0IBNwKEASADQbMHNgJcIANBAToAZyADIANB2ABqNgKAASADIANB4ABqNgJYIAMgA0HnAGo2AmAgA0HAAGogA0H4AGoQjRAgA0HUAGogA0E8aigCADYCACADIAMpAjQ3AkwgBSAEIANBwABqENcaIQQgAi0A4AFBogFHDQEgAiACEJcsEJ8XDAELIAIQoAsCQAJAAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBCUYNAQtBACEKDAELIANBCToAeCADIAIgA0H4AGoQ0hEgAygCBCEKIAMoAgBBAXENAQsgAyAKNgJAIANB+ABqIAIgCC0AACAHLQAAIAQgCRDtHxDhCyADKAJ8IQsCQCADKAJ4IgxBgYCAgHhHDQAgA0HAAGoQpSsgCyEEDAILIANB6ABqQQhqIg0gA0H4AGpBEGoiDikCADcDACADIAMpAoABNwNoAkAgDEGAgICAeEcNACACLwGQAUGAwABxRQ0AIAlBBnQhBQNAIAVFDQECQCAEKAIAQQRHDQAgBEEQaigCACEJIARBDGooAgAhDyADQamBgIB4NgJ4IAIgDyAJIANB+ABqENcjCyAEQcAAaiEEIAVBQGohBQwACwsgA0GMAWogAUEIaigCADYCACADQfgAakEIaiIFIANBKGpBCGooAgA2AgAgAyADKQIoNwN4IAMgASkCADcChAEgASgCGCgCACEBIAIoAtQBIQkgBy0AACECIAgtAAAhB0HIAEEEEJkqIgQgCzYCHCAEIAw2AhggBCAHOgBFIAQgAjoARCAEIAo2AkAgBCAGNgI8QQAhAiAEQQA2AjggBCAJNgI0IAQgATYCMCAEQRBqIA4pAwA3AgAgBEEIaiAFKQMANwIAIAQgAykDeDcCACAEIAMpA2g3AiAgBEEoaiANKQMANwIADAQLIAohBAsgA0EoahCyKAsgBhCfLAsgARCNKEEBIQILIAAgBDYCBCAAIAI2AgAgA0GQAWokAAuqCgENfyMAQZABayIDJABBACEEAkACQAJAIAItAJEBQSBxRQ0AAkACQCACKAKIASIEQYAgcQ0AIAIgBEGAIHI2AogBIANBCGogAhDCFSADKAIIIQUgAiACKAKIAUH/X3E2AogBIAMoAgwhBAwBCyADQRBqIAIQwhUgAygCFCEEIAMoAhAhBQsgBUEBcQ0BCyAEIQYCQAJAIAItAOABRQ0AIAIoAtwBIQQgAigC2AEhBSADQRxqIAIQzSYgA0EBNgJ8IANByL6cATYCeCADQgE3AoQBIANBswc2AiwgA0EAOgBgIAMgA0EoajYCgAEgAyADQdgAajYCKCADIANB4ABqNgJYIANBwABqIANB+ABqEI0QIANB1ABqIANBJGooAgA2AgAgAyADKQIcNwJMIAUgBCADQcAAahDXGiEEIAItAOABQaIBRw0BIAIgAhCXLBCfFwwBCyACEKALIAEoAgwhByADIAEoAhA2AoABIAMgBzYCfCADIAEoAhQiCDYCeAJAAkAgAigCiAEiBEGAgIABcQ0AIAIgBEGAgIABcjYCiAEgA0HAAGogA0H4AGogAhCXIiACIAIoAogBQf///35xNgKIAQwBCyADQcAAaiADQfgAaiACEJciCyADKAJEIQQgAygCQCIFQYCAgIB4Rg0AIAMgAygCSCIJNgIwIAMgBDYCLCADIAU2AigCQAJAIAItAOABQQFGDQAgAigC3AEhBCACKALYASEFIANBNGogAhDNJiADQQE2AnwgA0HIvpwBNgJ4IANCATcChAEgA0GzBzYCXCADQQE6AGcgAyADQdgAajYCgAEgAyADQeAAajYCWCADIANB5wBqNgJgIANBwABqIANB+ABqEI0QIANB1ABqIANBPGooAgA2AgAgAyADKQI0NwJMIAUgBCADQcAAahDXGiEEIAItAOABQaIBRw0BIAIgAhCXLBCfFwwBCyACEKALAkACQAJAAkAgAi0AkQFBIHFFDQAgAi0A4AFB/wFxQQlGDQELQQAhCgwBCyADQQk6AHggAyACIANB+ABqENIRIAMoAgQhCiADKAIAQQFxDQELIAMgCjYCQCADQfgAaiACIAgtAAAgBy0AACAEIAkQ7R8Q4QsgAygCfCELAkAgAygCeCIMQYGAgIB4Rw0AIANBwABqEK0rIAshBAwCCyADQegAakEIaiINIANB+ABqQRBqIg4pAgA3AwAgAyADKQKAATcDaAJAIAxBgICAgHhHDQAgAi8BkAFBgMAAcUUNACAJQQZ0IQUDQCAFRQ0BAkAgBCgCAEEERw0AIARBEGooAgAhCSAEQQxqKAIAIQ8gA0GpgYCAeDYCeCACIA8gCSADQfgAahDXIwsgBEHAAGohBCAFQUBqIQUMAAsLIANBjAFqIAFBCGooAgA2AgAgA0H4AGpBCGoiBSADQShqQQhqKAIANgIAIAMgAykCKDcDeCADIAEpAgA3AoQBIAEoAhgoAgAhASACKALUASEJIActAAAhAiAILQAAIQdByABBBBCnKiIEIAs2AhwgBCAMNgIYIAQgBzoARSAEIAI6AEQgBCAKNgJAIAQgBjYCPEEAIQIgBEEANgI4IAQgCTYCNCAEIAE2AjAgBEEQaiAOKQMANwIAIARBCGogBSkDADcCACAEIAMpA3g3AgAgBCADKQNoNwIgIARBKGogDSkDADcCAAwECyAKIQQLIANBKGoQsigLIAYQ2SULIAEQjShBASECCyAAIAQ2AgQgACACNgIAIANBkAFqJAALqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQwhUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMIVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACEM0mIANBATYCfCADQci+nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCNECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ1xohBCACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQliIgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCWIgsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQzSYgA0EBNgJ8IANByL6cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCNECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ1xohBCACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDSESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEO0fEOELIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahCtKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ1yMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQpyoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELIoCyAGENklCyABEI0oQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC+YJAgt/AX4jAEHgAGsiAyQAIAEoAgghBEEAIQUgA0EANgIIIANCgICAgMAANwIAIAJB8AFqIQYgAigC9AEiByACKAL4AUEDdGohCEEEIQlBACEKAkACQAJAAkACQAJAAkACQANAIAcgCEYNASABIAcQkQwhCyAHQQhqIgwhByALRQ0AIAEoAgwhByABKAIIIQsCQCABKQMAIg5CA4NCAFINACAOpyINIA0oAgAiDUEBajYCACANQX9MDQMLIANBxICAgHg2AjAgAyAONwM4IAsgByADQTBqENcaIQcCQCAKIAMoAgBHDQAgA0HM2psBEM8dIAMoAgQhCQsgCSAKQQJ0aiAHNgIAIAMgCkEBaiIKNgIIIAVBBGohBSAMIQcMAAsLAkAgASkDACIOQgODQgBSDQAgDqciByAHKAIAIgdBAWo2AgAgB0F/TA0BCwJAIAIoAvgBIgcgAigC8AFHDQAgBhDpHQsgAigC9AEgB0EDdGogDjcDACACIAdBAWo2AvgBAkAgAi0A4AFB3QBGDQAgA0EwaiACQYCAgIACEMAfIAMoAjQhByADKAIwIglBE0YNBCADQSBqIANByABqKQMANwMAIANBKGogA0HQAGopAwA3AwAgAyADKQNANwMYIAMoAjwhCCADKAI4IQsgAygCWCEGIAMoAlwhDQwFCyADQQA2AhQgA0KAgICAwAA3AgwgA0EwaiACIANBDGoQnSwgAygCNCEIIAMoAjAiC0EIRg0CIANBGGpBEGogA0HIAGopAwA3AwAgA0EYakEIaiADQTBqQRBqKQMANwMAIAMgAykDODcDGCADKAJQIQYgAygCVCENQREhCSALQQFHDQECQCACLQCIAUEIcUUNACAGKAI0IQcgBigCMCELIANBz4CAgHg2AjAgAiALIAcgA0EwahDXIwsCQCAGLQBEDQBBASELIAYtAEVBAUcNAgsgBigCNCEHIAYoAjAhCyADQc6AgIB4NgIwIAIgCyAHIANBMGoQ1yNBASELDAQLAAsMAgsgCCEHCyAAQRM2AgAgACAHNgIEIAMoAgQiByAKEJolIAMoAgAgBxDwLCABKQMAEL8hDAELQTBBCBCZKiIMIAg2AgwgDCALNgIIIAwgBzYCBCAMIAk2AgAgDCANNgIsIAwgBjYCKCAMIAMpAxg3AxAgDEEYaiADQRhqQQhqKQMANwMAIAxBIGogA0EoaikDADcDACADKAIAIQsgAyADKAIEIgcgCkECdGoiCDYCPCADIAs2AjggAyAHNgIwAkADQCAFRQ0BIAIgBygCABCfFyAFQXxqIQUgB0EEaiEHDAALCyADIAg2AjQgA0EwahCuHiACKAL4AUEDdCEHIAIoAvQBIQtBACEIAkADQCAHRQ0BAkAgCyABEJEMDQAgB0F4aiEHIAhBAWohCCALQQhqIQsMAQsLIAggAigC+AEiB08NAiACKAL0ASAIQQN0aiILKQMAIQ4CQCAHIAhBf3NqQQN0IghFDQAgCyALQQhqIAj8CgAACyACIAdBf2o2AvgBIA4QvyELIAAgDDYCKCAAIAQ2AgggAEEFNgIAIAAgASkDADcDECAAIAIoAtQBNgIMIABBGGogAUEIaikDADcDACAAQSBqIAFBEGopAwA3AwALIANB4ABqJAAPCyAIIAdBvNqbARCTFQAL2wkBCn8jAEHwAGsiAiQAAkAgACgCACIDQYCAgIB4Rg0AIAAoAgghBCACQSBqIAAQqRICQAJAAkACQAJAAkACQCACKAIgQQFxRQ0AIAIoAiRFDQELIAFFDQEgABDUBSAAKAIAIgNBgICAgHhGDQUgACgCCCIFRQ0FIAAoAgQgBUGQ14QBEOAoIgYoAgghByAGKAIEIQggAkEBNgJIIAIgBiAFQQR0ajYCRCACIAY2AkAgByEJA0AgAkHAAGoQqhMiBkUNAwJAIAkgB0sNACAJIAYoAggiCiAJIApJGyEJIAYoAgQhCkEAIQYDQAJAAkAgCSAGRg0AIAogBmotAAAgCCAGai0AAEYNASAGIQkLIAkNA0EBIQhBACEJDAcLIAZBAWohBgwACwsLIAkgB0Gw14QBEN0sAAsgABCJLQwFCyAERQ0DIAAoAgQgBEHA14QBEOAoIgYoAgghBSAGKAIEIQsgAkEBNgJIIAIgBiAEQQR0ajYCRCACIAY2AkAgBSEIAkACQANAIAJBwABqEKoTIgZFDQEgBSAIayEJIAYoAgghCCAGKAIEIQYgAkEYaiAJIAsgBUHg14QBEMEjIAYgCGpBf2ohCSACKAIYIAIoAhwiB2pBf2ohCkEAIQYDQAJAAkAgCCAGRg0AAkAgByAGRw0AIAchCAwBCyAJLQAAIAotAABGDQEgBiEICyAIDQJBACEJDAQLIAlBf2ohCSAKQX9qIQogBkEBaiEGDAALCwsgAkEQaiAFIAhrIAsgBUHQ14QBEMEjIAIoAhQhCQsgBCEFDAILIAkgB00NACAJIAdBoNeEARDdLAALIARBAkkNACAJQX9qQQJLDQAgCC0AAEHY2YQBai0AAEHHAUsNACAAQQEQlxcgABDFKQwCCwJAAkAgABCsFQ0AIAlBAUsNAQwCCyAJQQRLDQAgCUECSSADQYCAgIB4RyAFQRFJcXINAQsCQAJAIAENACAAIAkQrhAMAQsgACAJEJcXCyAAEMUpIAIgACgCCCIGNgIwIAIgACgCAEGAgICAeEciCTYCLAJAIAZBAUcNACAJDQELIAJBADYCQCACQSxqIAJBwABqEJYhAAsCQAJAIAAQrBUNACACQYGAgIB4NgI0DAELIAJBNGogABDfCwsgAkEFNgJEAkBBKEUNACACQcAAakEIakGA2IQBQSj8CgAAC0EAIQYDQAJAAkAgBkEoRg0AIAAoAgBBgICAgHhGDQAgACgCCCACQcAAaiAGaiIJQQxqKAIASw0BCyACQQhqIAAQ9iUCQCACKAIIIgZFDQAgBkEEaiEKIAIoAgxBBHQhCQNAIAlFDQECQAJAAkAgBigCCA4CAgABCyAKKAIALQAAQdjZhAFqLQAAQfkBSw0BCyAGQRBqIQYgCUFwaiEJIApBEGohCgwBCwsgABCJLQsgAigCNEGBgICAeEYNAgJAIAAoAgBBgICAgHhGDQAgAiAAEKkSIAIoAgBBAXFFDQAgAigCBEECTQ0AIAAoAghBwABLDQAgAkE0ahDEKQwDCyAAEMQpIABBCGogAkE0akEIaigCADYCACAAIAIpAjQ3AgAMAgsgCUEIaigCACEJAkACQCABDQAgACAJEK4QDAELIAAgCRCXFyAAENQFCyAGQQhqIQYMAAsLIAJB8ABqJAALzAoBAn8jAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQYCAgIB4cyIDQQsgA0ESSRsOEgABAgMEBQYHCAkKCwwNDg8QEQALIAIgAEEEajYCCCACQQE2AhQgAkHIvpwBNgIQIAJCATcCHCACQa8HNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQjCkhAQwRCyACIABBBGo2AgggAkEBNgIUIAJByL6cATYCECACQgE3AhwgAkGwBzYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqEIwpIQEMEAsgAiAAQQRqNgIIIAJBATYCFCACQdjEmwE2AhAgAkIBNwIcIAJBsQc2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDA8LIAJBADYCICACQQE2AhQgAkGAxZsBNgIQIAJCBDcCGCABKAIAIAEoAgQgAkEQahCMKSEBDA4LIAJBADYCICACQQE2AhQgAkGwxZsBNgIQIAJCBDcCGCABKAIAIAEoAgQgAkEQahCMKSEBDA0LIAJBADYCICACQQE2AhQgAkHYxZsBNgIQIAJCBDcCGCABKAIAIAEoAgQgAkEQahCMKSEBDAwLIAIgACgCBDYCCCACQQI2AhQgAkGAxpsBNgIQIAJCATcCHCACQQs2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDAsLIAIgACgCBDYCCCACQQE2AhQgAkGsxpsBNgIQIAJCATcCHCACQQs2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDAoLIAIgACgCBDYCCCACQQE2AhQgAkHMxpsBNgIQIAJCATcCHCACQQs2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDAkLIAJBADYCICACQQE2AhQgAkGAx5sBNgIQIAJCBDcCGCABKAIAIAEoAgQgAkEQahCMKSEBDAgLIAJBADYCICACQQE2AhQgAkGox5sBNgIQIAJCBDcCGCABKAIAIAEoAgQgAkEQahCMKSEBDAcLIAIgADYCCCACQQE2AhQgAkHYx5sBNgIQIAJCATcCHCACQfkANgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQjCkhAQwGCyACQQA2AiAgAkEBNgIUIAJBhMibATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQjCkhAQwFCyACQQA2AiAgAkEBNgIUIAJBsMibATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQjCkhAQwECyACQQA2AiAgAkEBNgIUIAJB2MibATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQjCkhAQwDCyACQQA2AiAgAkEBNgIUIAJB8MibATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQjCkhAQwCCyACIAAtAAg6AAwgAiAAKAIENgIIIAJBATYCFCACQZjJmwE2AhAgAkIBNwIcIAJBsgc2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDAELIAIgACgCBDYCCCACQQE2AhQgAkG8yZsBNgIQIAJCATcCHCACQQU2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBCyACQTBqJAAgAQuqCQIEfwF+IwBBIGsiAyQAIAEoAhwhBCADQRBqIAIgASgCGCIFQQAQjAICQAJAIAMtABBBBEYNACADKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkACQAJAAkACQAJAAkACQAJAIAVFDQAgA0EQaiACIAUQhyMgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgASgCICIFKAIAQWhqDgQDAgIBAgsgACAHNwIADAcLIAUoAghBA0YNAwsgA0EQaiABQSBqIAIQyS0gAy0AEEEERw0BQQAhBgwEC0EAIQYgA0EQaiACIAVBBGpBABDdBCADLQAQQQRGDQMgAykDECIHQv8Bg0IEUQ0DIAAgBzcCAAwEC0EAIQYgAykDECIHQv8Bg0IEUg0BDAILIANBEGogAiAFQRBqQQEQoQECQCADLQAQQQRHDQAgAy0AESEGDAILAkAgAykDECIHQv8Bg0IEUg0AIAdCgAKDQgiIpyEGDAILIAAgBzcCAAwCCyAAIAc3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgASgCAA4DAQIAAQsgA0EQaiABQQRqIAIQhgkgAy0AEEEERg0HIAMpAxAiB0L/AYNCBFINAgwHCyABKAIQIQUgBkEBcUUNBQJAIAVBAkkNACADQRBqIAIgBUF+akEAEIwCIAMtABBBBEYNACADKQMQIgdC/wGDQgRSDQMLIANBADYCECADQQhqIAIgA0EQakHA/JsBQQEQuQ0gAy0ACEEERg0FIAMpAwgiB0L/AYNCBFENBSAAIAc3AgAMBwsgASgCECEFIAZBAXFFDQMCQCAFQQJJDQAgA0EQaiACIAVBfmpBABCMAiADLQAQQQRGDQAgAykDECIHQv8Bg0IEUg0DCyADQQA2AhAgA0EIaiACIANBEGpBwPybAUEBELkNIAMtAAhBBEYNAyADKQMIIgdC/wGDQgRRDQMgACAHNwIADAYLIAAgBzcCAAwFCyAAIAc3AgAMBAsgACAHNwIADAMLAkACQCAFRQ0AIANBEGogAiAFQX9qQQAQjAIgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgA0EANgIQIANBCGogAiADQRBqQcD8mwFBARC5DQJAIAMtAAhBBEYNACADKQMIIgdC/wGDQgRRDQAgACAHNwIADAQLIANBEGogAUEIaiACEP4IIAMtABBBBEYNAiADKQMQIgdC/wGDQgRRDQIgACAHNwIADAMLIAAgBzcCAAwCCwJAAkAgBUUNACADQRBqIAIgBUF/akEAEIwCIAMtABBBBEYNACADKQMQIgdC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakHA/JsBQQEQuQ0CQCADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwDCyADQRBqIAFBCGogAhC8GCADLQAQQQRGDQEgAykDECIHQv8Bg0IEUQ0BIAAgBzcCAAwCCyAAIAc3AgAMAQsCQAJAIARFDQAgA0EQaiACIAQQhyMgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgAEEEOgAADAELIAAgBzcCAAsgA0EgaiQAC7wKAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgAiAUF0aiICQQcgAkEmSRtBf2oOJAABAgMEBQYHCAkKCwwNDg8QERITIhQVFhciGBkaGxwdHh8gISILIABBCGoiAigCACAAQQxqKAIAEKYeIAAoAgQgAigCABCbLQwhCyAAQQRqEPIqDCALIAApAwggAEEcai0AABDlKCAAKAIgIgJBBGoiASgCACACQQhqKAIAEIMTIAIoAgAgASgCABCYLSACQQxqEI0oAkAgAigCGEGAgICAeEYNACACQRhqEI4oCyACQTxqEP0jIAJBwABqEP0qIAJByABBBBCsFgwfCyAAQQRqEPYCDB4LIABBDGoQ9gIMHQsgAEEEahD2AiAAQQhqEPYCDBwLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEODAoAAQIDBAUGBwgLCQsLIABBCGoQ7yIMCgsgAEEIahDzJgwJCyAAQQRqEPYCDAgLIABBBGoQsx8MBwsgAEEEahD/KwwGCyAAQQRqEP8rDAULIABBBGoQ9gIMBAsgAEEEahD/KwwDCyAAQQRqEKYtDAILAkACQAJAIAAoAgQOAgABBAsgACgCDCICIAAoAhAQ6CIgACgCCCACEJotDAELIABBCGoQyw8gACgCCCAAKAIMEJ8tCyAAQRxqEP0qDAELIAApAwgQvyEgAEEgahD9KgsgAEE4ahD2AgwbCyAAQQhqEO8iDBoLIABBCGoQ8yYMGQsgAEEEahD2AiAAQQhqEPYCIABBDGoQ9gIMGAsgAEEEaiECAkAgAC0AGEEFRw0AIABBEGoQ9gILIAIQ/iogACgCKBCALAwXCyAAQRBqEPYCAkAgACgCBEGAgICAeEYNACAAQQRqEP4qCyAAKAIgEIAsDBYLIABBBGoQhigMFQsgACkDCBC/IQwUCwJAAkACQAJAAkAgACgCCA4GARgYAgMEAAsgACkDEBC/ISAAKQMYEL8hDBcLIAApAxAgAEEgaikDABC1LgwWCyAAKQMgEP8qDBULIABBGGopAwAgAEEgaigCABC+JgwUCyAAKQMQEL8hIAApAxgQvyEMEwsgAEEEahD+KwwSCyAAQQRqEPYCIAAoAhgQgCwgACgCCCICEP4rIAJBIEEEEKwWDBELIABBBGoQjyggAEEQahDOIyAAQSBqEP0jIABBJGoQ/SoMEAsgACkDCCAAQRxqLQAAEOUoIAAoAiAiAhCNKCACQQxqEPwBIAIoAgwgAkEQaigCABCeLSACQTBqEPwqIAJBNGoQ/SMgAigCOBCALCACQRxqIgEoAgAgAkEgaigCABD7DyACKAIYIAEoAgAQmy0gACgCIEHAAEEEEKwWDA8LIABBDGoQ/CoMDgsgAEEEahD2AgwNCyAAQQRqEPYCDAwLIABBCGoQ8CIMCwsgACkDCCAAQRhqKQMAELYuDAoLIAAoAgQiAkHAAGoQqR4gAigCgAEiASACKAKEARCqGyACKAJ8IAEQni0gAigCeBCALCACQZABahDxKgJAIAItADxBBkYNACACQRBqEKkeCyACQaABQQgQrBYMCQsgAEEEahDxKgwICyAAQQRqEP8rDAcLIABBBGoQ9gIMBgsgAEEEahD2AgwFCyAAQQRqEP8rDAQLIABBBGoQpi0MAwsgAEEEahD/KwwCCyAAKQMIEL8hDAELIABBBGoQsx8LIABBwABBCBCsFgucCgENfyMAQZABayIDJABBACEEAkACQAJAIAItAJEBQSBxRQ0AAkACQCACKAKIASIEQYAgcQ0AIAIgBEGAIHI2AogBIANBCGogAhDCFSADKAIIIQUgAiACKAKIAUH/X3E2AogBIAMoAgwhBAwBCyADQRBqIAIQwhUgAygCFCEEIAMoAhAhBQsgBUEBcQ0BCyAEIQYCQAJAIAItAOABRQ0AIAIoAtwBIQQgAigC2AEhBSADQRxqIAIQzSYgA0EBNgJ8IANByL6cATYCeCADQgE3AoQBIANBswc2AiwgA0EAOgBgIAMgA0EoajYCgAEgAyADQdgAajYCKCADIANB4ABqNgJYIANBwABqIANB+ABqEI0QIANB1ABqIANBJGooAgA2AgAgAyADKQIcNwJMIAUgBCADQcAAahDXGiEEIAItAOABQaIBRw0BIAIgAhCXLBCfFwwBCyACEKALIAEoAgwhByABKAIQIQgCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANB+ABqIAIgCC0AACAHLQAAEMQeIAIgAigCiAFB////fnE2AogBDAELIANB+ABqIAIgCC0AACAHLQAAEMQeCyADKAJ8IQQgAygCeCIFQYCAgIB4Rg0AIAMgAygCgAEiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQzSYgA0EBNgJ8IANByL6cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCNECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ1xohBCACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDSESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEO0fEOELIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahClKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ1yMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIUKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQmSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELIoCyAGEJ8sCyABEI0oQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC5wKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMIVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDCFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDNJiADQQE2AnwgA0HIvpwBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQjRAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqENcaIQQgAi0A4AFBogFHDQEgAiACEJcsEJ8XDAELIAIQoAsgASgCDCEHIAEoAhAhCAJAAkAgAigCiAEiBEGAgIABcQ0AIAIgBEGAgIABcjYCiAEgA0H4AGogAiAILQAAIActAAAQxB4gAiACKAKIAUH///9+cTYCiAEMAQsgA0H4AGogAiAILQAAIActAAAQxB4LIAMoAnwhBCADKAJ4IgVBgICAgHhGDQAgAyADKAKAASIJNgIwIAMgBDYCLCADIAU2AigCQAJAIAItAOABQQFGDQAgAigC3AEhBCACKALYASEFIANBNGogAhDNJiADQQE2AnwgA0HIvpwBNgJ4IANCATcChAEgA0GzBzYCXCADQQE6AGcgAyADQdgAajYCgAEgAyADQeAAajYCWCADIANB5wBqNgJgIANBwABqIANB+ABqEI0QIANB1ABqIANBPGooAgA2AgAgAyADKQI0NwJMIAUgBCADQcAAahDXGiEEIAItAOABQaIBRw0BIAIgAhCXLBCfFwwBCyACEKALAkACQAJAAkAgAi0AkQFBIHFFDQAgAi0A4AFB/wFxQQlGDQELQQAhCgwBCyADQQk6AHggAyACIANB+ABqENIRIAMoAgQhCiADKAIAQQFxDQELIAMgCjYCQCADQfgAaiACIAgtAAAgBy0AACAEIAkQ7R8Q4QsgAygCfCELAkAgAygCeCIMQYGAgIB4Rw0AIANBwABqEK0rIAshBAwCCyADQegAakEIaiINIANB+ABqQRBqIg4pAgA3AwAgAyADKQKAATcDaAJAIAxBgICAgHhHDQAgAi8BkAFBgMAAcUUNACAJQQZ0IQUDQCAFRQ0BAkAgBCgCAEEERw0AIARBEGooAgAhCSAEQQxqKAIAIQ8gA0GpgYCAeDYCeCACIA8gCSADQfgAahDXIwsgBEHAAGohBCAFQUBqIQUMAAsLIANBjAFqIAFBCGooAgA2AgAgA0H4AGpBCGoiBSADQShqQQhqKAIANgIAIAMgAykCKDcDeCADIAEpAgA3AoQBIAEoAhQoAgAhASACKALUASEJIActAAAhAiAILQAAIQdByABBBBCnKiIEIAs2AhwgBCAMNgIYIAQgBzoARSAEIAI6AEQgBCAKNgJAIAQgBjYCPEEAIQIgBEEANgI4IAQgCTYCNCAEIAE2AjAgBEEQaiAOKQMANwIAIARBCGogBSkDADcCACAEIAMpA3g3AgAgBCADKQNoNwIgIARBKGogDSkDADcCAAwECyAKIQQLIANBKGoQsigLIAYQ2SULIAEQjShBASECCyAAIAQ2AgQgACACNgIAIANBkAFqJAAL8gkBAn8CQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACICQXRqIgNBByADQSZJGw4mGgABAgMEBQYHCAkKCwwNGg4PEBESGhMTFBoaFRYXFxcXFxcaGRoaCyAAKAIMIgNFDRkgACgCCCEAIANBBHQhAwNAAkAgACgCAEECRg0AIABBDGooAgAgARD5AgsgAEEQaiEAIANBcGoiAw0ADBoLCyAAKAIMIgNFDRggACgCCCEAIANBDGwhAwNAAkACQCAAKAIAIgINACAAQQRqKAIAIAEQwwgMAQsgAiABEPkCCyAAQQxqIQAgA0F0aiIDDQAMGQsLIAAoAiAgARCfDQ8LIAAoAgQhAAwUCyAAKAIMIQAMEwsgACgCBCABEPkCIAAoAgghAAwSCwJAAkAgAkELRw0AIABBCGohAwJAAkAgACgCBA4DAAEDAAsgAyABEKwdIAAoAjghAAwUCyADIAEQnSAgACgCOCEADBMLIAAgARDAEAsgACgCOCEADBELIAAoAiggARD5AiAAKAIIQQJJDRIgAEEMaiABEPUuDwsgACgCCEEBRw0RIABBDGogARD1Lg8LIAAoAgQgARD5AiAAKAIIIAEQ+QIgACgCDCEADA4LAkAgAC0AGEEFRw0AIAAoAhAgARD5AgsgACgCDCIDRQ0PIANBBHQhAyAAKAIIQQxqIQADQCAAKAIAIAEQ+QIgAEEQaiEAIANBcGoiAw0ADBALCyAAKAIQIAEQ+QIgACgCBEGAgICAeEYNDiAAKAIMIgNFDQ4gA0EEdCEDIAAoAghBDGohAANAIAAoAgAgARD5AiAAQRBqIQAgA0FwaiIDDQAMDwsLIAAoAgwiA0UNDSAAKAIIIQAgA0ECdCEDA0AgACgCACABEPkCIABBBGohACADQXxqIgMNAAwOCwsgACkDCCAAKAIYIAEQ0iMPCyAAKAIMIgNFDQsgACgCCCEAIANBAnQhAwNAIAAoAgAgARD5AiAAQQRqIQAgA0F8aiIDDQAMDAsLIAAoAgQgARD5AiAAKAIIIgAoAggiA0UNCiAAKAIEIQAgA0ECdCEDA0AgACgCACABEPkCIABBBGohACADQXxqIgMNAAwLCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAIAMgARCiDiADQShqIQMgAkFYaiICDQALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAKAIEIAEQ+QIPCyAAIAEQniAPCyAAKAIgIAEQ5QQPCyAAKAIMIgANBQwHCyAAKAIEIQAMBAsgAEEIaiABEKgkDwsgASAAKAIEIgJBwABqEK4KAkAgAigChAEiA0UNACACKAKAASEAIANB2ABsIQMDQAJAAkACQCAAKAIAQXxqDgICAAELIABBBGooAgAgARD5AgwBCyABIAAQ1gcLIABB2ABqIQAgA0Gof2oiAw0ACwsCQCACKAKYASIDRQ0AIAIoApQBIQAgA0EobCEDA0AgACABEMsJIABBKGohACADQVhqIgMNAAsLIAItADxBBkYNBCABIAJBEGoQrgoPCyAAKAIMIgNFDQMgACgCCCEAIANBKGwhAwNAIAAgARDLCSAAQShqIQAgA0FYaiIDDQAMBAsLIAAoAgQhAAwACwsgACgCBCABEOsTCwuzCQEGfwJAAkACQAJAAkACQAJAIAAoAgAOCAABAgMGBgQFAAsCQCAAKAIgIgIoAggiA0UNACACKAIEIQAgA0EMbCEDA0AgASAAKAIAEO0aIABBDGohACADQXRqIgMNAAsLAkAgAigCFCIARQ0AIAIoAhAiBCAAQdgAbGohBQNAAkACQAJAAkACQAJAAkACQCAEKAIAIgBBfGpBACAAQXtqQQhJGw4JAAECAwQHBwUGAAsgASAEEJEOAkAgBCgCSCIARQ0AIAQoAkQiBiAAQQZ0aiEHA0ACQAJAIAYoAgBBB0YNAAJAIAYoAjgiA0UNACAGKAI0IQAgA0EMbCEDA0AgASAAKAIAEO0aIABBDGohACADQXRqIgMNAAsLIAYgARDwCgwBCwJAIAYoAjgiA0UNACAGKAI0IQAgA0EMbCEDA0AgASAAKAIAEO0aIABBDGohACADQXRqIgMNAAsLIAYtABxBAkcNACAGKAIMIQAgBigCCCABEPAKIAEgABDtGgsgBkHAAGoiBiAHRw0ACwsgBEEgaiIAKAIAQYCAgIB4Rg0GIAAgARChIAwGCyABIARBCGoQkQ4gBCgCMCABEKENDAULIAFBADoABCAEKAIgIAEQoQ0MBAsgASAEQQhqEJEOAkAgBCgCPCIARQ0AIAEgABDtGgsgBCgCOCIDRQ0DIAQoAjQhACADQQxsIQMDQCABIAAoAgAQ7RogAEEMaiEAIANBdGoiAw0ADAQLCyABQQA6AAQCQCAEKAIkIgBFDQAgASAAEO0aCyAEKAI0IgNFDQIgBCgCMCEAIANBDGwhAwNAIAEgACgCABDtGiAAQQxqIQAgA0F0aiIDDQAMAwsLIARBBGogARChIAwBCwJAAkAgBCgCCEEFRg0AIAEgBEEIahCRDgwBCyABQQA6AAQLAkAgBCgCPCIARQ0AIAEgABDtGgsgBCgCOCIDRQ0AIAQoAjQhACADQQxsIQMDQCABIAAoAgAQ7RogAEEMaiEAIANBdGoiAw0ACwsgBEHYAGoiBCAFRw0ACwsgAigCMCIARQ0FIAEgABDtGg8LIAAoAiAgARChDQ8LIAAoAgQiACgCCCIDRQ0DIAAoAgQiACADQThsaiEGA0AgACABEPAKAkAgAEEwaigCACIDRQ0AIAEgAxDtGgsgAEE4aiIAIAZHDQAMBAsLIAAoAgQiACgCCCIDRQ0CIAAoAgQiACADQThsaiEGA0AgACABEPAKAkAgAEEwaigCACIDRQ0AIAEgAxDtGgsgAEE4aiIAIAZHDQAMAwsLIAAoAgQiACgCKCIDRQ0BIANBMGwhAyAAKAIkQShqIQADQAJAIAAoAgAiBkUNACABIAYQ7RoLIABBMGohACADQVBqIgMNAAwCCwsgACgCBCIALQBFIgNBA0YNAAJAIANBAkYNAAJAIAAoAkAiAC0AJUECRg0AA0AgACgCICIALQAlQQJHDQALCyAAKAIIIgNFDQEgACgCBCEAIANBOGwhAwNAIAAgARCiDSAAQThqIQAgA0FIaiIDDQAMAgsLIAAoAigiA0UNACAAKAIkIQAgA0E4bCEDA0AgACABEKINIABBOGohACADQUhqIgMNAAsLC7oJAgh/BX4jAEEQayICJAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADgkJAAECAwQFBwYJCyAAQQhqIAEQ/gUMCAsgAC0AIA0HIAAoAhgNBwJAIAAoAgwiA0UNACAAKAIIIQQgA0HQAGwhAwNAQRghBUEIIQYCQAJAAkACQCAEKQMAIgpCfnwiC0ICIAtCAlQbpw4DAAIBAAsgBEEIaigCAA0CQSAhBUEQIQYMAQsgBEHIAGotAAANAUEIIQYgCqdBAXENAQsgBCAGaikDACAEIAVqKAIAIAEQ0iMLIARB0ABqIQQgA0Gwf2oiAw0ACwsgACgCHCIERQ0HIAQgARCGGQwHCwJAAkAgACgCCA4DAAEIAAsgACgCKCABEOUEDAcLIAAoAiggARCfDQwGCyAAKAIEIAEQ+QIMBQsgACgCECIERQ0EIAQgARCGGQwECyAAKAIEIgMtAEENAyADKQMAQgBSDQMgA0EIaiEEAkAgAy0AHEECRw0AA0AgBCgCACIAQRhqIQQgAC0ALEECRg0ACwsgAy0AQA0CIAIgAykDKCADQThqKAIAELIfIAIpAwAhCyACKAIIIQAgAiAEKQMAIARBEGooAgAQsh8gAigCCCEFIAIpAwAhDCACIAA2AgggAiALNwMAIAsgABDmHiELAkAgASgCGA0AIAFBEGogAUEgahCJAhoLIAtCGYgiDUKBgoSIkKDAgAF+IQogASgCFCIGIAuncSEEIAEoAhAhA0EAIQdBACEIA0ACQAJAAkACQCADIARqKQAAIg4gCoUiC0J/hSALQv/9+/fv37//fnyDQoCBgoSIkKDAgH+DIgtQDQADQCACIAEoAhAgC3qnQQN2IARqIAZxIglBBXRrQWBqEOgoDQIgC0J/fCALgyILUEUNAAsLIA5CgIGChIiQoMCAf4MhCwJAIAhBAUYNACALUA0CIAt6p0EDdiAEaiAGcSEACwJAIAsgDkIBhoNCAFINAEEBIQgMAwsCQCADIABqLAAAQQBIDQAgAykDAEKAgYKEiJCgwIB/g3qnQQN2IQALIAEoAhAiBCAAaiIDLQAAIQYgAikDACELIAIoAgghCCADIA2nIgk6AAAgBCABKAIUIABBeGpxakEIaiAJOgAAIAEgASgCHEEBajYCHCABIAEoAhggBkEBcWs2AhggBCAAQQV0ayIEQXhqIAU2AgAgBEFwaiAMNwMAIARBaGogCDYCACAEQWBqIAs3AwAMBwsgASgCEEEAIAlrQQV0aiIEQXhqIAU2AgAgBEFwaiIEKQMAIQsgBCAMNwMAAkAgAikDACIKQgODQgBSDQAgCqciBCAEKAIAIgBBf2o2AgAgAEEBRw0AIAQgBCgCEBDAJAsgC1ANBiALQgODQgBSDQYgC6ciBCAEKAIAIgBBf2o2AgAgAEEBRw0GIAQgBCgCEBDAJAwGC0EAIQgLIAQgB0EIaiIHaiAGcSEEDAALCyAAKQMQIAAoAiAgARDSIwwCCyAAKAIEIAEQ+QIMAQsgAiAEKQMAIARBEGooAgAQsh8gASACKQMAIAIoAggQiQYaIAIgAykDKCADQThqKAIAELIfIAEgAikDACACKAIIEIkGGgsgAkEQaiQAC9IJAQh/IwBB0ABrIgIkAAJAIAAoAgBBAUcNAAJAAkACQAJAAkACQAJAAkACQCAAKAIEIgNFDQAgACgCCCEEA0AgAy8BMiIFQQJ0IQZBACEHQX8hCAJAA0ACQCAGIAdHDQAgBSEIDAILIAMgB2ohCSAIQQFqIQggB0EEaiEHIAEgCUEEaigCACIJSyABIAlJa0H/AXEOAgwAAQsLAkAgBEUNACAEQX9qIQQgAyAIQQJ0aigCNCEDDAELCyADRQ0AIAIgCDYCFCACQQA2AhAgAiADNgIMIAMvATJBC0kNAUEFIQkCQAJAAkACQAJAAkAgCEEFSQ0AQQAhByAIQXtqDgIBAwILIAJCgICAgMAANwIcIAIgAzYCGCACQTBqIAJBGGoQzQ4gAigCPCEGIAIoAjghAyAIIQcgAigCNCIJIQQgAigCMCIIIQUMAwsgAkKAgICA0AA3AhwgAiADNgIYIAJBMGogAkEYahDNDiACKAIwIQggAigCNCEJIAJBBTYCTCACIAk2AkggAiAINgJEIAJBJGogAkHEAGogARD1HiACKAI4IQMgAigCPCEGDAMLIAhBeWohB0EGIQkLIAIgCTYCICACQQA2AhwgAiADNgIYIAJBMGogAkEYahDNDiACKAI0IQkgAigCMCEIIAIoAjwiBiEEIAIoAjgiAyEFCyACIAc2AkwgAiAENgJIIAIgBTYCRCACQSRqIAJBxABqIAEQ9R4gCEUNCQsgAigCQCEEA0ACQCAIKAIAIgcNACAAKAIEIgdFDQQgACgCCCEIEKkmIgEgBzYCNCACIAEgCEEBahD6EyACKAIAIQcgACACKAIEIgg2AgggACAHNgIEIAYgCEF/akcNBSAHLwEyIghBC08NBiAHIAhBAWoiATsBMiAHIAhBAnRqIAQ2AgQgByABQQJ0aiADNgI0IAMgATsBMCADIAc2AgAMCgsgAiAHNgIYIAIgCC8BMCIINgIgIAIgCUEBaiIFNgIcIAYgCUcNBiAHLwEyQQtJDQcCQAJAAkACQAJAIAhBBUkNAEEAIQFBBSEJIAhBe2oOAgEDAgsgAkEENgIsIAIgBTYCKCACIAc2AiQgAkEwaiACQSRqEOAJIAIoAjAhByACKAI0IQkgCCEBDAMLQQUhASACQQU2AiwgAiAFNgIoIAIgBzYCJCACQTBqIAJBJGoQ4AkgAigCMCEHIAIoAjQhCQwCCyAIQXlqIQFBBiEJCyACIAk2AiwgAiAFNgIoIAIgBzYCJCACQTBqIAJBJGoQ4AkgAigCOCEHIAIoAjwhCQsgAiABNgJMIAIgCTYCSCACIAc2AkQgAkHEAGogBCADEKUMIAIoAkAhBCACKAI8IQYgAigCOCEDIAIoAjQhCSACKAIwIggNAAwJCwsQqiYhByAAQQA2AgggACAHNgIEIAcvATIiCEELTw0GIAcgCEEBajsBMiAHIAhBAnRqIAE2AgQMBwsgAkEwaiACQQxqIAEQ9R4MBgtBxLqbARDOLAALQeC7mwFBMEGQvJsBEMweAAtB1LqbAUEgQaC8mwEQzB4AC0GYvZsBQTVB0L2bARDMHgALIAJBGGogBCADEKUMDAELQdS6mwFBIEHQu5sBEMweAAsgACAAKAIMQQFqNgIMCyACQdAAaiQAC/QJAgp/AX4jAEGQAWsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQANAAkACQAJAAkAgASgCAA4TABISAQIDEhIFBgcICQoLDA0ODwALIAAgAUEEahD8BAwPCyABKAIIIQMgACABKAIEEKgBIAAgAxD9AgwOCyABKAIMIgNFDQ0gACADEKgBDA0LIAEoAighAQwACwsgACABKAIEEKgBIAAgASgCCBD9AiABKAIUIgNFDQogACADEP0CDAoLIAAgASgCEBCoASABKAIMIgRFDQkgASgCCCEDIARBGGwhBANAAkAgA0EUaigCACIFRQ0AIAAgBRCoAQsgACADEPwEIANBGGohAyAEQWhqIgQNAAwKCwsgACABKAIEEKgBDAgLIAAgASgCBCIDQcgAahD8BCADQeAAaiEEAkACQAJAIAMoAgBBeWoOAgECAAsgACADELwnCyAAIANBKGoQ/AQLIAQoAgBBgICAgHhGDQcgACAEEPwEDAcLIAEoAgghAyAAIAEoAgQQqAEgACADEP0CDAYLIAEoAgghAyAAIAEoAgQQqAEgACADEP0CDAULAkAgASgCBCIDQQJGDQAgASgCCCEEAkAgA0EBcUUNACAAIAQQqAEMAQsgBCAAEJcgCwJAIAEoAhgiA0UNACAAIAMQqAELAkAgASgCHCIDRQ0AIAAgAxCoAQsgACABKAIMEP0CDAQLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCXIAwCCyADIAAQmCAMAQsgACADELwnCyAAIAEoAgwQqAEgACABKAIQEP0CDAMLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCXIAwCCyADIAAQmCAMAQsgACADELwnCyAAIAEoAgwQqAEgACABKAIQEP0CDAILIAFBCGogABDRBwwCCyAAIAEoAgQQqAELIAEoAgBBEUcNAQsgAkHgAGoQgCIgAkE4akEgaiABQShqIgMpAwA3AwAgAkE4akEYaiABQSBqIgQpAwA3AwAgAkE4akEQaiABQRhqIgUpAwA3AwAgAkE4akEIaiABQRBqIgYpAwA3AwAgASkDCCEMIAEgAikDYDcDCCAGIAJB4ABqQQhqIgcpAwA3AwAgBSACQeAAakEQaiIIKQMANwMAIAQgAkHgAGpBGGoiCSkDADcDACADIAJB4ABqQSBqIgopAwA3AwAgAiAMNwM4IAJBCGogACACQThqQQAQXCABQQhqIQACQAJAAkAgAigCCEFtaiILQQIgC0ECSRsOAwABAgALIAEpAwAhDCABQgE3AwAgAkHgAGpBKGogAykDADcDACAKIAQpAwA3AwAgCSAFKQMANwMAIAggBikDADcDACAHIAApAwA3AwAgAEEANgIAIAIgDDcDYCACQeAAahDuAwwCCyAAEIcFIABBIGogAkEIakEoaikDADcDACAAQRhqIAJBCGpBIGopAwA3AwAgAEEQaiACQQhqQRhqKQMANwMAIABBCGogAkEIakEQaikDADcDACAAIAIpAxA3AwAMAQsgARDu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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIAIgMoAgBBdGoiB0EHIAdBJkkbDiYsAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCwLIANBFGohByADQRBqIQgMLAsgA0EUaiEHIANBEGohCAwrCyADKAIgIghBNGohByAIQTBqIQgMKgsgA0EMaiEHIANBCGohCAwpCyADQQhqIQcgA0EEaiEIDCgLIANBEGohByADQQxqIQgMJwsgA0E0aiEHIANBMGohCAwmCyADQSRqIQcgA0EgaiEIDCULIANBJGohByADQSBqIQgMJAsgA0EUaiEHIANBEGohCAwjCyADQSBqIQcgA0EcaiEIDCILIANBGGohByADQRRqIQgMIQsgA0EUaiEHIANBEGohCAwgCyADQRRqIQcgA0EQaiEIDB8LIAMoAggOBxYXGBkaGxwWCyADQSBqIQcgA0EcaiEIDB0LIANBEGohByADQQxqIQgMHAsgA0EYaiEHIANBFGohCAwbCyADKAIgIghBKGohByAIQSRqIQgMGgsgA0EIaiEHIANBBGohCAwZCyADQQhqIQcgA0EEaiEIDBgLIANBDGohByADQQhqIQgMFwsgA0EMaiEHIANBCGohCAwWCyADQRxqIQcgA0EYaiEIDBULIANBLGohByADQShqIQgMFAsgA0EIaiEHIANBBGohCAwTCyADKAIEIghBBGohBwwSCyADQRRqIQcgA0EQaiEIDBELIANBEGohByADQQxqIQgMEAsgA0EMaiEHIANBCGohCAwPCyADQQxqIQcgA0EIaiEIDA4LIANBEGohByADQQxqIQgMDQsgA0EQaiEHIANBDGohCAwMCyADQRBqIQcgA0EMaiEIDAsLIANBFGohByADQRBqIQgMCgsgA0EMaiEHIANBCGohCAwJCyADQQhqIQcgA0EEaiEIDAgLIANBHGohByADQRhqIQgMBwsgA0EQaiEHIANBDGohCAwGCyADQRBqIQcgA0EMaiEIDAULIANBFGohByADQRBqIQgMBAsgA0EUaiEHIANBEGohCAwDCyADQSRqIQcgA0EgaiEIDAILIANBJGohByADQSBqIQgMAQsgA0EIaiEHIANBBGohCAsgCCgCACEIIAFBDGogBygCADYCACABQQhq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AgAgAyADKQIsNwNQIANB0ABqEKkMIANBOGpBCGpBACgCxP+bATYCACADQQApArz/mwE3AzggAq0hCQJAA0AgCVANASADQThqIAmnQbSAnAEQmyFCACEJDAALCyAAIAMpAzg3AgwgAEEUaiADQThqQQhqKAIANgIAIABBCGogA0HQAGpBCGooAgA2AgAgACADKQNQNwIADAgLIABBDGogASgCBCAFENgXIABBCGpBACgCxP+bATYCACAAQQApArz/mwE3AgAMBwtBAC0AoPCeARpBBBB9IgFFDQQgAEEBNgIIIAAgATYCBCAAQQE2AgAgAUEBNgIAIABBACkCvP+bATcCDCAAQRRqQQAoAsT/mwE2AgAMBgsgAigCBCIIIARBAnRqQXxqIgZFDQQCQCAGKAIAIgdnIgYNACADQThqIAEoAgQgBRDYFyAAIANBOGogCCAEEL4DDAYLIANBIGogASAGEKIZIANBLGogAiAGEKIZIANBOGogA0EgaiADKAIwIgEgAygCNBC+AyAAQQhqIANBOGpBCGooAgA2AgAgACADKQI4NwIAIANBEGpBCGogA0HMAGooAgA2AgAgAyADKQJENwMQIAMoAiwgARDwLCAAQQxqIQECQCADKAIUIANBEGogAygCEEGAgICAeEYbKAIIRQ0AIAEgA0EQaiAHRSAGQR9xEOoHDAYLIAEgA0EQahDFHQwFCyADQQA2AkggA0EBNgI8IANB2MKCATYCOCADQgQ3AkAgA0E4akGQw4IBEOIjAAsgAEEIakEAKALE/5sBIgE2AgAgAEEAKQK8/5sBIgk3AgAgACAJNwIMIABBFGogATYCAAwDCyADQQA2AkggA0EBNgI8IANB2MKCATYCOCADQgQ3AkAgA0E4akHgwoIBEOIjCwALQYDDggEQziwACyADQeAAaiQAC9AIAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkAgASgCAA4HAAIBAgMEBQALIAJBCGogAUEIahCvGSACKAIMIQMgAigCCCEBDAULIAEoAgwhAyABKAIIIQEMBAsgASgCFCEDIAEoAhAhAQwDCyABKAIQIQMgASgCDCEBDAILIAEoAgghAyABKAIEIQEMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJA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NwJEIABBIGogASgCBCABKAIIEIQUIABBBDYCBCAAIAIpAzg3AiwgAEE0aiADKQMANwIAIABBPGogAkHIAGopAwA3AgAgAEGJgMQANgIADAELIAJBNGogBUEIaigCACIDNgIAIAJBKGogAzYCACACQQA2AhwgAkKAgICAwAA3AhQgAiAFKQIAIgg3AiwgAiAINwIgIAJBOGpBCGohAyACQSBqIQQCQAJAA0AgARD2D0EtRw0BIAMgARCoDSACQQA6AFggAkKBgMSA0AU3AjggAkEUaiACQThqEOkSIAEQziQNAAsgAkE4akEIaiIDIAJBCGpBCGooAgAiBTYCACACQcwAaiAFNgIAIAIgAikDCCIINwM4IAIgCDcCRCAAQSBqIAEoAgQgASgCCBCEFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELAkAgAigCHA0AIAEQ9g9B3QBHDQAgAkE4akEIaiIDIAEQqA0gAkEAOgBYIAJCgYDEgNALNwI4IAJBFGogAkE4ahDpEiABEM4kDQAgAkHMAGogBUEIaigCADYCACADIAJBCGpBCGooAgA2AgAgAiACKQMINwM4IAIgBSkCADcCRCAAQSBqIAEoAgQgASgCCBCEFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELIAJBkAFqQRRqIAVBCGooAgA2AgAgAkGQAWpBCGoiASACQQhqQQhqKAIANgIAIAJBqAFqQQhqIgMgBEEIaigCACIHNgIAIAJBqAFqQRRqIAc2AgAgAiACKQMINwOQASACIAUpAgA3ApwBIAIgBCkCACIINwOoASACIAg3ArQBAkBBJEUNACAAQfQAaiACQRRqQST8CgAACyAAQgQ3AgggAEKHgMQANwIAIAAgBkHeAEY6AHAgACACKQOoATcCECAAQRhqIAMpAwA3AgAgAEEgaiACQagBakEQaikDADcCACAAIAIpA5ABNwJYIABB4ABqIAEpAwA3AgAgAEHoAGogAkGQAWpBEGopAwA3AgAMAQsgAEGJgMQANgIAIAJBFGoQ7CoLIAJBwAFqJAAL/AgCCn8BfiMAQZABayICJAACQAJAAkAgASgCACIDQQlHDQAgACABQQhqEP0CIAEoAgBBAUYN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ayICJAAgAiABKALYASIDNgIUAkACQAJAIAEtAOABQc8ARg0AQQghBAwBCyABEKALAkACQCABLQDgAUUNAEEHIQQMAQsgARCgCyACQThqIAFBABDRAiACKAI8IQUCQAJAIAIoAjgiBEEHRg0AIAJBoAFqQSBqIAJBOGpBIGopAwA3AwAgAkGgAWpBGGogAkE4akEYaikDADcDACACQaABakEQaiACQThqQRBqKQMANwMAIAIgAikDQDcDqAEgAiAFNgKkASACIAQ2AqABIAEtAOABIQYCQAJAIAEtAJEBQSBxRQ0AIAZB/wFxQQlHDQAgASgC2AEhByABEKALAkACQCABKAKIASIGQYAgcQ0AIAEgBkGAIHI2AogBIAIgARC/EiACKAIAIQggASABKAKIAUH/X3E2AogBIAIoAgQhBgwBCyACQQhqIAEQvxIgAigCDCEGIAIoAgghCAsCQCAIQQFxRQ0AIAYhBQwCCyACQcABaiEIIAIgBjYCOAJAAkACQAJAIAQOBwEAAAACAgIBCyACQbgBaiEICyABKALUASEJQQxBBBDGKiIKIAk2AgggCiAHNgIEIAogBjYCACAIEMUrIAggCjYCAAwBCyACQThqELQGCyABLQDgASEGCyAGQf8BcUEBRg0CIAEoAtwBIQUgASgC2AEhBCACQcwBaiABEM0mIAJBATYCPCACQci+nAE2AjggAkIBNwJEIAJBswc2AvQBIAJBAToA/wEgAiACQfABajYCQCACIAJB+AFqNgLwASACIAJB/wFqNgL4ASACQdgBaiACQThqEPQaIAJB7AFqIAJB1AFqKAIANgIAIAIgAikCzAE3AuQBIAQgBSACQdgBahDXGiEFIAEtAOABQaIBRw0AIAEgARCXLBCfFwsgAkGgAWoQ5hULIABBCTYCACAAIAU2AgQMAwsgARCgCyACQRhqQRhqIAJBqAFqIgZBGGopAwA3AwAgAkEYakEQaiAGQRBqKQMANwMAIAJBGGpBCGogBkEIaikDADcDACACIAYpAwA3AxgLIAJB2ABqIAJBGGpBGGopAwA3AwAgAkE4akEYaiACQRhqQRBqKQMANwMAIAJBOGpBEGogAkEYakEIaikDADcDACACIAIpAxg3A0AgAkGgAWogAUEAEIwIIAIgATYCYCACIAU2AjwgAiAENgI4IAIoAqABIQYgAiAC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AmwhDCACKAJoIg1BBUYNBiAGIAUpAwA3AwAgBkEYaiAFQRhqKQMANwMAIAZBEGogBUEQaikDADcDACAGQQhqIAVBCGopAwA3AwAgAiAMNgJEIAIgDTYCQAwFCyACQegAakEEciABEM0mIAJBIDYCfCACQaTfmwE2AnggAkGwgICAeDYCaCABKALYASABKALcASACQegAahDXGiEMIAEtAOABQaIBRw0FIAEQkRIhCyABEKALIAEgCxCfFwwFCyACQegAaiABQQAQ8hsgAigCaCEMIAIoAvgBIg5BgYCAgHhGDQQCQEGMAUUiDw0AIAJBlAJqIAhBjAH8CgAACyACQYgCakEIaiIQIAdBCGooAgA2AgAgAiAHKQIANwOIAiAOQYCAgIB4Rg0BQQhBoAEQnCwiDUUNAiANIAw2AgACQCAPDQAgDUEEaiACQZQCakGMAfwKAAALIA0gDjYCkAEgDSACKQOIAjcClAEgDUGcAWogECgCADYCACACIA02AkQgAkEDNgJADAMLIAJB6ABqIAEQxBEgAikDaCERIAIpA3AhEiABKALYASEMIAEoAtwBIQ4gAkHoAGogARCsAiABIA42AtQBIAEgDDYC0AEgBCACKQJoNwIAIA0gBSgCADYCACACIA42AlwgAiAMNgJYIAIgEjcDUCACIBE3A0ggAkEANgJADAILIAYgAikClAI3AgAgBkEYaiACQZQCakEYaikCADcCACAGQRBqIAJBlAJqQRBqKQIANwIAIAZBCGogAkGUAmpBCGopAgA3AgAgAiAMNgJEIAJBBDYCQAwBCwALAkBBKEUiDA0AIAJBGGogAkHAAGpBKPwKAAALAkAgCyACKAIMRw0AIAJBDGoQ3B0gAigCECEDCwJAIAwNACADIApqIAJBGGpBKPwKAAALIApBKGohCiALQQFqIQsMAQsLIAJBBjYCQCACIAw2AkQgCRCxKAsgACACKQIMNwIAIABBCGogAkEMakEIaigCADYCACACQaADaiQAC7QIAgJ/AX4jAEEwayIDJAAgA0EYaiACIAEoAgBBABCMAgJAAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EANgIMIANBGGogAiADQQxqQcL3mwFBBhC0DQJAIAMtABhBBEYNACADKQMYIgVC/wGDQgRRDQAgACAFNwIA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AgAgBEHwAWokAAvYCAIGfwF+IwBB4AFrIgIkACACQTBqIAEoAgAiA0HYAGooAgAiBDYCACACQSRqIAQ2AgBBACEEIAJBADYCGCACQoCAgIDAADcCECACIAMpAlAiCDcCKCACIAg3AhwgA0HQAGohBSACQShqIQYCQAJAAkADQAJAAkAgARD2D0E6Rg0AIAEQ9g9BKUcNAQsCQCAEQQFxRQ0AIABBHGogASgCBCABKAIIEIQUIABBDDYCACAAIAIpAjQ3AiggAEEwaiACQTxqKQIANwIAIABBOGogAkHEAGopAgA3AgAMBAsgBiAFKQIANwIAIAZBCGogBUEIaigCADYCAAJAQSRFDQAgAEEEaiACQRBqQST8CgAACyAAQSI2AgAMBAsCQAJAAkAgARD2D0EtRiIEDQAgAkHIAWogARCoDSACQYgBaiABEIULIAItAIwBIQMgAigCiAEiB0EiRg0BAkBBO0UNACAAQQVqIAJBiAFqQQVqQTv8CgAACyAAIAM6AAQgACAHNgIADAULIAJBNGogARCoDSACQcwAaiABEKgNIAJBBzoAZCACIAJBEGogAkHMAGoQmAsgAigCAEEBcQ0DDAELIAJB6ABqQQhqIAJByAFqQQhqKQIANwMAIAJB6ABqQRBqIAJByAFqQRBqKQIANwMAIAIgAikCyAE3A2ggAiADOgCAASACQQhqIAJBEGogAkHoAGoQmAsgAigCCEEBcUUNACACKAIMIQQgAkHIAWogARCoDSACQYgBakEQaiIDIAIoAhQgAigCGCAEQZTDhAEQyiUiBEEQaikCADcDACACQYgBakEIaiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCEFCAAQQ02AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIADAMLIAEQjAsNAAsgAkGcAWogBUEIaigCACIENgIAIAJBiAFqQQhqIgMgBDYCACACIAUpAgAiCDcClAEgAiAINwOIASAAQRxqIAEoAgQgASgCCBCEFCAAQQ82AgAgACACKQOIATcCKCAAQTBqIAMpAwA3AgAgAEE4aiACQZgBaikDADcCAAwBCyACKAIEIQQgAkHIAWogARCoDSACQYgBakEQaiIDIAIoAhQgAigCGCAEQYTDhAEQyiUiBEEQaikCADcDACACQYgBakEIaiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCEFCAAQQ42AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIACyACKAIQIAIoAhQQ8iwLIAJB4AFqJAALswkCCH8CfiMAQaALayIDJAAgA0EDNgIwIANBADsANSADQQA6AB4gA0EAOgAqIANBAToAICADQoKAgIAwNwIUIANBAzYCJCADQQE6ADQgA0EAOgA5IANBgAI7ASwgA0EBOwEoIANBATsBHCADQQJBASACQfUDSRsiBDoAOCADQaADaiADQRRqQRxqIAEgAhCnAgJAAkACQAJAIAMoAqADQQFHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIIAMtALUDIQEgAy0AtAMhBCADKAKwAyEFIAMoAqwDIQIgAygCqAMhBgwBCyADQcgIaiIBIANBvgNqLwEAOwEAIAMgAykBtgM3A8AIIAMpAqQDIQsgAykCrAMhDCADLwG0AyEFAkBByAJFDQAgA0E8akEcaiADQcADakHIAvwKAAALIANB1gBqIAEvAQA7AQAgAyAFOwFMIAMgDDcCRCADIAs3AjwgAyADKQPACDcBTgJAAkACQAJAAkAgAkH1A0kNACADQaADakECQQEgA0E8ahCfAQJAIAMoAqADIgFBgICAgHhHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIDAULIANBwAhqQQhqIgIgA0G+A2ovAQA7AQAgAyADKQG2AzcDwAggAy0AtQMhBSADLQC0AyEGIAMoArADIQcgAygCrAMhCCADKAKoAyEJIAMoAqQDIQoCQEGoAkUNACADQYgGaiADQcADakGoAvwKAAALIANBsAhqQQhqIAIvAQA7AQAgAyADKQPACDcDsAhBAC0AoPCeARpB0AIQfSICRQ0BIAIgBToAHSACIAY6ABwgAiAHNgIYIAIgCDYCFCACIAk2AhAgAiAKNgIMIAIgATYCCCACQoGAgIAQNwIAIAIg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AQsgARCgCwwDCwJAIANBfmoOAwAFAAULIAJByAFqIAFBABDRAiACKALIAUEHRw0BIAJByAFqQQRyEOcHDAQLIAIgAigCzAE2AixBASEDQQAhBQwECyACQcgBahCgFwsCQAJAAkAgAS0A4AEiA0F/ag4KAQQEBAQEAgQCAgALIANBF0YNAQwDCyABEKALIAEtAOABQRtHDQILQQEhBAsgAiAEOgApQQAhA0EBIQUMAQtBACEEIAJBADoAKUEBIQVBACEDCyACIAM6ACggASACQTBqEMcFAkACQCADRQ0AIAUNASACQSxqEOcHDAELIARBAXENAgsgAS0A4AEhAwsgA0H/AXFB8wBHDQEgARDUCSEEIAEtAOABIQMgBEUNASAELQAAQeMARg0DIANB/wFxQeMARw0CDAMLIAJByAFqIAFBARC/BAJAAkAgAigCyAFBgYCAgHhHDQAgAiACKALMATYCNEEUIQEMAQsgAkHMAGogAkHgAWopAgA3AgAgAkHEAGogAkHYAWopAgA3AgAgAkE8aiACQdABaikCADcCACACIAIpAsgBNwI0QQIhAQsgAiABNgIwIAJBIGogAkEwahDxGyACKAIkIQMgAigCICEEDAMLIANB/wFxQeMARg0BCyABKALYASEFAkAgA0H/AXFBFEcNACABEKALCyACQRhqIAEQswpBASEEIAIoAhwhAyACKAIYQQFxDQFBACEEIAEtAOABQRRHDQFBBEEEEJYqIgYgAzYCACACQQE2AsABIAIgBjYCvAEgAkEBNgK4AQNAAkAgAS0A4AFBFEYNACABKALUASEBQeAAQQgQlioiA0IKNwMAIAMgATYCGCADIAU2AhQgAyACKQO4ATcDCCADQRBqIAJBuAFqQQhqKAIANgIADAMLIAEQoAsgAkEQaiABELMKIAIoAhQhAwJAIAIoAhBBAXENACACQbgBaiADQezYmwEQyyEMAQsLIAJBuAFqEPkqQQEhBAwBCyACQcgBaiABQQAQvwQCQAJAIAIoAsgBQYGAgIB4Rw0AIAIgAigCzAE2AjRBFCEBDAELIAJBzABqIAJB4AFqKQIANwIAIAJBxABqIAJB2AFqKQIANwIAIAJBPGogAkHQAWopAgA3AgAgAiACKQLIATcCNEECIQELIAIgATYCMCACQQhqIAJBMGoQ8RsgAigCDCEDIAIoAggh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KAIQEMAkCwJAIAEpAwBCAFINACABQQhqEIcRIAFByABBCBCsFgwDCyABEMYTIAFByABBCBCsFgwCCyACQQRqKAIAIgEQtwEgAUHAAEEIEKwWDAELIAJBCGoQ7QMLIAJBOGohAiADQX9qIgMNAAsgACgCECICRQ0AAkAgACgCDCIEIAAoAggiAygCCCIBRg0AIAJBOGwiAEUNACADKAIEIgUgAUE4bGogBSAEQThsaiAA/AoAAAsgAyABIAJqNgIICw8LIAMgASACajYCCAu6CAEKfyMAQcABayIBJAACQAJAAkAgACgCACICQYiAxABHDQAgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BIAAoAggoAgAiAkGIgMQARg0BIAJBgIDEAEYNAgwBCwJAAkAgAkGAgLx/aiICQQIgAkEISRsOCAMDAwMDAwABAwsgACgCBCgCACICQYiAxABGDQEgAkGAgMQARw0BDAILIAAoAgxFDQELQdgAEOsnIQMCQEHYAEUiAg0AIAFB6ABqIABB2AD8CgAACyAAQgA3AgQgAEGAgMQANgIAIABBDGpCADcCACAAQRRqQgA3AgACQCACDQAgAyABQegAakHYAPwKAAALIAFBATYCDCABIAM2AgggAUEBNgIEIAFBEGpBBGohBEEAIQBBASECA0ACQAJAAkACQAJAIAJFDQAgASACQX9qIgU2AgwgAyAFQdgAbGoiBigCACICQYmAxABHDQEgBSEACyADIQIDQCAARQ0CIABBf2ohACACEPMjIAJB2ABqIQIMAAsLIAEoAgQhByABIAI2AhACQEHUAEUiCA0AIAQgBkEEakHUAPwKAAALIAJBiIDEAEcNASABKAIUIQICQEHYAEUiBQ0AIAFB6ABqIAJB2AD8CgAACyACQgA3AgQgAkGAgMQANgIAIAJBDGpCADcCACACQRRqQgA3AgAgAUEEaiABQegAakG4+4cBEOAeIAEoAhghAgJAIAUNACABQegAaiACQdgA/AoAAAsgAkIANwIEIAJBgIDEADYCACACQQxqQgA3AgAgAkEUakIANwIAIAFBBGogAUHoAGpByPuHARDgHgwCCyABKAIEIANBBEHYABCUFgwDCwJAAkAgAkGAgLx/aiICQQIgAkEISRsOCAICAgICAgABAgsgASgCFCECAkBB2ABFDQAgAUHoAGog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gLx/akH/j7x/TQ0HIAJBEGogBSACQRxqEP8LIAIoAhQhAyACQQhqIAQgAkEgahD/CyACIAM2AiwgAiACKAIMIgc2AkggAyAHRw0IAkACQAJAAkACQCADQX5qDgMBAgMACyACIAM2AiwgAkEBNgI0IAJBiNqXATYCMCACQgE3AjwgAkELNgJMIAIgAkHIAGo2AjggAiACQSxqNgJIIAJBMGpBkNqXARDiIwALQQEhAyACQStqIQcgAkEsaiEIIAJByABqIQUgAkEwaiEEIAItACEhCSACLQAdIQEgAi0AHCEGIAItACAhCgwCCyACIAItABw6ADAgAiACLQAgOgBIQQIhAyACQSlqIQcgAkEqaiEIIAJBK2ohBSACQSxqIQQgAi0AIiEJIAItAB4hASACLQAdIQYgAi0AISEKDAELIAIgAi0AHDoAMCACIAItACA6AEggAiACLQAdOgAsIAIgAi0AIToAK0EDIQMgAkEnaiEHIAJBKGohCCACQSlqIQUgAkEqaiEEIAItACMhCSACLQAfIQEgAi0AHiEGIAItACIhCgsgBCAGOgAAIAUgCjoAACAIIAE6AAAgByAJOgAAIAAgAzoAACAAIAItADA6AAEgACACLQBIOgACIAAgAi0ALDoAAyAAIAItACs6AAQgACACLQAqOgAFIAAgAi0AKToABiAAIAItACg6AAcgACACLQAnOgAIDAkLIAEgBSAJciIDQQFqIAQQrR8gAyEEDAELIAEgCCAEEK0fIAhBf2ohBAwACwsLIABBBDoAAAwECyAAIAQ6AAIgACAFOgABIABBADoAAAwDC0Gw2pcBEM4sAAtBwNqXARDOLAALIAJBADYCMEEAIAJBLGogAkHIAGogAkEwakHQ2pcBEI4hAAsgAkHQAGokAAv0BwINfwF+IwBBMGsiASQAAkACQAJAIAAoAgANACAAKAIQIgBFDQEgAEHFkJwBQQEQggYhAgwCCyABQQxqIAAQqwsCQAJAAkAgASgCDCICDQAgAS0AECEDAkAgACgCECIERQ0AQQEhAiAEQeTjlwFB1OOXASADQQFxIgUbQRlBECAFGxCCBg0FCyAAIAM6AARBACECDAELAkAgASgCECIDQQFxDQAgAUKAgICAIDcCGCABIAI2AgwgASADNgIQIAEgAiADaiIFNgIUAkADQCABQQxqEMEDQYCAvH9qDgICAQALCyAAKAIQIgRFDQMgBCgCAEEiIARBBGoiBigCACgCEBEHAA0CIAFCgICAgCA3AhggASAFNgIUIAEgAzYCECABIAI2AgwgAUEoaiEHA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBDGoQwQMiA0GBgMQARg0AIANBgIDEAEYNCiADQSdGDQsCQCADQSFKDQAgA0F3ag4FBwQDAwgCCyADQSJGDQQgA0HcAEcNAkHcACEIQQAhCUECIQpBACELQQAhA0EAIQxB3AAhBQwNCyAEKAIAQSIgBEEEaigCACgCEBEHACECDBILIANFDQMLIANB/wVNDQkgAxD9B0UNCSABQSBqIAMQ9QogASkAIiIOQjCIpyELIA5CEIinIQMgAS0AKyEKIAEtACohDCABLQAhIQggAS0AICEFIA6nIQkMCgtB3AAhBUHuACEIDAQLQdwAIQVBIiEIDAMLQdwAIQVBMCEIQQAhCUECIQpBACELDAMLQdwAIQVB9AAhCAwBC0HcACEFQfIAIQgLQQAhCUECIQpBACELQQAhAwtBACEMDAMLQciXnAFBKyABQSBqQcTblwFBtNuXARDiEgALIAQoAgBBJyAGKAIAKAIQEQcADQUMAgtBgAEhBSADEM4MDQAgAUEgaiADEPUKIAEpACIiDkIwiKchCyAOQhCIpyEDIAEtACshCiABLQAqIQwgAS0AISEIIAEtACAhBSAOpyEJCyABIAg6ACEgASAFOgAgIAEgC61CMIYgCa1C//8Dg4QgA61CEIaENwEiIAohDSAMIQADQAJAAkAgBUH/AXFBgAFHDQBBACEFIAdBADsBACABQgA3AyBBACENQQAhACADIQJBACEDDAELIABB/wFxIgIgDUH/AXFPDQIgAEEBaiEAIAFBIGogAmotAAAhAgsgBCgCACACIAYoAgAoAhARBwANBAwACwsLAkAgACgCECICRQ0AIAJB1OOXAUEQEIIGDQILQQAhAiAAQQA6AAQLIAAgAjYCAAwCC0EBIQIMAQtBACECCyABQTBqJAAgAgvrBwIHfwF+IwBB8ABrIgMkACADQQhqIAEoAgAiBEHAAGpBuMaEARDlIyADKAIMIQUgAygCCCIGQQA2AgggA0EQakEIaiAEQdgAaigCADYCACADIAQpAlA3AxAgA0HAAGogARCoDSADQSBqQQhqIANB1ABqKAIANgIAIAMgAykCTDcDICAEQdAAaiEEAkACQANAIAEQziRFDQEgARD2D0H9AEYNAQJAIAEQ9g8Q2yINACADQcAAaiABEKgNIABBHGogASgCBCABKAIIEIQUIABBCTYCACAAIAMpAkA3AiggAEEwaiADQcgAaikCADcCACAAQThqIANB0ABqKQIANwIADAMLIAYgARD2DxC4FwwACwsCQAJAAkACQCAEKAIAIgcgASgCCCIIRg0AIANBMGpBCGogBEEIaigCADYCACADIAQpAgA3AzAgBigCBCEJIAYoAgghBiADIAEQ9g8iBzYCPCAHQf0ARw0BIAEQziQaIAZFDQIgA0HAAGogCSAGQRAQnQggAy0AQA0DIAMoAkQiBkGAsANzQYCAvH9qQYCQvH9JDQMgBkGAgMQARg0DIANB2ABqQQhqIgEgA0EgakEIaigCADYCACADQewAaiAEQQhqKAIANgIAIAAgBjYCBCAAIAMpAyAiCjcCCCAAIAI6ACEgAEEFOgAgIAMgBCkCADcCZCAAQRBqIAEpAwA3AgAgAEEYaiADQdgAakEQaikDADcCACADIAo3A1ggAEEiNgIADAQLIANB1ABqIARBCGooAgA2AgAgA0HAAGpBCGoiBiADQRBqQQhqKAIANgIAIAMgAykDEDcDQCADIAQpAgA3AkwgAEEcaiABKAIEIAcQhBQgAEEKNgIAIAAgAykDQDcCKCAAQTBqIAYpAwA3AgAgAEE4aiADQdAAaikDADcCAAwDCyADQQA2AkAgA0E8akHIxoQBIANBwABqQczGhAEQsCEACyADQdQAaiAEQQhqKAIANgIAIANBwABqQQhqIgYgA0EQakEIaigCADYCACADIAMpAxA3A0AgAyAEKQIANwJMIABBHGogASgCBCAIEIQUIABBBzYCACAAIAMpA0A3AiggAEEwaiAGKQMANwIAIABBOGogA0HQAGopAwA3AgAMAQsgA0HAAGpBCGoiBiADQSBqQQhqKAIANgIAIANB1ABqIANBMGpBCGooAgA2AgAgAyADKQMgNwNAIAMgAykDMDcCTCAAQRxqIAEoAgQgCBCEFCAAQQg2AgAgACADKQNANwIoIABBMGogBikDADcCACAAQThqIANBwABqQRBqKQMANwIACyAFIAUoAgBBAWo2AgAgA0HwAGokAAuK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DkEaIQ8MAQtBACELQQAtAKDwngEaQcAAEH0iBkUNASAGQQA6ABwgBiACNgIYQgAhECAGQgA3AhAgBiASNwIIIAZBGjYCAEEALQCg8J4BGkHAABB9Ig1FDQEgBEEIdiEBIBFCIIinIQkgEachCkEBIQxBFCEPCyANQgA3AxAgDUIENwMIIA1CDjcDAEEALQCg8J4BGkHAABB9IgJFDQAgAiABOwAdIAIgAzYCKCACQgA3AiAgAiAEOgAcIAIgBTYCGCACIAk2AhQgAiAKNgIQIAIgEDcCCCACIA82AgAgAkEfaiABQRB2OgAAQQAtAKDwngEaQcAAEH0iAUUNACABQQA6ADwgASANNgI4IAFCADcDMCABIAY2AiggAUIANwMgIAEgBzYCHCABIAg2AhggASATNwMQIAEgDjYCDCABIAs2AgggASAMNgIAEPQnIgNBADYCCCADQjE3AwAQ9CciBkEANgIIIAZCMTcDACADELgBIANBwABBCBCsFiAGELgBIAZBwABBCBCsFkEALQCg8J4BGkHAABB9IgNFDQAgA0ETOgAUIANCADcCDCADIAE2AgggAyACNgIEIANBEjYCACAAIAM2AgwgAEEANgIADwsAC84HAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgJBdGoiA0EHIANBJkkbDiYfAAECAwQFBgcICQoLDA0fDg8QERIfExQVHx8WFxgZGhscHR8eHx8LEOkoGiAAKAIMQQR0IQMgACgCCCEAA0AgA0UNHwJAIAAoAgBBAkYNACAAQQxqKAIAIAEQ+AMLIABBEGohACADQXBqIQMMAAsLIAEgAEEEahCSBA8LIABBCGogARDYJQ8LIABBBGogARCOLw8LIABBDGogARCOLw8LIABBBGogARCOLyAAQQhqIAEQji8PCyAAQThqIQMCQAJAIAJBC0cNACAAQQhqIQICQAJAIAAoAgQOAwABAwALIAIgARD5HQwCCyACIAEQqQQMAQsCQAJAAkACQAJAAkACQAJAAkACQCACDgsAAQIDBAUGBwgJCgALIABBCGogASgCFBCTLwwJCyABIABBCGoQliYMCAsgASAAQQhqELgoDAcLIABBBGogARCOLwwGCyAAQQRqIAEQ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AgAgAkEIaiALKQMANwIAIAIgFTcCACABQYABaiQAIAIPCyAQIAEoAihB9PGaARCFKQALpwcCCn8BfiMAQfAAayICJAACQAJAIAAoAgAiA0EJRw0AIAFBADoAfSAAQQhqIAEQ5AIMAQsCQAJAAkACQAJAAkACQAJAAkAgAw4JAAECAwQFBgcIAAsCQCAAKAIMIgNFDQAgACgCCCEEIANByABsIQUgAUEsaiEGIAFBgAFqIQdBACEIA0ACQAJAAkACQCAEIAhqIgMpAwBCfXwiDKdBAWpBACAMQgJUGw4DAAECAAsgA0EgaiIJKQMAIANBMGoiCigCACABEOQeAkAgAykDACIMQgJRDQAgDKdBAXENACADQQhqKQMAIANBGGooAgAgARDkHgsgAkEIaiAJKQMAIAooAgAQsh8gBiACKQMIIAIoAhBBARCxDCABIAkpAwAgCigCABDREQwCCyADQSBqIgsoAgAiCSEKAkAgAS0AkAENACAJIQogCUUNACACQQhqIANBEGopAwAgCRCyHyAHIAIpAwggAigCEBCJBhogCygCACEKCyACQQhqIANBEGoiAykDACAKELIfIAYgAikDCCACKAIQQQEQsQwgASADKQMAIAkQ0REMAQsgA0EgaiILKAIAIgkhCgJAIAEtAJABDQAgCSEKIAlFDQAgAkEIaiADQRBqKQMAIAkQsh8gByACKQMIIAIoAhAQiQYaIAsoAgAhCgsgAkEIaiADQRBqIgMpAwAgChCyHyAGIAIpAwggAigCEEEBELEMIAEgAykDACAJENERCyAFIAhByABqIghHDQALCyAAKAIcIgNFDQggAyABEPAYDAgLIABBCGogARDMBAwHCyAAQQRqIQMCQCAAKAIYDQAgAyABEPwIDAcLIAEtAJABIQggAUEBOgCQASADIAEQ/AggASAIOgCQAQwGCwJAAkACQAJAIAAoAggOAwABCQALIAFBLGoiAyAAQRBqELMSIAAtACRBAkcNASACQQhqIAMQgA0MAgsgAUEsaiAAQRBqIgMQlR8gASADENkFDAcLIAEgACkDECIMIAAoAiAiCBDRESACQQhqIAMQgA0gAS0AkAENACAIRQ0AIAJB4ABqIAwgCBCyHyABQYABaiACKQNgIAIoAmgQiQYaCyAAKAIoIAEQsQYgAyACQQhqEKYDDAULIAEgACgCBBCJIAwECyAAKAIQIgNFDQMgAyABEPAYDAMLIAAoAgQiAykDKCADQThqKAIAIAEQ5B4MAgsgASAAKAIEEIkgDAELIAApAxAgACgCICABEOQeCyACQfAAaiQAC7IHAQd/IwBBgAFrIgQkAAJAAkACQAJAAkACQAJAIAAtAABBAUcNACABIAIQuS0NARC3JiECDAYLIAAgASACEPgSIgINBSAALQAAQQFGDQEgBEEwaiAAKAIEIgAoAgAoAgAQui0gBEEwahDKJiICDQUCQAJAIAMtAABBAUcNACAAKAIAIQVBACECIARBADYCCCAEQoCAgIAQNwIAIANBAWohBgJAAkAgAy0AIEEBRg0AIARCmICAgMAENwJQIARCk4CAgPACNwJIIARCjoCAgKACNwJAIARCiYCAgNABNwI4IARCgICAgIABNwIwAkBBJEUNACAEQdwAakEAQST8CwALQQAhBwJAA0AgB0EFRg0BIAJBECACQRBLGyEIIARBMGogB0EDdGoiACgCBCEJIAAoAgAhAANAAkAgACAJSQ0AAkACQCAHQQRGDQAgCUEkTw0BIARB3ABqIAlqQS06AAALIAdBAWohBwwDCyAJQSRBhIOeARCMFQALIAggAkYNCSAAQSRPDQogBEHcAGogAGoiASAGIAJqLQAAIgpBBHZBmIKeAWotAAA6AAACQCAAQSNGDQAgAUEBaiAKQQ9xQZiCngFqLQAAOgAAIAJBAWohAiAAQQJqIQAMAQsLC0EkQSRBtIOeARCMFQALAkBBJEUNACAEQQxqIARB3ABqQST8CgAACyAEIARBDGogBEEMakEkahDQIAwBCyAEIAYoAAAiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AgwgBEEBNgJEIARBmI2CATYCQCAEQQE2AjQgBEHIvpwBNgIwIARBATYCPCAEQeQANgJgIAQgBEHcAGo2AjggBCAEQQxqNgJcIAQgBEEwahCvKQ0HCwJAIAMoABEiAEUNACAEQQE2AjQgBEGQsIMBNgIwIARCATcCPCAEQegBNgJgIAQgADYCDCAEIARB3ABqNgI4IAQgBEEMajYCXCAEIARBMGoQrykNBwsgBEEwakEIaiAEQQhqKAIAIgA2AgAgBCAEKQIANwMwIARB3ABqIAUgBCgCNCAAEK0GIARB3ABqEMomIQIgBEEwahC0LQwBCyAAKAIAKAIAENMjIQILIAINBSAEQQQ6ADAgBEEwahDKJiECDAULEJUDIQIMBAtBy7icAUEoQejOmwEQzB4ACyAIQRBBlIOeARCMFQALIABBJEGkg54BEIwVAAtB/JWcAUE3IARBMGpB3LObAUGAl5wBEOISAAsgBEGAAWokACACC58HAQZ/IwBB0ABrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAKABSIFLQDiAg0AIAQgASACIAMQTyAEKAIAIgZBAkcNAQwMCyAFLQDjAiEHIAQgASACIAMQTyAEKAIAIgZBAkYNCyAGQQFxRQ0DIAQoAgghCCAEKAIEIQkgB0EBcUUNAiAEQThqIAMgCSAIIAggASACEL4GIAQoAjgiBkECRw0BIAQoAjwhAQwMCyAGQQFxRQ0CIAQoAgghCCAEKAIEIQkMAQsgBCgCQCEIIAQoAjwhCQsgBkEBcUUNACADKAIQIgYgCEYNAQJAAkACQCADKAIADQAgBSgCsAIgBSgCtAJGDQAgAygCDCEFIAMoAgghAyAEIAg2AiAgBCAGNgIcIAYgCEEBaksNBSAIIAVLDQUgAkHAAWohAiAEQQA6ABggBCAINgIUIAQgBjYCECAEIAU2AgwgBCADNgIIIARBATYCACABQZAFaiEDAkACQCABKAKQCiIBLQDiAg0AIARBOGogAyACIAQQbSAEKAI4IgFBAkcNAQwLCyABLQDjAiEFIARBOGogAyACIAQQbSAEKAI4IgFBAkYNCiABQQFxRQ0IIAQoAkAhBiAFQQFxRQ0DIARBJGogBCAEKAI8IAYgBiADIAIQ5QYgBCgCJCIBQQJHDQIgBCgCKCEBDAsLIAFBAXFFDQcgBCgCQCEGDAILIAYgCEsNBSAAIAk2AgwgACAINgIIIAAgBjYCBCAAQQE2AgAMDAsgBCgCLCEGCyABQQFxRQ0EIAYgCEsNBSAAIAk2AgwgACAINgIIIAAgBjYCBCAAQQE2AgAMCgsgAEEANgIADAkLIAAgCTYCDCAAIAg2AgggACAINgIEIABBATYCAAwICyAEQQI2AjwgBEGA6JsBNgI4IARCAjcCRCAEQQs2AjAgBEGSATYCKCAEIAU2AjQgBCAEQSRqNgJAIAQgBEE0ajYCLCAEIARBHGo2AiQgBEE4akGQ6JsBEOIjAAsgBEEANgIQIARBATYCBCAEQfyUhAE2AgAgBEIENwIIIARB1KSDARDiIwALQcSVgwFBMEHkloMBEKoXAAsgBEEANgJIIARBATYCPCAEQfyUhAE2AjggBEIENwJAIARBOGpB1KSDARDiIwALIAQoAjwhAQsgAEECNgIAIAAgATYCBAwCCyAEKAIEIQELIABBAjYCACAAIAE2AgQLIARB0ABqJAAL7QYCCn8DfiMAQcAAayIEJAAgBCADNgIMIAQgAjYCCCAAKAIMIQMgBCAEQQhqNgIQAkACQAJAAkACQAJAAkAgAyABaiICIANJDQAgAiAAKAIEIgMgA0EBakEDdkEHbCADQQhJGyIDQQF2TQ0DIANBAWoiAyACIAMgAksbIgNBD0kNASADQf////8BSw0AQX8gA0EDdEEHbkF/amd2QQFqIQMMAgsQ4CEAC0EEQQhBECADQQhJGyADQQRJGyEDCyAEQTBqIAMQixIgBCgCNCEFIAQoAjAiBkUNAiAEKAI4IQcgBCgCPCEDAkAgBUEJaiICRQ0AIAZB/wEgAvwLAAsgBCADNgIsIAQgBzYCKCAEIAU2AiQgBCAGNgIgIARBCDYCHEEAIQhBACEDAkAgACgCDCIJRQ0AIAZBCGohCiAAKAIAIgspAwBCf4VCgIGChIiQoMCAf4MhDkEAIQEDQAJAIA5CAFINAANAIAFBCGohASALQQhqIgspAwBCgIGChIiQoMCAf4MiD0KAgYKEiJCgwIB/UQ0ACyAPQoCBgoSIkKDAgH+FIQ4LIAAoAgAgDnqnQQN2IAFqQQJ0IgxrQXxqKAIAIgMgBCgCDCICTw0FAkAgBiAFIAQoAgggA0EYbGooAhAiDXEiAmopAABCgIGChIiQoMCAf4MiD0IAUg0AQQghAwNAIAIgA2ohAiADQQhqIQMgBiACIAVxIgJqKQAAQoCBgoSIkKDAgH+DIg9QDQALCyAOQn98IRACQCAGIA96p0EDdiACaiAFcSIDaiwAAEEASA0AIAYpAwBCgIGChIiQoMCAf4N6p0EDdiEDCyAQIA6DIQ4gBiADaiANQRl2IgI6AAAgCiADQXhqIAVxaiACOgAAIAYgA0ECdGtBfGogACgCACAMa0F8aigAADYAACAJQX9qIgkNAAsgACgCDCEDCyAEIAM2AiwgBCAHIANrNgIoAkADQCAIQRBGDQEgACAIaiIDKAIAIQIgAyAEQRRqIAhqQQxqIgEoAgA2AgAgASACNgIAIAhBBGohCAwACwsgBCgCJCIDRQ0BIAQoAiAgA0ECdEELakF4cSICayADIAJqQQlqQQgQrBYMAQsgACAEQRBqQZYHEOgEC0GBgICAeCEFCyAEQcAAaiQAIAUPCyADIAJB5JGbARCMFQAL2QcBBX8jAEHgAmsiAyQAIAIgASgCACIEKQJQNwIYIAJBIGogBEHYAGooAgA2AgAgA0EgaiAEQRBqQaC9hAEQ5SMgAygCJCEFAkACQAJAAkAgAygCICIGKAIIIgcNACADQYGAgIB4NgKQAQwBCyAGIAdBf2oiBzYCCCAGKAIEIAdB8ABsaiEHAkBB8ABFDQAgA0GQAWogB0HwAPwKAAALAkACQCADKAKQAUGAgICAeGoOAgACAQsgA0H4AGogB0EUaikCADcDACADQegAakEIaiAHQQxqKQIANwMAIANBiAFqIARB0ABqIgRBCGooAgA2AgAgAyAHKQIENwNoIAMgBCkCADcDgAECQEEkRQ0AIANBgAJqIAJBJPwKAAALIANBGGogA0GAAmoQmhEgA0HoAGogAygCGCADKAIcQbC9hAEQgB8gA0EQaiADQegAahDNJCADQqKAgICgATcCKCADIAMoAhQ2AjAgAygCkAFBgoCAgHhIDQIgA0GQAWoQ4ioMAgsCQEHIAEUNACADQYACaiAHQSRqQcgA/AoAAAsgA0HYAmoiBiAHQeQAaikCADcDACADQdACaiIEIAdB3ABqKQIANwMAIAMgBykCVDcDyAIgAEEcaiABKAIEIAEoAggQhBQgAEEVNgIAIAAgAykDyAI3AiggAEEwaiAEKQMANwIAIABBOGogBikDADcCACADQYACahDaHiADQZABahDiKiAFIAUoAgBBAWo2AgAgAhDiKgwCCwJAQSRFDQAgA0GAAmogAkEk/AoAAAsgA0EIaiADQYACahCaESADQSI2AiggAyADKQMINwIsCwJAAkACQCAGKAIIIgINACADQYGAgIB4NgKQAQwBCyAGIAJBf2oiAjYCCCAGKAIEIAJB8ABsaiEGAkBB8ABFDQAgA0GQAWogBkHwAPwKAAALAkACQCADKAKQAUGAgICAeGoOAgACAQtBy7icAUEoQcC9hAEQzB4ACwJAQcgARQ0AIANBgAJqIAZBJGpByAD8CgAACyADQdgCaiICIAZB5ABqKQIANwMAIANB0AJqIgQgBkHcAGopAgA3AwAgAyAGKQJUNwPIAiAAQRxqIAEoAgQgASgCCBCEFCAAQRU2AgAgACADKQPIAjcCKCAAQTBqIAQpAwA3AgAgAEE4aiACKQMANwIAIANBgAJqENoeIANBLGoQ5AsMAQtBwABFDQAgACADQShqQcAA/AoAAAsgBSAFKAIAQQFqNgIAAkACQCADKAKQAUGAgICAeGoOAgACAQsgA0GQAWoQxCQMAQsgA0GQAWoQ4ioLIANB4AJqJAAL6QYCCn8BfiMAQTBrIgIkAAJAAkACQAJAAkAgAC0APA0AIAAtAChBAUcNAQsgAkEAOwAtIAJBCGpBCGpBACkDgISeASIMNwMAIAJBIGogDDcDACACQQApA/iDngEiDDcDCCACIAA2AiggAiAALQA4OgAsIAIgDDcDGCACQQhqQRBqIQMgASgCCCIERQ0BIAEoAgQiBSAEQThsaiEGIAUhBwNAAkACQCAHKAIAIgFBCUcNACAHQQhqIAJBCGoQ3gQMAQsCQAJAAkACQAJAIAEOCQABAgMFBAUFBQALAkAgBygCDCIBRQ0AIAFByABsIQggBygCCEEQaiEBIAIoAigiCUEQaiEKA0ACQAJAAkACQAJAIAFBcGopAwBCfXwiDKdBAWpBACAMQgJUGw4DAAECAAsgCSABQRBqIgtBABD8DyAJLQA0QQFHDQMgCykDACIMQgODQgBSDQIgDKciCyALKAIAIgtBAWo2AgAgC0F/Sg0CDA8LIAkgAUEAEPwPIAktADRBAUcNAiABKQMAIgxCA4NCAFINASAMpyILIAsoAgAiC0EBajYCACALQX9MDQ4MAQsgCSABQQAQ/A8gCS0ANEEBRw0BIAEpAwAiDEIDg0IAUg0AIAynIgsgCygCACILQQFqNgIAIAtBf0wNDQsgCiAMEMMGCyABQcgAaiEBIAhBuH9qIggNAAsLIAcoAhwiAUUNBCABQQRqKAIAIAFBCGooAgAgAkEIahDyFwwECyAHQQhqIAJBCGoQsQMMAwsgBygCHCIBRQ0CIAFBBGooAgAgAUEIaigCACACQQhqEPIXDAILAkACQCAHKAIIDgMAAQMACwJAIActACRBAkYNACACKAIoIAdBEGpBABD8DwsgBygCKCACQQhqENoWDAILIActACRBAkYNASACKAIoIAdBEGpBAhD8DwwBCyAHKAIQIgFFDQAgAUEEaigCACABQQhqKAIAIAJBCGoQ8hcLIAdBOGoiByAGRw0ACyACQQhqEMoKIAMQygogBEE4bCEBA0AgBSAAEOICIAVBOGohBSABQUhqIgENAAwDCwsgASgCCCIHRQ0BIAEoAgQhASAHQThsIQcDQCABIAAQ4gIgAUE4aiEBIAdBSGoiBw0ADAILCyACQQhqEMoKIAMQygoLIAJBMGokAA8LAAvmBgILfwN+IwBBwABrIgMkACADIAI2AgwgAyABNgIIIAAoAgwhAiADIANBCGo2AhACQAJAAkACQAJAAkACQCACQX9GDQAgAiAAKAIEIgEgAUEBakEDdkEHbCABQQhJGyIBQQF2SQ0DIAEgAiABIAJLGyICQQ5JDQEgAkH+////AUsNAEF/IAJBA3RBCGpBB25Bf2pndkEBaiECDAILEOAhAAtBBEEIQRAgAkEHSRsgAkEDSRshAgsgA0EwaiACEIsSIAMoAjQhBCADKAIwIgVFDQIgAygCOCEGIAMoAjwhAgJAIARBCWoiAUUNACAFQf8BIAH8CwALIAMgAjYCLCADIAY2AiggAyAENgIkIAMgBTYCICADQQg2AhxBACEHQQAhAgJAIAAoAgwiCEUNACAFQQhqIQkgACgCACIKKQMAQn+FQoCBgoSIkKDAgH+DIQ5BACELA0ACQCAOQgBSDQADQCALQQhqIQsgCkEIaiIKKQMAQoCBgoSIkKDAgH+DIg9CgIGChIiQoMCAf1ENAAsgD0KAgYKEiJCgwIB/hSEOCyAAKAIAIA56p0EDdiALakECdCIMa0F8aigCACICIAMoAgwiAU8NBQJAIAUgBCADKAIIIAJBFGxqKAIQIg1xIgFqKQAAQoCBgoSIkKDAgH+DIg9CAFINAEEIIQIDQCABIAJqIQEgAkEIaiECIAUgASAEcSIBaikAAEKAgYKEiJCgwIB/gyIPUA0ACwsgDkJ/fCEQAkAgBSAPeqdBA3YgAWogBHEiAmosAABBAEgNACAFKQMAQoCBgoSIkKDAgH+DeqdBA3YhAgsgECAOgyEOIAUgAmogDUEZdiIBOgAAIAkgAkF4aiAEcWogAToAACAFIAJBAnRrQXxqIAAoAgAgDGtBfGooAAA2AAAgCEF/aiIIDQALIAAoAgwhAgsgAyACNgIsIAMgBiACazYCKAJAA0AgB0EQRg0BIAAgB2oiAigCACEBIAIgA0EUaiAHakEMaiILKAIANgIAIAsgATYCACAHQQRqIQcMAAsLIAMoAiQiAkUNASADKAIgIAJBAnRBC2pBeHEiAWsgAiABakEJakEIEKwWDAELIAAgA0EQakHYBRDoBAtBgYCAgHghBAsgA0HAAGokACAEDwsgAiABQeSRmwEQjBUAC4gHAgJ/A34jAEGgAWsiBiQAIAYgAzYCBCAGIAI2AgAgBkHoAGpBCGogBEEIaigCADYCACAGIAQpAgA3A2ggASgCiAEhBCAGIAZBBGo2AnggBiAGNgJ0AkACQCAEQYCACHENACABIARBgIAIcjYCiAEgBkEIaiAGQegAaiABEKgqIAEgASgCiAFB//93cTYCiAEMAQsgBkEIaiAGQegAaiABEKgqCyAGKAIIIQQCQAJAIAYtABwiA0EDRw0AIABBCDYCACAAIAQ2AgQMAQsgBkEwakEMaiAGQQhqQQxqKQIANwIAIAZBMGpBF2ogBkEIakEXai0AADoAACAGIAYpAgw3AjQgBiAGLwAdOwBFIAYgAzoARCAGIAQ2AjAgBigCICEHAkACQCAFDQAgBygCFEHYAGwhAyAHKAIQIQQDQCADRQ0CAkACQAJAAkAgBCgCACICQXxqQQAgAkF7akEISRtBf2oOAwADAQMLIARBNWotAAANAQwCCyAEQcUAai0AAEEBRw0BCyAEQSxqKAIAIQIgBEEoaigCACEFIAZBoIGAgHg2AgggASAFIAIgBkEIahDXIwsgBEHYAGohBCADQah/aiEDDAALCyAHQQE6ADwLIAYgBzYCTCAGQcKAgIB4NgKIASAGQegAaiAGQTBqIAZBiAFqEK8SIAZB0ABqQQhqIgQgBkHoAGpBEGoiAikDADcDACAGQdAAakEQaiIDIAZB6ABqQRhqIgUpAwA3AwAgBiAGKQNwNwNQAkACQAJAIAYoAmhFDQAgBkEIakEYaiADKQMANwMAIAZBCGpBEGogBCkDADcDACAGIAYpA1A3AxAgBkHMAGoQzxYgBkEINgIIIAEoAtgBIAEoAtwBIAZBCGpBCGoQ1xohBCABLQDgAUGiAUYNAQwCCyAGQYgBakEQaiADKQMAIgg3AwAgBkGIAWpBCGogBCkDACIJNwMAIAYgBikDUCIKNwOIASAGQegAakEMaiAJNwIAIAZB6ABqQRRqIAg3AgAgBiAKNwJsIAZBCGpBDGogBkHoAGpBCGopAgA3AgAgBkEIakEUaiACKQIANwIAIAZBJGogBSgCADYCACAGIAYpAmg3AgwgBkEAOgAsIAYgBzYCKCAGQQA2AghBKEUNAiAAIAZBCGpBKPwKAAAMAgsgASABEJcsEJ8XCyAAQQg2AgAgACAENgIECyAGQaABaiQAC7cHAQF/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQXRqIgFBByABQSZJG0F/ag4kAAECAwQFBgcICQoLDA0ODxAREhMiFBUWFyIYGRobHB0eHyAhIgsgAEEEahDAKA8LIABBBGoQ8ioPCyAAKQMIIAAtABwQ5CggACgCICIAQQRqIgEoAgAgAEEIaigCABCDEyAAKAIAIAEoAgAQmC0gAEEMahCNKAJAIAAoAhhBgICAgHhGDQAgAEEYahCOKAsgACgCPBDhJCAAQcAAahC0KyAAQcgAQQQQrBYPCyAAQQRqEKcsDwsgAEEMahCnLA8LIABBBGoQpywgAEEIahCnLA8LIAAQgw8gAEE4ahCnLA8LIABBCGoQqCwPCyAAQQhqEIsnDwsgAEEEahCnLCAAQQhqEKcsIABBDGoQpywPCyAAQQRqEPgoDwsgAEEEahD5KA8LIABBBGoQkSgPCyAAKQMIEL4hDwsCQAJAAkACQAJAIAAoAggOBgEYGAIDBAALIAApAxAQviEgACkDGBC+IQ8LIAApAxAgACkDIBCnLg8LIAApAyAQ9SoPCyAAKQMYIAAoAiAQwSYPCyAAKQMQEL4hIAApAxgQviEPCyAAQQRqEIMsDwsgAEEEahCnLCAAKAIYEIAsIAAoAggiABCDLCAAQSBBBBCsFg8LIABBBGoQsCggAEEQahDaIyAAKAIgEOEkIABBJGoQtCsPCyAAKQMIIAAtABwQ5CggACgCICIAEI0oIABBDGoQ/AEgACgCDCAAQRBqKAIAEJ4tIABBMGoQtSsgACgCNBDhJCAAKAI4EIAsIABBHGoiASgCACAAQSBqKAIAEPsPIAAoAhggASgCABCbLSAAQcAAQQQQrBYPCyAAQQxqELUrDwsgAEEEahCnLA8LIABBBGoQpywPCyAAQQhqEPQiDwsgACkDCCAAKQMYEKMuDwsgACgCBCIAQcAAahCvHiAAQYABaiIBKAIAIABBhAFqKAIAEKobIAAoAnwgASgCABCeLSAAKAJ4EIAsIABBkAFqEIQrAkAgAC0APEEGRg0AIABBEGoQrx4LIABBoAFBCBCsFg8LIABBBGoQhCsPCyAAQQRqEKksDwsgAEEEahCnLA8LIABBBGoQpywPCyAAQQRqEKksDwsgAEEEahDQLQ8LIABBBGoQqSwPCyAAKQMIEL4hDwsgAEEEahDbIwsLpAcBA38CQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMAEREBAgMEBQYHEhAODQwLCgkIAAsgACgCDCICRQ0QIAAoAgghACACQTBsIQIDQCAAIAEQjAQgAEEwaiEAIAJBUGoiAg0ADBELCyAAKAIEIAEQvQMgACgCCCEADA0LIAAoAgwiAEUNDiAAIAEQvQMPCyAAQQA2AiAgACgCKCEADAsLIAAtACRBAkYNDCAAQQA2AiAPCyAALQAkQQJGDQsgAEEANgIgDwsgACgCBCABEL0DIAAoAgggARCMBCAAKAIUIgANCAwKCyAAKAIQIAEQvQMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEL0DCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEIwEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQvQMMCAsgAEEIaiABELkGDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABENsaDAILIAIgARDdGgwBCyACIAEQ6g0LIAAoAgwgARC9AyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABENsaDAILIAIgARDdGgwBCyACIAEQ6g0LIAAoAgwgARC9AyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARC9AwwBCyADIAEQ2xoLAkAgACgCGCICRQ0AIAIgARC9AwsCQCAAKAIcIgJFDQAgAiABEL0DCyAAKAIMIQAMAgsgACgCBCABEL0DIAAoAgghAAwBCyAAKAIEIAEQvQMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCMBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDqDQsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQjAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEIwEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEL0DC8kGAQt/IwBBIGsiAiQAQQEhAyABIAEoAmgiBEEBaiIFNgJoIAEoAmwhBiABKAJ4IQcCQCAELAAAIghBf0oNACABIARBAmoiBTYCaCAELQABQT9xIQkgCEEfcSEKAkACQCAIQWBPDQAgCkEGdCAJciEEDAELIAEgBEEDaiIFNgJoIAlBBnQgBC0AAkE/cXIhCQJAIAhBcE8NACAJIApBDHRyIQQMAQsgASAEQQRqIgU2AmggCUEGdCAELQADQT9xciAKQRJ0QYCA8ABxciEECyAEQYABSQ0AQQIhAyAEQYAQSQ0AQQNBBCAEQYCABEkbIQMLIAEgAyAHaiIINgJ4QQ4hBAJAAkAgBSAGRg0AAkACQAJAAkAgBSwAACIDQX9KDQAgA0EfcSILQQZ0IAUtAAFBP3EiDHIhCgJAIANBYEkNACAMQQZ0IAUtAAJBP3FyIQkCQAJAIANBcE8NACAJIAtBDHRyIQkMAQsgCUEGdCAFLQADQT9xciALQRJ0QYCA8ABxciEJCyAJQS1HDQUgASAFQQJqIgk2AmggA0FgSQ0DIAEgBUEDaiIJNgJoIAxBBnQgBS0AAkE/cXIhBCADQXBPDQIgBCALQQx0ciEKDAMLIApBLUcNBCABIAVBAmoiCTYCaEEBIQQMAwsCQAJAIANB/wFxQVNqDhEABQUFBQUFBQUFBQUFBQUFAQULQQEhBCABIAVBAWoiCTYCaAwDCyABIAhBAWo2AnggASAFQQFqNgJoQSAhBAwDCyABIAVBBGoiCTYCaCAEQQZ0IAUtAANBP3FyIAtBEnRBgIDwAHFyIQoLAkAgCkGAAU8NAEEBIQQMAQsCQCAKQYAQTw0AQQIhBAwBC0EDQQQgCkGAgARJGyEECyABIAQgCGoiBTYCeEEeIQQgAS0AKEUNACAGIAlGDQAgCS0AAEE+Rw0AIAEgBUEBajYCeCABIAlBAWo2AmggAkGmgICAeDYCCCABIAcgAkEIahDQESABQQAQsQIgARCJASABQQA6AJMBAkAgASgCbCABKAJoIgVHDQAgAEGAxgI7AQAMAgsgACABIAUtAABBAnRBlKKaAWooAgARBgAMAQsgAEEAOgAAIAAgBDoAAQsgAkEgaiQAC+gGAgR/AX4jAEEgayIDJAAgASgCCCEEIANBCGogAiABKAIEIgVBABCMAgJAAkAgAy0ACEEERg0AIAMpAwgiB0L/AYNCBFENACAAIAc3AgAMAQsCQAJAAkACQAJAIAEoAgAiBigCAEEDRw0AIANBCGogBkEQaiACEMktIAMtAAhBBEYNASADKQMIIgdC/wGDQgRRDQEgACAHNwIADAULAkACQCAGKAIgIgQoAgBBGEcNACADQQhqIAIgBEEEakEAEN0EIAMtAAhBBEYNASADKQMIIgdC/wGDQgRRDQEgACAHNwIADAYLIANBCGogBkEgaiACEMktIAMtAAhBBEYNACADKQMIIgdC/wGDQgRSDQILAkACQAJAAkACQAJAIAEtAAwNACAGKAIAQQJGDQUgA0EANgIIIAMgAiADQQhqQcD8mwFBARC5DSADLQAAQQRGDQEgAykDACIHQv8Bg0IEUQ0BIAAgBzcCAAwKCyADQQA2AgggAyACIANBCGpB6eqbAUECELkNIAMtAABBBEYNACADKQMAIgdC/wGDQgRSDQELIAYoAgAOAwECAwELIAAgBzcCAAwHCyADQQhqIAZBCGogAhC8GCADLQAIQQRGDQUgAykDCCIHQv8Bg0IEUQ0FIAAgBzcCAAwGCyADQQhqIAZBCGogAhD+CCADLQAIQQRGDQQgAykDCCIHQv8Bg0IEUQ0EIAAgBzcCAAwFCyADQQhqIAZBBGogAhCGCSADLQAIQQRGDQMgAykDCCIHQv8Bg0IEUQ0DIAAgBzcCAAwECyABLQAMRQ0BIANBADYCCCADIAIgA0EIakHp6psBQQIQuQ0gAy0AAEEERg0BIAMpAwAiB0L/AYNCBFENASAAIAc3AgAMAwsgACAHNwIADAILIANBADYCFCADQQhqIAIgA0EUakHRkJwBQQEQuQ0CQCADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwCCyADQQhqIAIgBSAEIAYoAgggBigCDBCdKgJAIAMtAAhBBEYNACADKQMIIgdC/wGDQgRRDQAgACAHNwIADAILIANBCGogAiADQRRqQdyDngFBARC5DSADLQAIQQRGDQAgAykDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwBCyAAQQQ6AAALIANBIGokAAuOBgEOfyMAQZAJayICJAACQCABQQJJDQBBASEDIAAgAUEBdiIEQRhsIgVqIQYgAiAFaiEHAkACQCABQQhJDQAgACACEO4HIAYgBxDuB0EEIQMMAQsgAkEQaiAAQRBqKQIANwMAIAJBCGogAEEIaikCADcDACACIAApAgA3AwAgByAGKQIANwIAIAdBCGogBkEIaikCADcCACAHQRBqIAZBEGopAgA3AgALQQAhCCACQQA2AogJQQAgA2shCSAAIANBGGwiBmohCiACIAQ2AowJIAEgBGshCyACIAZqIQwgAkGACWpBCGohDQNAAkACQCAIQQJGDQAgCSALIAQgDSAIQQJ0aigCACIGGyIFIAMgBSADSxtqIQ4gDCAGQRhsIg9qIQYgCiAPaiEFIAIgD2ohDwNAIA5FDQIgBiAFKQIANwIAIAZBEGogBUEQaikCADcCACAGQQhqIAVBCGopAgA3AgAgDyAGEKQLIA5Bf2ohDiAGQRhqIQYgBUEYaiEFDAALCyAHQWhqIQ4gACABQRhsQWhqIgVqIQYgAiAFaiEPIAIhBQJAA0ACQCAEDQAgDkEYaiEGAkAgAUEBcUUNACAAIAUgByAFIAZJIgQbIg4pAgA3AgAgAEEQaiAOQRBqKQIANwIAIABBCGogDkEIaikCADcCACAHIAUgBk9BGGxqIQcgBSAEQRhsaiEFCyAFIAZHDQIgByAPQRhqRw0CDAULIAAgByAFIAdBDGooAgAiAyAFQQxqKAIAIglJIgobIggpAgA3AgAgAEEIaiAIQQhqKQIANwIAIABBEGogCEEQaikCADcCACAGQRBqIA4gDyAPQQxqKAIAIgsgDkEMaigCACIMSSINGyIIQRBqKQIANwIAIAZBCGogCEEIaikCADcCACAGIAgpAgA3AgAgDkFoQQAgDRtqIQ4gD0FoQQAgCyAMTxtqIQ8gBSADIAlPQRhsaiEFIAcgCkEYbGohByAEQX9qIQQgBkFoaiEGIABBGGohAAwACwsQ2SEACyAIQQFqIQgMAAsLIAJBkAlqJAAL7gYCCX8BfiMAQfAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4DAAECAAsgAUEIaiAAEKAoIAAgASgCKBC8JwwCCyAALQCcASEDIABBADoAnAECQCABKAIwIgRFDQAgACAEEKgBCyAAIAM6AJwBIAAoAgANAgwDCyAAIAEoAgQQvCcLIAAoAgBFDQEgA0EBRw0BCyAAIAFBEGoiAxCqBSIERQ0AIAEoAjAhBSABQQA2AjACQAJAIAUNACAEIQAMAQsQ9CchACACQTBqIAQQQiAAQThqIAJBMGpBOGopAwA3AwAgAEEwaiACQTBqQTBqKQMANwMAIABBKGogAkEwakEoaiIGKQMANwMAIABBIGogAkEwakEgaiIHKQMANwMAIABBGGogAkEwakEYaiIIKQMANwMAIABBEGogAkEwakEQaiIJKQMANwMAIABBCGogAkEwakEIaiIKKQMANwMAIAAgAikDMDcDACACIAAQmxEgAigCAEEMRg0CIAYgAkEoaikDADcDACAHIAJBIGopAwA3AwAgCCACQRhqKQMANwMAIAkgAkEQaikDADcDACAKIAJBCGopAwA3AwAgAiACKQMANwMwQQAtAKDwngEaQcAAEH0iAEUNAyAAIAIpAzA3AwAgAEEAOgA8IAAgBTYCOCAAQgA3AzAgAEEoaiACQTBqQShqKQMANwMAIABBIGogAkEwakEgaikDADcDACAAQRhqIAJBMGpBGGopAwA3AwAgAEEQaiACQTBqQRBqKQMANwMAIABBCGogAkEwakEIaikDADcDACAEENEBIARBwABBCBCsFgsgAkEwakEYaiADQRhqKQMANwMAIAJBMGpBEGogA0EQaikDADcDACACQTBqQQhqIANBCGopAwA3AwAgAUIANwMYIAMpAwAhCyABQgE3AxAgAUEdakIANwAAIAFBADYCKCACIAs3AzAgAiACQTBqELAZQQAtAKDwngEaIAIpAwAhCyACKAIMIQQgAigCCCEFQSgQfSIDRQ0CIAMgADYCBCADQQY2AgBCAUEAEK0YIAEgAzYCKCABIAQ2AhwgASAFNgIYIAEgCzcDECABQQA2AgggAUEA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HCADQdAAaiABIAIQnA8gAygCUCEFAkACQAJAAkAgAy0AaCIGQQJGDQAgA0EwakEQaiIHIANB0ABqQRRqKAIANgIAIANBMGpBCGoiCCADQdAAakEMaikCADcDACADIAMpAlQ3AzAgAyADKABpNgIoIAMgA0HQAGpBHGooAAA2ACtBCEEgEJwsIglFDQMgCSAFNgIAIAkgAykDMDcCBCAJIAY6ABggCSADKAIoNgAZIAlBHGogAygAKzYAACAJQQxqIAgpAwA3AgAgCUEUaiAHKAIANgIAIAMgCTYCSCADQQE2AkQgA0HQAGpBBHIhCkEAIQggA0HpAGoiC0EDaiEMQQQhDUEAIQdBASEJA0AgAyAJNgJMIAZBAXENAgJAAkAgASgCiAEiCUHAAHENACABIAlBwAByNgKIASADIAEQ+wkgAygCACEJIAEgASgCiAFBv39xNgKIASADKAIEIQUMAQsgA0EIaiABEPsJIAMoAgwhBSADKAIIIQkLAkAgCUEBcQ0AAkAgByADKAIcRw0AIANBHGpB2OGbARDPHSADKAIgIQ0LIA0gCGogBTYCACADIAdBAWoiBzYCJCADQdAAaiABIAIQtwYgAygCUCEFIAMtAGgiBkECRg0AIANB+ABqQRBqIg4gCkEQaigCADYCACADQfgAakEIaiIPIApBCGopAgA3AwAgAyAKKQIANwN4IAMgCygAADYCcCADIAwoAAA2AHMCQCADKAJMIhAgAygCREcNACADQcQAakHo4ZsBEOYdCyADKAJIIBBBBXRqIgkgBTYCACAJIAMpA3g3AgQgCSAGOgAYIAkgAygCcDYAGSAJQQxqIA8pAwA3AgAgCUEUaiAOKAIANgIAIAlBHGogAygAczYAACAIQQRqIQggEEEBaiEJDAELCyADQcQAahCJKAsgA0EcahCRKEGAgICAeCEJDAELIANBEGpBCGoiBiADQcQAakEIaigCADYCACADIAMpAkQ3AxAgAygCICEFIAMoAhwiCUGAgICAeEYNACAAIAMpAxA3AgwgAEEUaiAGKAIANgIAIAAgBDYCGCAAIAc2AgggACABKALUATYCHAsgACAJNgIAIAAgBTYCBCADQZABaiQADwsAC4gHAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQF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iAEhCiADIANBJ2o2AjwgAyADQSZqNgI4IAMgA0EgajYCNAJAAkAgCkGAgIAQcQ0AIAEgCkGAgIAQcjYCiAEgA0EQaiADQShqIAEQkg4gAygCECELIAEgASgCiAFB////b3E2AogBIAMoAhQhCgwBCyADQRhqIANBKGogARCSDiADKAIcIQogAygCGCELCwJAAkAgC0EBcUUNACAAQQ02AgAgACAKNgIEIAIQiScMAQsCQAJAAkACQCAJDgMDAAEDCyABLQCRAUEgcUUNAiABLQCSAUH/AXENAgwBCyABLQCRAUEgcUUNASABLQCSAUH/AXENAQsgA0EIaiACEM4hIAMoAgwhCyADKAIIIQwgA0GAgYCAeDYCKCABIAwgCyADQShqENcjCwJAAkACQCACKAIAQQVGDQAgASgC1AEhCyADKAIgIQwgBUEBcQ0BDAILIAJBCGohCyABKALUASENIAIoAhQhAiADKAIgIQwCQCAEQf8BcUEDRg0AIANBtYGAgHg2AiggASAMIAIgDCACSRsgDCACIAwgAksbIANBKGoQ1yMLIANBKGpBDGogC0EIaigCADYCACAAQQY2AgAgACAIOgApIAAgBzoAKCAAIAU6ACcgACAJOgAlIAAgBDoAJCAAIAo2AiAgACANNgIcIAAgDDYCGCAAIAI2AhQgACAGQQBHOgAmIAMgCykCADcCLCAAIAMpAig3AgQgAEEMaiADQShqQQhqKQIANwIADAILIAooAhhBgICAgHhGDQAgA0GhgYCAeDYCKCABIAwgCyADQShqENcjCyAAQQU2AgAgA0HEAGogAkEYaikCADcCACADQTxqIAJBEGopAgA3AgAgA0E0aiACQQhqKQIANwIAIAMgAikCADcCLAJAQSRFDQAgAEEEaiADQShqQST8CgAACyAAIAQ6ADkgACAJOgA4IAAgCDoANyAAIAc6ADYgACAFOgA1IAAgBkEARzoANCAAIAo2AjAgACALNgIsIAAgDDYCKAsgA0HQAGokAAuJBwIIfwF+IwBBwAFrIgMkACADQZABakEIaiEEIANB4ABqQQhqIQUgACgCACEGAkACQANAAkACQAJAAkACQCACLQDgASIHQdQARg0AIAdBzgBHDQELIANBADYCJCADQoCAgICAATcCHCACKALYASEIIAIQoAsgB0HOAEYNASAGQQFxRQ0CIAIoAtwBIQcgAigC2AEhCSAAKQIEIQsgA0G5gICAeDYCYCADIAs3AmQgCSAHIANB4ABqENcaIQogAi0A4AFBogFHDQUgAiACEJcsEJ8XDAULQQAhCgwFCwJAAkAgAigCiAEiB0HAAHENACACIAdBwAByNgKIASADQQhqIAIQ+wkgAygCCCEHIAIgAigCiAFBv39xNgKIASADKAIMIQoMAQsgA0EQaiACEPsJIAMoAhQhCiADKAIQIQcLIAdBAXFFDQEMAwsgACAINgIEQQEhBiAAQQE2AgAgACACKALUATYCCEEAIQoLIAMgCjYCKAJAAkAgAi0A4AFBCUYNACACKALcASEHIAIoAtgBIQkgA0EsaiACEM0mIANBATYCZCADQci+nAE2AmAgA0IBNwJsIANBswc2AlQgA0EJOgBfIAMgA0HQAGo2AmggAyADQdgAajYCUCADIANB3wBqNgJYIANBOGogA0HgAGoQ9BogA0HMAGogA0E0aigCADYCACADIAMpAiw3AkQgCSAHIANBOGoQ1xohCiACLQDgAUGiAUcNASACIAIQlywQnxcMAQsgAhCgCwNAAkACQCACLQDgASIHQQNGDQAgB0HUAEYNACAHQc4ARw0BCyACKALUASEJAkAgASgCCCIHIAEoAgBHDQAgARDgHQsgASAHQQFqNgIIIAEoAgQgB0EYbGoiByADKQIcNwIAIAcgCjYCFCAHIAk2AhAgByAINgIMIAdBCGogA0EcakEIaigCADYCAAwDCwJAAkAgAigCiAEiB0GAgICAAnFFDQAgAiAHQf////99cTYCiAEgA0HgAGogAhCxLyACIAIoAogBQYCAgIACcjYCiAEMAQsgA0HgAGogAhCxLwsgAygCZCEHAkAgAygCYCIJQRNHDQAgByEKDAILAkBBKEUNACAEIAVBKPwKAAALIAMgBzYClAEgAyAJNgKQASADQRxqIANBkAFqQfyunAEQ8B4MAAsLCyADQShqEMMrCyADQRxqEMQoCyADQcABaiQAIAoL3gYBCH8jAEGAAWsiAiQAAkACQCABKAIIDQAgASgCBCIDQQAQ6SIgASgCACADEJwtDAELAkACQAJAAkACQCAAKAIgQYCAgIB4Rg0AIAJBCGpBCGogAUEIaigCADYCACACQQA7ARQgAiABKQIANwMIQQBBBBCcLQJAIAAoAigiA0UNACAAKAIkIQEgA0EwbCEDA0AgASACQQhqEJoEIAFBMGohASADQVBqIgMNAAsgAi0AFUEBcQ0ECyACKAIQIQMgAkEANgIQIAIoAgghBCACKAIMIQEgAkKAgICAwAA3AwggAkEcaiAAQSBqQQBBABDREyACIAEgA0ECdGo2AjwgAiAENgI4IAIgATYCNCACIAE2AjACQCACKAIcIgEgAigCICIERg0AIAJBwABqQQRyIgBBKGohBSAAQSBqIQYgAEEYaiEHIABBEGohCCAAQQhqIQkDQCABKAIAIgNBE0YNASAFIAFBLGooAgA2AgAgBiABQSRqKQIANwIAIAcgAUEcaikCADcCACAIIAFBFGopAgA3AgAgCSABQQxqKQIANwIAIAAgAUEEaikCADcCACACIAM2AkAgAkHAAGoQhgIgAUEwaiIBIARHDQALCyACQRxqQRRqIQEgAkKIgICAgAE3AhwgAigCJCEDAkAgAigCLA0AIAMgAUHYr5sBEIcDDAMLIAMgAigCKCABEIoDRQ0CAkAgAigCPCIAIAIoAjQiA0cNACADIQAMAgsgAkEcaiAAIANrQQJ2ELwUIAIoAiQgAigCKCABEIoDRQ0CIAIoAjwhAyACKAI0IQAMAQtB6K+bAUEeQfSwmwEQqhcACyACQcAAaiADIABrQQJ2QQhBMBCQDyACKAJEIQMgAigCQEEBRg0CIAJBADYCfCACIAIoAkg2AnggAiADNgJ0IAJB9ABqIAFBgOmbARCHAyACIAIoAnQ2AkggAiACKAJ4IgM2AkAgAiADNgJEIAIgAyACKAJ8IgBBMGxqNgJMAkAgAEUNACACQRxqIAAQvBQgAigCJCACKAIoIAJBwABqEK8IGgsgAkHAAGoQrR0LIAJBHGoQuQsgARD3GQsgAigCDCACKAIQEOkiIAIoAgggAigCDBCcLQwBCyADIAIoAkhBgOmbARCFKQALIAJBgAFqJAALyAYCBn8BfiMAQSBrIgIkAEEALQCg8J4BGgJAQcAAEH0iA0UNACADQQA2AgggA0IMNwMAAkACQAJAAkACQAJAAkACQCAAKAIADgUAAgMBBAALIAApAxAhCCAAKAIMIQQgACgCCCEFQQAhBgwGCyAAKAIMIQQgACgCCCEFIAAoAgQhB0ECIQYMBAsgAkEEakEUaiAAQRhqKQIANwIAIAJBEGogAEEQaikCADcCAEEAIQRBAC0AoPCeARogAiAAKQIINwIIQcAAEH0iB0UNBSAHQQA2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAwCCyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQCg8J4BGiACIAApAgg3AghBwAAQfSIHRQ0EIAdBAzYCCCAHQRs2AgAgByACKQIENwIMIAdBFGogAkEMaikCADcCACAHQRxqIAJBBGpBEGopAgA3AgAgB0EkaiACQQRqQRhqKAIANgIADAELIAJBBGpBFGogAEEYaikCADcCACACQRBqIABBEGopAgA3AgBBACEEQQAtAKDwngEaIAIgACkCCDcCCEHAABB9IgdFDQMgB0EENgIIIAdBGzYCACAHIAIpAgQ3AgwgB0EUaiACQQxqKQIANwIAIAdBHGogAkEEakEQaikCADcCACAHQSRqIAJBBGpBGGooAgA2AgALQQIhBkEAIQULC0EALQCg8J4BGkHAABB9IgBFDQAgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAEEALQCg8J4BGkHAABB9IgFFDQAgAUEAOgA8IAEgADYCOCABQgA3AzAgASADNgIoIAFCADcDICABIAg3AhggASAENgIUIAEgBTYCECABIAc2AgwgASAGNgIIIAFBATYCACACQSBqJAAgAQ8LAAvdBgIOfwN+IwBB8ABrIgIkACABKALYASEDIAEQnAEgAkHQAGogARDNCgJAAkACQAJAAkACQAJAIAItAGRBAkcNACACKAJQIQEMAQsgAikDWCEQIAIpA1AhESABLQDgAUEJRw0CIAEQoAsgARCcASACQdAAaiABEM0KIAItAGRBAkcNASACKAJQIQEgERC/IQsgAEEGOgAsIAAgATYCAAwECyACKQNQIRIgEVBFDQEgECERIBIhEAtBACEEIAJBADoAFCACQQA2AhAgAiAQPgIIIAIgEEIgiD4CDEEDIQUMAQsgAigCWCEFIAIgAigCXCIGNgIkIAIgAzYCICACIAY2AhwgAiAFNgIYIAIgEDcDCCACIBI3AxAgEkIgiKchBEEFIQULIAIgBToALCACIBE3AwAgAkEtaiEHIAJBHGohCCACQRVqIQkgAkEEciEKA0ACQAJAIAEtAOABQQhHDQAgARCgCyABEJwBIAJB0ABqIAEQzQogAi0AZEECRw0BIAIoAlAhASAAQQY6ACwgACABNgIAIAIQqx4MAwtBMEUNAiAAIAJBMPwKAAAMAgsgAigCXCELIAIoAlghDCACKQNQIRAgASgC1AEhBgJAAkACQAJAIAVBfWoiBUEBIAVB/wFxIg1BA0kbQf8BcQ4DAQIAAQsgAkEBNgJUIAJB0OCbATYCUCACQgA3AlwgAiACQewAajYCWCACQdAAakHY4JsBEOIjAAsgEachDiACQdAAakEIaiAKQQhqKQIANwMAIAJBzABqQQJqIAlBAmotAAA6AAAgAiAKKQIANwNQIAIgCS8AADsBTCAEIQUMAQsCQEEIQTAQnCwiDkUNAAJAQTBFDQAgDiACQTD8CgAAC0ECIQUMAQsACyACQThqQQhqIgQgAkHQAGpBCGopAwA3AwAgAkE0akECaiIPIAJBzABqQQJqLQAAOgAAIAIgAikDUDcDOCACIAIvAUw7ATQCQCANQQJHDQAgAhCrHgsgCCACKQM4NwIAIAcgAi8BNDsAACAIQQhqIAQpAwA3AgAgB0ECaiAPLQAAOgAAIAIgDjYCGCACIAY2AhQgAiADNgIQIAIgCzYCDCACIAw2AgggAiAQNwMAIAIgBToALCAGIQQgECERDAALCyACQfAAaiQAC/MGAQl/IwBBsAFrIgIkAAJAAkAgASgCACIDIAEoAgRGDQAgASADQRhqNgIAAkACQCABKAIQIgQgASgCFEYNACABIARBCmo2AhAgBC0AACIFQQJGDQAgAkGAAWogBEEJai0AADoAACACIAQpAAE3A3gMAQsgASABKAIMIgY2AhQgASABKAIIIgQ2AhAgBCAGRg0BIAEgBEEKajYCECACQYABaiAEQQlqLQAAOgAAIAIgBCkAATcDeCAELQAAIgVBAkYNAQsgAkEgakEIaiACQfgAakEIai0AADoAACACIAIpA3g3AyAgAkEYaiADENslAkACQCACKAIYIgENAEGAgICAeCEEIAJBgICAgHg2AiwgAygCECEHIAMoAgwhCAwBCyACQSxqIAEgAigCHBCEGEGAgICAeCEEIAMoAhAhByADKAIMIQgCQCACKAIsQYCAgIB4Rw0ADAELIAIoAjAhBiACKAI0IQNBACEEIAJBADYCeCACQRBqQQogAkH4AGoQzhsgAigCeCEJIAIoAhQhCkEBIQEgAkEBOwFcIAIgAzYCWCACQQA2AlQgAiAKOgBQIAIgCTYCTCACIAM2AkggAkEANgJEIAIgAzYCQCACIAY2AjwgAkEKNgI4IAJB7ABqIAJBOGoQhAdBBCEDQQAhBgJAIAIoAmxBgICAgHhGDQBBDCEDIAJBCGpBBEEEQQxBgOmbARCcGSACQewAakEIaigCACEEIAIoAgghCSACKAIMIgYgAikCbDcCACAGQQhqIAQ2AgAgAkEBNgJoIAIgBjYCZCACIAk2AmACQEEoRQ0AIAJB+ABqIAJBOGpBKPwKAAALAkADQCACQaQBaiACQfgAahCEByACKAKkAUGAgICAeEYNAQJAIAEgAigCYEcNACACQeAAakEBEPwkIAIoAmQhBgsgBiADaiIEIAIpAqQBNwIAIARBCGogAkGkAWpBCGooAgA2AgAgAiABQQFqIgE2AmggA0EMaiEDDAALC0GAgICAeCACKAKoARCdKSACKAJkIQMgAigCYCEEIAEhBgsgAkEsahDJLAsgACAFOgAUIAAgBzYCECAAIAg2AgwgACAGNgIIIAAgAzYCBCAAIAQ2AgAgACACKQMgNwAVIABBHWogAkEoai0AADoAAAwBCyAAQYGAgIB4NgIACyACQbABaiQAC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpAQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQnQMgACgCCCEADAsLIAAoAgwiAEUNDCABIAAQnQMPCyAAKAIoIQAMCQsgASAAKAIEEJ0DIAAoAgggARCkBCAAKAIUIgANCAwKCyABIAAoAhAQnQMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEJ0DCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQnQMMCAsgAEEIaiABEIoHDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABENwaDAILIAIgARDeGgwBCyACIAEQoA4LIAEgACgCDBCdAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABENwaDAILIAIgARDeGgwBCyACIAEQoA4LIAEgACgCDBCdAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxCdAwwBCyADIAEQ3BoLAkAgACgCGCICRQ0AIAEgAhCdAwsCQCAAKAIcIgJFDQAgASACEJ0DCyAAKAIMIQAMAgsgASAAKAIEEJ0DIAAoAgghAAwBCyABIAAoAgQQnQMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCkBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCgDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEJ0DC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQggMgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQggMPCyAAKAIoIQAMCQsgACgCBCABEIIDIAAoAgggARClBCAAKAIUIgANCAwKCyAAKAIQIAEQggMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEIIDCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQggMMCAsgAEEIaiABEKoBDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOkaDAILIAIgARDqGgwBCyACIAEQoQ4LIAAoAgwgARCCAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOkaDAILIAIgARDqGgwBCyACIAEQoQ4LIAAoAgwgARCCAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARCCAwwBCyADIAEQ6RoLAkAgACgCGCICRQ0AIAIgARCCAwsCQCAAKAIcIgJFDQAgAiABEIIDCyAAKAIMIQAMAgsgACgCBCABEIIDIAAoAgghAAwBCyAAKAIEIAEQggMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARClBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARChDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEIIDC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQpQIgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQpQIPCyAAKAIoIQAMCQsgACgCBCABEKUCIAAoAgggARCmBCAAKAIUIgANCAwKCyAAKAIQIAEQpQIgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEKUCCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQpQIMCAsgAEEIaiABEKECDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOUaDAILIAIgARDmGgwBCyACIAEQiQsLIAAoAgwgARClAiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOUaDAILIAIgARDmGgwBCyACIAEQiQsLIAAoAgwgARClAiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARClAgwBCyADIAEQ5RoLAkAgACgCGCICRQ0AIAIgARClAgsCQCAAKAIcIgJFDQAgAiABEKUCCyAAKAIMIQAMAgsgACgCBCABEKUCIAAoAgghAAwBCyAAKAIEIAEQpQIgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCmBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCJCwsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEKUCC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ0wEgACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ0wEPCyAAKAIoIQAMCQsgASAAKAIEENMBIAAoAgggARCnBCAAKAIUIgANCAwKCyABIAAoAhAQ0wEgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAENMBCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ0wEMCAsgAEEIaiABEIsHDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOcaDAILIAIgARDoGgwBCyACIAEQow4LIAEgACgCDBDTASAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOcaDAILIAIgARDoGgwBCyACIAEQow4LIAEgACgCDBDTASAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxDTAQwBCyADIAEQ5xoLAkAgACgCGCICRQ0AIAEgAhDTAQsCQCAAKAIcIgJFDQAgASACENMBCyAAKAIMIQAMAgsgASAAKAIEENMBIAAoAgghAAwBCyABIAAoAgQQ0wEgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCnBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCjDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEENMBC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ7RogACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ7RoPCyAAKAIoIQAMCQsgASAAKAIEEO0aIAAoAgggARCoBCAAKAIUIgANCAwKCyABIAAoAhAQ7RogACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEO0aCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ7RoMCAsgAEEIaiABEPoCDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQ8AoLIAEgACgCDBDtGiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQ8AoLIAEgACgCDBDtGiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxDtGgwBCyADIAEQ8BoLAkAgACgCGCICRQ0AIAEgAhDtGgsCQCAAKAIcIgJFDQAgASACEO0aCyAAKAIMIQAMAgsgASAAKAIEEO0aIAAoAgghAAwBCyABIAAoAgQQ7RogACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCoBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDwCgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEO0aC8AGAhN/AX4jAEHQAGsiAiQAIAAoAghBOGwhAyACQRhqQQRqIQQgASgCFCEFIAAoAgQhBkEAIQcDQAJAAkACQAJAIAMgB0YNAAJAAkACQAJAIAYgB2oiACgCAA4DAAECAAsgASAAQQhqEMMoIABBKGooAgAgARCHFgwCCyAAQTBqKAIAIghFDQEgCCABEPgDDAELIABBBGogARD+LwsgACgCAEEBRw0DIAIgAEEQaiIIEK8VAkAgBSACEKgIDQAgAiAIEJEMDQIgCCkDACEVIAhCATcDACACQRhqQRhqIgkgCEEYaikDADcDACACQRhqQRBqIgogCEEQaikDADcDACACQRhqQQhqIgsgCEEIaikDADcDACAAQRhqIgxCADcDACAAQR1qQgA3AAAgAEEoaiINQQA2AgAgAiAVNwMYIAJBOGogAkEYahCwGSACKQM4IRUgAigCRCEOIAIoAkAhDyAAQTBqIhAoAgAhESAQQQA2AgACQCARRQ0AIABBCGoiEigCACETIABBDGooAgAhFCAEQRBqIAJBEGopAwA3AgAgBEEIaiACQQhqKQMANwIAIAQgAikDADcCAEEIQSgQqywiEEUNBCAQQQA2AgAgECACKQIYNwIEIBBBADYCICAQQQxqIAspAgA3AgAgEEEUaiAKKQIANwIAIBBBHGogCSgCADYCAEEIQSgQqywiCUUNBCAJIBQ2AhAgCSATNgIMIAkgETYCCCAJIBA2AgQgCUEENgIAIAAQnh8gEkEANgIAIABBADYCACAIIBU3AgAgDSAJNgIAIABBHGogDjYCACAMIA82AgAMBQsgBCACKQMANwIAIARBEGogAkEQaikDADcCACAEQQhqIAJBCGopAwA3AgBBCEEoEKssIhBFDQMgEEEANgIAIBAgAikCGDcCBCAQQQA2AiAgEEEMaiALKQIANwIAIBBBFGogCikCADcCACAQQRxqIAkoAgA2AgAgABCeHyAAQQhqQQA2AgAgAEEANgIAIAggFTcCACANIBA2AgAgAEEcaiAONgIAIAwgDzYCAAwECyACKQMAEL4hDAMLIAJB0ABqJAAPCyACKQMAEL4hDAELAAsgB0E4aiEHDAALC+AGAgV/AX4jAEGQAWsiASQAAkACQAJAAkACQAJAIAAoAgAOCAUFBQUAAQIDBQsgACgCDCICKAIAIAJBDGooAgAQryNFDQQMAwsgACgCBCICKAIAIAJBDGooAgAQryNFDQMMAgsgACgCDA0BDAILIAAoAgxFDQELQRxBBBChJyECELIaIQMgAEEYaiIEKAIAIQUgBCADNgIAIAApAgAhBiAAQQA2AgAgAiAGNwIAIAJBCGogAEEIaikCADcCACACQRBqIABBEGopAgA3AgAgAkEYaiAFNgIAQQEhACABQQE2AhQgASACNgIQIAFBATYCDCABQdQAakEEaiECA0ACQAJAAkACQAJAAkAgAEUNACABIABBf2oiADYCFCABQThqQQhqIgMgASgCECAAQRxsaiIAQQxqKQIANwMAIAFBOGpBEGoiBCAAQRRqKQIANwMAIAEgACkCBDcDOCAAKAIAIgBBCEYNACACIAEpAzg3AgAgAkEIaiADKQMANwIAIAJBEGogBCkDADcCACABIAA2AlQgAA4IBQUFBQECAwQF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/wGDQgRRDQELIAAgCzcCAAwDCwJAIActABdFDQAgASABKAIsQX9qNgIsIAdBADoAFwsgByAJELIQIAhBf2ohCCAEQQRqIQRBASEJIAcoAgQhCgwACwsgB0EYaiABIAMgBUUgBhDUEwJAIActABhBBEYNACAHKQMYIgtC/wGDQgRRDQAgACALNwIADAELIABBBDoAAAsgB0EgaiQAC+4GAgh/AX4jAEHwAGsiAiQAIAEoAtgBIQMgARCgCyABQdgBaiEEAkACQAJAIAEtAOABIgVBHEcNACABEKALIAJBCGogARD7CSACKAIMIQUCQCACKAIIQQFxRQ0AIABBBTYCACAAIAU2AgQMAwsgAiAFNgIoIAJBkd6bATYCLAJAIAEtAOABQQNGDQAgASgC3AEhBCABKALYASEFIAJBNGogARDNJiACQQE2AlwgAkHIvpwBNgJYIAJCATcCZCACQbMHNgIgIAIgAkEcajYCYCACIAJBLGo2AhwgAkHAAGogAkHYAGoQjRAgAkHUAGogAkE8aigCADYCACACIAIpAjQ3AkwgBSAEIAJBwABqENcaIQQCQCABLQDgAUGiAUcNACABIAEQlywQnxcLIABBBTYCACAAIAQ2AgQgAkEoahC6AwwDCyABKALYASEGIAEoAtwBIQcgAkHYAGogARCsAiABIAc2AtQBIAEgBjYC0AEgBCACKQJYNwIAIARBCGogAkHYAGpBCGooAgA2AgBBAiEBIAMhBgwBCwJAAkACQCAFQQNGDQAgAkEQaiABEPsJQQEhBSACKAIUIQYgAigCEEEBcQ0CIAIgBjYCICACQQE2AhwgAS0A4AEhByACQZHemwE2AigCQCAHQQNHDQAMAgsgASgC3AEhBCABKALYASEFIAJBNGogARDNJiACQQE2AlwgAkHIvpwBNgJYIAJCATcCZCACQbMHNgIwIAIgAkEsajYCYCACIAJBKGo2AiwgAkHAAGogAkHYAGoQjRAgAkHUAGogAkE8aigCADYCACACIAIpAjQ3AkwgBSAEIAJBwABqENcaIQQCQCABLQDgAUGiAUcNACABIAEQlywQnxcLIABBBTYCACAAIAQ2AgQgAkEgahC6AwwEC0EAIQUgAkEANgIcIAIgBCgCACIGNgIkIAIgBjYCICACQZHemwE2AiggBiEHCyABKALYASEIIAEoAtwBIQkgAkHYAGogARCsAiABIAk2AtQBIAEgCDYC0AEgBCACKQJYNwIAIARBCGogAkHYAGpBCGooAgA2AgAgCa1CIIYgA62EIQpBASEBDAELIABBBTYCACAAIAY2AgQMAQsgACAKNwMQIAAgBzYCDCAAIAY2AgggACAFNgIEIAAgATYCAAsgAkHwAGokAAuABwIHfwF+IwBBwABrIgIkACAAKAIAIQNBASEAIAEoAgBBx5CcAUEBIAEoAgQoAgwRCwAhBCACQQE6ABMgAkEAOwARIAIgBDoAECACIAE2AgwCQAJAAkACQCADKAIMIgVFDQAgAkETaiEGIAMoAgAiAEEIaiEBIAApAwBCf4VCgIGChIiQoMCAf4MhCUEAIQMDQCADIQcCQCAJQgBSDQADQCAAQaB/aiEAIAEpAwAhCSABQQhqIgMhASAJQoCBgoSIkKDAgH+DIglCgIGChIiQoMCAf1ENAAsgCUKAgYKEiJCgwIB/hSEJIAMhAQsgAiAAQQAgCXqnQQN2a0EMbGoiA0F0ajYCFCACIANBfGo2AhhBASEDIARBAXEhCEEBIQQCQCAIDQACQAJAAkACQAJAAkAgAi0AEg0AAkAgAigCDCIILQAKQYABcQ0AIAdBAXENAgwDCwJAIAdBAXENAEEBIQQgCCgCAEHMopwBQQEgCCgCBCgCDBELAA0HCyACQQE6ABMgAiAGNgIkIAJB8JiBATYCLCACIAgpAgA3AhwgAiAIKQIINwIwIAIgAkEcajYCKCACQRRqIAJBKGoQsSYNBCACQRxqQZDJmAFBAhC+BQ0EDAMLIAJBADYCOCACQQE2AiwgAkHYmYEBNgIoIAJCBDcCMCACQShqQYCagQEQ4iMAC0EBIQQgCCgCAEGanpoBQQIgCCgCBCgCDBELAA0EC0EBIQQgAkEUaiAIELEmDQNBASEEIAgoAgBBkMmYAUECIAgoAgQoAgwRCwANAwsgAkEAOgAQIAJBAToAEgJAIAIoAgwiCC0ACkGAAXENAEEBIQQgAkEYaiAIEOwhDQMMAgsgAiAGNgIkIAJB8JiBATYCLCACIAgpAgA3AhwgAiAIKQIINwIwIAIgAkEcajYCKCACQRhqIAJBKGoQ7CENACACKAIoQYuZgQFBAiACKAIsKAIMEQsARQ0BC0EBIQQMAQtBACEEIAJBADoAEgsgCUJ/fCAJgyEJIAJBAToAESACIAQ6ABAgBUF/aiIFDQALQQEhACAEDQIgAigCDCEBDAELIAQNAQsgAi0AEg0BIAEoAgBByJCcAUEBIAEoAgQoAgwRCwAhAAsgAkHAAGokACAADwsgAkEANgI4IAJBATYCLCACQcCagQE2AiggAkIENwIwIAJBKGpByJqBARDiIwALnAYCBH8BfiMAQSBrIgckACAHQRhqIAEgAiAFIAYgBRDGHgJAAkAgBy0AGEEFRg0AIAAgBykDGDcCAAwBC0EFIAcoAhwQtigCQAJAAkACQAJAIAVFDQAgB0EBOgAWAkACQCAGQQNxDQAgBkGAAXFFDQEgAS0ATQ0BIAdBGGogARCMESAHLQAYQQRGDQEgBykDGCILQv8Bg0IEUQ0BIAAgCzcCAAwHCwJAIAEtAE0NACAHQRhqIAEQhRYgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFINAwsgB0EAOgAWCyAGQcAAcUUNAyABLQBNQQFHDQIMAwsCQCAGQQFxRQ0AIAEtAE0NBCAHQRhqIAEQhRYgBy0AGEEERg0EIAcpAxgiC0L/AYNCBFENBCAAIAs3AgAMBQsgBkGAAXFFDQMgAS0ATQ0DIAdBGGogARCMESAHLQAYQQRGDQMgBykDGCILQv8Bg0IEUQ0DIAAgCzcCAAwECyAAIAs3AgAMAwsgASABKAIsQQFqNgIsCyAHQQA6ABcgBSEIQQAhCUEAIQoDQAJAAkACQAJAIAhFDQAgB0EYaiABIAMgBiAJIAogB0EXaiAHQRZqEK0FAkAgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFINAwsgB0EYaiAEIAEQSQJAIActABhBBEYNACAHKQMYIgtC/wGDQgRSDQMLIActABYNASAHQQE6ABYMAwsgB0EYaiABIAIgAyAGIAkgChCOAiAHLQAYQQRGDQQgBykDGCILQv8Bg0IEUg0BDAQLIAEoAkRFDQEgB0EIaiAEEMwFIAdBGGogASAHKAIMQQAQ8QMgBy0AGEEERg0BIAcpAxgiC0L/AYNCBFENAQsgACALNwIADAMLAkAgBy0AF0UNACABIAEoAixBf2o2AiwgB0EAOgAXCyAIQX9qIQggByAEEMwFIARBMGohBEEBIQkgBygCBCEKDAALCyAHQRhqIAEgAyAFRSAGENQTAkAgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFENACAAIAs3AgAMAQsgAEEEOgAACyAHQSBqJAALkgcBBX8jAEGAAWsiBCQAQQAhBUEAIQYCQCABEIQnDQAgASgCiAEhBwJAIAEQ1AkiCA0AQQAhBUEAIQYMAQtBACEFQQAhBiAILQAAIggQoBVFDQBBACEFQQAhBgJAAkACQAJAAkACQAJAAkACQAJAIAhBtH9qDkkHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCAoKCgoKCgoKCgoKCgoKBgkJCQkJCQkJCQkJCgkJCQABCQkJCQkJCQkJCQIDBAUJCQkICQtBACEFQQAhBiAHQQhxRQ0IDAkLQQAhBUEAIQYgB0EIcUUNBwwIC0EAIQVBACEGIAdBCHFFDQYMBwtBACEFQQAhBiAHQQhxRQ0FDAYLQQAhBUEAIQYgB0EIcUUNBAwFC0EAIQVBACEGIAdBCHFFDQMMBAtBACEFQQAhBiAHQYACcQ0DDAELQQAhBUEAIQYgB0GABXENAgtBACEFQQAhBiAHQQhxDQELIAEQoAsgBEEANgIMIARCgICAgIABNwIEIARByABqQQhqIQggBEEQakEIaiEHAkACQAJAA0AgAS0A4AFBBkYNASAEQRBqIAFBAEEAEOkEIAQoAhQhBSAEKAIQIgZBB0YNAwJAQTBFDQAgCCAHQTD8CgAACyAEIAU2AkwgBCAGNgJIIARBBGogBEHIAGpB7K6cARDvHiABLQDgAUEHRw0CIAEQoAsMAAsLIAEoAtQBIQUgASgC0AEhBiAEQfaAgIB4NgIQIAEgBiAFIARBEGoQ1yMLAkAgAS0AkQFBAnENACABKALUASEFIARBhICAgHg2AhAgASACIAUgBEEQahDXIwsCQCABLQCLAUEQcQ0AIAEoAtQBIQUgBEGCgICAeDYCECABIAIgBSAEQRBqENcjCyAEKAIMQThsIQYgBCgCCCEFA0ACQAJAAkAgBkUNACAFKAIADQEMAgsgARDAEiIFDQMgASgC1AEhAUEYQQQQxioiBSADOgAUIAUgATYCECAFIAI2AgwgBUEIaiAEQQRqQQhqKAIANgIAIAUgBCkCBDcCAEEAIQYMBAsgASgC1AEhCCAEQYWAgIB4NgIQIAEgAiAIIARBEGoQ1yMLAkAgBSgCMA0AIAEoAtQBIQggBEGGgICAeDYCECABIAIgCCAEQRBqENcjCyAFQThqIQUgBkFIaiEGDAALCyAEQQRqEMsoQQEhBgsgACAFNgIEIAAgBjYCACAEQYABaiQAC+cGAgZ/BX4jAEGgAWsiAyQAIAG9IQkCQAJAIAGZRAAAAAAAAPB/Yg0AQQMhBAwBCwJAIAlCgICAgICAgPj/AIMiCkKAgICAgICA+P8AUg0AQQIhBAwBCyAJQv////////8HgyILQoCAgICAgIAIhCAJQgGGQv7///////8PgyAJQjSIp0H/D3EiBRsiDEIBgyENAkAgCkIAUg0AAkAgC1BFDQBBBCEEDAILIAVBzXdqIQUgDadBAXMhBEIBIQoMAQtCgICAgICAgCAgDEIBhiAMQoCAgICAgIAIUSIGGyEMQgJCASAGGyEKIA2nQQFzIQRBy3dBzHcgBhsgBWohBQsgAyAFOwGIASADIAo3A4ABIANCATcDeCADIAw3A3AgAyAEOgCKAQJAAkACQAJAAkACQAJAIARBfmoiBEUNAEEBIQVB6vKbAUHp8psBIAlCAFMiBhtB6vKbAUEBIAYbIAIbIQZBASAJQj+IpyACGyECIARBAyAEQQNJG0F/ag4DAQIDAQsgA0EDNgIgIANByKmbATYCHCADQQI7ARhBASEGQQAhAkEBIQUMAwsgA0EDNgIgIANBvuaXATYCHCADQQI7ARgMAgsgA0EDNgIgIANBsZWBATYCHCADQQI7ARgMAQsgA0HgAGogA0HwAGogA0EHahCAAgJAAkAgAygCYEUNACADQZABakEIaiADQeAAakEIaigCADYCACADIAMpAmA3A5ABDAELIANBkAFqIANB8ABqIANBB2oQeAsgAygClAEiBUUNASADKAKQASIHLQAAQTBNDQIgAy4BmAEhCCADIAc2AhwgA0ECOwEYIANBATYCIAJAAkAgBUEBRw0AIANBJGohBEEDIQUMAQsgA0E8aiEEIANBAjsBMCADQcD8mwE2AiggA0ECOwEkIAMgBUF/ajYCOCADQQE2AiwgAyAHQQFqNgI0QQUhBQsgBEEBOwEMIARBAjsBACAEQQEgCGsgCEF/aiAIQQFIIggbOwEOIARBAkEBIAgbNgIIIARB/IeZAUGwlYEBIAgbNgIECyADIAU2AmwgAyACNgJkIAMgBjYCYCADIANBGGo2AmggACADQeAAahDIBSEEIANBoAFqJAAgBA8LQaiTgQFBIUGQlYEBEMweAAtB4JSBAUEfQaCVgQEQzB4AC7EGAgl/AX4jAEHwAGsiAiQAIAJBADYCGCACQoCAgIAQNwIQIAEoAhghAyABKAIcIQQgAkEANgJEIAJBADsBQCACIAQ2AjwgAkEANgI4IAJBAToANCACQQo2AjAgAiAENgIsIAJBADYCKCACIAQ2AiQgAiADNgIgIAJBCjYCHCABKAIgIgVBAmpBBCAFGyEGIAEoAgQhByABKAIIIQgCQAJAA0AgAkEIaiACQRxqEJAHIAIoAggiBEUNAiACKAIMIQMgAiACKAJEIgFBAWoiCTYCRAJAAkAgBQ0AIAJBEGpB0JWcAUHUlZwBELwgDAELIAIgCTYCVCACQdgAaiACQdQAahDeEyAFIAIoAmAiCUkNAiACQeQAakEgIAUgCWsQmxUgAkHkAGogAigCXCAJEPQrIAJByABqQQhqIgkgAkHkAGpBCGooAgA2AgAgAiACKQJkNwNIIAJB2ABqEPQsIAJBEGogAigCTCAJKAIAEPQrIAJByABqEPQsIAJBEGpBkMmYAUGSyZgBELwgCyACQRBqIAQgAxD0KyACQRBqQQoQjAoCQCABIAhPDQAgByABQQxsaiIEQQhqIgMoAgBFDQEgAkEANgJsIAJCgICAgBA3AmQgBiEBAkADQCABRQ0BIAJB5ABqQSAQjAogAUF/aiEBDAALCyAEQQRqKAIAIgQgAygCAEEYbGohCkEAIQEDQAJAAkAgBCAKRg0AIAEgBCgCCEF/aiIDIAEgA0sbIgMgAWshAQJAA0AgAUUNASACQeQAakEgEIwKIAFBf2ohAQwACwtBACAEKAIUIgEgBCgCCGsiCSAJIAFLGyIBQQEgAUEBSxsiCSEBA0AgAUUNAiACQeQAakHeABCMCiABQX9qIQEMAAsLIAIpAmghCyACKAJkIgFBgICAgHhGDQMgAiABNgJkIAIgCzcCaCACQRBqIAunIAtCIIinEPQrIAJBEGpBChCMCiACQeQAahD0LAwDCyAJIANqIQEgBEEYaiEEDAALCwsgASAIQcj+hwEQjBUAC0HY/ocBEM4sAAsgACACKQIQNwIAIABBCGogAkEQakEIaigCADYCACACQfAAaiQAC5kGAgd/AX4jAEEwayICJAAgACkCaCEJIABCgICAgIABNwNoQQghAyACQQhqQQhqIgQgAEHwAGoiBSgCADYCAEEAIQYgBUEANgIAIAIgCTcDCCAAQegAaiEHAkACQAJAIAEoAggiBQ0AIAcgAikDCDcCACAHQQhqIAQoAgA2AgBBACEGDAELIAEoAgQhAwJAAkADQAJAAkACQCADKAIAQQlHDQAgA0EIaigCACEEIAAgAxCSAyAEQQFHDQEMAgsgACADEJIDCyADKAIAQQlHDQAgA0EIaigCAEEBRg0CCyADQThqIQMgBSAGQQFqIgZHDQALQQAhCAwBCyADEPEFQQEhCCAGQQFqIAVGDQAgA0E4aiEDIAZBf3MgBWohBEEBIQgDQAJAAkACQAJAIAMoAgBBCUcNACADQQhqKAIAIQYgACADEJIDIAZBAUcNAQwCCyAAIAMQkgMLIAMoAgBBCUcNACADQQhqKAIAQQFHDQAgAxDxBSAIQQFqIQgMAQsgAyAIQUhsaiIGIAMpAwA3AwAgBkEwaiADQTBqKQMANwMAIAZBKGogA0EoaikDADcDACAGQSBqIANBIGopAwA3AwAgBkEYaiADQRhqKQMANwMAIAZBEGogA0EQaikDADcDACAGQQhqIANBCGopAwA3AwALIANBOGohAyAEQX9qIgQNAAsLIAEgBSAIayIFNgIIIAAoAmwhAyAAKAJoIQYgByACKQMINwIAIAAoAnAhACAHQQhqIAJBCGpBCGooAgA2AgAgAEUNACACIAY2AhwgAiADNgIYIAIgAzYCFCACIAMgAEEEdGo2AiAgAkEkaiACQRRqEMgIQQAtAKDwngEaAkBBHBB9IgNFDQAgAyACKQIkNwIAIANCADcCDCADQRJqQgA3AQAgA0EIaiACQSRqQQhqKAIANgIAAkAgBSABKAIARw0AIAFBsJ6bARDhHQsgASAFQQFqNgIIIAEoAgQgBUE4bGoiBiADNgIUIAZBAjYCECAGQRE2AgggBkEJNgIAQQBBCBCfLQwCCwALIAYgAxCxLQsgAkEwaiQAC8QGAQ9/IwBBIGsiAiQAAkAgACgCCCIDRQ0AIAEoAggiBEUNACABKAIEIQVBACEGQQAhBwNAAkACQCAHIANPDQAgBiAESQ0BCyADIAcgAyAHSxshBANAAkAgBCAHRw0AIAJBDGogACADEKgcIAJBDGoQmBYgACAALQAMIAEtAAxxOgAMDAQLIAAgACgCBCAAKAIIIAdBiOaHARDLJSIGLQAAIAYtAAFBmOaHARCFHyAHQQFqIQcMAAsLAkACQAJAIAUgBCAGQajmhwEQyyUtAAEgACgCBCIIIAAoAggiCSAHQbjmhwEQyyUtAABJDQACQCAIIAkgB0HI5ocBEMslLQABIAUgBCAGQdjmhwEQyyUtAABJDQAgCCAJIAdB6OaHARDLJSEKAkAgBSAEIAZB+OaHARDLJSILLQAAIgwgCi0AACINIAwgDUsbIAstAAEiCyAKLQABIgogCyAKSRtLDQAgCCAJIAdBiOeHARDLJSIILQABIQwgCC0AACENA0ACQCAEIAZHDQAgBCEGDAULIAUgBCAGQZjnhwEQyyUiCC0AACIKIA1B/wFxIgkgCiAJSxsgCC0AASIKIAxB/wFxIgggCiAISRtLDQQgBSAEIAZBqOeHARDLJSIKLQABIQsCQCAKLQAAIg4gCUsiCg0AIAkgC0H/AXEiD0sNACAIIA9NDQYLAkAgDiAJIAobIAtB/wFxIg8gCCAPIAhJIhAbSw0AAkACQAJAAkAgCg0AIA8gCE8NAQtBACEMIAoNAQwCC0Goy4QBQShB0MuEARDMHgALIAkgDhCiJ0H/AXEiDSAJIA1LGyEMIAkgDSAJIA1JGyENCwJAIBBFDQAgCxC1JkH/AXEiCSAIIAkgCEsbIQsgCSAIIAkgCEkbIQkCQCAKRQ0AIAAgDSAMQbjnhwEQhR8LIAshDCAJIQ0MAQsgCkUNBgsgBSAEIAZByOeHARDLJS0AASAISw0EIAZBAWohBgwACwtB6OeHAUHJAEG06IcBEMweAAsgACAIIAkgB0HE6IcBEMslIggtAAAgCC0AAUHU6IcBEIUfDAILIAZBAWohBgwCCyAAIA0gDEHY54cBEIUfCyAHQQFqIQcMAAsLIAJBIGokAAuzBgIHfwF+IwBBsAFrIgQkAAJAIAEQ9g9BP0YNACABEPYPQSpGDQAgARD2D0ErRg0AQfTAhAFB0ABBxMGEARDMHgALIARBEGpBCGogASgCACIFQdgAaigCADYCACAEIAUpAlA3AxAgBEEIaiACEOAbIAVB0ABqIQUCQAJAAkACQAJAAkAgBCgCCCIGQQxGDQAgBCAEKAIMIgc2AiQgBCAGNgIgIAZBAkkNAkEBIQggARCMCw0BDAQLIARBPGogBUEIaigCACIGNgIAIARBKGpBCGoiAyAGNgIAIAQgBSkCACILNwI0IAQgCzcDKCAAQRxqIAEoAgQgASgCCBCEFCAAQRs2AgAgACAEKQMoNwIoIABBMGogAykDADcCACAAQThqIARBOGopAwA3AgAMAgsgARD2D0E/Rw0CIAEQjAsaQQAhCAwCCyAEQTxqIAVBCGooAgAiBjYCACAEQShqQQhqIgMgBjYCACAEIAUpAgAiCzcCNCAEIAs3AyggAEEcaiABKAIEIAEoAggQhBQgAEEbNgIAIAAgBCkDKDcCKCAAQTBqIAMpAwA3AgAgAEE4aiAEQThqKQMANwIAIARBIGoQ5AsLIAIQ4ioMAQsgBEHwAGpBFGogBUEIaiIBKAIANgIAIARB8ABqQQhqIgkgBiAHELcWIgpBCGooAgA2AgAgBCAFKQIANwJ8IAQgCikCADcDcCAEQShqQQhqIgogBEEQakEIaigCADYCACAEQShqQRRqIAEoAgA2AgAgBEGIAWpBCGogA0EIaigCADYCACAEIAUpAgA3AjQgBEGIAWpBFGogCikDADcCACAEQaQBaiAEQShqQRBqKQMANwIAIAQgBCkDEDcClAEgBCADKQIANwOIAUEIEOsnIgEgBzYCBCABIAY2AgAgBEHYAGogCSkDADcCACAEQeAAaiAEQfAAakEQaikDADcCACAEIAQpA3A3AlACQEEkRSIFDQAgBEEoaiAEQYgBakEk/AoAAAsgBCABNgJMIAQgCDoAaCACQQggBEEoahDtJkHkwIQBEIAfAkAgBQ0AIABBBGogAkEk/AoAAAsgAEEiNgIACyAEQbABaiQAC6sHAgF/AXwjAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQAADhIAAQIDBAUGBwgJCgsMDQ4PEBEACyACIAAtAAE6AAggAkECNgIUIAJB3LqYATYCECACQgE3AhwgAkHVADYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqEIwpIQEMEQsgAiAAKQMINwMIIAJBAjYCFCACQfi6mAE2AhAgAkIBNwIcIAJB1gA2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDBALIAIgACkDCDcDCCACQQI2AhQgAkH4upgBNgIQIAJCATcCHCACQdcANgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQjCkhAQwPCyAAKwMIIQMgAkECNgIUIAJBmLuYATYCECACQgE3AhwgAkHYADYCDCACIAM5AyggAiACQQhqNgIYIAIgAkEoajYCCCABKAIAIAEoAgQgAkEQahCMKSEBDA4LIAIgACgCBDYCCCACQQI2AhQgAkG0u5gBNgIQIAJCATcCHCACQQU2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCMKSEBDA0LIAIgACkCBDcCCCACQQE2AhQgAkHMu5gBNgIQIAJCATcCHCACQcoANgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQjCkhAQwMCyABKAIAQcm6mAFBCiABKAIEKAIMEQsAIQEMCwsgASgCAEHUu5gBQQogASgCBCgCDBELACEBDAoLIAEoAgBB3ruYAUEMIAEoAgQoAgwRCwAhAQwJCyABKAIAQeq7mAFBDiABKAIEKAIMEQsAIQEMCAsgASgCAEH4u5gBQQggASgCBCgCDBELACEBDAcLIAEoAgBB2bSbAUEDIAEoAgQoAgwRCwAhAQwGCyABKAIAQcDymwFBBCABKAIEKAIMEQsAIQEMBQsgASgCAEGAvJgBQQwgASgCBCgCDBELACEBDAQLIAEoAgBBjLyYAUEPIAEoAgQoAgwRCwAhAQwDCyABKAIAQZu8mAFBDSABKAIEKAIMEQsAIQEMAgsgASgCAEGovJgBQQ4gASgCBCgCDBELACEBDAELIAEoAgAgACgCBCAAKAIIIAEoAgQoAgwRCwAhAQsgAkEwaiQAIAELxAYBDn8jAEEgayIBJAAgAC0AACECIAFBGGohA0EAIQQDQCAEQQlLIQUCQANAAkAgAkEBcQ0AIAJB/wFxIQYgACACQQFyIAAtAAAiAiACIAZGIgYbOgAAIAZFDQEgAUEgaiQADwsCQCACQQJxDQACQCAFDQAgBEEBaiEEDAMLIAJB/wFxIQYgACACQQJyIAAtAAAiAiACIAZGGzoAACACIAZHDQELCwJAAkACQEEAKAKA654BDQBBAEEAKAL46p4BQQFqIgc2AvjqngEgB0EDbCEEAkADQAJAQQAoAvzqngEiCA0AEIQbIQgLIAgoAgQiAiAETw0BIAJBBnQhBiAIKAIAIQICQANAIAZFDQEgAiACKAIAIgVBASAFGzYCAAJAIAVFDQAgAhCoFQsgAkHAAGohAiAGQUBqIQYMAAsLAkBBACgC/OqeASAIRg0AIAgoAgRBBnQhAiAIKAIAIQYDQCACRQ0CIAJBQGohAiAGEJokIAZBwABqIQYMAAsLCyAHIAgQvQchCSAIKAIAIgIgCCgCBEEGdGohCgJAA0AgAiAKRg0BIAJBwABqIQtBACAJKAIIa0EfcSEMIAkoAgAhDSAJKAIEIQ4gAigCBCECA0ACQCACDQAgCyECDAILIAIoAgBBufPd8XlsIAx2IgYgDk8NBSACKAIEIQUgDSAGQQZ0aiIGQQhqIQQCQAJAIAYoAggiB0UNACAHIAI2AgQMAQsgBiACNgIECyAEIAI2AgAgAkEANgIEIAUhAgwACwsLQQAgCTYC/OqeASAIKAIEQQZ0IQIgCCgCACEGA0AgAkUNASACQUBqIQIgBhCaJCAGQcAAaiEGDAALCyADQQA6AABBAEIANwKE654BQQBCADcCjOueASABQQhqQQhqQgA3AwBBACgCgOueASECQQBBATYCgOueAUEAIAMoAgA2ApTrngEgAUIANwMIIAJFDQBBAEEAKAL46p4BQX9qNgL46p4BCyAAEKcSIQIgAC0AAEEDRg0BIAIQmiRBACEEDAILIAYgDkHgkYMBEIwVAAtBACAANgKE654BQQBBADYCiOueAUEAQQA6AJTrngFBAEEANgKQ654BEOMhAAsgAC0AACECDAALC/0GAgd/An4jAEHQAGsiAyQAIANBOGogARDYDiADKAJAIQQCQAJAIAMpAzgiCkIAUg0AQQEhBQwBCyADIAMoAkQ2AiQgAyAENgIgIAMgCjcDGCADQRBqIANBGGoQ6hUCQAJAIAMoAhAiBCADKAIUIgVBy/ObAUEGENwlDQAgBCAFQbGHnAFBBBDcJQ0AIAQgBUGy85sBQQYQ3CUNACAEIAVBuPObAUEGENwlDQAgBCAFQajzmwFBAxDcJQ0AIAQgBUGr85sBQQcQ3CUNACAEIAVBvvObAUEHENwlDQAgBCAFQcXzmwFBBhDcJQ0AIAQgBUHR85sBQQYQ3CUNACAEIAVB1/ObAUEEENwlDQAgBCAFQeTzmwFBBRDcJQ0AIAQgBUHp85sBQQkQ3CVFDQELIAMoAiQhBCADKAIgIQUgA0GtgYCAeDYCOCABIAUgBCADQThqENcjC0EBIQUgA0EIaiABQQFBABChGiADKAIMIQYCQAJAAkAgAygCCEEBcUUNACAGIQQMAQsCQAJAAkAgAS0A4AFB2QBGDQAgA0EANgI0IANCgICAgMAANwIsDAELIAEQoAsgA0E4aiABEMQEIAMoAjwhBCADKAI4IgdBgICAgHhGDQEgAyADKAJANgI0IAMgBDYCMCADIAc2AiwgAS0A4AFB2QBHDQAgASgC3AEhBCABKALYASEHIANBlYGAgHg2AjggASAHIAQgA0E4ahDXIwNAIAEtAOABIgRBAkYNASAEQaMBRg0BIAEQoAsMAAsLIAEoAtgBIQcCQAJAIAEoAogBIgRBgCBxDQAgASAEQYAgcjYCiAEgA0E4aiABEIIBIAEgASgCiAFB/19xNgKIAQwBCyADQThqIAEQggELIAMoAjwhBCADKAI4IghBgICAgHhHDQIgA0EsahCvKAsgBhCVLAsgAykDGBC+IQwBCyADKAJAIQUgASgC1AEhCSADKQMYIQogAykDICELQcgAQQgQlioiASAJNgI0IAEgBzYCMCABIAU2AiwgASAENgIoIAEgCDYCJCABIAY2AiBBACEFIAFBADoAHCABQQA2AhggASALNwMQIAEgCjcDCCABIAk2AgQgASACNgIAIAFBADoARCABIAMpAiw3AjggAUHAAGogA0EsakEIaigCADYCACABIQQLIAAgBDYCBCAAIAU2AgAgA0HQAGokAAuLBgIDfwF+IwBBIGsiBCQAIARBEGogASACKAIYIgUoAiRBABCMAgJAAkAgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFENACAAIAc3AgAMAQsCQAJAAkACQCAFKAIkIgZFDQAgBEEQaiABIAYQhyMgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFINAQsgAi0AHA0BDAILIAAgBzcCAAwCCyAEQQA2AhAgBEEIaiABIARBEGpByZCcAUEHELENAkAgBC0ACEEERg0AIAQpAwgiB0L/AYNCBFENACAAIAc3AgAMAgsgBEEQaiABEIwRIAQtABBBBEYNACAEKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkAgAw0AIAVBCGooAgBBDGwhAyAFQQRqKAIAIQYDQCADRQ0BIARBEGogBiABELMHAkACQCAELQAQQQRGDQAg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QUhqIQIgAEE4aiEADAALCyAAQQhqIAEQgyEPCyAAQQRqIAEQvgQgAEEIaiABEL4EIABBDGogARC+BCAAQRBqIQAMAwsgAEEQaiABEO8kDwsgAEEEaiEADAELIABBBGogARC+BCAAQQhqIQAMAAsLIABBEGogARDvJCABIABBwABqEKsqIAEgAEHEAGoQqyoPCyAAKAIIQYSAgIB4SA0CIABBCGogARCDIQ8LIABBKGohAgJAIAAtABxBAkYNACABKAIUIABBCGoQqAgaCyABIAIQqSoPCyAAQQhqIAEQxAoLC+AGAgd/AX4jAEHwAGsiAyQAIAEoAtgBIQRBACEFAkACQAJAIAINACABLQDgASIGIQUCQCAGQfMARw0AIAEQoAsgAS0A4AEhBQsCQCAFQf8BcUHjAEYNACABKALcASECIAEoAtgBIQYgA0EYaiABEM0mIANBATYCTCADQci+nAE2AkggA0IBNwJUIANBswc2AmQgA0HjADoAbyADIANB4ABqNgJQIAMgA0HoAGo2AmAgAyADQe8AajYCaCADQTBqIANByABqEPQaIANBxABqIANBIGooAgA2AgAgAyADKQIYNwI8IAYgAiADQTBqENcaIQIgAS0A4AFBogFHDQIgASABEJcsEJ8XDAILIAEQoAsgBkHzAEYhBQsgA0EQaiABQQBBARChGiADKAIUIQYCQCADKAIQQQFxRQ0AIABBgYCAgHg2AgAgACAGNgIEDAILAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQUgA0EkaiABEM0mIANBATYCTCADQci+nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ9BogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBSACIANBMGoQ1xohAiABLQDgAUGiAUYNAQwDCyABEKALIANByABqIAEQsgMgAygCTCEHIAMoAkgiCEGAgICAeEYNASADIAMoAlAiCTYCOCADIAc2AjQgAyAINgIwIANBGzoASCADQQhqIAEgA0HIAGoQ0hEgAygCDCEHAkAgAygCCEEBcUUNACAAQYGAgIB4NgIAIAAgBzYCBCADQTBqEPgqDAQLIAEoAtQBIQECQAJAIAIN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CyAAIAMQvgogACAEOgA9CyACQcAAaiQAC6wGAQV/IwBB8ABrIgMkACABKALYASEEAkACQAJAAkACQCACRQ0AAkAgAS0A4AFB4wBGDQAgASgC3AEhAiADQRhqIAEQzSYgA0EBNgJMIANByL6cATYCSCADQgE3AlQgA0GzBzYCZCADQeMAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ9BogA0HEAGogA0EgaigCADYCACADIAMpAhg3AjwgBCACIANBMGoQ1xohAiABLQDgAUGiAUYNAgwECyABEKALCyADQRBqIAFBAEEBEKEaIAMoAhQhBSADKAIQQQFxRQ0BIABBAjYCACAAIAU2AgQMAwsgASABEJcsEJ8XDAELAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQQgA0EkaiABEM0mIANBATYCTCADQci+nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ9BogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBCACIANBMGoQ1xohAiABLQDgAUGiAUYNAQwDCyABEKALIANByABqIAEQsgMgAygCTCEGIAMoAkgiB0GAgICAeEYNASADIAMoAlA2AjggAyAGNgI0IAMgBzYCMAJAAkACQAJAIAEtAOABQQlGDQBBACEGDAELIANBCToAYCADQQhqIAEgA0HgAGoQ0hEgAygCDCEGIAMoAghBAXENAQsgAyAGNgJIAkAgARCFJyIHRQ0AIABBAjYCACAAIAc2AgQgA0HIAGoQnysMAgsgACADKQIwNwIEIAAgBTYCHCAAIAY2AhggACAENgIQIAAgAjYCACAAIAEoAtQBNgIUIABBDGogA0E4aigCADYCAAwHCyAAQQI2AgAgACAGNgIECyADQTBqEPgqDAMLIAEgARCXLBCfFwwBCyAAQQI2AgAgACAGNgIEDAELIABBAjYCACAAIAI2AgQLIAUQlSwMAQsgAEECNgIAIAAgAjYCBAsgA0HwAGokAAuSBgELfyMAQYABayIDJAACQEEAKAKA4p4BQQJGDQAgA0G44Z4BNgIcIANBuOGeATYCbCADIANB+ABqNgIw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iYUhByAIIAlCEImFIghCFYkgCCAKQiCJfCIKhSEJIAxCIIkhCCAKIAuFIQogBEEIaiIEIAJJDQALIAAgBzcDECAAIAk3AxggACAINwMIIAAgCjcDAAtBBCECAkACQCAFQQRPDQBBACECQgAhBwwBCyABIARqNQAAIQcLAkAgAkEBciAFTw0AIAEgBGogAmozAAAgAkEDdK2GIAeEIQcgAkECciECCwJAIAIgBU8NACABIAIgBGpqMQAAIAJBA3SthiAHhCEHCyAAIAc3AzALIAAgBTYCPAu4BQIHfwF+IwBBMGsiAiQAIAApAmghCSAAQoCAgICAATcDaEEIIQMgAkEIakEIaiIEIABB8ABqIgUoAgA2AgBBACEGIAVBADYCACACIAk3AwggAEHoAGohBwJAAkACQCABKAIIIggNACAHIAIpAwg3AgAgB0EIaiAEKAIANgIAQQAhBQwBCyABKAIEIQMCQAJAA0AgAygCACEEIAAgAxD9AiAGQQFqIQUCQCAEQQFGDQAgAygCAEEBRg0CCyADQTBqIQMgBSEGIAggBUcNAAtBACEEDAELIAMQlwQCQCAFIAhHDQBBASEEDAELIANBMGohAyAGQX9zIAhqIQZBASEEA0AgAygCACEFIAAgAxD9AgJAAkAgBUEBRg0AIAMoAgBBAUcNACADEJcEIARBAWohBAwBCyADIARBUGxqIgUgAykDADcDACAFQShqIANBKGopAwA3AwAgBUEgaiADQSBqKQMANwMAIAVBGGogA0EYaikDADcDACAFQRBqIANBEGopAwA3AwAgBUEIaiADQQhqKQMANwMACyADQTBqIQMgBkF/aiIGDQALCyABIAggBGsiBjYCCCAAKAJsIQMgACgCaCEFIAcgAikDCDcCACAAKAJwIQAgB0EIaiACQQhqQQhqKAIANgIAIABFDQAgAiAFNgIcIAIgAzYCGCACIAM2AhQgAiADIABBBHRqNgIgIAJBJGogAkEUahDICEEALQCg8J4BGgJAQRwQfSIDRQ0AIAMgAikCJDcCACADQgA3AgwgA0ESakIANwEAIANBCGogAkEkakEIaigCADYCAAJAIAYgASgCAEcNACABQdSfmwEQ7B0LIAEgBkEBajYCCCABKAIEIAZBMGxqIgUgAzYCDCAFQQI2AgggBUERNgIAQQBBCBCfLQwCCwALIAUgAxCxLQsgAkEwaiQAC+oFAQt/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIUIQIgA0EANgIUAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgQoAgAiBSgCACIDRQ0AIAMgAygCACIAQX9qNgIAAkAgAEEBRw0AIAUoAgAQhBMLIAUoAgQiBigC8AUhAAJAIAYoAvQFIgMoAgAiAkUNACAAIAIRAwALAkAgAygCBCICRQ0AIAAgAiADKAIIEKwWCyAGQYQGaigCACEHIAZBgAZqKAIAIQhBACEJAkADQCAJIAdGDQEgCCAJQQZ0aiIDQQRqIQogA0EMaigCACEAIANBCGooAgAhAgJAA0AgAEUNASACKAIAIgMoAhQiCyALKAIAIgtBf2o2AgACQCALQQFHDQAgAygCFBCoEgsgAygCCCADQQxqKAIAEPcsAkAgAygC6AQiC0GAgICAeEYNACALIANB7ARqKAIAEJUtIANB9ARqEKsrIANBpAVqEKsrCwJAIAMoAtQFIgtBgICAgHhGDQAgCyADQdgFaigCABCVLSADKALgBSADQeQFaigCABCHLQsCQCADKALYBCILQYCAgIB4Rg0AIAsgA0HcBGooAgAQ9ywLAkAgAygCyARBAkYNACADQdgBahDvESADQZgDahDvEQsCQCADKALIAUECRg0AIANBGGoQ7xELIANB8AVBCBCsFiAAQX9qIQAgAkEEaiECDAALCyAKKAIAIApBBGooAgBBBEEEEJEWIAlBAWohCQwACwsgBigC/AUgBkGABmooAgBBwABBwAAQkRYgBhDzDCAGQYgGQQgQrBYgBSgCCCIDIAMoAgAiA0F/ajYCACADQQFHDQAgBSgCCCAFQQxqKAIAEPseCyAEKAIAIgMgASkCCDcCACADQQhqIAFBCGpBCGopAgA3AgAgAUEgaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsIueATYCCCABQgQ3AhAgAUEIakHUvpwBEOIjAAuuBQEQfyMAQTBrIgUkACAFIAEoAggiBjYCFAJAAkAgBkHAAEcNAAJAAkAgASgCECIHIARqIgYgA0sNACAGIARJDQEgASACIARqIAcQ4xIhCCABKAIUIQkgASgCBCEKIAEoAgwiC0EQaiEMAkADQCAKIAhBP3FBDGxqIgFBBGooAgAiBiABQQhqKAIAQQN0aiENIAIgBGohDiADIARrIQ8DQAJAAkACQAJAAkACQCAGIgEgDUYNACABQQhqIQYgASgCACAIRw0GIAVBCGogC0EMaigCACAMKAIAIAEoAgQiEBCOKSADIARJDQQgBSgCCCERIAUoAgwiEiAPSw0GIBJBBEkNBSARIBJBfGoiAWohEyAOIAFqIRQgDiEBA0AgASAUTw0CIAEoAAAgESgAAEcNByARQQRqIREgAUEEaiEBDAALCyAEIAdqIgEgA08NASADIARGDQIgCCAJIA4tAABsa0EBdCACIAFqLQAAaiEIIARBAWohBAwGCyAUKAAAIBMoAABHDQQMBgsgAEEANgIADAkLIAMgA0HosIABEIwVAAsgBCADQYixgAEQ3CwACwJAAkACQCASDgQFAgEABQsgDi8AACAOQQJqLQAAQRB0ciARLwAAIBFBAmotAABBEHRyRw0CQQMhEgwECyAOLwAAIBEvAABHDQFBAiESDAMLIA4tAAAgES0AAEcNAAsLQQEhEgsCQCASIARqIgEgEkkNACAAIBA2AgwgACABNgIIIAAgBDYCBCAAQQE2AgAMBAsgBUEANgIoIAVBATYCHCAFQfyUhAE2AhggBUIENwIgIAVBGGpBhJWEARDiIwALIABBADYCAAwCCyAEIAZB2LCAARDeLAALIAVBADYCGEEAQdSwgAEgBUEUaiAFQRhqQfiwgAEQjiEACyAFQTBqJAAL6AUCBH8FfiMAQYABayIEJAAgAb0hCAJAAkAgAZlEAAAAAAAA8H9iDQBBAyEFDAELAkAgCEKAgICAgICA+P8AgyIJQoCAgICAgID4/wBSDQBBAiEFDAELIAhC/////////weDIgpCgICAgICAgAiEIAhCAYZC/v///////w+DIAhCNIinQf8PcSIGGyILQgGDIQwCQCAJQgBSDQACQCAKUEUNAEEEIQUMAgsgBkHNd2ohBiAMp0EBcyEFQgEhCQwBC0KAgICAgICAICALQgGGIAtCgICAgICAgAhRIgcbIQtCAkIBIAcbIQkgDKdBAXMhBUHLd0HMdyAHGyAGaiEGCyAEIAY7AXggBCAJNwNwIARCATcDaCAEIAs3A2AgBCAFOgB6AkACQAJAAkACQCAFQX5qIgZFDQBBASEFQerymwFB6fKbASAIQgBTIgcbQerymwFBASAHGyACGyEHQQEg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ACABNgIEIAAgBDYCACADQeAAaiQAC6kFAQx/IwBBMGsiAyQAAkAgASgCeCACRg0AIAEgAjYCeCABIAEoAnAiBCABKAJ0ajYCbCABIAQgAiABKAJ8a2o2AmgLIAEQiQEgASgCeCEFAkACQAJAAkAgASgCbCABKAJoIgJHDQAgBSEGDAELAkACQAJAIAItAAAiBEE+Rw0AQRMhBwwBCyAEQS9HDQFBECEHCyABIAVBAWoiBjYCeCABIAJBAWo2AmgMAgsgAUEAOgCTASADQQRqIAEgBEECdEGUopoBaigCABEGAAJAIAMtAARBAXFFDQAgAygCCCECIANBCDYCGCADIAI2AhwgASADQRhqEJQFIAEoAnghBkGiASEHDAILIAEoAnghBiADLQAFIgdBowFHDQELIAEtACghAkGjASEHDAELIAYhAgJAIAEoAjBBgICAgHhGDQAgASgCRCEEIAFBADYCRCADQQA2AhQgAyABQTxqNgIMIAMgBDYCECADIAEoAkAiAjYCBCADIAIgBEEYbCIIaiIJNgIIAkAgBEUNACABQTBqIQogASgCOCILQQV0IQwDQCADQRhqQRBqIg0gAkEQaikDADcDACADQRhqQQhqIg4gAkEIaikDADcDACADIAIpAwA3AxgCQCALIAooAgBHDQAgCkGImpoBEOYdCyACQRhqIQIgASgCNCAMaiIEIAMpAxg3AwAgBEEQaiANKQMANwMAIARBCGogDikDADcDACAEQRxqQQA6AAAgBEEYaiAFNgIAIAEgC0EBaiILNgI4IAxBIGohDCAIQWhqIggNAAsgAyAJNgIECyADQQRqEMUJIAEoAnghAgsgASACNgIkIAEgBzoAKyABIAEtACgiAjoAKQsgACACOgAJIAAgBzoACCAAIAY2AgQgACAFNgIAIAEgABDwDiADQTBqJAALkgUCBH8BfiMAQSBrIgMkACADQRBqIAIgASgCGCIEKAIkQQAQjAICQAJAIAMtABBBBEYNACADKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkACQAJAAkACQCAEKAIkIgVFDQAgA0EQaiACIAUQhyMgAy0AEEEERg0AIAMpAxAiB0L/AYNCBFINAQsgBEEIaigCAEEMbCEFIARBBGooAgAhBgNAIAVFDQIgA0EQaiAGIAIQswcCQCADLQAQQQRGDQAgAykD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Rg0AIAMpAyAiBkL/AYNCBFENACAAIAY3AgAMAgsgA0EgaiACIANBDGpBxPabAUEIELoNIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAELAkAgBC0AREUNACADQQA2AiAgA0EYaiACIANBIGpB0pCcAUEBELkNIAMtABhBBEYNACADKQMYIgZC/wGDQgRRDQAgACAGNwIADAELAkAgAS0AFEECRg0AIANBIGogAhCREQJAIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAILIANBIGogASACEPwXIAMtACBBBEYNACADKQMgIgZC/wGDQgRRDQAgACAGNwIADAELIANBIGogAiAEEKYFAkAgAy0AIEEERg0AIAMpAyAiBkL/AYNCBFENACAAIAY3AgAMAQsgAEEEOgAACyADQTBqJAALuAUCB38BfiMAQcAAayIDJAAgAS0A4AEhBAJAAkACQAJAAkACQAJAIAJFDQAgBEH/AXFB4gBGDQELAkAgBEH/AXFBywBGDQAgA0EoaiABQQFBARDKAyADKAIoIQQCQCADLQA8IgJBAkcNACAAQQI6ABQgACAENgIADAcLIANBJGpBAmogA0EoakEXai0AACIFOgAAIANBCGpBF2ogBToAACADIAMvAD0iBjsBJCADIAI6ABwgAyADKAI4Igc2AhggAyADKAI0IgU2AhQgAyADKAIwIgg2AhAgAyADKAIsIgk2AgwgAyAENgIIIAMgBjsAHQJAIAEoAogBIgZBgAVxRQ0AIANBCGpBhIScAUEFEPwhDQMLIAZBgAJxRQ0FIANBCGpBiYScAUEFEPwhDQIMBQsgASgC3AEhBCABKALYASECIAMgARCVIjcDACADEOwgIgo3AyggA0EoaiADEJEMIQUgChDPIQJAIAUNACADQsHK2YvGDTcDKCADQShqIAMQkQwhBULBytmLxg0QzyEgBUUNBAsgA0GpgICAeDYCKCABIAIgBCADQShqEMoODAMLIANBKGpBBHIgARDNJiADQTA2AjwgA0GOhJwBNgI4IANBsICAgHg2AiggASgC2AEgASgC3AEgA0EoahDXGiEEIAEtAOABQaIBRw0BIAEgARCXLBCfFwwBCyADQcKAgIB4NgIoIAEgCCAFIANBKGoQ1yMMAgsgAEECOgAUIAAgBDYCAAwC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AXFFDQEgAEEBOgCIBgwBCyACIARqIAE6AAAgBEEBaiEECyAIQgBSDQALCyAAIAQ2AgAgBEGABksNASAEQQdqIQEDQCAAIAFqLQAADQEgACABQXhqNgIAIAFBf2oiAUEHRw0ACwsPCyAEQX9qQYAGQezygAEQjBUAC48FAQJ/IwBBMGsiAyQAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEF+aiIEQQYgBEEJSRsOCQABAgMEBQYHCAALIANBATYCFCADQci+nAE2AhAgA0IBNwIcIANBkwI2AgwgAyAAKQIINwIoIAMgA0EIajYCGCADIANBKGo2AgggASACIANBEGoQjCkhAAwICyADIABBBGo2AgggA0ECNgIUIANBnOuYATYCECADQgE3AhwgA0H5ADYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEIwpIQAMBwsgA0EANgIgIANBATYCFCADQcDrmAE2AhAgA0IENwIYIAEgAiADQRBqEIwpIQAMBgsgA0EANgIgIANBATYCFCADQdDrmAE2AhAgA0IENwIYIAEgAiADQRBqEIwpIQAMBQsgA0EANgIgIANBATYCFCADQezrmAE2AhAgA0IENwIYIAEgAiADQRBqEIwpIQAMBAsgA0EANgIgIANBATYCFCADQYzsmAE2AhAgA0IENwIYIAEgAiADQRBqEIwpIQAMAwsgAyAANgIIIANBATYCFCADQci+nAE2AhAgA0IBNwIcIANBlAI2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahCMKSEADAILIAMgAEEEajYCCCADQQI2AhQgA0GU7JgBNgIQIANCATcCHCADQfkANgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQjCkhAAwBCyADIABBBGo2AgggA0EBNgIUIANByL6cATYCECADQgE3AhwgA0H5ADYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEIwpIQALIANBMGokACAAC94EARZ/IwBB4ABrIgIkACABKAIEIQMgAiABKAIIIgRBBEEQEJAPIAIoAgQhBQJAAkAgAigCAEEBRg0AIAIoAgghBgJAIAVFDQAgAyAEQQR0aiEHQQAhCCAFIQkDQCADIAdGDQEgAygCCCEKIAMoAgQhCyADKAIAIQEQ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IQEgCkEwIAcoAhARBwBFDQAMBAsLQQEhCSAKIAYgCCACIAMQuiANAiAKIAQgBSAGKAIMEQsADQIgDCALa0H//wNxIQBBACEBA0ACQCABQf//A3EgAEkNAEEADwtBASEJIAFBAWohASAKIAcgBigCEBEHAEUNAAwDCwtBASEJIAogBCAFIAcoAgwRCwANASAAIA03AghBAA8LQQEhCSAAKAIAIgEgACgCBCIKIAggAiADELogDQAgASAEIAUgCigCDBELACEJCyAJC9kEAQd/IwBBIGsiAiQAQQEhAwJAIAFFDQAgASAAKAIESQ0AIAFBECABQRBLGyEEAkACQAJAIAAoAggiBUH///93Rg0AIAFB/v//B00NAQwDCyABQf7//wdNDQJBACEFAkAgACgCAEF8aiIGKAAAIgdBf3NBH3YgB0GE3YABELciIgdB+P///wdLDQBBBCEFIAJBBDYCHCACIAdBBGo2AhgLIAIgBTYCFCACQQhqIAJBFGpBoN2AARCfGyACKAIIIQUgAigCDCEIIARBf3NBH3YgBEGE3YABELciIQRBACEHAkAgAUH4////B0sNAEEEIQcgAkEENgIcIAIgBEEEajYCGAsgAiAHNgIUIAJBCGogAkEUakGg3YABEJ8bIAIoAggiByACKAIMakF/akEAIAdrcSIHIARJDQIgBiAFIAhqQX9qQQAgBWtxIAUgBxD1AyIFRQ0CIAUgBDYAACAFQQRqIQQMAQtBACEDIAQgBUH///8HcSIFRg0BIAJBADYCHCACIAU2AhhBASEDIAJBATYCFCACQQhqIAJBFGpBsN2AARCfGyACKAIIIQUgAigCDCEGIARBf3NBH3YgBEGEhJkBELciIQQgAkEANgIcIAIgBDYCGCACQQE2AhQgAkEIaiACQRRqQbDdgAEQnxsgAigCCCIHIAIoAgxqQX9qQQAgB2txIgcgBEkNASAAKAIAIAUgBmpBf2pBACAFa3EgBSAHEPUDIgRFDQELIAAgAUH///8HIAFB////B0kbQYCAgHByNgIIIAAgBDYCAEEAIQMLIAJBIGokACADC+kEAgR/BH4jAEHQAGsiAiQAAkACQAJAAkACQAJAAkACQCABKAIADgcEAQACAAMGAAsgAEEMNgIAIAAgASkDADcDCCAAQShqIAFBIGopAwA3AwAgAEEgaiABQRhqKQMANwMAIABBGGogAUEQaikDADcDACAAQRBqIAFBCGopAwA3AwAMBgsgAkEQaiABQRBqKQIANwMAIAJBCGpBEGogAUEYaikCADcDACACIAEpAgg3AwggASgCBCEBQQshA0EAIQQMAwsgAkEQaiABQRBqKQIANwMAIAJBCGpBEGogAUEYaikCADcDACACIAEpAgg3AwggASgCBCEBQQshA0EBIQQMAgsgAEEKNgIAIAAgASkCBDcCBCABEPgKDAMLIAJBEGogAUEUaikCADcDACACQRhqIAFBHGopAgA3AwAgAiABKQIMNwMIIAEoAiQhBSABKAIIIQFBACEDCyAAIAE2AgggACAENgIEIAAgAzYCACAAIAIpAwg3AgwgACAFNgIkIABBFGogAkEQaikDADcCACAAQRxqIAJBGGopAwA3AgAMAQsgAkEgaiABKAIEEKcFIAIoAiQhAQJAIAIoAiAiA0ELRg0AIAJBEGogAkEgakEUaikCACIGNwMAIAJBGGogAkEgakEcaikCACIHNwMAIAIgAikCLCIINwMIIAIoAkQhBCACKQNIIQkgACACKAIoNgIIIAAgATYCBCAAIAM2AgAgACAINwIMIABBFGogBjcCACAAQRxqIAc3AgAgACAJNwMoIAAgBDYCJAwBCyAAIAE2AgwgAEEGNgIIIABBDDYCAAsgAkHQAGokAAvZBAEIfyMAQRBrIgMkACADIAE2AgQgAyAANgIAIANCoICAgA43AggCQAJAAkACQAJAIAIoAhAiBEUNACACKAIUIgENAQwCCyACKAIMIgBFDQEgAigCCCIBIABBA3RqIQUgAEF/akH/////AXFBAWohBiACKAIAIQADQAJAIABBBGooAgAiB0UNACADKAIAIAAoAgAgByADKAIEKAIMEQsARQ0AQQEhAQwFCwJAIAEoAgAgAyABQQRqKAIAEQcARQ0AQQEhAQwFCyAAQQhqIQAgAUEIaiIBIAVGDQMMAAsLIAFBGGwhCCABQX9qQf////8BcUEBaiEGIAIoAgghCSACKAIAIQBBACEHA0ACQCAAQQRqKAIAIgFFDQAgAygCACAAKAIAIAEgAygCBCgCDBELAEUNAEEBIQEMBAtBACEFQQAhCgJAAkACQCAEIAdqIgFBCGovAQAOAwABAgALIAFBCmovAQAhCgwBCyAJIAFBDGooAgBBA3RqLwEEIQoLAkACQAJAIAEvAQAOAwABAgALIAFBAmovAQAhBQwBCyAJIAFBBGooAgBBA3RqLwEEIQULIAMgBTsBDiADIAo7AQwgAyABQRRqKAIANgIIAkAgCSABQRBqKAIAQQN0aiIBKAIAIAMgASgCBBEHAEUNAEEBIQEMBAsgAEEIaiEAIAggB0EYaiIHRg0CDAALC0EAIQYLAkAgBiACKAIETw0AIAMoAgAgAigCACAGQQN0aiIBKAIAIAEoAgQgAygCBCgCDBELAEUNAEEBIQEMAQtBACEBCyADQRBqJAAgAQvcBAIIfwF+AkAgAC0AFEECRg0AIAApAwAiCUIDg0IAUg0AIAmnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQwCQLIAAoAhgiA0EEaigCACEAAkAgAygCCCIBRQ0AA0AgACgCACICEJIBIAJBwABBCBCsFiAAQQxqIQAgAUF/aiIBDQALIANBBGooAgAhAAsgAygCACAAEJctIANBDGoQ/AEgAygCDCADQRBqKAIAEJ4tAkAgAygCMCIARQ0AIAAQkgEgAEHAAEEIEKwWCwJAIAMoAjQiAkUNACACQQRqKAIAIQACQCACKAIIIgFFDQADQCAAEM8UIABBMGohACABQX9qIgENAAsgAkEEaigCACEACyACKAIAIAAQmS0gAkEUQQQQrBYLAkAgAygCOCIERQ0AIARBBGooAgAhAAJAIAQoAggiAUUNAANAIAAoAgAiAhC0AiACQeAAQQgQrBYgAEEEaiEAIAFBf2oiAQ0ACyAEQQRqKAIAIQALIAQoAgAgABCcLSAEQRRBBBCsFgsgA0EcaigCACEFAkAgAygCICIGRQ0AQQAhBwNAIAUgB0EEdGoiACgCACIBEJIBIAFBwABBCBCsFgJAIAAoAgwiBEUNACAEQQRqIggoAgAhAAJAIAQoAggiAUUNAANAIAAoAgAiAhC0AiACQeAAQQgQrBYgAEEEaiEAIAFBf2oiAQ0ACyAIKAIAIQALIAQoAgAgABCcLSAEQRRBBBCsFgsgB0EBaiIHIAZHDQALIANBHGooAgAhBQsgAygCGCAFEJstIANBwABBBBCsFgvpBAEGfyMAQRBrIgIkACABIABBwABqEPEJAkAgACgChAEiA0UNACAAKAKAASIEIANB2ABsaiEFA0ACQAJAIAQoAgAiA0EFRw0AIAEgBCgCBBD5JgwBCyADQQRGDQACQAJAAkAgAw4EAwABAgMLIAQoAgRBAUcNAiABIAQoAggQ+SYMAgsgBCgCBCABEOAFDAELIAQoAgwiA0UNACADQShsIQYgBCgCCEEEaiEDA0ACQAJAAkACQAJAIANBfGooAgAOBQQAAQIDBAsgAygCAEEBRw0DIAEgA0EEaigCABD5JgwDCyABIAMoAgAQ+SYMAgsgASADKAIAEL8JDAELIAMgARDtCwsgA0EoaiEDIAZBWGoiBg0ACwsgBEHYAGoiBCAFRw0ACwsCQCAAKAJ4IgNFDQAgASADEIUTCwJAIAAoApgBIgNFDQAgACgClAEiBiADQShsaiEFA0ACQAJAAkACQAJAIAYoAgAOBQQAAQIDBAsgBigCBEEBRw0DIAEgBigCCBD5JgwDCyABIAYoAgQQ+SYMAgsgBigCBCIHQcAAaiABEMIKIAcoApgBIQQgBygClAEhAyACIAE2AggCQCAERQ0AIARBKGwhBANAIAJBCGogAxDLCCADQShqIQMgBEFYaiIEDQALCyAHLQA8QQZGDQEgASAHQRBqEPEJDAELIAYoAgwhBCAGKAIIIQMgAiABNgIMIARFDQAgBEEobCEEA0AgAkEMaiADEMsIIANBKGohAyAEQVhqIgQNAAsLIAZBKGoiBiAFRw0ACwsCQCAALQA8QQZGDQAgASAAQRBqEPEJCyACQRBqJAALsQQCCX8EfgJAIAAoAgAiAkUNAAJAAkACQAJAIAFBP3EiA0EBdEHM84ABaiIBLwEAIgRB/w9xIgVBnQpPDQAgBEELdiEEQQAgAmshBiAAQQhqIQcgBSABLwECQf8PcWshCEHkdSEBA0AgCCABakHkdUYNBCAFIAFqIglFDQQgBiABakHkdUYNAiABQeR7Rg0DIAcgAWohCiABQQFqIQEgCkGcCmotAAAiCiAJQer+gAFqLQAAIglB/wFxRg0ACyAEIAogCUH/AXFJayEEDAMLIAVBnApB7P6AARDcLAALIARBf2ohBAwBC0GABkGABkH8/oABEIwVAAsgAEEHaiIJIARqIQogA60hC0IAIQwDQCACIgFBf2ohAgJAAkACQCABQYEGTw0AIAkgAWoxAAAgC4YgDHwiDSANQgqAIgxCdn58IQ4gAiAEakGABkkNASAOUA0CIABBAToAiAYMAgsgAkGABkH88oABEIwVAAsgCiABaiAOPAAACyACDQALAkAgDUIKVA0AIARBB2ohAgNAIAwiDSANQgqAIgxCdn58IQ4CQAJAIAJBeGpBgAZJDQAgDlANASAAQQE6AIgGDAELIAAgAmogDjwAAAsgAkF/aiECIA1CCloNAAsLIAAgACgCBCAEajYCBCAAIAAoAgAgBGoiAkGABiACQYAGSRsiATYCACACRQ0AIAFBB2ohAgNAIAAgAmotAAANASAAIAJBeGo2AgAgAkF/aiICQQdHDQALCwvSBAIDfwF+IwBBIGsiAyQAIAEoAhQhBCADQQhqIAIgASgCECIFQQAQjAICQAJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELAkAgAS0AGEUNACADQQA2AgggAyACIANBCGpB/KicAUEIELQNAkAgAy0AAEEERg0AIAMpAwAiBkL/AYNCBFENACAAIAY3AgAMAgsgAi0ATQ0AIANBCGogAhCNESADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyADQQA2AhQgA0EIaiACIANBFGpBi5+cAUEBELMNAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgA0EIaiACIAUgBCABKAIEIAEoAggQwQUCQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCyADQQhqIAIgA0EUakHEkJwBQQEQsw0CQCADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCABKAIMRQ0AIANBCGogAiADQRRqQcOQnAFBARCzDQJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAQLAkAgAi0ATQ0AIANBCGogAhCNESADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUg0CCyADQQhqIAFBDGogAhDKLSADLQAIQQRGDQAgAykDCCIGQv8Bg0IEUg0CCyAAQQQ6AAAMAgsgACAGNwIADAELIAAgBjcCAAsgA0EgaiQAC6cEAQl/AkACQCAAKAIYIgIgACgCACIDRg0AIAIgA0sgAiADSWshBAwBCyAAQSRqKAIAIgIgAEEMaigCACIDSyACIANJayEECwJAAkAgACgCSCICIAAoAjAiA0YNACACIANJIQUMAQsgAEHUAGooAgAgAEE8aigCAEkhBQsgAEEwQcgAIAUbaiEDIAAgBEF/SkEYbGohAgJAAkAgAEHIAEEwIAUbaiIFKAIAIgYgACAEQYABcUEHdkEYbGoiBygCACIARg0AIAYgAEkhAAwBCyAFQQxqKAIAIAdBDGooAgBJIQALAkACQCADKAIAIgQgAigCACIGRg0AIAQgBkkhBAwBCyADQQxqKAIAIAJBDGooAgBJIQQLAkACQCADIAIgBSAAGyAEGyIGKAIAIgggByAFIAIgBBsgABsiCSgCACIKRg0AIAggCkkhCAwBCyAGQQxqKAIAIAlBDGooAgBJIQgLIAEgBSAHIAAbIgApAgA3AgAgAUEQaiAAQRBqKQIANwIAIAFBCGogAEEIaikCADcCACABQShqIAYgCSAIGyIAQRBqKQIANwIAIAFBIGogAEEIaikCADcCACABIAApAgA3AhggAUHAAGogCSAGIAgbIgBBEGopAgA3AgAgAUE4aiAAQQhqKQIANwIAIAEgACkCADcCMCABIAIgAyAEGyIAKQIANwJIIAFB0ABqIABBCGopAgA3AgAgAUHYAGogAEEQaikCADcCAAvCBAIGfwR+IwBBEGsiAyQAIAMgAikDACIJIAIoAhAQsh8gAykDACEKAkACQAJAAkACQCABKAIMRQ0AIAEoAgAiBEFgaiEFIAogAygCCBDmHiIKQhmIQoGChIiQoMCAAX4hCyABKAIEIgYgCqdxIQFBACEHAkACQANAAkAgBCABaikAACIMIAuFIgpCf4UgCkL//fv379+//358g0KAgYKEiJCgwIB/gyIKUA0AA0AgAyAFIAp6p0EDdiABaiAGcSIIQQV0axDoKA0DIApCf3wgCoMiClBFDQALCyAMIAxCAYaDQoCBgoSIkKDAgH+DUEUNAiABIAdBCGoiB2ogBnEhAQwACwsgBEEAIAhrQQV0aiIBQXBqKQMAIgpQRQ0CQQYhAgwDCyADKQMAIQoLIABBBjoALCAKQgODQgBSDQMgCqciACAAKAIAIgJBf2o2AgAgAkEBRw0DIAAgACgCEBDAJAwDCwJAIApCA4NCAFINACAKpyIEIAQoAgAiBEEBajYCACAEQX9MDQILIAIoAgwhBCACKAIIIQIgAUF4aigCACEBAkAgCUIDg0IAUg0AIAmnIgYgBigCACIGQQFqNgIAIAZBf0wNAgsgACABNgIoIABCADcDICAAIAo3AxggAEIANwMQIAAgBDYCDCAAIAI2AgggACAJNwMAQQAhAgsgACACOgAsIAMpAwAiCkIDg0IAUg0BIAqnIgAgACgCACICQX9qNgIAIAJBAUcNASAAIAAoAhAQwCQMAQsACyADQRBqJAAL4wQBBn8jAEEQayICJAAgAEHAAGoQnygCQCAAKAKEASIDRQ0AIAAoAoABIgQgA0HYAGxqIQUDQAJAAkAgBCgCACIDQQVHDQAgBCgCBCABEKUCDAELIANBBEYNAAJAAkACQCADDgQDAAECAwsgBCgCBEEBRw0CIAQoAgggARClAgwCCyAEKAIEIAEQ5QUMAQsgBCgCDCIDRQ0AIANBKGwhBiAEKAIIQQRqIQMDQAJAAkACQAJAAkAgA0F8aigCAA4FBAABAgMECyADKAIAQQFHDQMgA0EEaigCACABEKUCDAMLIAMoAgAgARClAgwCCyABIAMoAgAQzgkMAQsgAyABEPkLCyADQShqIQMgBkFYaiIGDQALCyAEQdgAaiIEIAVHDQALCwJAIAAoAngiA0UNACADIAEQvB8LAkAgACgCmAEiA0UNACAAKAKUASIGIANBKGxqIQUDQAJAAkACQAJAAkAgBigCAA4FBAABAgMECyAGKAIEQQFHDQMgBigCCCABEKUCDAMLIAYoAgQgARClAgwCCyAGKAIEIgdBwABqIAEQzAogBygCmAEhBCAHKAKUASEDIAIgATYCCAJAIARFDQAgBEEobCEEA0AgAkEIaiADENMIIANBKGohAyAEQVhqIgQNAAsLIActADxBBkYNASAHQRBqEJ8oDAELIAYoAgwhBCAGKAIIIQMgAiABNgIMIARFDQAgBEEobCEEA0AgAkEMaiADENMIIANBKGohAyAEQVhqIgQNAAsLIAZBKGoiBiAFRw0ACwsCQCAALQA8QQZGDQAgAEEQahCfKAsgAkEQaiQAC8MEAgR/AX4jAEEQayIGJAAgBkEIaiABIAIgBUGQAiAFEMYeAkACQCAGLQAIQQVGDQAgACAGKQMINwIADAELQQUgBigCDBC2KCAGQQE6AAYgBkEAOgAHQQAhB0EAIQgDQAJAAkACQAJAAkAgBUUNACAEQQhqKAIAIQkgBkEIaiABIANBkAIgByAIIAZBB2ogBkEGahCtBQJAIAYtAAhBBEYNACAGKQMIIgpC/wGDQgRSDQMLIAZBCGogASAEQQRqKAIAQQAQjAICQAJAAkAgBi0ACEEERg0AIAYpAwgiCkL/AYNCBFINAQsgBkEIaiAEIAEQyS0CQCAGLQAIQQRGDQAgBikDCCIKQv8Bg0IEUg0BCyAGQQhqIARBDGogARCUJiAGLQAIQQRGDQEgBikDCCIKQv8Bg0IEUQ0BCyAKQv8Bg0IEUg0DCyAGLQAGDQEgBkEBOgAGDAQLIAZBCGogASACIANBkAIgByAIEI4CAkAgBi0ACEEERg0AIAYpAwgiCkL/AYNCBFINAgsgBkEIaiABIANBAEGQAhDUEyAGLQAIQQRGDQIgBikDCCIKQv8Bg0IEUQ0CIAAgCjcCAAwFCyABKAJERQ0CIAZBCGogASAJQQAQ8QMgBi0ACEEERg0CIAYpAwgiCkL/AYNCBFENAgsgACAKNwIADAMLIABBBDoAAAwCCwJAIAYtAAdFDQAgASABKAIsQX9qNgIsIAZBADoABwsgBUF/aiEFIARBEGohBEEBIQcgCSEIDAALCyAGQRBqJAALiAQBCH8gASAAIABBA2pBfHEiAmsiA2oiBEEDcSEFQQAhAUEAIQYCQCAAIAJGDQBBACEGA0AgBiAALAAAQb9/SmohBiAAQQFqIQAgA0EBaiIDDQALCwJAIAVFDQAgAiAEQXxxaiEAQQAhAQNAIAEgACwAAEG/f0pqIQEgAEEBaiEAIAVBf2oiBQ0ACwsgBEECdiEDIAEgBmohBwJAA0AgAiEGIANFDQEgA0HAASADQcABSRsiBEEDcSEIIARBAnQhCUEAIQECQCADQQRJDQAgBiAJQfAHcWohAkEAIQEgBiEAA0AgAEEMaigCACIFQX9zQQd2IAVBBnZyQYGChAhxIABBCGooAgAiBUF/c0EHdiAFQQZ2ckGBgoQIcSAAQQRqKAIAIgVBf3NBB3YgBUEGdnJBgYKECHEgACgCACIFQX9zQQd2IAVBBnZyQYGChAhxIAFqampqIQEgAEEQaiIAIAJHDQALCyADIARrIQMgBiAJaiECIAFBCHZB/4H8B3EgAUH/gfwHcWpBgYAEbEEQdiAHaiEHIAhFDQALIAhBAnQhBSAGIARB/AFxQQJ0aiEAQQAhAQNAIAAoAgAiAkF/c0EHdiACQQZ2ckGBgoQIcSABaiEBIABBBGohACAFQXxqIgUNAAsgAUEIdkH/gfwHcSABQf+B/AdxakGBgARsQRB2IAdqIQcLIAcL8QQCB38DfiMAQTBrIgMkAAJAAkACQAJAAkACQAJAIAAoAuQKQQNGDQACQCACKAIAQX9qQQJJDQAgACgCiAsiBCgCsAIgBCgCtAJHDQELIAEoAtgEQYCAgIB4Rg0BIANBFGogAEHkCmogAUHYBGogAkEEQQAQgAggAygCFCICQQJHDQYgAyADKAIYNgIMQciXnAFBKyADQQxqQYSVgwFB9KGDARDiEgALAkAgACgCyAoiBEECRg0AIAIoAgwhBQJAIAItABhBAUcNACAFQYABSw0BCyAAKALgCigC0AIiBkUNAkEAIAIoAhQiByACKAIQIghrIgkgCSAHSxtBAEF/IAAoAswKQQN0QYCAgAEgBEEBcRsiBEEFdiAEQRhxQQBHaiIEQQV0IARB////P0sbIAZuIgRBf2oiBiAGIARLG0sNACABKALUBUGAgICAeEYNAyACKQIAIQogAigCCCECIANBAToALCADIAc2AiggAyAINgIkIAMgBTYCICADIAI2AhwgAyAKNwIUIANBDGogAEHICmogAUHUBWogA0EUakEEQQAQvwYgAygCDCICQQJGDQQMBgsgASgC6ARBgICAgHhGDQQgAikCACEKIAIpAgghCyACKQIQIQwgA0EBOgAsIAMgDDcCJCADIAs3AhwgAyAKNwIUIAMgAEGwCmogAUHoBGogA0EUakEEQQAQiQggAygCACECDAULQeShgwEQziwAC0Hko4MBEN0hAAtBpKGDARDOLAALIAMgAygCEDYCFEHIl5wBQSsgA0EUakGElYMBQbShgwEQ4hIAC0H0oIMBEM4sAAsgA0EwaiQAIAJBAEcLgwUCBn8CfiMAQeABayICJAACQCABKAIYIgMoAhQiBEUNACADKAIQIQUgBEEMbCEEIAAtADkhBgNAIAUoAgAhByAAQQE6ADkgByAAENkBIAAgBjoAOSAFQQxqIQUgBEF0aiIEDQALCyAAQSxqIQUCQAJAIAEtABRBAkYNACAAKAIwEPUVIQQgAkE0aiIHIAVBCGooAgA2AgAgAkEIakEAKQOAhJ4BIgg3AwAgAkEQaiIGQQApA/iDngEiCTcDACACQRhqIAg3AwAgAiAANgIgIAIgBDYCJCACQQE6ADkgAkEBOgAoIAIgBSkCADcCLCACIAk3AwAgAiAAKAE6NgE6IAIgAC0AODoAOCACIAFBAxD8DyACKAIwEPUVIQAgAkGAAWpBNGogBygCADYCACACQYABakEIaiAINwMAIAJBgAFqQRBqIgUgCTcDACACQYABakEYaiAINwMAIAIgADYCpAEgAkEBOgC5ASACQQE6AKgBIAIgAikCLDcCrAEgAiAJNwOAASACIAIoATo2AboBIAIgAi0AODoAuAEgAiACNgKgASACQYABaiADENQEIAJBgAFqEK0KIAUQygogAhCtCiAGEMoKDAELIAAoAjAQ9RUhBCACQbQBaiAFQQhqKAIANgIAIAJBgAFqQQhqQQApA4CEngEiCDcDACACQZABaiIHQQApA/iDngEiCTcDACACQZgBaiAINwMAIAIgADYCoAEgAiAENgKkASACQQE6ALkBIAJBAToAqAEgAiAFKQIANwKsASACIAk3A4ABIAIgACgBOjYBugEgAiAALQA4OgC4ASACQYABaiADENQEIAJBgAFqEK0KIAcQygoLIAJB4AFqJAALzQQBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4TABERAQIDBAUGBwgJCgsMDQ4PEAALIAEgAEEEahCRBw8LIABBBGogARCOLyAAQQhqIAEQnS8PCyAAQQxqIAEQtCoPCyABKAIUIABBEGoQqAgaIABBKGogARCdLw8LIABBEGogASgCFBDCKA8LIABBEGogASgCFBDCKA8LIABBBGogARCOLyAAQQhqIAEQnS8gACgCFEUNCiAAQRRqIAEQnS8PCyAAQRBqIAEQji8gACgCDEEYbCECIAAoAgghAANAIAJFDQogAEEUaiABELQqIAEgABCRByACQWhqIQIgAEEYaiEADAALCyAAQQRqIAEQji8PCyABIAAoAgQiAEHIAGoQkQcgAEHgAGohAgJAAkACQCAAKAIAQXlqDgIBAgALIAAgARCHFgsgASAAQShqEJEHCyACKAIAQYCAgIB4Rg0HIAEgAhCRBw8LIABBBGogARCOLyAAQQhqIAEQnS8PCyAAQQRqIAEQji8gAEEIaiABEJ0vDwsCQCAAKAIEIgJBAkYNACAAQQhqIQMCQCACQQFxRQ0AIAMgARCOLwwBCyADIAEQ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ACEHIAIgAUF4aiAAIAFB9MqbARDJIyACKAIEQQhHDQUgB0LTkYytiNHanySFIQYgAigCACkAAELE5sGb4MXijBOFIQcMAgsgADUAACEHIAJBCGogAUF8aiAAIAFB1MqbARDJIyACKAIMQQRHDQUgB0LTkYytiNHanySFIQYgAigCCDUAAELE5sGb4MXijBOFIQcMAQsgACABakF/ajEAAEIIhiAAIAFBAXZqMQAAhELE5sGb4MXijBOFIQcgADEAAELTkYytiNHanySFIQYLIAJBIGokACAGQv////8PgyAHQiCIfiABrYUgBkIgiCAHQv////8Pg35CIImFIgenQd3L3Z55bCAHQiCIp2pBycH4/QBsQaPuuZwEakEPd60PC0EIIARBtMqbARDdLAALQRAgBEHEypsBEN0sAAtByJecAUErIAJBH2pBlMubAUGEy5sBEOISAAtByJecAUErIAJBH2pBlMubAUHkypsBEOISAAu7BAIFfwF+IwBBMGsiAyQAQQwhBAJAAkACQCAAKAIEIAAtAAsiBUHAAGpB/wFxIgZBDCAGQQxJGyAFQf4BRhsiByACaiIGIAdJDQACQCAFQf4BRw0AIAAoAggiBEEYdiEFAkAgBEH///93Rg0AIARB////B3EhBAwBCyAAKAIAQXxqKAAAIQQLAkAgBiAESQ0AAkACQAJAIAZBDUkNACAFQf4BRg0BIANBGGogABDRHiADQSBqIAMoAhggAygCHCACEOIRIANBIGohBQwCCyADQQhqIAAQ0R4gA0IANwMgIANBADYAJyADIAMoAgwiBUHAAXI6ACsCQCAFRQ0AIANBIGogAygCCCAF/AoAAAsgA0EgaiEFDAELIABBfyAGIAYgB0kbIgVB/////wcgB61CA34iCKdBAXYgCEIgiKcbIgQgBSAESxsQ3AVFDQEgA0EQaiAAENEeIANBIGogAygCECADKAIUIAIQ4hEgA0EgaiEFCwJAIAAtAAtB/gFHDQAgACgCACAAKAIIEIgMCyAAIAUpAgA3AgAgAEEIaiAFQQhqKAIANgIACyADIAAQghsgBiAHSQ0BIAYgAygCBCIFSw0CAkAgAkUNACADKAIAIAdqIAEgAvwKAAALAkACQCAALQALQf4BRg0AIAZBC0sNASAAIAZBwAFyOgALDAELIAAgBjYCBAsgA0EwaiQADwtB14GZAUEsQeyCmQEQqhcACyAHIAZB/IKZARDeLAALIAYgBUH8gpkBEN0sAAvXBAICfwF+AkACQCAAKAIAIgFBCUYNAAJAAkACQAJAAkACQAJAAkACQCABDggBAgMEBQYHCAALIAApAxAiA0IDg0IAUg0JIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNCSAAIAAoAhAQwCQPCyAAKAIIIgEgACgCDBDvCCAAKAIEIAEQoS0gACgCECIBEMETIAFBGEEIEKwWIAAoAhwiAEUNCCAAEJkXIAAoAgAgAEEEaigCABCXLSAAQRRBBBCsFg8LIABBCGoQ+gQPCyAAKAIIIgEgACgCDBD4ByAAKAIEIAEQoi0CQCAAKAIYIgFFDQAgARDBEyABQRhBCBCsFgsgACgCHCIARQ0GIAAQmRcgACgCACAAQQRqKAIAEJctIABBFEEEEKwWDwsCQAJAAkAgACgCCA4CAQIACyAAKAIMEPoODwsgAEEQahCLGQ8LAkAgAC0AJEECRg0AIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQwCQLIAAoAigQzw0PCyAAQQRqEOYBDwsgACgCECEBIAAoAgQiABDBEyAAQRhBCBCsFiABRQ0DIAEQmRcgASgCACABQQRqKAIAEJctIAFBFEEEEKwWDwsCQCAAKAIEIgApAygiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQwCQLAkACQCAAKQMAQgBSDQAgAEEIahDoEAwBCyAAEMETCyAAQcgAQQgQrBYPCyAAQQRqEOYBDwsgAEEIahCXBAsLzwQBBn8jAEEQayICJAAgAEHAAGoQmBoCQCAAKAKEASIDRQ0AIAAoAoABIgQgA0HYAGxqIQUDQAJAAkAgBCgCACIDQQVHDQAgBCgCBCABEL0DDAELIANBBEYNAAJAAkACQCADDgQDAAECAwsgBCgCBEEBRw0CIAQoAgggARC9AwwCCyAEKAIEIAEQ8gUMAQsgBCgCDCIDRQ0AIANBKGwhBiAEKAIIQQRqIQMDQAJAAkACQAJAAkAgA0F8aigCAA4FBAABAgMECyADKAIAQQFHDQMgA0EEaigCACABEL0DDAMLIAMoAgAgARC9AwwCCyABIAMoAgAQyAkMAQsgAyABEPYLCyADQShqIQMgBkFYaiIGDQALCyAEQdgAaiIEIAVHDQALCwJAIAAoApgBIgNFDQAgACgClAEiBiADQShsaiEFA0ACQAJAAkACQAJAIAYoAgAOBQQAAQIDBAsgBigCBEEBRw0DIAYoAgggARC9AwwDCyAGKAIEIAEQvQMMAgsgBigCBCIHQcAAaiABEK0LIAcoApgBIQQgBygClAEhAyACIAE2AggCQCAERQ0AIARBKGwhBANAIAJBCGogAxDPCCADQShqIQMgBEFYaiIEDQALCyAHLQA8QQZGDQEgB0EQahCYGgwBCyAGKAIMIQQgBigCCCEDIAIgATYCDCAERQ0AIARBKGwhBANAIAJBDGogAxDPCCADQShqIQMgBEFYaiIEDQALCyAGQShqIgYgBUcNAAsLAkAgAC0APEEGRg0AIABBEGoQmBoLIAJBEGokAAvzBAEFfyMAQfAAayICJAAgASgC2AEhAyABEKALIAJBCEEEQRBByPebARCpGiACQQA2AhAgAiACKQMANwIIIAFB/AFqIQQCQAJAAkADQAJAAkAgAS0A4AFBe2oOAwMAAQALAkACQCABKAKIASIFQcAAcQ0AIAEgBUHAAHI2AogBIAJByABqIAEQgQsgASABKAKIAUG/f3E2AogBDAELIAJByABqIAEQgQsLIAIoAkwhBQJAAkAgAigCSCIGQQJGDQAgAiACKQJQNwIcIAIgBTYCGCACIAY2AhQgAkEIaiACQRRqQdj3mwEQxBsCQCABLQDgAUF7ag4DBAACAAsgASgC3AEhBSABKALYASEGIAJBJGogARDNJiACQQE2AkwgAkHIvpwBNgJIIAJCATcCVCACQbMHNgJkIAJBBzoAbyACIAJB4ABqNgJQIAIgAkHoAGo2AmAgAiACQe8AajYCaCACQTBqIAJByABqEJIQIAJBxABqIAJBLGooAgA2AgAgAiACKQIkNwI8IAYgBSACQTBqENcaIQUgAS0A4AFBogFHDQAgASABEJcsEJ8XCyACQQhqEMAoQQEhAQwECyABEKALIAEtAOABQQVHDQEgAkHIAGogBCADIAEoAtABIAEoAtQBEJoGDAELIAEQoAsgAkECNgJIIAJBCGogAkHIAGpB6PebARDEGwwACwsgARCgCyABKALUASEBQQhBwAAQ+ysiBUUNASAFQQ02AgAgBSACKQII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IAELqgQBCH8gASgCeCECAkACQCABKAJsIgMgASgCaCIERg0AIAQsAAAiBUEASA0AIAVBwKqaAWotAAANAQsgACABIAIQuAIPCyABIAJBAWoiBjYCeCABIARBAWoiBTYCaAJAAkAgAyAFRg0AIAMgBWshB0EAIQMMAQsgAEEAOgAMIABBgICAgHg2AgAgASABKAJwIgQgASgCdGo2AmwgASAEIAYgASgCfCIDayIFajYCaCAAIAUgAiADayIDazYCCCAAIAQgA2o2AgQPCwNAAkAgAyIEIAcgBEEgaiIIIAcgCEkbIgNPDQACQANAIAUgBGotAAAiCUHAlpoBai0AAA0BIAMgBEEBaiIERg0CDAALCyAJwCEDAkAgBEUNACABIAYgBGoiBjYCeCABIAEoAnAiBCABKAJ0ajYCbCABIAQgBiABKAJ8a2o2AmgLAkAgA0F/Sg0AIAAgASACELgCDwsCQCADQdwARw0AIAAgASACELgCDwsgAEEAOgAMIABBgICAgHg2AgAgASABKAJwIgQgASgCdGo2AmwgASAEIAYgASgCfCIDayIFajYCaCAAIAUgAiADayIDazYCCCAAIAQgA2o2AgQPCyAIIAdJDQALIABBADoADCAAQYCAgIB4NgIAIAEgBiAHaiIDNgJ4IAEgASgCcCIEIAEoAnRqNgJsIAEgBCADIAEoAnwiBWsiA2o2AmggACADIAIgBWsiBWs2AgggACAEIAVqNgIEC7UEAQJ/AkACQAJAAkACQAJAAkAgACgCAA4IAAECAwYGBAUACyAAKAIgIAEQ5QQPCyAAKAIgIAEQnw0PCyAAKAIEIgAoAggiAkUNAyAAKAIEIgAgAkE4bGohAwNAIAAgARCiDgJAIABBMGooAgAiAkUNACACIAEQ+QILIABBOGoiACADRw0ADAQLCyAAKAIEIgAoAggiAkUNAiAAKAIEIgAgAkE4bGohAwNAIAAgARCiDgJAIABBMGooAgAiAkUNACACIAEQ+QILIABBOGoiACADRw0ADAMLCyAAKAIEIgApAwAgAEEQaigCACABENIjIAAoAigiAkUNASAAKAIkIgAgAkEwbGohAwNAAkAgACgCAA0AIABBCGopAwAgAEEYaigCACABENIjCwJAIABBKGooAgAiAkUNACACIAEQ+QILIABBMGoiACADRw0ADAILCwJAIAAoAgQiACgCAA0AIAApAwggAEEYaigCACABENIjCyAALQBFIgJBA0YNAAJAIAJBAkYNACAAKQMoIABBOGooAgAgARDSIwJAIAAoAkAiAC0AJUECRg0AA0AgACkDCCAAQRhqKAIAIAEQ0iMgACgCICIALQAlQQJHDQALCyAAKAIIIgJFDQEgACgCBCEAIAJBOGwhAgNAIAAgARDUJSAAQThqIQAgAkFIaiICDQAMAgsLIAAoAigiAkUNACAAKAIkIQAgAkE4bCECA0AgACABENQlIABBOGohACACQUhqIgINAAsLC9AEAgZ/AX4jAEGAAWsiAyQAAkACQAJAAkAgAS0A4AEiBEGAAUYNAAJAIARBwABGDQAgA0EoakEEciABEM0mIANBGjYCPCADQfzYmwE2AjggA0GwgICAeDYCKCABKALYASABKALcASADQShqENcaIQUgAS0A4AFBogFHDQMgASABEJcsEJ8XDAMLIANB6ABqIAEQ9RpCASEJDAELIANBKGogARDYDiADKAIwIQUgAykDKCIJUA0BIANBADYCeCADIAMoAjQ2AnQgAyAFNgJwIANBADoAfCADIAk3A2hCACEJCyADQQhqQRBqIANB8ABqKQMANwMAIANBIGogA0HoAGpBEGopAwA3AwAgAyAJNwMIIAMgAykDaDcDEAJAAkACQCABLQDgAUECRg0AIAEQwBIiBQ0BQQMhBgwCCyADQegAaiABELAIAkAgAygCaCIHQYCAgIB4Rg0AIANByABqIANB9ABqKQIANwMAIAMgAykCbDcDQEECIQYMAgsgAygCbCEFCyADQQhqEJMmDAELIAEoAtQBIQhB2ABBCBCWKiIFIAc2AiAgBUEYaiADQQhqQRhqKQMANwMAIAVBEGogA0EIakEQaikDADcDACAFQQhqIANBCGpBCGopAwA3AwAgBSADKQMINwMAAkBBIUUNACAFQSRqIANBwABqQSH8CgAAC0EAIQEgBUEAOgBSIAUgBEGAAUY6AFEgBUEAOgBQIAUgCDYCTCAFIAI2AkggBSAGOgBFDAELQQEhAQsgACAFNgIEIAAgATYCACADQYABaiQAC68EAgR/AX4jAEEgayIDJAAgA0EQaiABIAIoAgwiBEEAEIwCAkACQCADLQAQQQRGDQAgAykDECIHQv8Bg0IEUQ0AIAAgBzcCAAwBCwJAAkAC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CyAEQQhqIAEQyicgBEEoaiABEJAvDAYLIARBKGogARCQLwwFCyACQQhqIARBCGoiBhCPIyABKAIcIQUgASgCICEHIAUgByAFIAcgAigCDBDzE0HApZwBENclIQggBEEoaiEJAkACQCAEKAJIIgoNAEEAIAQoAjQgBCgCKEGAgICAeEYbIQoMAQsgCigCBCEKCyAFIAcgCkF/ahCgKiEHIAEgCCgCAEEBaiIFIAcoAgRBf2oiByAFIAdJGyAFIAcgBSAHSxsQwx8gBiABEMonIAQoAkggARCYJiAJIAEQ8CgMBAsgBEEgaiEFAkAgBCgCIEEHRg0AIAJBGGogBRCiDyABIAIoAhggAigCHBDDHyACQRBqIAQoAmgQog8gASABKAIcIAEoAiAgAigCEEF/ahCgKiIHKAIAIAcoAgQQwx8LIAQgARDKJwJAIAQoAiBBB0YNACAFIAEQhhULIAQoAmggARCGFSAEQcgAaiABEPAoDAMLIARBCGogARDKJyAEKAIoIAEQ8QsMAgsgACABEJAvDAELIAJBIGokAA8LIABBDGohACADQXRqIQMMAAsL7AQCBn8CfiMAQfABayICJAACQEEALQDY754BDQBBABCdFQtBAEEAKQPg754BIghCAXw3A+DvngFBACkD6O+eASEJIAEoAoAFKALQAiEDIAJCBDcC5AEgAkIANwLcASACQoCAgIDAADcC1AECQCADQX9MDQAgAkHsAWoiBEEANgIAIAJB1AFqIAMQgyUgAkHgAWoiBSADEIMlIAJB0ABqIAQoAgA2AgAgAkHIAGogAkHkAWoiBikCADcDACACQcAAaiACQdQBakEIaiIHKQIANwMAIAIgAikC1AE3AzggBEEANgIAIAZCBDcCACAHQgA3AgAgAkKAgICAwAA3AtQBIAJB1AFqIAMQgyUgBSADEIMlIAJB7ABqIAQoAgA2AgAgAkHkAGogBikCADcCACACQdwAaiAHKQIANwIAIAJBCGpBCGpBACkDgISeATcDACACIAIpAtQBNwJUIAJBADYCtAEgAkKAgICAEDcCrAEgAkEANgKcASACQoCAgIDAADcClAEgAkIENwKMASACQgA3AoQBIAJCgICAgMAANwJ8IAJBACkD+IOeATcDCCACQQA2AqgBIAJCgICAgMAANwOgASACIAk3AyAgAiAINwMYIAJBADYC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IAIoAgRJIAQoAgAiBSACKAIAIgZJIAUgBkYbIggbIgUoAgQhCSAAIAMgAiAIGyAHGyIGKAIEIQogBSgCACELIAYoAgAhDCABQQhqIAMgACAHGyIAQQhqKAIANgIAIAEgACkCADcCACABIAUgBiAJIApJIAsgDEkgCyAMRhsiABsiAykCADcCDCABQRRqIANBCGooAgA2AgAgAUEgaiAGIAUgABsiAEEIaigCADYCACABIAApAgA3AhggASACIAQgCBsiACkCADcCJCABQSxqIABBCGooAgA2AgALpwMBBH8jAEEgayIDJAACQAJAIAItAAwiBEEBRw0AIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyADIAIQ5iYgACADKQIANwIAIANBAiADLQAMazoADCAAQQhqIANBCGopAgA3AgAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggiAhC7IEH/AXEOAgIDAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIAMgAigCBCACKAIIEPIKIAAgBSADQRRqENcXDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiAGIAIgAxDDBSAAQQIgBWsgA0EUahDXFwwDCyAAQQhqQQApAoyZggE3AgAgAEEAKQKEmYIBNwIADAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiADIAYgAhC8IiAAIAUgA0EUahDXFwwBCyABKAIAIAQQ8CwLIANBIGokAAudAwEFfyMAQdAAayICJABBACEDIAJBADsBNCACQQA2AiwgAkEBOgAoIAJBCjYCJCACQQA2AhwgAkEKNgIQIAIgASgCBCIENgIwIAIgBDYCICACIAQ2AhggAiABKAIAIgU2AhQgAiACQRBqEMggIgY2AgwCQCAFIARBChCsH0UNACACIAZBAWoiBjYCDAsCQCAGQQJJDQAgAkEQaiACQQxqEN4TIAIoAhghAyACQRBqEPQsCyACQQA2AkAgAkKAgICAwAA3AjggAkEQaiACQThqIAYQ2QggAiADNgIwIAIgBDYCLCACIAU2AiggAkEANgIkIAJCgICAgMAANwIcIAJB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BEF4aiEEIAcgCEEDdCIIayEHIAggBWpBeGohBQwACwsQ2SEAC6sDAQZ/IwBB8ABrIgMkAAJAQSRFDQAgA0EMaiACQegBakEk/AoAAAsgAkEANgL4ASACQoCAgICAATcD8AEgAkEANgLoASACQQApA/iDngE3AvwBIAJBhAJqQQApA4CEngE3AgAgAyACNgIwAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBAkYNACACEKMgRQ0AIABBgICAgHg2AgAMAQsCQAJAIAIoAogBIgRBwABxDQAgAiAEQcAAcjYCiAEgA0E0aiACEI0vIAIgAigCiAFBv39xNgKIAQwBCyADQTRqIAIQjS8LIAMoAjghBAJAIAMoAjQiBUGAgICAeEcNACAAQYGAgIB4NgIAIAAgBDYCBAwBCyADQcAAaiEGIAMoAjwhBwJAIAFBAXENACADQcwAaiAEIAcQwhMgAygCTEEBRw0AIAMoAlQhASADKAJQIQggA0GrgICAeDYCWCACIAggASADQdgAahDXIwsgACAHNgIIIAAgBDYCBCAAIAU2AgAgACAGKQIANwIMIABBFGogBkEIaigCADYCAAsgA0EMahCFIyADQfAAaiQAC64DAQR/IwBB0ABrIgMkACABKALYASEEAkACQAJAAkACQCABLQDgAUECRg0AIAEoAtwBIQIgA0EEaiABEM0mIANBATYCLCADQci+nAE2AiggA0IBNwI0IANBswc2AkQgA0ECOgBPIAMgA0HAAGo2AjAgAyADQcgAajYCQCADIANBzwBqNgJIIANBEGogA0EoahD0GiADQSRqIANBDGooAgA2AgAgAyADKQIENwIcIAQgAiADQRBqENcaIQIgAS0A4AFBogFGDQEMAwsgARCgCwJAAkAgASgCiAEiBUGAgICAAnFFDQAgASAFQf////99cTYCiAEgA0EoaiACIAEQtSMgASABKAKIAUGAgICAAnI2AogBDAELIANBKGogAiABELUjCyADKAIsIQIgAygCKCIFQYCAgIB4Rw0BIABBgICAgHg2AgAgACACNgIEDAMLIAEgARCXLBCfFwwBCyADKAIwIQYgAEEANgIUIAAgBDYCDCAAIAY2AgggACACNgIEIAAgBTYCACAAIAEoAtQBNgIQDAELIABBgICAgHg2AgAgACACNgIECyADQdAAaiQAC5ID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AkACQCAFDQACQCABRQ0AIAIgBEH/fnE2AogBIANBIGogA0EwaiACEJ0PIAMoAiAhASACIAIoAogBQYABcjYCiAEgAygCJCECDAILIANBGGogA0EwaiACEJ0PIAMoAhwhAiADKAIYIQEMAQsCQCABDQAgAiAEQYABcjYCiAEgA0EIaiADQTBqIAIQng8gAygCCCEBIAIgAigCiAFB/35xNgKIASADKAIMIQIMAQsgA0EQaiADQTBqIAIQng8gAygCFCECIAMoAhAhAQsgACACNgIEIAAgATYCACADQdAAaiQAC4MDAQV/IwBB0ABrIgMkACABKAIMKAIAIQQgASgCFC0AACEFIAEoAhgtAAAhBiABKAIQIQcgA0EwakEIaiABQQhqKAIANgIAIAMgBzYCQCADIAY6AC8gAyAFOgAuIAMgBDYCKCADIAEpAgA3AzAgAigCiAEiBEGAAXEhASADIANBL2o2AkwgAyADQShqNgJIIAMgA0EuajYCRCADIANBL2o2AjwCQAJAIAUNAAJAIAFFDQAgAiAEQf9+cTYCiAEgA0EgaiADQTBqIAIQoA8gAygCICEBIAIgAigCiAFBgAFyNgKIASADKAIkIQIMAgsgA0EYaiADQTBqIAIQoA8gAygCHCECIAMoAhghAQwBCwJAIAENACACIARBgAFyNgKIASADQQhqIANBMGogAhChDyADKAIIIQEgAiACKAKIAUH/fnE2AogBIAMoAgwhAgwBCyADQRBqIANBMGogAhChDyADKAIUIQIgAygCECEBCyAAIAI2AgQgACABNgIAIANB0ABqJAALigMBBH8jAEHQAGsiAyQAIAMgAjoAAyADIAEoAtgBNgIEAkACQAJAIAEtAOABIgJBGEYNAEEEIQRBACEFQQAhBgwBCyADQQhqIAFBARD3ASADKAIMIQQCQCADKAIIIgZBgICAgHhGDQAgAygCECEFIAEtAOABIQIMAQsgAEETNgIAIAAgBDYCBAwBCwJAAkAgAkH/AXEiAkHYAEYNACACQd8ARw0BCyADIAU2AhQgAyAENgIQIAMgBjYCDCADIAE2AgggACABIANBDGoQkwgMAQsgAyAFNgJEIAMgBDYCQCADIAY2AjwgASgCiAEhAiADIANBA2o2AkwgAyADQQRqNgJIAkACQCACQYCABHFFDQAgASACQf//e3E2AogB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ASABQSxqKAIAIQQgAUEkaikCACEPIAFBHGopAgAhECABQRRqKQIAIREgAUEMaikCACESIAFBBGopAgAhEyAFIA42AgAgBUEEaiATNwIAIAVBDGogEjcCACAFQRRqIBE3AgAgBUEcaiAQNwIAIAVBJGogDzcCACAFQSxqIAQ2AgAgCCAENgIAIAkgDzcDACAKIBA3AwAgCyARNwMAIAwgEjcDAEEBIQQgACAAKAIIQQFqNgIIIAMgEzcDACANIQEgBUEwaiIFIAZHDQALCyAEC6IDAQV/IwBB0ABrIgIkACABKALYASEDAkACQAJAAkACQCABLQDgAUECRg0AIAEoAtwBIQQgAkEEaiABEM0mIAJBATYCLCACQci+nAE2AiggAkIBNwI0IAJBswc2AkQgAkECOgBPIAIgAkHAAGo2AjAgAiACQcgAajYCQCACIAJBzwBqNgJIIAJBEGogAkEoahD0GiACQSRqIAJBDGooAgA2AgAgAiACKQIENwIcIAMgBCACQRBqENcaIQQgAS0A4AFBogFGDQEMAwsgARCgCwJAAkAgASgCiAEiBEGAgICABHENACABIARBgICAgARyNgKIASACQShqIAEQpCAgASABKAKIAUH/////e3E2AogBDAELIAJBKGogARCkIAsgAigCLCEEIAIoAigiBUGAgICAeEcNASAAQYCAgIB4NgIAIAAgBDYCBAwDCyABIAEQlywQnxcMAQsgAigCMCEGIAAgAzYCDCAAIAY2AgggACAENgIEIAAgBTYCACAAIAEoAtQBNgIQDAELIABBgICAgHg2AgAgACAENgIECyACQdAAaiQAC9oCAgF/AX4jAEHwAGsiByQAIAcgAjYCDCAHIAE2AgggByAENgIUIAcgAzYCECAHQQI2AhwgB0Gg4psBQZ7imwEgAEEBcRs2AhgCQCAFKAIARQ0AIAdBIGpBEGogBUEQaikCADcDACAHQSBqQQhqIAVBCGopAgA3AwAgByAFKQIANwMgIAdBBDYCXCAHQdCYgQE2AlggB0IENwJkIAdBD61CIIYiCCAHQRBqrYQ3A1AgByAIIAdBCGqthDcDSCAHQcAArUIghiAHQSBqrYQ3A0AgB0EMrUIghiAHQRhqrYQ3AzggByAHQThqNgJgIAdB2ABqIAYQ4iMACyAHQQM2AlwgB0GcmIEBNgJYIAdCAzcC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QQJGDQAgBEEBcUUNAQsCQAJAAkACQCACLQAYDgMAAQIACyADQQhqEIwuDAILIANBCGoQiy4MAQsgA0EIakHUh4gBQZwGEIsNCyADQThqIAEoAgQgASgCCCACIANBCGoQzRMgA0EoakEIaiIBIANBOGpBDGopAgA3AwAgAyADKQI8NwMoAkAgAygCOCIEQYCAgIB4Rg0AIAAgAykCTDcCFCAAQSRqIANBOGpBJGooAgA2AgAgAEEcaiADQThqQRxqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAQLIANBGGpBCGogASkDADcDACADIAMpAyg3AxggAi0AGQ0BDAILQeDuhAFBKEGI74QBEMweAAsgA0EYahD/CQsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC+kCAQZ/IwBBEGsiASQAAkACQAJAAkAgACgCACICRQ0AQQAhAwNAAkAgACgCCCIEIAAoAgQiBU8NACACIARqLQAAQcUARw0AIAAgBEEBajYCCAwCCwJAAkACQAJAIANFDQAgACgCECIGRQ0AIAZBmp6aAUECEIIGDQcgACgCACICRQ0BIAAoAgghBCAAKAIEIQULIAQgBU8NAAJAIAIgBGotAABBtX9qDgICAAELIAAgBEEBajYCCCABIAAQgQggAS0AAA0FIAAgASkDCBDbDQ0GDAILIAAQ/wINBQwBC0EBIQIgACAEQQFqNgIIIABBABCNAg0FCyADQX9qIQMgACgCACICDQALC0EAIQIMAgsgAS0AASEEAkAgACgCECIDRQ0AQQEhAiADQeTjlwFB1OOXASAEQQFxIgUbQRlBECAFGxCCBg0CCyAAIAQ6AARBACECIABBADYCAAwBC0EBIQILIAFBEGokACACC+ICAgR/AX4jAEHAAGsiAiQAIAIgATYCDAJAAkACQCABRQ0AIAIgACgCAEEIakGU9JgBEOUjIAIoAgQhAyACQShqIAIoAgAgARDuCSACQShqEJcPIQQQziAhBiACQgA3AxggAkEBOgAgIAIgBjcDECAEKAIIQRhsIQEgBCgCBCEAA0AgAUUNAiABQWhqIQEgACACQRBqEJEMIQUgAEEYaiEAIAVFDQALIAIpAxAiBkIDg0IAUg0CIAanIgEgASgCACIAQX9qNgIAIABBAUcNAiABIAEoAhAQwCQMAgsgAkIANwI0IAJCgYCAgMAANwIsIAJB3PSYATYCKCACQQxqIAJBKGoQuyEACyACQShqQRBqIAJBEGpBEGopAwA3AwAgAkEoakEIaiACQRBqQQhqKQMANwMAIAIgAikDEDcDKCAEIAJBKGpBpPSYARDAFwsgAyADKAIAQQFqNgIAIAJBwABqJAAL2wICBn8BfiMAQSBrIgIkACACQRBqIAEoAgwiAyABKAIEIgRrQQR2QQhBOBCQDyACKAIUIQUCQCACKAIQQQFGDQBBACEGIAJBADYCDCACIAIoAhgiBzYCCCACIAU2AgQgASgCACEFIAIgASgCCDYCGCACIAU2AhAgAiAENgIUIAIgAzYCHAJAIAQgA0YNAEEAIQYDQCAEQQhqKAIAIQEgBCkDACEIIAdBIGpCADcCACAHQRxqQQA6AAAgB0EYaiABNgIAIAdBEGpCADcCACAHQQhqIAg3AgAgB0EANgIAIAdBKGpCADcCACAHQS1qQgA3AAAgB0E4aiEHIAZBAWohBiAEQRBqIgQgA0cNAAsgAiAENgIUCyACQQRqQQhqIgcgBjYCACACQRBqEK4TIABBCGogBygCADYCACAAIAIpAgQ3AgAgAkEgaiQADwsgBSACKAIYQaiymwEQhSkAC+ECAQJ/IwBBMGsiBiQAAkACQAJAAkACQAJAIAEoAhwiBw0AIAUgA0sNAiAGQQhqIAEgAiAFIAQQ/gQMAQsgBSAESQ0CIAUgA0sNAwJAIAUgBGsgASgCKEkNACAGQRhqIAcgASgCICIBKAIIQX9qQXhxakEIaiACIARqIAIgBWogASgCEBENAAJAIAYoAhgNACAGQQA2AggMAgsgBigCICACayIFIAYoAiQgAmsiAUsNBSAGIAE2AhAgBiAFNgIMIAZBATYCCAwBCyAGQQhqIAEgAiADIAQgBRD4JAtBACEFAkAgBigCCEEBRw0AIAAgBikCDDcCBEEBIQULIAAgBTYCACAGQTBqJAAPCyAFIANBkJaEARDdLAALIAQgBUGAloQBEN4sAAsgBSADQYCWhAEQ3SwACyAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakGElYQBEOIjAAvtAgIFfwJ+IwBBEGsiASQAAkACQAJAAkACQCAAKAIADQAgACgCECIADQFBACECDAQLIAEgAEHHABCWDwJAIAEtAABBAUcNACABLQABIQMCQCAAKAIQIgRFDQBBASECIARB5OOXAUHU45cBIANBAXEiBRtBGUEQIAUbEIIGDQULIAAgAzoABEEAIQIgAEEANgIADAQLAkAgACgCECICRQ0AIAEpAwgiBlANAyACQf3jlwFBBBCCBg0CQgAhBwNAAkAgBiAHUg0AIAAoAhAiA0UNBUEBIQIgA0GB5JcBQQIQggZFDQUMBgsCQCAHUA0AIAAoAhAiAkUNACACQZqemgFBAhCCBg0EC0EBIQIgACAAKAIUQQFqNgIUIAdCAXwhByAAQgEQ2w1FDQAMBQsLIAAQkwQhAgwDCyAAQcWQnAFBARCCBiECDAILQQEhAgwBCyAAEJMEIQIgACAAKAIUIAanazYCFAsgAUEQaiQAIAIL+AIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyACIAEoAggQ+SYPCyACIAEoAgQQ+SYPCyABKAIEIgNBwABqIAIQwgoCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABD5JgwDCyACIAEoAgAQ+SYMAgsgASACEJkPDAELIAEgAhDTEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIAIgA0EQahDxCQ8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABD5JgwDCyACIAEoAgAQ+SYMAgsgAiABKAIAEL8JDAELIAEgAhDtCwsgAUEoaiEBIABBWGoiAA0ACwsL+AIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyACIAEoAggQqAEPCyACIAEoAgQQqAEPCyABKAIEIgNBwABqIAIQqAsCQCADKAKYASIBRQ0AIAFBKGwhACADKAKUAUEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCoAQwDCyACIAEoAgAQqAEMAgsgASACEJoPDAELIAEgAhDaEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIAIgA0EQahDwDA8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCoAQwDCyACIAEoAgAQqAEMAgsgAiABKAIAEMAJDAELIAEgAhDuCwsgAUEoaiEBIABBWGoiAA0ACwsLvAIBBX8gACABaiECA0ACQCAAIAIiA0cNAEEADwsCQCADQX9qIgIsAAAiAUF/Sg0AAkACQCADQX5qIgItAAAiBMAiBUFASA0AIARBH3EhBAwBCwJAAkAgA0F9aiICLQAAIgTAIgZBQEgNACAEQQ9xIQQMAQsgA0F8aiICLQAAQQdxQQZ0IAZBP3FyIQQLIARBBnQgBUE/cXIhBAsgBEEGdCABQT9xciEBCwJAIAFBd2oiBEEXSw0AQQEgBHRBn4CABHENAQsCQCABQYABSQ0AAkAgAUEIdiIERQ0AAkACQCAEQTBGDQAgBEEgRg0BIARBFkcNAyABQYAtRg0EDAMLIAFBgOAARg0DDAILIAFB/wFxQfy7nAFqLQAAQQJxDQIMAQsgAUH/AXFB/LucAWotAABBAXENAQsLIAMgAGsLlAMBAn9BCCECAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBgICAgHhzIgNBFSADQRVJGw4WAAECAwQFBgcICQoLDA0ODxQUEBESEwALIAAgAS0ABDoAAUEAIQIMEwsgACABMQAENwMIQQEhAgwSCyAAIAEzAQQ3AwhBASECDBELIAAgATUCBDcDCEEBIQIMEAsgACABKQMINwMIQQEhAgwPCyAAIAEwAAQ3AwhBAiECDA4LIAAgATIBBDcDCEECIQIMDQsgACABNAIENwMIQQIhAgwMCyAAIAEpAwg3AwhBAiECDAsLIAAgASoCBLs5AwhBAyECDAoLIAAgASsDCDkDCEEDIQIMCQsgACABKAIENgIEQQQhAgwICyAAIAEpAwg3AgRBBSECDAcLIAAgASkCBDcCBEEFIQIMBgsgACABKQMINwIEQQYhAgwFCyAAIAEpAgQ3AgRBBiECDAQLQQchAgwDC0EJIQIMAgtBCiECDAELQQshAgsgACACOgAAC/YCAQJ/IAAoAgAhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCACEL0DDwsgASgCBCACEL0DDwsgASgCBCIDQcAAaiACEK0LAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQvQMMAwsgASgCACACEL0DDAILIAEgAhC2DwwBCyABIAIQ1BILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEJgaDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAUEEaigCACACEL0DDAMLIAEoAgAgAhC9AwwCCyACIAEoAgAQyAkMAQsgASACEPYLCyABQShqIQEgAEFYaiIADQALCwv2AgECfyAAKAIAIQICQAJAAkACQAJAIAEoAgAOBQQAAQIDBAsgASgCBEEBRw0DIAIgASgCCBCdAw8LIAIgASgCBBCdAw8LIAEoAgQiA0HAAGogAhCuCwJAIAMoApgBIgFFDQAgAUEobCEAIAMoApQBQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAiABQQRqKAIAEJ0DDAMLIAIgASgCABCdAwwCCyABIAIQtw8MAQsgASACENUSCyABQShqIQEgAEFYaiIADQALCyADLQA8QQZGDQEgA0EQahCfKA8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABCdAwwDCyACIAEoAgAQnQMMAgsgAiABKAIAEMkJDAELIAEgAhD4CwsgAUEoaiEBIABBWGoiAA0ACwsL8AIBAn8gACgCACECAkACQAJAAkACQCABKAIADgUEAAECAwQLIAEoAgRBAUcNAyACIAEoAggQVA8LIAIgASgCBBBUDwsgASgCBCIDQcAAaiACEKcLAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyACIAFBBGooAgAQVAwDCyACIAEoAgAQVAwCCyABIAIQuA8MAQsgASACENYSCyABQShqIQEgAEFYaiIADQALCyADLQA8QQZGDQEgA0EQahCfKA8LIAEoAgwiAEUNACAAQShsIQAgASgCCEEEaiEBA0ACQAJAAkACQAJAIAFBfGooAgAOBQQAAQIDBAsgASgCAEEBRw0DIAIgAUEEaigCABBUDAMLIAIgASgCABBUDAILIAIgASgCABDHCQwBCyABIAIQ9wsLIAFBKGohASAAQVhqIgANAAsLC8sCAgJ/An4CQAJAAkACQCAAKQMAIgNCfnwiBEICIARCAlQbpw4CAQIACyAAQQhqIQECQAJAIANCAFINACABKQMAIgRCA4NCAFINASAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMAkDAELIAEQwRMLIAApAyAiBEICUQ0CIABBKGohAAJAIARCAFINACAAKQMAIgRCA4NCAFINAyAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMAkDwsgABDBEw8LIABBEGohAQJAIAAoAggNACABKQMAIgRCA4NCAFINAiAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEMAkDwsgARDBEw8LIAApAwgiBEIDg0IAUg0AIASnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQwCQLC/YCAQJ/IAAoAgAhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCACEKUCDwsgASgCBCACEKUCDwsgASgCBCIDQcAAaiACEMwKAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQpQIMAwsgASgCACACEKUCDAILIAEgAhC6DwwBCyABIAIQ1xILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEJ8oDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAUEEaigCACACEKUCDAMLIAEoAgAgAhClAgwC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QAJAIAQNAAJAIAJFDQAgASADQf9+cTYCiAEgBkEgaiAGQTBqIAEQnw8gBigCICECIAEgASgCiAFBgAFyNgKIASAGKAIkIQEMAgsgBkEYaiAGQTBqIAEQnw8gBigCHCEBIAYoAhghAgwBCwJAIAINACABIANBgAFyNgKIASAGQQhqIAZBMGogARCjDyAGKAIIIQIgASABKAKIAUH/fnE2AogBIAYoAgwhAQwBCyAGQRBqIAZBMGogARCjDyAGKAIUIQEgBigCECECCyAAIAI2AgAgACABNgIEIAZB0ABqJAALzQICA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEIwCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEIcjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakG8/psBQQEQsg0gAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogAiAFIAFBABDfBgJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBEGogAiAEEIcjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBIGokAAvKAgIIfwF+IwBBwABrIgIkACABKAIEIQMgAiABKAIIIgRBCEHAABCQDyACKAIEIQUCQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACAEQQZ0IQcgAkEwaiEIIAYhASAFIQkDQCAHRQ0BIAMpAyghCiAIIANBMGoQ6gggAiADELwCIAFBKGogCjcDACACQShqIAo3AwAgASACKQMANwMAIAFBCGogAkEIaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBIGogAkEgaikDADcDACABQTBqIAgpAwA3AwAgAUE4aiACQThqKQMANwMAIAFBwABqIQEgB0FAaiEHIANBwABqIQMgCUF/aiIJDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQcAAaiQADwsgBSACKAIIQfTxmgEQhSkAC+ACAQR/IAAt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EAsgAkEQaiQAC68CAQJ/AkACQAJAAkACQCAAKAIADgUEAAECAwQLIAAoAgRBAUcNAyABIAAoAggQ7RoPCyABIAAoAgQQ7RoPCyAAKAIEIgJBwABqEKUoAkAgAkGEAWooAgAiA0UNACACQYABaigCACEAIANB2ABsIQMDQAJAAkACQCAAKAIAQXxqDgICAAELIAFBADoABAwBCyABIAAQpQcLIABB2ABqIQAgA0Gof2oiAw0ACwsCQCACQZgBaigCACIDRQ0AIAJBlAFqKAIAIQAgA0EobCEDA0AgACABEPIJIABBKGohACADQVhqIgMNAAsLIAItADxBBkYNASACQRBqEKUoDwsgACgCDCIDRQ0AIAAoAgghACADQShsIQMDQCAAIAEQ0gcgAEEoaiEAIANBWGoiAw0ACwsLrwICAX8BfiMAQSBrIgMkAAJAAkACQAJAAkACQAJAAkAgAkH/AXEOBAABAgQACyADQQA2AhAgA0EIaiABIANBEGpBpa+cAUEGELENIAMtAAhBBEYNAiADKQMIIgRC/wGDQgRRDQIgACAENwIADAYLIANBADYCECADQQhqIAEgA0EQakHJ8psBQQkQsQ0gAy0ACEEERg0BIAMpAwgiBEL/AYNCBFENASAAIAQ3AgAMBQsgA0EANgIQIANBCGogASADQRBqQdLymwFBBxCxDSADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUg0CCyADQRBqIAEQjBEgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFINAgsgAEEEOgAADAILIAAgBDcCAAwBCyAAIAQ3AgALIANBIGokAAujAgEDfyMAQTBrIgMkACAAKAIoIQQgA0EIaiAAKAIEIAAoAgggAUH0vYMBEKoiIAMoAgwhACADKAIIIQUgAyACNgIUAkACQAJAIABFDQACQAJAIAUtAAAiAUH/AUYNACABIAFBAnZqIAFBA3FBAEdqQQJqIQEMAQsgBEECaiEBCyABIABPDQECQAJAIAUgAUECdGooAgAiBEF/TA0AAkAgAiABakEBaiIBIABPDQAgBSABQQJ0aigCACEADAILIAEgAEGstYMBEIwVAAsgAg0DIARB/////wdxIQALIANBMGokACAADwtBAEEAQcy1gwEQjBUACyABIABBnLWDARCMFQALIANBADYCGEEAQZD0mAEgA0EUaiAD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IQEMAwsgAikDGCEFIAIoAiQhAyACKAIgIQQgAkGHgICAeDYCKCABIAQgAyACQShqENcjQQhBwAAQmCwiAUUNBCABIAM2AhQgASAENgIQIAEgBTcCCCABQS82AgBBACEDDAILQQIhAyABEJcsIQEMAgsgAkEIaiABEMgTIAIoAgwhASACKAIIIQMLQQJBACADQQFxGyEDCyAAIAM6AAAgACABNgIEIAJBwABqJAAPCwALtwICAn8BfiMAQTBrIgIkAAJAAkACQAJAAkAgAS0A4AEiA0HAAEYNAAJAIAMQoBUNACACQRhqQQRyIAEQzSYgAkEUNgIsIAJBvoScATYCKCACQbCAgIB4NgIYIAEoAtgBIAEoAtwBIAJBGGoQ1xohAyABLQDgAUGiAUcNBCABIAEQlywQnxcMBAsgAkEYaiABENgOIAIoAiAhASACKQMYIgRQDQIgAkEANgIQIAIgAigCJDYCDCACIAE2AgggAkEAOgAUIAIgBDcDAEIAIQQMAQsgAiABEPUaQgEhBAsgACAENwMAIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwAgAEEYaiACQRBqKQMANwMADAILIABCAjcDACAAIAE2AggMAQsgAEICNwMAIAAgAzYCCAsgAkEwaiQAC50CAQZ/IwBBMGsiAiQAAkACQCABKAIAQYCAgIB4Rg0AIAEoAgQhAyACIAEoAggiBEEEQQxBgOmbARCcGSACQQA2AhAgAiACKQMANwIIIAJBCGogBBD8JCACKAIQIQUCQCAERQ0AIAQgBWohBiABQRRqIQcgAigCDCAFQQxsaiEBIAJBIGpBBGohBQNAIAVBCGogB0EIai8BADsBACAFIAcpAgA3AgAgAiADNgIgIAJBFGogAkEgahDZEyABQQhqIAJBFGpBCGooAgA2AgAgASACKQIUNwIAIAFBDGohASADQQxqIQMgBEF/aiIEDQALIAYhBQsgACACKQIINwIAIABBCGogBTYCAAwBCyAAQYCAgIB4NgIACyACQTBqJAALkgIBBn8jAEEgayICJAAgAkEQakEIaiABQQhqKAIAIgM2AgAgAiABKQIANwMQAkAgA0UNACACKAIUIgQgA0ECdGpBfGoiAUUNACABKAIADQAgA0ECdCEBIARBfGohBSADQf////8DcSEGAkADQCAGIQQCQCABDQBBACEE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8JiBATYCFCADIAYpAgA3AgAgAyAGKQIINwIYIAMgA0EPajYCCCADIAM2AhAgASADQRBqIAIRBwANASADKAIQQYuZgQFBAiADKAIUKAIMEQsAIQQMAQsgASAGIAIRBwAhBAsgAEEBOgAFIAAgBDoABCADQSBqJAAgAAvmAQEDfwJAIANBCEkNACAAIAAgA0EDdiIDQQV0IgRqIAAgA0E4bCIFaiADEMMLIQAgASABIARqIAEgBWogAxDDCyEBIAIgAiAEaiACIAVqIAMQwwshAgsCQAJAIAAoAgAiAyABKAIAIgVGDQAgAyAFSSEEDAELIAAoAgQgASgCBEkhBAsCQAJAIAMgAigCACIGRg0AIAMgBkkhAwwBCyAAKAIEIAIoAgRJIQMLAkAgBCADRw0AAkACQCAFIAZGDQAgBSAGSSEADAELIAEoAgQgAigCBEkhAAsgAiABIAQgAHMbIQALIAAL5gEBA38CQCADQQhJDQAgACAAIANBeHEiBGogACADQQN2IgNBDmwiBWogAxDECyEAIAEgASAEaiABIAVqIAMQxAshASACIAIgBGogAiAFaiADEMQLIQILAkACQCAALQAAIgMgAS0AACIFRg0AIAMgBUkhBAwBCyAALQABIAEtAAFJIQQLAkACQCADIAItAAAiBkYNACADIAZJIQMMAQsgAC0AASACLQABSSEDCwJAIAQgA0cNAAJAAkAgBSAGRg0AIAUgBkkhAAwBCyABLQABIAItAAFJIQALIAIgASAEIABzGyEACyAAC48CAQF/IwBB4ABrIgIkACAAKAIAIQAgAkEANgJMIAJCgICAgBA3AkQgAkHovZgBNgJUIAJCoICAgA43AlggAiACQcQAajYCUAJAIAAgAkHQAGoQoAZFDQBB/JWcAUE3IAJBIGpBgL6YAUGAl5wBEOISAAsgAkE4akEIaiACQcQAakEIaigCADYCACACIAIpAkQ3AzggAkELNgI0IAJBCzYCLCACQdwANgIkIAJBBDYCDCACQejDmAE2AgggAkIDNwIUIAIgAEEQajYCMCACIABBDGo2AiggAiACQThqNgIgIAIgAkEgajYCECABKAIAIAEoAgQgAkEIahCMKSEAIAJBOGoQkC0gAkHgAGokACAAC+sBAgR/AX4jAEEgayIFJAACQCACIAAoAgAiBiABa00NAEEAIQcCQAJA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NgIAC/4BAgF/A34jAEEgayIBJAACQAJAAkAgAA4CAQIACyABQQA2AhggAUEBNgIMIAFBrMuYATYCCCABQgQ3AhAgAUEIakHYy5gBEOIjDAELQQBBATYCpO+eAQJAAkBBACkDyOueASICUEUNAEEAKQPQ654BIQMDQCADQn9RDQJBACADQgF8IgJBACkD0OueASIEIAQgA1EiABs3A9DrngEgBCEDIABFDQALQQAgAjcDyOueAQtBAC0AoPCeARpBGBB9IgBFDQEgAEEANgIQIABCgoCAgBA3AgAgACACNwMIQQANAUEAIABBCGo2AqTvngEgAUEgaiQAIAAPCxD6IQALAAvkAQEDfyMAQTBrIgIkAAJAAkACQAJAQQAgASgCACIDQXlqIgQgBCADSxsOAgECAAsgAkEBNgIUIAJBhNyEATYCECACQgE3AhwgAkH2ADYCLCACIAE2AiggAiACQShqNgIYIAJBEGpB+NyEARDiIwALIAAgASkCADcCACAAQRhqIAFBGGooAgA2AgAgAEEQaiABQRBqKQIANwIAIABBCGogAUEIaikCADcCAAwBCyACQQhqIAFBDGooAgA2AgAgAiABKQIENwMAIAAgAhDYFQsCQCADQQlJDQAgARC4GgsgAkEwaiQAC9IBAQN/AkACQAJAAkACQCABKAIMIgMgAksNACADDQEMAgsgASADIAJBf3NqNgIMIAEgASgCACIEIAJqIgNBAWogASgCBCIFIAIgBSAEayIESRs2AgAgAiAETw0BIAEgASgCCCACaiICQQFqNgIIDAMLIAEgASgCACIEIANBf2oiAmpBAWogASgCBCIFIAIgBSAEayIESRs2AgACQCACIARPDQAgASABKAIIIANqNgIIC0EAIQMgAUEANgIMDAELQQAhAwsLIAAgAzYCBCAAIAI2AgAL4wEBBH8gAUHAAGogABCKBgJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBCUKwwDCyAAIAMoAgQQlCsMAgsgACADKAIEELgMDAELIAMoAgwiBUUNACADKAIIIQIgBUEobCEFA0AgAiAAEN8IIAJBKGohAiAFQVhqIgUNAAsLIANBKGoiAyAERw0ACwsCQCABLQA8IgJBBkYN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DwsgACgCKCABEKYBDwsCQCAAKAIIQQNHDQAgACgCDCABEKYBCyAAKAJIIgBFDQIgACgCACABEKkBDwsgAEEgaiEDAkAgAkEDRw0AIAAoAgQgARCmAQsCQCADKAIAQQdGDQAgAyABELMICyAAKAJoIAEQswgPCwJAIAAoAghBA0cNACAAKAIMIAEQpgELIAAoAiggARDNDAsL+QEBAn8jAEEQayICJAACQAJAIAEoAgBBCUcNAAJAAkACQAJAAkACQAJAIAEoAggOEwMAAAIABgYGAgQGAQICAwQEBQYDCyABKAIQIQMgASgCDCEBDAcLIAEoAgwiASgCfCEDIAEoAnghAQwGCyABKAIYIQMgASgCFCEBDAULIAEoAhwhAyABKAIYIQEMBAsgASgCICEDIAEoAhwhAQwDCyACIAFBEGoQ3QwgAigCBCEDIAIoAgAhAQwCCyABKAIUIQMgASgCECEBDAELIAJBCGogARC0DCACKAIMIQMgAigCCCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAvdAQEBfwJAAkACQAJAAkACQAJAAkACQCABKAIADggAAQIDBAUGBwALIAEoAiAiAkEoaiEBIAJBJGohAgwHCyABKAIgIgJBNGohASACQTBqIQIMBgsgASgCBCICQRBqIQEgAkEMaiECDAULIAEoAgQiAkEQaiEBIAJBDGohAgwECyABKAIEIgJBBGohAQwDCyABKAIEIgJBBGohAQwCCyABKAIEIgJBHGohASACQRhqIQIMAQsgASgCBCICQcwAaiEBIAJByABqIQILIAAgASgCADYCBCAAIAIoAgA2AgAL4AEBAX8jAEEQayITJAAgACgCACABIAIgACgCBCgCDBELACECIBNBADoADSATIAI6AAwgEyAANgIIIBNBCGogAyAEIAUgBhC6CSAHIAggCSAKELoJIAsgDCANIA4QugkgDyAQIBEgEhC6CSESIBMtAA0iAiATLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgEigCACIALQAKQYABcQ0AIAAoAgBB1+SXAUECIAAoAgQoAgwRCwAhAAwBCyAAKAIAQciQnAFBASAAKAIEKAIMEQsAIQALIBNBEGokACAAQQFxC84BAQN/IwBBIGsiAyQAAkACQAJAIAEgAmoiAiABTw0AQQAhBAwBC0EAIQQCQCAC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AQF/AkAgACgCACICQQlHDQAgAEEIaiABEKgEDwsCQAJAAkACQAJAAkACQAJAIAIOCQABAgMEBQcGBwALAkAgACgCDCICRQ0AIAJByABsIQIDQCACQbh/aiICDQALCyAAKAIcIgBFDQYgACABEJ0aDwsgAEEIaiABEPoCDwsgACgCHCIARQ0EIAAgARCdGg8LAkACQCAAKAIIDgMAAQUACyABQQA6AAQPCyABQQA6AAQPCyABIAAoAgQQ7RoPCyAAKAIQIgBFDQEgACABEJ0aDwsgASAAKAIEEO0aCwvMAQIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIEQQAQjAICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogASACEMktAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EANgIQIANBCGogAiADQRBqQdCQnAFBARCzDQJAIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIABBBDoAAAsgA0EgaiQAC8oBAgF/AX4jAEEgayIDJAAgA0EQaiABIAIQvBgCQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBADYCECADQQhqIAIgA0EQakHDkJwBQQEQsg0CQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyADQRBqIAFBEGogAhC8GAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIABBBDoAAAsgA0EgaiQAC9MBAQN/IwBBwABrIgIkAAJAAkAgASgCiAEiA0GAA3EiBEUNACABIANB/3xxNgKIASACIAEQii8gASABKAKIASAEcjYCiAEMAQsgAiABEIovCyACKAIAIQECQAJAIAItABQiA0ECRw0AIABBAjoAFCAAIAE2AgAMAQsgAkEgakEMaiACQQxqKQIANwIAIAJBIGpBHGogAkEcaigAADYAACACIAIpAgQ3AiQgAiACKQAVNwA1IAIgAzoANCACIAE2AiAgACACQSBqELAZCyACQcAAaiQAC8QBAQh/IwBBEGsiBCQAIAEtAAYhBSABLQAFIQYgAS0ABCEHQQAhCCABLQAHQf8BcSEJQQAhAQJA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IANBCGogA0EUakGw3YABEJ8bIAMoAggiBSAFIAMoAgxqQX9qQQAgBWtxEOcrIgUNAQALIAQQ2xAhBQsCQCACRQ0AIAUgASAC/AoAAAsgACACNgIEIAAgBTYCACAAIARB////ByAEQf///wdJG0GAgIBwcjYCCCADQSBqJAAL3AEBAn8jAEEQayIDJAACQAJAAkACQCACQX9MDQAgAkHp////B08NASACQRdqQfj///8HcSIEQfH///8HTw0CQQAtAKDwngEaIARBD2pBeHEQfSIERQ0DIAQgAjYCECAEIAA3AwggBEEBNgIAAkAgAkUNACAEQRhqIAEgAvwKAAALIANBEGokACAEDwtByJecAUErIANBD2pB4I6CAUHgj4IBEOISAAtByJecAUErIANBD2pB4I6CAUHwj4IBEOISAAtByJecAUErIANBD2pB4I6CAUHQj4IBEOISCwAL+QEBAX8gACgCOCIBIAAoAjwQgBQgACgCNCABEPksIAAoAkAgACgCRBD3LCAAKAJQIgEgACgCVBDXHiAAKAJMIAEQ+iwgACgCaCIBIAAoAmwQqCMgACgCZCABEPssIAAoAnwiASAAKAKAARCpIyAAKAJ4IAEQ+SwgACgCjAEiASAAKAKQARCqIyAAKAKIASABEPosIAAoApgBIgEgACgCnAEQqiMgACgClAEgARD6LCAAKAK8ASAAKALAARD8LCAAKALMASAAKALQARD9LCAAKAKgASAAKAKkARD8LCAAKAKsASAAKAKwARD5LCAAKALcASAAKALgARD5LAvGAQEDfyMAQTBrIgQkAAJAIAIoAhAiBSACKAIUIgZLDQACQAJAIAIoAgBBf2pBAkkNACAEQQxqIAAgAigCCCACKAIMIAUgBhCEEEEAIQIgBCgCDEEBRw0BQQEhAiAEKAIQIAQoAhRNDQEgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDiIwALIAUgAigCDE8NASAAIAIoAgggBWotAABqLQAAIQILIAJFDQAgAxCyFwsgBEEwaiQAC7wBAQV/IwBBkAJrIgIkAEEAIQMCQEGAAkUNACACQRBqQQBBgAL8CwALQQEhBAJAA0AgAiABIARBf2oiBUEDdkEQcWoiBikDACAGKQMIIAVB/wBxEIkWAkAgAikDAEIBg1ANACADQf8BcUEBaiIDQf8BcSADRw0CCyACQRBqIARqIAM6AAAgBEEBaiIEQYACRw0ACwJAQYACRQ0AIAAgAkEQakGAAvwKAAALIAJBkAJqJAAPC0Gs0IMBEM4sAAvOAQEBfwJAAkACQAJAAkACQAJAIAAoAgAOBwABAgMFBAYACyAAQQA2AhgPCyAAKAIMIgJFDQIgACgCCCEAIAJBKGwhAgNAAkAgACgCAEEHRg0AIAAgARDqDQsgAEEoaiEAIAJBWGoiAg0ADAMLCyAAKAIEIAEQ6g0PCyAAKAIMIgJFDQAgACgCCCEAIAJBOGwhAgNAIAAgARDwGyAAQThqIQAgAkFIaiICDQALCw8LIAAoAgQgARDqDSAAKAIIIAEQvQMPCyAAKAIEIAEQvQMLyAEBBX8gAS0AJiECIAFBADoAJgJAIAAoAggiA0UNACAAKAIEIQQgA0EGdCEDIAEtACUhBSABLQAkIQYDQCABQQI6ACQgBCABELgeIAEgBToAJSABIAY6ACQgBEHAAGohBCADQUBqIgMNAAsLIABBGGohBSABIAI6ACYCQCAAKAIUIgNFDQAgACgCECEEIANBDGwhAwNAIAEgBCgCABBUIARBDGohBCADQXRqIgMNAAsLAkAgBSgCAEGAgICAeEYNACABIAUQkhsLC8wBAQJ/IAFBwABqEKUoAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABCmAQwBCyAAIAMQvgcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAJ4IgNFDQAgAyAAEL0fCwJAIAEoApgBIgJFDQAgASgClAEhAyACQShsIQIDQCADIAAQoQkgA0EoaiEDIAJBWGoiAg0ACwsCQCABLQA8QQZGDQAgAUEQahClKAsLwAEBB38jAEHgAGshAwJAIAAoAggiBCABRg0AIAAoAgQiBSABQdgAbGohBiAFIARB2ABsaiEEIAIoAgQhASACKAIMIQcDQCABIAdGDQEgAiABQdgAaiIFNgIEIAEoAgAiCEENRg0BAkBB1ABFIgkNACADQQxqIAFBBGpB1AD8CgAACyAEIAg2AgACQCAJDQAgBEEEaiADQQxqQdQA/AoAAAsgACAAKAIIQQFqNgIIIAUhASAEQdgAaiIEIAZHDQALCwvPAQEDfyAAQcAAahCwJCAAQZABaiECIAAoAoQBQdgAbCEDIAAoAoABIQQCQANAIANFDQECQAJAAkACQAJAIAQoAgAOBgQBAgMEAAQLIARBBGogARCQLwwDCyAEQQRqIAEQ0ScMAgsgBEEEaiABEJgvDAELIARBBGogARDyEwsgBEHYAGohBCADQah/aiEDDAALCwJAIAAoAngiBEUNACABIARBDGooAgAgBEEQaigCABCZJgsgAiABEPITAkAgAC0APEEGRg0AIABBEGoQsCQLC7oBAQJ/IAAgAC0ADSABLQANIgIgAkEDRhs6AA0gACAALQAMIAEtAAwiAiACQQJGGzoADCAAIAAtAAsgAS0ACyICIAJBAkYbOgALIAAgAC0ACiABLQAKIgIgAkECRhs6AAogACABQQlqIABBCWogAS0ACCICGy0AADoACSAAIAAoAgAgASgCACIDIANBAkYiAxs2AgAgACACIAAtAAhyQQFxOgAIIAAgAEEEaiABQQRqIAMbKAIANgIEIAALuQEBAn8CQAJAAkAgACgCCCICIAFJDQAgAiABRg0BIAIgAWshAgJAAkAgACgCBCABQQJ0aiIDLQAAIgFB/wFGDQAgASABQQJ2aiABQQNxQQBHakECaiIBIAJJDQEgASACQdy1gwEQjBUACyAAKAIoQQJqIgEgAk8NAwsgAyABQQJ0aigCACIBQQEgAUF/ShsPCyABIAJBhL6DARDcLAALQQBBAEHMtYMBEIwVAAsgASACQey1gwEQjBUAC8sBAQN/IwBB0ABrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCUCECIANBADYCUAJAIAJFDQAgAUEIaiACEQMAAkAgACgCBCICKAIAIgMoAjgiAEECRg0AIABFDQAgAygCQCIARQ0AIAMoAjwgAEEBEKwWIAIoAgAhAwsCQEHIAEUNACADIAFBCGpByAD8CgAACyABQdAAaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsIueATYCCCABQgQ3AhAgAUEIakHUvpwBEOIjAAvOAQEBfwJAIAAoAgAiAkEJRw0AIABBCGogARCaBA8LAkACQAJAAkACQAJAAkACQCACDgkAAQIDBAUHBgcACwJAIAAoAgwiAkUNACACQcgAbCECA0AgAkG4f2oiAg0ACwsgACgCHCIARQ0GIAAgARCPGQ8LIABBCGogARCbBw8LIAAoAhwiAEUNBCAAIAEQjxkPCyAAKAIIDQMgACgCKCABEIwHDwsgASAAKAIEEKsBDwsgACgCECIARQ0BIAAgARCPGQ8LIAEgACgCBBCrAQsL2QEBA38jAEEgayIDJAACQAJAIAEoAogBIgRBgISQgAFxQYCEkIABRg0AIAEgBEGAhJCAAXI2AogBIANBCGogARCVLyABIAEoAogBIARB//vv/35ycTYCiAEMAQsgA0EIaiABEJUvCyADKAIMIQQCQAJAIAMoAggiBUGAgICAeEcNAEENIQEMAQsgACADKQIQNwIMIABBFGogA0EYaikCADcCACAAIAI2AhwgACAENgIIIAAgASgC1AE2AiBBCyEBIAUhBAsgACABNgIAIAAgBDYCBCADQSBqJAALygEBAX8jAEEQayILJAAgACgCACABIAIgACgCBCgCDBELACECIAtBADoADSALIAI6AAwgCyAANgIIIAtBCGogAyAEIAUgBhC6CSAHIAggCSAKELoJIQogCy0ADSICIAstAAwiAXIhAAJAIAJBAUcNACABQQFxDQACQCAKKAIAIgAtAApBgAFxDQAgACgCAEHX5JcBQQIgACgCBCgCDBELACEADAELIAAoAgBByJCcAUEBIAAoAgQoAgwRCwAhAAsgC0EQaiQAIABBAXELuQECAn8BfiMAQRBrIgQkAAJAAkACQCACIANqQX9qQQAgAmtxrSABrX4iBkIgiKcNACAGpyIDQYCAgIB4IAJrTQ0BCyAAQQA2AgRBASECDAELAkAgAw0AIAAgAjYCCEEAIQIgAEEANgIEDAELIARBCGogAiADEL4kAkAgBCgCCCIFRQ0AIAAgBTYCCCAAIAE2AgRBACECDAELIAAgAzYCCCAAIAI2AgRBASECCyAAIAI2AgAgBEEQaiQAC8ABAQR/IwBBMGsiAyQAQQAhBAJAIAIoAhAiBSACKAIUIgZLDQAgAEEEaiEAAkAgAigCAEF/akECSQ0AIANBDGogACACKAIIIAIoAgwgBSAGEOIGIAMoAgwiBEEBRw0BIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANB/JSEATYCGCADQgQ3AiAgA0EYakHUpIMBEOIjAAsgBSACKAIMTw0AIAAtAAAgAigCCCAFai0AAEYhBAsgA0EwaiQAIAQLyAEBBH8jAEHQAGsiAiQAIAJBNGpBGGoiA0EANgIAIAJBNGpBEGoiBEIENwIAIAJBNGpBCGoiBUIANwIAIAJCgICAgMAANwI0IAJBNGpBABCDJSACQcAAakEAEIMlIAJBGGogAygCADYCACACQRBqIAQpAgA3AwAgAkEIaiAFKQIANwMAIAIgAikCNDcDACACQQA2AiwgAkIANwIkIAJCgICAgMAANwIcIAIgARCpCgJAQTBFDQAgACACQTD8CgAACyACQdAAaiQAC7kBAgJ/AX4jAEEQayIEJAACQAJAAkAgAiADakF/akEAIAJrca0gAa1+IgZCIIinDQAgBqciA0GAgICAeCACa00NAQsgAEEANgIEQQEhAgwBCwJAIAMNACAAIAI2AghBACECIABBADYCBAwBCyAEQQhqIAIgAxDCJAJAIAQoAggiBUUNACAAIAU2AgggACABNgIEQQAhAgwBCyAAIAM2AgggACACNgIEQQEhAgsgACACNgIAIARBEGokAAuzAQEEfwJAAkACQCABLQAAIgIgAUF+ai0AACIDRw0AIAEtAAEiBCABQX9qLQAASQ0BDAILIAIgA08NASABLQABIQQLIAFBfGohASAEQf8BcSEFAkADQCABQQRqIAFBAmoiAy8AADsAACADIABGDQECQAJAIAIgAS0AACIDRw0AIAUgAUEBai0AAEkNAQwDCyACIANPDQILIAFBfmohAQwACwsgAUECaiAEQQh0IAJyOwAADwsLoAEBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICQhWJIAIgACkDECIDIAApAwB8IgRCIIl8IgKFIgVCEIkgBSABIANCDYkgBIUiA3wiAUIgiXwiBIUiBSACIAEgA0IRiYUiAXwiAkIgiXwiAzcDACAAIAVCFYkgA4U3AxggACABQg2JIAKFIgFCEYkgBCABfCIBhTcDECAAIAFCIIk3AwgL1wEAAkAgASACQbL9mwFBAhDcJUUNAEHeAA8LAkAgASACQcL3mwFBBhDcJUUNAEHfAA8LAkAgASACQbClnAFBAhDcJUUNAEHgAA8LAkAgASACQbKlnAFBChDcJUUNAEHhAA8LAkAgASACQY30mwFBAhDcJUUNAEGEAQ8LAkAgASACQcTymwFBBRDcJUUNAEGdAQ8LAkAgASACQZyvnAFBCRDcJUUNAEGC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gBBxRQ0AIAIgAUH//29xNgKIASADQQhqIANBEGogAhCbCCADKAIIIQEgAiACKAKIAUGAgBByNgKIASADKAIMIQIMAQsgAyADQRBqIAIQmwggAygCBCECIAMoAgAhAQsgACACNgIEIAAgATYCACADQTBqJAALwAEBAX8jAEEwayIDJAAgA0EQakEIaiABQQhqKQIANwMAIAMgASkCADcDECADIAEoAhg2AiggAyABKQIQNwMgAkACQCACKAKIASIBQYCAEHFFDQAgAiABQf//b3E2AogBIANBCGogA0EQaiACEJoIIAMoAgghASACIAIoAogBQYCAEHI2AogBIAMoAgwhAgwBCyADIANBEGogAhCaCCADKAIEIQIgAygCACEBCyAAIAI2AgQgACABNgIAIANBMGokAAu/AQEBfyMAQRBrIgckACAAKAIAIAEgAiAAKAIEKAIMEQsAIQIgB0EAOgANIAcgAjoADCAHIAA2AgggB0EIaiADIAQgBSAGELoJIQYgBy0ADSICIActAAwiAXIhAAJAIAJBAUcNACABQQFxDQACQCAGKAIAIgAtAApBgAFxDQAgACgCAEHX5JcBQQIgACgCBCgCDBELACEADAELIAAoAgBByJCcAUEBIAAoAgQoAgwRCwAhAAsgB0EQaiQAIABBAXELuAEBBH8jAEEQayIFJAACQAJAIAEoAgAiBg0AQQAhBiAFQQxqIQcMAQsgBSADNgIMIAYgBGwhBiABKAIEIQggBUEIaiEHCyAHIAY2AgACQAJAIAUoAgwiBkUNACAFKAIIIQcCQAJAIAINACAIIAYgBxCKKQwBCyAIIAcgBiAEIAJsIgQQ9QMiA0UNAgsgASACNgIAIAEgAzYCBAtBgYCAgHghBgsgACAENgIEIAAgBjYCACAFQRBqJAALpwEBBH8gACgCACECIAAgARD6GwJAIAAoAggiASACIAAoAgwiA2tNDQAgACgCACEEAkACQCACIAFrIgUgAyAFayIDTQ0AIAQgAmsgA08NAQsgBCAFayECAkAgBUECdCIDRQ0AIAAoAgQiBSACQQJ0aiAFIAFBAnRqIAP8CgAACyAAIAI2AggPCyADQQJ0IgFFDQAgACgCBCIAIAJBAnRqIAAgAfwKAAALC7UBAQR/IwBBMGsiAiQAQQEhAwJAIAEoAgAiBEGbsIMBQQEgASgCBCIFKAIMEQsADQBBACEDIAAoAgAiAGgiAUEfSw0AA0AgAiABNgIMIAJBATYCFCACQZCwgwE2AhAgAkIBNwIcIAJB+AA2AiwgAiACQShqNgIYIAIgAkEMajYCKAJAIAQgBSACQRBqEN4FRQ0AQQEhAwwCCyAAQX4gAXdxIgBoIgFBH00NAAsLIAJBMGokACADC8MBAQJ/IwBBIGsiAiQAIAJBADoAECACQuSAgICgHzcCCCACQoqAgICgATcCACACQRRqIAIgARDDAQJAIAIoAhRBgICAgHhGDQAgAigCHCIBRQ0AIAFBBHQhAyACKAIYQQxqIQEDQCABQQA6AAAgAUEQaiEBIANBcGoiAw0ACwsgAkEUakEBEPMCAkACQCACKAIUQYCAgIB4Rg0AIAAgAigCGCACKAIcEIMQDAELIABBAjoADAsgAkEUahCBJSACQSBqJAAL1AEBAX8jAEHAAGsiAiQAIAAoAgAhACACQciDhAE2AjggAkHwi4QBNgIwIAIgAEHgBGo2AiwgAkHgi4QBNgIoIAIgAEHgAmo2AiQgAkHQi4QBNgIgIAIgAEHgAGo2AhwgAkHAi4QBNgIYIAIgAEGEBWo2AhQgAkGwi4QBNgIQIAIgAEGABWo2AgwgAkGgi4QBNgIIIAIgADYCBCACIABBiAVqNgI8IAIgAkE8ajYCNCABQeSMhAFBA0GsjIQBQQcgAkEEakEHEKQKIQAgAkHAAGokACAAC7kBAQJ/IwBBwABrIgIkACACIAE2AgggAkEANgIwIAJCADcCKCACIAAgASACQShqEL4LIgM2AgwCQCABIAMgACgCZGoiA08NACACQQM2AhQgAkHI4JgBNgIQIAJCAzcCHCACQQ02AjwgAkELNgI0IAJBDTYCLCACIABB5ABqNgIoIAIgAkEoajYCGCACIAJBCGo2AjggAiACQQxqNgIwIAJBEGpB4OCYARDiIwALIAJBwABqJAAgASADawu6AQIBfwF+AkACQAJAAkACQAJAIAAoAgAOBAECAwQACyAAKQMQIAAoAhgQrRkPCyAAKQMIIgJCA4NCAFINAyACpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMAkDwsgAEEIahDBEw8LIAApAxgiAlANASACQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDAJA8LIAAoAgQiABCSASAAQcAAQQgQrBYLC7oBAQN/IwBBIGsiASQAIABBBGooAgAhAiAAKAIAIgMoAgAhACADQQA2AgAgACgCFCEDIABBADYCFAJAIANFDQAgAUEIaiADEQMAAkAgAigCACIAKAIARQ0AIAAQygogAigCACEACyAAIAEpAgg3AgAgAEEIaiABQQhqQQhqKQIANwIAIAFBIGokAEEBDwsgAUEANgIYIAFBATYCDCABQbCLngE2AgggAUIENwIQIAFBCGpB1L6cARDiIwAL0gEBAX8jAEHAAGsiAiQAIAAoAgAhACACQfSSmwE2AjggAkH8mJkBNgIwIAIgAEHRAGo2AiwgAkG8mZkBNgIoIAIgAEEgajYCJCACQayZmQE2AiAgAiAAQcAAajYCHCACQayYmQE2AhggAiAANgIUIAJBpJabATYCECACIABBzABqNgIMIAJBhJKbATYCCCACIABBOGo2AgQgAiAAQdAAajYCPCACIAJBPGo2AjQgAUHclJsBQQtB4JabAUEHIAJBBGpBBxCkCiEAIAJBwABqJAAgAAvOAQEBfyMAQcAAayICJAAgACgCACEAIAJB+J2ZATYCOCACQeidmQE2AjAgAiAAQRhqNgIsIAJByJyZATYCKCACIAA2AiQgAkHonJkBNgIgIAIgAEEhajYCHCACQeicmQE2AhggAiAAQSBqNgIUIAJBuJyZATYCECACIABBDGo2AgwgAkGEkpsBNgIIIAIgAEEQajYCBCACIABBHGo2AjwgAiACQTxqNgI0IAFBr/eaAUERQaT6mgFBByACQQRqQQcQpAohACACQcAAaiQAIAALzgEBAX8jAEHAAGsiAiQAIAAoAgAhACACQaD0mgE2AjggAkGQ9JoBNgIwIAIgAEEgajYCLCACQaTzmgE2AiggAiAAQSpqNgIkIAJBpPOaATYCICACIABBKWo2AhwgAkGk85oBNgIYIAIgAEEoajYCFCACQYD0mgE2AhAgAiAAQQhqNgIMIAJBhJKbATYCCCACIAA2AgQgAiAAQSRqNgI8IAIgAkE8ajYCNCABQYD1mgFBC0HI9JoBQQcgAkEEakEHEKQKIQAgAkHAAGokACAAC84BAQF/IwBBwABrIgIkACAAKAIAIQAgAkGU+poBNgI4IAJB/PeaATYCMCACIABBGGo2AiwgAkGs8poBNgIoIAIgADYCJCACQaTzmgE2AiAgAiAAQSFqNgIcIAJBpPOaATYCGCACIABBIGo2AhQgAkGU8poBNgIQIAIgAEEMajYCDCACQYSSmwE2AgggAiAAQRBqNgIEIAIgAEEcajYCPCACIAJBPGo2AjQgAUGv95oBQRFBpPqaAUEHIAJBBGpBBxCkCiEAIAJBwABqJAAgAAvSAQEBfyMAQcAAayICJAAgACgCACEAIAJB9JKbATYCOCACQeSSmwE2AjAgAiAAQdEAajYCLCACQcSWmwE2AiggAiAAQSBqNgIkIAJBtJabATYCICACIABBwABqNgIcIAJBlJKbATYCGCACIAA2AhQgAkGklpsBNgIQIAIgAEHMAGo2AgwgAkGEkpsBNgIIIAIgAEE4ajYCBCACIABB0ABqNgI8IAIgAkE8ajYCNCABQdyUmwFBC0HglpsBQQcgAkEEakEHEKQKIQAgAkHAAGokACAAC7wBAQJ/IAFBwABqIAAQohYCQCABKAKEASICRQ0AIAEoAoABIQMgAkHYAGwhAgNAAkACQAJAIAMoAgBBfGoOAgIAAQsgACADQQRqKAIAEIkgDAELIAAgAxDUBwsgA0HYAGohAyACQah/aiICDQALCwJAIAEoApgBIgJFDQAgASgClAEhAyACQShsIQIDQCADIAAQxgkgA0EoaiEDIAJBWGoiAg0ACwsCQCABLQA8QQZGDQAgAUEQaiAAEKIWCwu6AQIBfwF+AkACQAJAAkACQAJAIAAoAgAOBAECAwQACyAAKQMQIAAoAhgQrRkPCyAAKQMIIgJCA4NCAFINAyACpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMAkDwsgAEEIahDBEw8LIAApAxgiAlANASACQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDAJA8LIAAoAgQiABC4ASAAQcAAQQgQrBYLC7kBAQR/AkAgACgCCCICRQ0AIAAoAgQhAyACQThsIQRBACECA0ACQAJAAkACQCADIAJqIgUoAgAOAwABAgALIAVBCGogARCkKCAFQShqKAIAIAEQswgMAgsgASAFQRBqKQMAIAVBIGooAgAQ/iIMAQsgBUEEaigCACABELMIIAVBGGooAgAiBUUNACAFKAIAIAEQqQELIAQgAkE4aiICRw0ACwsCQCAAKAIUIgJFDQAgAigCACABEKkBCwvbAQECfwJAAkAgACgCACIBQQlHDQAgAEEIahCqJCECDAELQQEhAgJAAkACQAJAAkACQAJAAkAgAQ4JAAECAwgEBQgHAAsgAC0AIEEBcyECDAcLAkACQCAAKAIIDggIAAgIBwcIAQgLIAAoAigoAhhBgICAgHhHIQIMBwsgACgCDBCIEyECDAYLIAAtACBBAXMhAgwFCyAAKAIIDgMEAgMECyAALQAUQQFzIQIMAwsgACgCBC0AQUEBcyECDAILIAAoAigoAhhBgICAgHhHIQIMAQtBACECCyACQQFxC8wBAQV/IwBBoAFrIgIkAAJAAkAgAb1C////////////AINC//////////f/AFUNACACQRBqIQMgASACQRBqEPsBIQQMAQsgAkEIaiABEK4fIAIoAgwhBCACKAIIIQMLIAJBlAFqIARBAUEBEJAPIAIoApgBIQUCQCACKAKUAUEBRg0AIAIoApwBIQYCQCAERQ0AIAYgAyAE/AoAAAsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkGgAWokAA8LIAUgAigCnAFB2LucARCFKQALvAEBAn8gACABQcAAahCuCgJAIAEoAoQBIgJFDQAgASgCgAEhAyACQdgAbCECA0ACQAJAAkAgAygCAEF8ag4CAgABCyADQQRqKAIAIAAQ+QIMAQsgACADENYHCyADQdgAaiEDIAJBqH9qIgINAAsLAkAgASgCmAEiAkUNACABKAKUASEDIAJBKGwhAgNAIAMgABDLCSADQShqIQMgAkFYaiICDQALCwJAIAEtADxBBkYNACAAIAFBEGoQrgoLC7oBAgF/AX4CQAJAAkACQAJAAkAgACgCAA4EAQIDBAALIAApAxAgACgCGBCtGQ8LIAApAwgiAkIDg0IAUg0DIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQwCQPCyAAQQhqEMETDwsgACkDGCICUA0BIAJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMAkDwsgACgCBCIAELIBIABBwABBCBCsFgsLtwEBAX8CQCAAKAKIASIEQQFxDQAgASACIAMQ1xohAwJAIARBCHENAAJAIARBAnFFDQACQCAAKAJYIgQgACgCUEcN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AggiAEYNACACQShsIgRFDQAgAygCBCIFIABBKGxqIAUgAUEobGogBPwKAAALIAMgAiAAajYCCAsLsgEBAn8gACgCACICQcAAaiABEMIKAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQ+SYMAwsgASAAKAIAEPkmDAILIAAgARCZDwwBCyAAIAEQ0xILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAEgAkEQahDxCQsLsgEBAn8gACgCACICQcAAaiABEKgLAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQqAEMAwsgASAAKAIAEKgBDAILIAAgARCaDwwBCyAAIAEQ2hILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAEgAkEQahDwDAsLpwECAX8BfiMAQSBrIgIkACABKQMIIQMgAUEJNgIIIAJBCGpBEGogAUEYaikDADcDACACQRBqIAFBEGopAwA3AwAgAiADNwMIAkACQCADpyIBQQlGDQAgAUF+akEGSw0BCyACQQhqEO8OQcu4nAFBKEG4hpwBEMweAAsgACACKQMINwMAIABBCGogAkEIakEIaikDADcDACAAIAIpAxg3AxAgAkEgaiQAC7EBAgN/An4jAEEgayIDJAAgASgC2AEhBCADQQhqIAEQmw8gAykDGCEGAkACQAJAIAMoAghBAXENACADKQMQIQcMAQsgAyADKAIMIgU2AggCQCACDQAgAEECOgAYIAAgBTYCACAGEL8hDAILIANBCGoQsShCACEHCyABEKALIABBADoAGCAAIAc3AxAgACAEQQFqNgIIIAAgBjcDACAAIAEoAtQBQX5qNgIMCyADQSBqJAALsQEBAn8jAEEgayIDJAACQAJAIAEoAhwtAAANACADQRhqIAIgARCPEyADKAIcIQIgAygCGCEBDAELAkAgAigCiAEiBEGAAnENACACIARBgAJyNgKIASADQQhqIAEgAhDvAiADKAIIIQEgAiACKAKIAUH/fXE2AogBIAMoAgwhAgwBCyADQRBqIAEgAhDvAiADKAIUIQIgAygCECEBCyAAIAE2AgAgACACNgIEIANBIGokAAuxAQECfyMAQSBrIgMkAAJAAkAgASgCHC0AAA0AIANBGGogAiABEI8TIAMoAhwhAiADKAIYIQEMAQsCQCACKAKIASIEQYACcQ0AIAIgBEGAAnI2AogBIANBCGogASACEPACIAMoAgghASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEPACIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC7EBAQJ/IwBBIGsiAyQAAkACQCABKAIYLQAADQAgA0EYaiACIAEQjRMgAygCHCECIAMoAhghAQwBCwJAIAIoAogBIgRBgAJxDQAgAiAEQYACcjYCiAEgA0EIaiABIAIQ9wIgAygCCCEBIAIgAigCiAFB/31xNgKIASADKAIMIQIMAQsgA0EQaiABIAIQ9wIgAygCFCECIAMoAhAhAQsgACABNgIAIAAgAjYCBCADQSBqJAALsQEBAn8jAEEgayIDJAACQAJAIAEoAhwtAAANACADQRhqIAIgARCOEyADKAIcIQIgAygCGCEBDAELAkAgAigCiAEiBEGAAnENACACIARBgAJyNgKIASADQQhqIAEgAhDuAiADKAIIIQEgAiACKAKIAUH/fXE2AogBIAMoAgwhAgwBCyADQRBqIAEgAhDuAiADKAIUIQIgAygCECEBCyAAIAE2AgAgACACNgIEIANBIGokAAuxAQECfyMAQSBrIgMkAAJAAkAgASgCHC0AAA0AIANBGGogAiABEI4TIAMoAhwhAiADKAIYIQEMAQsCQCACKAKIASIEQYACcQ0AIAIgBEGAAnI2AogBIANBCGogASACEPECIAMoAgghASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEPECIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC7sBAQJ/IwBBEGsiAiQAAkACQAJAAkACQAJAAkAgASgCAA4HAAIBAgMEBQALIAIgAUEIahCvGSACKAIEIQMgAigCACEBDAULIAEoAgwhAyABKAIIIQEMBAsgASgCFCEDIAEoAhAhAQwDCyABKAIQIQMgASgCDCEBDAILIAEoAgghAyABKAIEIQEMAQsgAkEIaiABKAIEEMgDIAIoAgwhAyACKAIIIQELIAAgATYCACAAIAM2AgQgAkEQaiQAC7EBAQJ/IwBBIGsiAyQAAkACQCABKAIYLQAADQAgA0EYaiACIAEQjRMgAygCHCECIAMoAhghAQwBCwJAIAIoAogBIgRBgAJxDQAgAiAEQYACcjYCiAEgA0EIaiABIAIQ+AIgAygCCCEBIAIgAigCiAFB/31xNgKIASADKAIMIQIMAQsgA0EQaiABIAIQ+AIgAygCFCECIAMoAhAhAQsgACABNgIAIAAgAjYCBCADQSBqJAALqgEBBX8jAEEgayICJAAgAkEYaiIDIAFBNGooAgA2AgAgAkEQaiIEIAFBLGopAgA3AwAgAkEIaiIFIAFBJGopAgA3AwAgAiABKQIcNwMAQRxBBBDUJyIGQRhqIAMoAgA2AgAgBkEQaiAEKQMANwIAIAZBCGogBSkDADcCACAGIAIpAwA3AgAgAUEEahDoJyABEKwvIABBpJ2cATYCBCAAIAY2AgAgAkEgaiQAC5sBAQJ/IwBBEGsiBSQAAkACQCABKAIAIgFBAXFFDQAgBUEIaiIGIAIgASAEEQQAIgRrIgIgA2oiATYCACAFIAQ2AgAgBSABNgIEIAVBICABQQp2Z2siAUEHIAFBB0kbQQJ0QQFyNgIMIAUgAhCHDCAAQQhqIAYpAgA3AgAgACAFKQIANwIADAELIAAgASACIAMQ1AsLIAVBEGokAAulAQEDfyMAQRBrIgIkACACQQhqIAFB0OSEARDlIyACKAIMIQECQAJAIAIoAggiAygCCCIEDQAgAEEQNgIADAELIAMgBEF/aiIENgIIIAAgAygCBCAEQRxsaiIDKQIANwIAIABBCGogA0EIaikCADcCACAAQRBqIANBEGopAgA3AgAgAEEYaiADQRhqKAIANgIACyABIAEoAgBBAWo2AgAgAkEQaiQAC7cBAQN/IwBBIGsiAiQAIAJCABD0CwJAAkAgAigCAEGEgICAeEcNAEEALQCg8J4BGiACKAIEIQNBEBB9IgRFDQEgBCABOwEMIAQgAzYCCCAEQoGAgIAQNwIAIARBDmogAUEQdjoAACAAIAQ2AgAgAEHsm4MBNgIEIAJBIGokAA8LIAJBEGpBCGogAkEIaikDADcDACACIAIpAwA3AxBByJecAUErIAJBEGpB9JSDAUHEmYMBEOISCwALuwEBA38jAEEgayICJAAgAkIAEPQLAkACQCACKAIAQYSAgIB4Rw0AQQAtAKDwngEaIAIoAgQhA0HYABB9IgRFDQEgBEKBgICAEDcDAAJAQcgARQ0AIARBCGogAUHIAPwKAAALIAQgAzYCUCAAQbSbgwE2AgQgACAENgIAIAJBIGokAA8LIAJBEGpBCGogAkEIaikDADcDACACIAIpAwA3AxBByJecAUErIAJBEGpB9JSDAUHEmYMBEOISCwALvAEBA38jAEEgayICJAAgAkIAEPQLAkACQCACKAIAQYSAgIB4Rw0AQQAtAKDwngEaIAIoAgQhA0GcAxB9IgRFDQEgBEKBgICAEDcCAAJAQZADRQ0AIARBCGogAUGQA/wKAAALIAQgAzYCmAMgAEH8moMBNgIEIAAgBDYCACACQSBqJAAPCyACQRBqQQhqIAJBCGopAwA3AwAgAiACKQMANwMQQciXnAFBKyACQRBqQfSUgwFBxJmDARDiEgsAC7wBAQN/IwBBIGsiAiQAIAJCABD0CwJAAkAgAigCAEGEgICAeEcNAEEALQCg8J4BGiACKAIEIQNBjAIQfSIERQ0BIARCgYCAgBA3AgACQEGAAkUNACAEQQhqIAFBgAL8CgAACyAEIAM2AogCIABBxJqDATYCBCAAIAQ2AgAgAkEgaiQADwsgAkEQakEIaiACQQhqKQMANwMAIAIgAikDADcDEEHIl5wBQSsgAkEQakH0lIMBQcSZgwEQ4hILAAurAQEEfyMAQSBrIgIkAEEBIQMCQCAAQQFqIAEQ0AcNACACQQA2AhhBASEDIAJBATYCDCACQYz/hwE2AgggAkIENwIQIAEoAgAiBCABKAIEIgUgAkEIahCMKQ0AIABBAmogARDQBw0AQQAhAyAALQAAQQFHDQAgAkEANgIYIAJBATYCDCACQaD/hwE2AgggAkIENwIQIAQgBSACQQhqEIwpIQMLIAJBIGokACADC6ABAQV/IwBBEGsiAyQAAkACQCACQQdLDQAgAiEEIAEhBQNAAkAgBA0AQQAhBgwDCyAEQX9qIQRBASEGIAUtAAAhByAFQQFqIQUgB0EuRw0ADAILCyADQQhqQS4gASACELAJIAMoAghBAUYhBgsgACAGIAAtAARyOgAEIAAoAgAiBCgCACABIAIgBEEEaigCACgCDBELACEEIANBEGokACAEC6YBAgJ/AX4CQAJAIAAoAgAiAS0AJUECRw0AIAFBBGooAgAhAAJAIAEoAggiAkUNAANAIAAQgQcgAEE4aiEAIAJBf2oiAg0ACyABQQRqKAIAIQALIAEoAgAgABCfLQwBCwJAIAEpAwgiA0IDg0IAUg0AIAOnIgAgACgCACICQX9qNgIAIAJBAUcNACAAIAAoAhAQwCQLIAFBIGoQrQ8LIAFBKEEIEKwWC6ABAQJ/IwBBwABrIgEkABD0JyECIAEgACgCABBCIAJBOGogAUE4aikDADcDACACQTBqIAFBMGopAwA3AwAgAkEoaiABQShqKQMANwMAIAJBIGogAUEgaikDADcDACACQRhqIAFBGGopAwA3AwAgAkEQaiABQRBqKQMANwMAIAJBCGogAUEIaikDADcDACACIAEpAwA3AwAgAUHAAGokACACC74BAQF/IwBBwABrIgIkACAAKAIAKAIAIQAgAkG0i5kBNgI4IAJBpIuZATYCMCACIABBOGo2AiwgAkGkipkBNgIoIAIgAEEgajYCJCACQZSKmQE2AiAgAiAAQcQAajYCHCACQdSKmQE2AhggAiAAQQhqNgIUIAJBhJKbATYCECACIAA2AgwgAiAAQSRqNgI8IAIgAkE8ajYCNCABQciQmwFBD0GYkJsBQQYgAkEMakEGEKQKIQAgAkHAAGokACAAC8EBAQF/IwBBwABrIgIkACAAKAIAKAIAIQAgAkGUi5kBNgI4IAJBhIuZATYCMCACIAA2AiwgAkGUipkBNgIoIAIgAEHSAGo2AiQgAkGUipkBNgIgIAIgAEHRAGo2AhwgAkGUipkBNgIYIAIgAEHQAGo2AhQgAkGEkpsBNgIQIAIgAEHIAGo2AgwgAiAAQSBqNgI8IAIgAkE8ajYCNCABQeyPmwFBDEG8j5sBQQYgAkEMakEGEKQKIQAgAkHAAGokACAAC7MBAgF/AXwjAEEgayICJAACQAJAAkACQCABQQ9LDQAgAkEIaiAAIAFBChCYCCACLQAIQQFGDQIgAikDELohAwwBCyACQQhqIAAgARCBASACLQAIQQFGDQIgAisDECEDCyACQSBqJAAgAw8LIAIgAi0ACToAH0HIl5wBQSsgAkEfakH4m5kBQbCfmQEQ4hIACyACIAItAAk6AB9ByJecAUErIAJBH2pBiJyZAUHAn5kBEOISAAu+AQACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwABAgMEBQYHCAkKAAsgAEEANgIYDwsgACgCKCABEL0DIAAoAghBAkkNCCAAKAIMIAEQvQMPCyAAKAIIQQFHDQcgACgCDCABEL0DDwsgACgCBCABEL0DDwsgACgCBCABEOYTDwsgACgCBCABEL0DDwsgACgCBCABEL0DDwsgACgCBCABEL0DDwsgACgCBCABEL0DDwsgACgCBCABEL0DCwu+AQEBfyMAQcAAayICJAAgACgCACgCACEAIAJBiJCbATYCOCACQfiPmwE2AjAgAiAAQThqNgIsIAJBkImbATYCKCACIABBIGo2AiQgAkGAiZsBNgIgIAIgAEHEAGo2AhwgAkHkjpsBNgIYIAIgAEEIajYCFCACQYSSmwE2AhAgAiAANgIMIAIgAEEkajYCPCACIAJBPGo2AjQgAUHIkJsBQQ9BmJCbAUEGIAJBDGpBBhCkCiEAIAJBwABqJAAgAAvBAQEBfyMAQcAAayICJAAgACgCACgCACEAIAJBrI+bATYCOCACQZyPmwE2AjAgAiAANgIsIAJBgImbATYCKCACIABB0gBqNgIkIAJBgImbATYCICACIABB0QBqNgIcIAJBgImbATYCGCACIABB0ABqNgIUIAJBhJKbATYCECACIABByABqNgIMIAIgAEEgajYCPCACIAJBPGo2AjQgAUHsj5sBQQxBvI+bAUEGIAJBDGpBBhCkCiEAIAJBwABqJAAgAAu0AQEBfyAAKAIEIgEgACgCCBDnIiAAKAIAIAEQly0gAEEMahD8ASAAKAIMIAAoAhAQni0CQCAAKAIwRQ0AIABBMGoQ5QELAkAgACgCNCIBRQ0AIAEQyQ8gASgCACABQQRqKAIAEJktIAFBFEEEEKwWCwJAIAAoAjgiAUUNACABELEfIAEoAgAgAUEEaigCABCcLSABQRRBBBCsFgsgACgCHCIBIAAoAiAQ+w8gACgCGCABEJstC7ABAQJ/IAAoAgAiAkHAAGogARCtCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgAEEEaigCACABEL0DDAMLIAAoAgAgARC9AwwCCyAAIAEQtg8MAQsgACABENQSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEJgaCwuwAQECfyAAKAIAIgJBwABqIAEQrgsCQCACKAKYASIARQ0AIABBKGwhAyACKAKUAUEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABCdAwwDCyABIAAoAgAQnQMMAgsgACABELcPDAELIAAgARDVEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCfKAsLrgEBAn8gACgCACICQcAAaiABEKcLAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQVAwDCyABIAAoAgAQVAwCCyAAIAEQuA8MAQsgACABENYSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEJ8oCwu0AQEBfyAAKAIEIgEgACgCCBDnIiAAKAIAIAEQly0gAEEMahD8ASAAKAIMIAAoAhAQni0CQCAAKAIwRQ0AIABBMGoQ5gELAkAgACgCNCIBRQ0AIAEQyQ8gASgCACABQQRqKAIAEJktIAFBFEEEEKwWCwJAIAAoAjgiAUUNACABELEfIAEoAgAgAUEEaigCABCcLSABQRRBBBCsFgsgACgCHCIBIAAoAiAQ+w8gACgCGCABEJstC7ABAQJ/IAAoAgAiAkHAAGogARDMCgJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgAEEEaigCACABEKUCDAMLIAAoAgAgARClAgwCCyAAIAEQug8MAQsgACABENcSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEJ8oCwuwAQECfyAAKAIAIgJBwABqIAEQigsCQCACKAKYASIARQ0AIABBKGwhAyACKAKUAUEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABDnAQwDCyABIAAoAgAQ5wEMAgsgACABELsPDAELIAAgARDYEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCcGgsLsAEBAn8gACgCACICQcAAaiABEK8LAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQ0wEMAwsgASAAKAIAENMBDAILIAAgARC8DwwBCyAAIAEQ2RILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQnygLC7ABAQJ/IAAoAgAiAkHAAGogARCwCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEKsBDAMLIAEgACgCABCrAQwCCyAAIAEQvQ8MAQsgACABENsSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEJ8oCwu0AQEBfyAAKAIEIgEgACgCCBDnIiAAKAIAIAEQly0gAEEMahD8ASAAKAIMIAAoAhAQni0CQCAAKAIwRQ0AIABBMGoQ1gELAkAgACgCNCIBRQ0AIAEQyQ8gASgCACABQQRqKAIAEJktIAFBFEEEEKwWCwJAIAAoAjgiAUUNACABELEfIAEoAgAgAUEEaigCABCcLSABQRRBBBCsFgsgACgCHCIBIAAoAiAQ+w8gACgCGCABEJstC7QBAQF/IAAoAgQiASAAKAIIEOciIAAoAgAgARCXLSAAQQxqEPwBIAAoAgwgACgCEBCeLQJAIAAoAjBFDQAgAEEwahDXAQsCQCAAKAI0IgFFDQAgARDJDyABKAIAIAFBBGooAgAQmS0gAUEUQQQQrBYLAkAgACgCOCIBRQ0AIAEQsR8gASgCACABQQRqKAIAEJwtIAFBFEEEEKwWCyAAKAIcIgEgACgCIBD7DyAAKAIYIAEQmy0LngEBA38jAEEgayICJAACQAJAIAEoAgQiAyABKAIAIgQoAhRPDQAgASADQQFqNgIEIAJBCGpBBHIgBCgCECADQQR0aiIBQQRqKAIAIAFBCGooAgAQ0hMgAEEIaiACQQhqQQhqKQMANwMAIABBEGogAkEIakEQaikDADcDACACQQM6AAggACACKQMINwMADAELIABBBjoAAAsgAkEgaiQAC50BAQF/IwBBIGsiASQAIAFBBGpBFGogAEEQaikCADcCACABQQRqQQxqIABBCGopAgA3AgAgASAAKQIANwIIAkBBCEHAABD7KyIADQAACyAAQRo2AgAgACABKQIENwIEIABBDGogAUEEakEIaikCADcCACAAQRRqIAFBBGpBEGopAgA3AgAgAEEcaiABQRxqKAIANgIAIAFBIGokACAAC7YBAQJ/IwBBMGsiAiQAAkACQAJAIAEtAOABQdsARg0AQYCAgIB4IQMMAQsgARCgCyACQRhqIAFBABCMCCACKAIcIQECQCACKAIYIgNBgICAgHhGDQAgAkEQaiACQShqKQIANwMAIAIgAikCIDcDCAwBCyAAQYGAgIB4NgIAIAAgATYCBAwBCyAAIAE2AgQgACADNgIAIAAgAikDCDcCCCAAQRBqIAJBEGopAwA3AgALIAJBMGokAAugAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBA3QhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQTsQwgsaIAFBeGohASAAQQhqIQAMAAsLIAJBBGoQniMhASACQRBqJAAgAQupAQEEfyMAQRBrIgEkAEGAgMQAIQICQCAAKAIAKAJQIgMgACgCCCIERg0AIAAoAgQhAgJAAkAgABD2DyIAQYABTw0AQQEhAAwBCwJAIABBgBBPDQBBAiEADAELQQNBBCAAQYCABEkbIQALIAEgAiAEIAAgA2pBhLuEARC3GiABIAEoAgAiADYCCCABIAAgASgCBGo2AgwgAUEIahDeHyECCyABQRBqJAAgAguhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBHGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQfcAEMILGiABQWRqIQEgAEEcaiEADAALCyACQQRqEJ4jIQEgAkEQaiQAIAELugEBAX8jAEHAAGsiAiQAIAAoAgAhACACQaTjhwE2AjggAkGU44cB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2wMQwgsaIAFBaGohASAAQRhqIQAMAAsLIAJBBGoQniMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBMGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQb8CEMILGiABQVBqIQEgAEEwaiEADAALCyACQQRqEJ4jIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQQV0IQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakHeAxDCCxogAUFgaiEBIABBIGohAAwACwsgAkEEahCeIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQYufnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EwbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB7AMQwgsaIAFBUGohASAAQTBqIQAMAAsLIAJBBGoQniMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBDGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQfkDEMILGiABQXRqIQEgAEEMaiEADAALCyACQQRqEJ4jIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQQR0IQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakH+AxDCCxogAUFwaiEBIABBEGohAAwACwsgAkEEahCeIyEBIAJBEGokACABC7oBAQF/IwBBwABrIgIkACAAKAIAIQAgAkGojZkBNgI4IAJBmI6ZATYCMCACIABBGGo2AiwgAkHYjZkBNgIoIAIgAEEcajYCJCACQfiNmQE2AiAgAiAAQQxqNgIcIAJBiI6ZATYCGCACIAA2AhQgAkGEkpsBNgIQIAIgAEEQajYCDCACIABBHWo2AjwgAiACQTxqNgI0IAFB8IObAUEKQcCDmwFBBiACQQxqQQYQpAohACACQcAAaiQAIAALoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQThsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakG8BBDCCxogAUFIaiEBIABBOGohAAwACwsgAkEEahCeIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQYufnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0E4bCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBvwQQwgsaIAFBSGohASAAQThqIQAMAAsLIAJBBGoQniMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBOGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQcYEEMILGiABQUhqIQEgAEE4aiEADAALCyACQQRqEJ4jIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQQN0IQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakHHBBDCCxogAUF4aiEBIABBCGohAAwACwsgAkEEahCeIyEBIAJBEGokACABC7oBAQF/IwBBwABrIgIkACAAKAIAIQAgAkHYnZkBNgI4IAJB6JyZATYCMCACIABBEmo2AiwgAkHonJkBNgIoIAIgAEERajYCJCACQbicmQE2AiAgAiAAQQxqNgIcIAJB6JyZATYC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AgAgAUEBRw0AIAAgACgCEBDAJAsLrAEBAX8jAEEQayIEJAACQAJAAkACQCAALQAAQQFHDQAgASACELktDQEQtyYhAgwDCyAAIAEgAhD4EiICDQIgAC0AAEEBRg0BIARBCGogACgCBCIAKAIAKAIAELotIARBCGoQyiYiAg0CIAMgACgCABCECSICDQIgBEEEOgAIIARBCGoQyiYhAgwCCxCVAyECDAELQcu4nAFBKEHozpsBEMweAAsgBEEQaiQAIAILrAEBAX8jAEEQayIEJAACQAJAAkACQCAALQAAQQFHDQAgASACELktDQEQtyYhAgwDCyAAIAEgAhD4EiICDQIgAC0AAEEBRg0BIARBCGogACgCBCIAKAIAKAIAELotIARBCGoQyiYiAg0CIAMgACgCABCxJSICDQIgBEEEOgAIIARBCGoQyiYhAgwCCxCVAyECDAELQcu4nAFBKEHozpsBEMweAAsgBEEQaiQAIAILpgEBAX8jAEEgayIEJAAgBCADOgAfIAQgAjoAHgJAAkAgASgCiAEiA0GAIHENACABIANBgCByNgKIASAEQQhqIARBHmogBEEfaiABEL4CIAQoAgghAyABIAEoAogBQf9fcTYCiAEgBCgCDCEBDAELIARBEGogBEEeaiAEQR9qIAEQvgIgBCgCFCEBIAQoAhAhAwsgACADNgIAIAAgATYCBCAEQSBqJAALpQEBA38jAEEQayICJABBACEDAkAgAS0AkQFBIHFFDQBBACEDIAEtAOABQfIAakH/AXFBA0sNAEEAIQMgARDUCSIERQ0AAkAgBC0AACIEEKAVDQBBACEDIARBfmoOAwABAAELIAJBBGogAUGQ1JsBQQRBABDCBAJAIAIoAgRFDQAgAkEEakEEahDnBwtBASEDCyAAQQA6AAAgACADOgABIAJBEGokAAulAQIBfwF+IwBBIGsiBCQAIARBEGogAyABQQAQjAICQAJAIAQtABBBBEYNACAEKQMQIgVC/wGDQgRRDQAgACAFNwIADAELIAQgAjYCGCAEIAE2AhQgBEEBNgIQIARBCGogAyAEQRBqQbylnAFBBBC0DQJAIAQtAAhBBEYNACAEKQMIIgVC/wGDQgRRDQAgACAFNwIADAELIABBBDoAAAsgBEEgaiQAC40BAQN/AkAgA0EISQ0AIAAgACADQQN2IgNB4ABs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ACABNgIEIABBADsBAAsgA0EQaiQAC6EBACAAQQA6ABggAEF/NgIUIAAgBjYCECAAIAU2AgwgACAENgIIIAAgAzYCBCAAIAI2AgACQCABKAIUIgYgASgCDEcNACABQQxqQeC4mwEQrx0LIAEgBkEBajYCFCABKAIQIAZBHGxqIgEgACkCADcCACABQQhqIABBCGopAgA3AgAgAUEQaiAAQRBqKQIANwIAIAFBGGogAEEYaigCADYCAAuSAQEBf0H/ASEFAkAgA0H/AXFFDQBBf0EAIANrQQdxdEF/cyADQQdxdCEFCyAAQQg6AA4gACADOgANIAAgBToADCAAIAE2AgggACAEOgAWIABBADoAFSAAIAJBfmo2AgQgACABQQFqNgIAIAAgASACakF/ajYCECAAQX9BfyAEQQdxdEF/cyAEQf8BcUEIRhs6ABQLrAEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEOkJDAELIAJBCGogAUEBQQFB2LucARCjGiACKAIIIQUgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAALrAEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEOkJDAELIAJBCGogAUEBQQFB2LucARCfGiACKAIIIQUgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAALowECAn8BfiMAQRBrIgQkAAJAAkACQCADRQ0AAkAgAS0APEEBRw0AIARBCGogARCiFwJAIAQtAAhBBEYNACAEKQMIIgZC/wGDQgRSDQMLIAFBADoAPCABKAIAIQUgAUEANgIAIAVBAUcNACABIAEoAgQQxQULIAEoAiggAiADEIsJIAEgAiADEN4HCyAAQQQ6AAAMAQsgACAGNwIACyAEQRBqJAALnwEBAX8jAEEgayICJAACQAJAAkAgAS0AFEECRg0AIAIgACABIAEoAhgQoQcgAi0AFEEDRw0BIAEtABRBAkYNACAAKAIUIAEQqAgaCyABKAIYIAAQ+gYMAQsgARCAKSABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwALIAJBIGokAAujAQICfwF+IwBBEGsiBCQAAkACQAJAIANFDQACQCABLQA8QQFHDQAgBEEIaiABEKIXAkAgBC0ACEEERg0AIAQpAwgiBkL/AYNCBFINAwsgAUEAOgA8IAEoAgAhBSABQQA2AgAgBUEBRw0AIAEgASgCBBDFBQsgASgCKCACIAMQiwkgASACIAMQ3gcLIABBBDoAAAwBCyAAIAY3AgALIARBEGokAAusAQEEfyMAQRBrIgIkACABKAIMIQMCQAJAAkACQAJAIAEoAgQOAgABAgsgAw0BQQEhBEEAIQEMAgsgAw0AIAEoAgAiAygCBCEBIAMoAgAhBAwBCyAAIAEQ6QkMAQsgAkEIaiABQQFBAUHYu5wBEKkaIAIoAgghBSACKAIMIQMCQCABRQ0AIAMgBCAB/AoAAAsgACABNgIIIAAgAzYCBCAAIAU2AgALIAJBEGokAAujAQICfwF+IwBBEGsiBCQAAkACQAJAIANFDQACQCABLQA8QQFHDQAgBEEIaiABEKIXAkAgBC0ACEEERg0AIAQpAwgiBkL/AYNCBFINAwsgAUEAOgA8IAEoAgAhBSABQQA2AgAgBUEBRw0AIAEgASgCBBDFBQsgASgCKCACIAMQiwkgASACIAMQogoLIABBBDoAAAwBCyAAIAY3AgALIARBEGokAAubAQIDfwF+IwBBIGsiAiQAQQAhA0EAIQQCQANAIAEgBEYNASAAKQIAIQUgAEGBgICAeDYCACACQQhqQRBqIABBEGopAgA3AwAgAkEIakEIaiAAQQhqKQIANwMAIAIgBTcDCAJAIAWnQYGAgIB4Rg0AIARBAWohBCACQQhqEIMpDAELCyABIARrIQMgAkEIahCDKQsgAkEgaiQAIAMLpQEBBH8jAEEQayICJAAgAiABKAIUIgMQnSMCQAJAIAIoAgBBAUcNACAAIAIpAwg3AxAgAEL+////BzcDCCAAQQA2AgAMAQsgAigCBCEEAkAgAyABQQxqIgUoAgBHDQAgBUHEiYABEPUbCyAAIAQ2AgQgAEEDNgIAIAEgA0EBajYCFCABKAIQIANBCWxqIgFCADcAACABQQhqQQA6AAALIAJBEGokAAuxAQEDfyMAQSBrIgMkACADQgAQ9AsCQAJAIAMoAgBBhICAgHhHDQBBAC0AoPCeARogAygCBCEEQRAQfSIFRQ0BIAUgAjoADSAFIAE6AAwgBSAENgIIIAVCgYCAgBA3AgAgAEHUmYMBNgIEIAAgBTYCACADQSBqJAAPCyADQRBqQQhqIANBCGopAwA3AwAgAyADKQMANwMQQciXnAFBKyADQRBqQfSUgwFBxJmDARDiEgsAC48BAgN/AX4CQAJAIAGtQgx+IgVCIIinDQAgBaciAkF4Sw0AIAJBB2pBeHEiAiABQQhqaiIDIAJJDQAgA0H4////B0sNAEEALQCg8J4BGiADEH0iA0UNASAAQQA2AgwgACABQX9qIgQ2AgQgACADIAJqNgIAIAAgBCABQQN2QQdsIAFBCUkbNgIIDwsQ3yELAAukAQICfwF+AkACQAJAIAEoAgBBBUYNACABKQIAIgVCIIinIQMCQAJAAkAgBaciBEF9aiIBQQIgAUECSRsOAwABAgALQQEhASACEK0jIQIMAwsgAkUNA0EBIQEgAyACQX9qEKohIQIMAgtBASEBIAQgAxCnISECDAELIAEoAgQhAkEAIQELIAAgAjYCBCAAIAE2AgAPC0H04IMBQSRBmOGDARCqFwALlQECAX8CfiAAIAAoAjhBAWo2AjggACABrUL/AYMiAyAAKAI8IgFBA3RBOHGthiAAKQMwhCIENwMwAkACQEEIIAFrIgJBAUsNACAAIAApAxggBIU3AxggABD6DSAAKQMwIQQgACADIAJBA3StiDcDMCAAIAQgACkDAIU3AwAgAUF5aiEBDAELIAFBAWohAQsgACABNgI8C5UBAgF/An4gACAAKAI4QQFqNgI4IAAgAa1C/wGDIgMgACgCPCIBQQN0QThxrYYgACkDMIQiBDcDMAJAAkBBCCABayICQQFLDQAgACAAKQMYIASFNwMYIAAQ+g0gACkDMCEEIAAgAyACQQN0rYg3AzAgACAEIAApAwCFNwMAIAFBeWohAQwBCyABQQFqIQELIAAgATYCPAuVAQIBfwJ+IAAgACgCOEEBajYCOCAAIAGtQv8BgyIDIAAoAjwiAUEDdEE4ca2GIAApAzCEIgQ3AzACQAJAQQggAWsiAkEBSw0AIAAgACkDGCAEhTcDGCAAEPoNIAApAzAhBCAAIAMgAkEDdK2INwMwIAAgBCAAKQMAhTcDACABQXlqIQEMAQsgAUEBaiEBCyAAIAE2AjwLqgEBBH8gACgCBCEBAkAgACgCCCICRQ0AIAFBBGohAwNAAkACQAJAAkACQAJAIANBfGooAgAOBAECAwQACyADEJwQDAQLIANBBGoQjRQMAwsgAygCAEUNAiADQQRqKAIAIgQQkgEgBEHAAEEIEKwWDAILIAMoAgAiBBCSASAEQcAAQQgQrBYMAQsgAxCUCQsgA0EoaiEDIAJBf2oiAg0ACwsgACgCACABEJotC7QBAQN/A39BCCEBQQEhAgJAAkACQAJAAkACQAJAAkACQCAAKAIAIgNBc2oOFwUFBwABCAcCBwcFBgcHAwUFBwcHBwcFBAtBBCEBDAcLIAAtABFFDQNBDCEBDAYLIAAoAghBAkcPCyAAKAIIQQBHDwsgA0EwRw0CIAAoAgQoAgBBfHJBfkkPC0EAIQIMAQsgACgCBEGAgICAeEYNACAAKAIMRQ8LIAIPCyAAIAFqKAIAIQAMAAsLpgECAX8BfiMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACkDAEJ9fCIDp0EBakEAIANCAlQbDgMAAQIACyACIAA2AgQgAUGOhZsBQQUgAkEEakGjBBD9CyEADAILIAIgAEEIajYCCCABQYeFmwFBByACQQhqQaQEEP0LIQAMAQsgAiAAQQhqNgIMIAFB/oSbAUEJIAJBDGpBpQQQ/QshAAsgAkEQaiQAIAALiwEBAn8CQCAAIAFHDQBBgIDEAA8LAkAgACwAACIBQX9MDQAgAUH/AXEPCyAALQABQT9xIQIgAUEfcSEDAkAgAUFfSw0AIANBBnQgAnIPCyACQQZ0IAAtAAJBP3FyIQICQCABQXBPDQAgAiADQQx0cg8LIAJBBnQgAC0AA0E/cXIgA0ESdEGAgPAAcXILpgECAX8BfiMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACkDAEJ9fCIDp0EBakEAIANCAlQbDgMAAQIACyACIAA2AgQgAUGOhZsBQQUgAkEEakGiBhD9CyEADAILIAIgAEEIajYCCCABQYeFmwFBByACQQhqQaMGEP0LIQAMAQsgAiAAQQhqNgIMIAFB/oSbAUEJIAJBDGpBpAYQ/QshAAsgAkEQaiQAIAALrgEBAn8CQCAAKAIAIgFBCUYNAAJAAkACQAJAAkACQAJAIAFBfmoiAkEBIAJBB0kbDgYBAgMEBQYACyAAQQRqEOcHDwsgACkDCBC+IQ8LIAApAxAQviECQCABDQAgACkDCBC+IQ8LIABBBGoQ5wcPCyAAKQMIEL4hIAApAxAQviEPCyAAKQMIEL4hIAApAxAQviEPCyAAKQMIEL4hDwsgACgCEBDrKCAAKQMIEL4hCwudAQEEfyMAQRBrIgIkAAJAIAFFDQAgACgCHCAAKAIgIAEoAhAQnyohAyACIAAoAiggACgCLCABKAIMIgQgAygCACIFIAQgBUkbIAQgBSAEIAVLGxC1HSACIAIoAgAiBCACKAIEajYCDCACIAQ2AgggAkEIahCGFkUNACABKAIMIQEgACADKAIAQSAQ6x4gACABQSgQ6x4LIAJBEGokAAuZAQICfwF+IwBBEGsiAyQAIAFBCGohBAJAAkACQAJAIAEoAgBBAUcNACADQQhqIAQgAhBoIAMtAAhBBEYNAiADKQMIIgVC/wGDQgRSDQEMAgsgA0EIaiAEIAIQ/BcgAy0ACEEERg0BIAMpAwgiBUL/AYNCBFENASAAIAU3AgAMAgsgACAFNwIADAELIABBBDoAAAsgA0EQaiQAC6IBAQF/AkACQAJAAkACQAJAIAAoAgBBe2oiAUEEIAFBBkkbDgUBAgMEBQALIABBCGoQuB0gACgCKBDFGw8LIAApAwgQvyEPCyAAQQhqEK4sDwsgAEEIahC8Kw8LIABBCGoQuB0gAEHIAGoQuisgAEEoahC+Kg8LIAAQuB0CQCAAKAIgQQdGDQAgAEEgahDkFQsgAEHoAGoQvyogAEHIAGoQvioLrgEBAn8CQCAAKAIAIgFBCUYNAAJAAkACQAJAAkACQAJAIAFBfmoiAkEBIAJBB0kbDgYBAgMEBQYACyAAQQRqELUHDwsgACkDCBC/IQ8LIAApAxAQvyECQCABDQAgACkDCBC/IQ8LIABBBGoQtQcPCyAAKQMIEL8hIAApAxAQvyEPCyAAKQMIEL8hIAApAxAQvyEPCyAAKQMIEL8hDwsgACgCEBDFJyAAKQMIEL8hCwuoAQEBfyAAQegAahDXJAJAIAAoAmxFDQAgAEHsAGoQ1yQLIABBHGogACgCFCAAKAIYIAAoAhAoAhARCgACQCAAKAJEIgFBgICAgHhGDQAgASAAQcgAaigCABDwLCAAKAJQIABB1ABqKAIAENUsIAAoAlwgAEHgAGooAgAQlS0LAkAgAEF/Rg0AIAAgACgCBCIBQX9qNgIEIAFBAUcNACAAQYABQRAQrBYLC5sBAgF/AX4jAEHAAGsiAyQAIAMgATYCCCADIAA2AgQgAyACNgIMIANBAzYCJCADQdSEggE2AiAgA0EDNgIUIANBvISCATYCECADQQM2AhwgA0ELrUIghiIEIANBDGqthDcDOCADQeQArUIghiADQQRqrYQ3AzAgAyAEIANBCGqthDcDKCADIANBKGo2AhggA0EQakGIjZkBEOIjAAuOAQIBfwF+AkAgAa0gA61+IgVCIIinRQ0AIABBADYCAA8LAkAgBaciASACQX9qaiIEIAFPDQAgAEEANgIADwsCQCADIARBACACa3EiAWpBCGoiAyABTw0AIABBADYCAA8LAkAgA0GAgICAeCACa0sNACAAIAE2AgggACADNgIEIAAgAjYCAA8LIABBADYCAAuhAQEFf0EAIQEgABCnEiICIQMCQANAIAEhBCADIgUoAgQiAUUNASABIQMgASgCACAARw0ACyAFIAEoAgQiAzYCBAJAAkACQCACKAIIIAFGDQADQCADRQ0CAkAgAygCACAARw0AQQIhAwwECyADKAIEIQMMAAsLIAIgBDYCCAtBACEDCyAAIAM6AAAgAUEANgIIEOQhAAsgAEEAOgAAIAIQmiQLrQEBAn8jAEEQayIDJAACQAJAAkAgAkF/TA0AIAJB9f///wdPDQFBAC0AoPCeARogAkELakF8cUEEEJonIgRFDQIgBEKBgICAEDcCAAJAIAJFDQAgBEEIaiABIAL8CgAACyAAIAI2AgQgACAENgIAIANBEGokAA8LQciXnAFBKyADQQ9qQZjbgwFBqNuDARDiEgALQciXnAFBKyADQQ9qQdC6gAFBqLuAARDiEgsAC58BAQJ/IAAQpQkhASAAKALAEiAAKALEEiICKAIIQX9qQXhxakEIaiACKAIYEQQAIQICQCAALQDUEkEBRw0AQcu4nAFBKEGo64MBEMweAAsgASACaiAAKALQEiIAKALQAkEUbGogACgC3AJBAnRqIAAoAsQCIgIoAhBBA3RqIAIoAhxBBXRqIAIoAihBDGxqIAIoAixqIAAo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aiQAC6MBAgF/AX4jAEEQayICJAACQAJAAkACQCAAKAIAIgApAwBCfnwiA0ICIANCAlQbpw4DAAECAAsgAiAAQQhqNgIEIAFB/oSbAUEJIAJBBGpBhgYQ/QshAAwCCyACIABBCGo2AgggAUGHhZsBQQcgAkEIakGHBhD9CyEADAELIAIgADYCDCABQY6FmwFBBSACQQxqQYgGEP0LIQALIAJBEGokACAAC5YBAQF/QQAtAKDwngEaAkBBwAAQfSIBDQAACyABIAApAwA3AwAgAUE4aiAAQThqKQMANwMAIAFBMGogAEEwaikDADcDACABQShqIABBKGopAwA3AwAgAUEgaiAAQSBqKQMANwMAIAFBGGogAEEYaikDADcDACABQRBqIABBEGopAwA3AwAgAUEIaiAAQQhqKQMANwMAIAELmgECA38CfiABKAIMIQIgASgCACIDKQMAIQUCQAJAIAEoAgQiAQ0AQgAhBkEAIQQMAQsgAyABQQR0a0Fwaq1CIIYgAUERbEEZaq2EIQZBCCEECyAAIAY3AiQgACAENgIgIAAgAjYCGCAAIAM2AhAgACADQQhqNgIIIAAgAyABakEBajYCDCAAIAVCf4VCgIGChIiQoMCAf4M3AwAL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBH3EhAgsgAyACdLcL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBH3EhAgsgAyACdbcL0wEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBH3EhAgsgAyACdrgLmQEBAX8jAEEgayIFJAAgBSAEOgAHIAUgAjYCACAFQQhqQQhqIANBCGooAgA2AgAgBSADKQIANwMIIAEoAogBIQMgBSAFNgIYIAUgBUEHajYCFAJAAkAgA0EIcQ0AIAEgA0EIcjYCiAEgACAFQQhqIAEQoAEgASABKAKIAUF3cTYCiAEMAQsgACAFQQhqIAEQoAELIAVBIGokAAuVAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCEAIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCAAQQJ0IQECQANAIAFFDQEgAiADNgIMIAJBBGogAkEMakEuEMILGiABQXxqIQEgA0EEaiEDDAALCyACQQRqEJ4jIQEgAkEQaiQAIAELlQEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQYufnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEMbCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBPRDCCxogAUF0aiEBIANBDGohAwwACwsgAkEEahCeIyEBIAJBEGokACABC5UBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgASgCAEGLn5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABBAnQhAQJAA0AgAUUNASACIAM2AgwgAkEEaiACQQxqQTwQwgsaIAFBfGohASADQQRqIQMMAAsLIAJBBGoQniMhASACQRBqJAAgAQuVAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCEAIAEoAgBBi5+cAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCAA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AA8LAkAgASACQa2HnAFBBBDcJUUNAEHqAA8LAkAgASACQePymwFBBhDcJUUNAEHsAA8LAkAgASACQbv9mwFBAxDcJUUNAEHrAA8LAkAgASACQby4nAFBBBDcJUUNAEGXAQ8LQaB/QaR/IAEgAkHM+psBQQYQ3CUbC9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3K3C9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3O3C9ABAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQILIAIgA3G3C5gBAQJ/IwBBEGsiBiQAQQAhBwJAAkACQCABLQDgAUGEAUcNACABEKALIAZBCGogAUEAIAEoAtgBEPkSIAYoAgwhByAGKAIIQQFxDQELIAAgBzYCICAAIAI2AhggAEECOgAUIAAgASgC1AE2AhwgACAFrUIghiAErYQ3AwAMAQsgACAHNgIAQQIhAwsgACADOgAkIAZBEGokAAusAQECfyMAQSBrIgEkAAJAAkBBACgCyO+eAQ0AAkACQCAARQ0AIAAoAgAhAiAAQQA2AgAgAkUNACAAKAIEIQAMAQtBAEEAKALc354BIgBBAWo2AtzfngEgAEUNAgtBACAANgLM754BQQBBATYCyO+eAQsgAUEgaiQAQczvngEPCyABQQA2AhggAUEBNgIMIAFBnJyEATYCCCABQgQ3AhAgAUEIakGknIQBEOIjAAuNAQEEfyMAQRBrIgMkACADQQhqIAAoAgAiBCAAKAIEIAEQqBsgAygCCCEFIAMtAAwhBiAAIAAoAgxBAWo2AgwgACAAKAIIIAZBAXFrNgIIIARBACAFa0EYbGpBaGoiACACKQMANwMAIABBCGogAkEIaikDADcDACAAQRBqIAJBEGopAwA3AwAgA0EQaiQAC6ABAAJAAkACQAJAAkACQAJAAkACQCAAKAIADgoBAgMEBQYIBwgAAQsgAEEIaiABEKMGDwsgAEEcaiABEPYoDwsgAEEIaiABEHEPCyAAQRxqIAEQ9igPCwJAAkAgACgCCA4DAAEFAAsgACgCKCABEGEPCyAAKAIoIAEQlRsPCyAAQQRqIAEQjy8PCyAAQRBqIAEQ9igPCyAAQQRqIAEQjy8LC58BAQN/IAAtAAghAQJAAkAgACgCACICDQAgASEDDAELQQEhAwJAAkAgAUEBcQ0AIAJBAUcNASAALQAJRQ0BIAAoAgQiAS0ACkGAAXENAUEBIQMgASgCAEH4h5wBQQEgASgCBCgCDBELAEUNAQsgACADOgAIDAELIAAgACgCBCIDKAIAQdyDngFBASADKAIEKAIMEQsAIgM6AAgLIANBAXELkQEBBH8jAEGAIGsiAiQAAkACQCABQYCJ+gAgAUGAifoASRsiAyABIAFBAXZrIgQgAyAESxsiA0GBCEkNACACIAMQ0B8gACABIAIoAgQiAyACKAIIIgRBAnRqIAIoAgAiBSAEayABQcEASRDrAiAFIAMQui8MAQsgACABIAJBgAggAUHBAEkQ6wILIAJBgCBqJAALjQEBA38jAEEQayIEJAACQAJAIANBB0sNAEEAIQUgAUH/AXEhBkEAIQEDQAJAIAMgAUcNACADIQEMAwsCQCACIAFqLQAAIAZHDQBBASEFDAMLIAFBAWohAQwACwsgBEEIaiABIAIgAxCwCSAEKAIMIQEgBCgCCCEFCyAAIAU2AgAgACABNgIEIARBEGokAAucAQEBfyMAQcAAayICJAAgAkIANwM4IAJBOGogACgCABA2IAIgAigCPCIANgI0IAIgAigCODYCMCACIAA2AiwgAkEENgIoIAJBAjYCECACQeCDngE2AgwgAkIBNwIYIAIgAkEsajYCJCACIAJBJGo2AhQgASgCACABKAIEIAJBDGoQ3gUhASACKAIsIAIoAjAQ7iwgAkHAAGokACABC6YBAQN/IwBBEGsiAiQAQbDUmAEhA0ETIQQCQAJAAkACQCABLQAADgQDAgABAwsgASgCBCIBKAIEIQQgASgCACEDDAILIAJBCGogASgCBCIBKAIAIAEoAgQoAiARBgAgAigCDCEEIAIoAgghAwwBCyABLQABQQJ0IgFBjM+eAWooAgAhAyABQeTNngFqKAIAIQQLIAAgAzYCACAAIAQ2AgQgAkEQaiQAC6YBAQN/IwBBEGsiASQAIAAoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIAFBgICAgHg2AgAgASAANgIMIAFBgQIgACgCCCIALQAIIAAtAAkQzRQACyABIAM2AgQgASACNgIAIAFBiAIgACgCCCIALQAIIAAtAAkQzRQAC40BAgF/An4gACAAKAI4QQhqNgI4IAAgAa0iAyAAKAI8IgFBA3QiAkE4ca2GIAApAzCEIgQ3AzACQAJAIAFBCEsNACAAIAApAxggBIU3AxggABD6DSAAKQMwIQQgACADQcAAIAJrrYhCACABGzcDMCAAIAQgACkDAIU3AwAMAQsgAUEIaiEBCyAAIAE2AjwLlgECAX8BfgJAAkACQAJAIAAoAgAOAgECAAsgACgCBCIAEJIBIABBwABBCBCsFg8LIAApAwgiAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQwCQPCyAAKQMIIgJCA4NCAFINACACpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMAkCwuSAQICfwF+AkACQCAALQAsQQJHDQAgACgCGCIBEK4RIAFBMEEIEKwWDAELIAApAxgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIA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4SYCQCACKAIIIgNFDQAgACADNgIIIAAgATYCBAwBCyAAIAE2AghBASEBIABBATYCBAwBC0EAIQELIAAgATYCACACQRBqJAALhQEBBH8jAEEQayIFJAAgBUEEaiACIARqQQFqQdidggEQsxYgBSgCBCEGIAUoAggiByAFKAIMIgggASACIAMgBBCHASAFQQRqQQhqIgQgCDYCACAFIAc2AgggBSAGNgIEIAVBBGoQqQwgAEEIaiAEKAIANgIAIAAgBSkCBDcCACAFQRBqJAALiwEBAX8jAEEgayIDJAAgA0EUaiABIAIQphMgA0EIaiADQRRqEKAbAkACQCADKAIQRQ0AIAAgAykCCDcCACAAQQI6AAwgAEEIaiADQQhqQQhqKAIANgIADAELIABBCGpBACkCjJmCATcCACAAQQApAoSZggE3AgAgAygCCCADKAIMEPAsCyADQSBqJAALkAEBA38gAEG5893xeWwhAQJAA0ACQEEAKAL86p4BIgANABCEGyEACyABQQAgACgCCGt2IgIgACgCBCIDTw0BIAAoAgAgAkEGdGoiAiACKAIAIgNBASADGzYCAAJAIANFDQAgAhCoFQsCQEEAKAL86p4BIABGDQAgAhCaJAwBCwsgAg8LIAIgA0GwkIMBEIwVAAuJAQEBfyAAKAIIIABBDGooAgBBBEEIEIsWIABBGGoiASgCACAAQRxqKAIAEKgJIAAoAhQgASgCAEEIQSAQixYgAEEkaiIBKAIAIABBKGooAgAQ1x4gACgCICABKAIAEPosAkAgAEF/Rg0AIAAgACgCBCIBQX9qNgIEIAFBAUcNACAAQTBBBBCsFgsLiAEBBH9BACECAkACQAJAIAEoAgBBgICAgHhGDQAgASgCCCIDDQELDAELQQEhAiABKAIEIgQoAgghASADQQFGDQAgBEEYaiEEIANBf2pB/////wBxIQMDQCAEKAIAIgUgASAFIAFJGyEBIARBEGohBCADQX9qIgMNAAsLIAAgATYCBCAAIAI2AgALpQEBAX8jAEEgayIEJAACQEEAKALg354BQQJGDQAgBEHg354BNgIIIARB5N+eATYCDCAEIARBH2o2AhggBCAEQQxqNgIUIAQgBEEIajYCEEHg354BIARBEGpB8OWYARC7BgsCQAJAQQAoAuTfngFBgICAgHhGDQAgAEEAKALo354B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ACEAIANBADYCACAAKAIMIQMgAEEANgIMAkAgAw0AIAFBADYCGCABQQE2AgwgAUGwi54BNgIIIAFCBDcCECABQQhqQdS+nAEQ4iMACyADEQEAIQAgAigCACIDIAA2AgQgA0EBNgIAIAFBIGokAEEBC4YBAQJ/IwBBEGsiBCQAQQEhBQJAIAFBAXFFDQAgAxCgCwsgBEEIaiADEL8SIAQoAgwhAQJAAkAgBCgCCEEBcUUNACABIQMMAQsgAygC1AEhBUEMQQQQlioiAyAFNgIIIAMgAjYCBCADIAE2AgBBACEFCyAAIAM2AgQgACAFNgIAIARBEGokAAuXAQEDfyMAQRBrIgIkACABKALYASEDAkACQCABKAKIASIEQYCAgMAAcUUNACABIARB////v39xNgKIASACQQhqIAMgARDIBCACKAIIIQMgASABKAKIAUGAgIDAAHI2AogBIAIoAgwhAQwBCyACIAMgARDIBCACKAIEIQEgAigCACEDCyAAIAM2AgAgACABNgIEIAJBEGokAAuLAQEDfyMAQTBrIgEkAEEAIQICQCAAEKMgDQAgACgC3AEhAiAAKALYASEDIAFBDGogABDNJiABQRhqQYy7nAFBARC5GCABQSxqIAFBFGooAgA2AgAgASABKQIMNwIkIAMgAiABQRhqENcaIQIgAC0A4AFBogFHDQAgACAAEJcsEJ8XCyABQTBqJAAgAguGAQIBfwF+IwBBIGsiASQAIAApAwghAiAAQQk2AgggAUEIakEQaiAAQRhqKQMANwMAIAFBEGogAEEQaikDADcDACABIAI3AwgCQAJAIAKnIgBBCUYNACAAQQJGDQELIAFBCGoQ7w5By7icAUEoQdiFnAEQzB4ACyABKQMQIQIgAUEgaiQAIAILiwEBA38jAEEwayIBJABBACECAkAgABCjIA0AIAAoAtwBIQIgACgC2AEhAyABQQxqIAAQzSYgAUEYakGMu5wBQQEQvRggAUEsaiABQRRqKAIANgIAIAEgASkCDDcCJCADIAIgAUEYahDXGiECIAAtAOABQaIBRw0AIAAgABCXLBCfFwsgAUEwaiQAIAILiQEBAn8jAEEQayIGJAACQAJAIAUoAgBBgICAgHhGDQAgBkEIaiAFKAIEIAUoAggQnikgBigCDCEFIAYoAgghBwwBC0GBAUGAASABLQAAGyEF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AAuJAQECfyMAQRBrIgQkAAJAAkAgASgCiAEiBUGAIHENACABIAVBgCByNgKIASAEIAIgAyABEL4SIAQoAgAhAiABIAEoAogBQf9fcTYCiAEgBCgCBCEBDAELIARBCGogAiADIAEQvhIgBCgCDCEBIAQoAgghAgsgACACNgIAIAAgATYCBCAEQRBqJAALjgEBAX8jAEEgayIDJAAgA0EIakEIaiABQQhqKQIANwMAIAMgASgCEDYCGCADIAEpAgA3AwgCQAJAIAIoAogBIgFBgICAgAFxDQAgAiABQYCAgIABcjYCiAEgACADQQhqIAIQtCggAiACKAKIAUH/////fnE2AogBDAELIAAgA0EIaiACELQoCyADQSBqJAALjgEBAX8jAEEgayIDJAAgA0EIakEIaiABQQhqKQIANwMAIAMgASgCEDYCGCADIAEpAgA3AwgCQAJAIAIoAogBIgFBgICAgAFxDQAgAiABQYCAgIABcjYCiAEgACADQQhqIAIQtSggAiACKAKIAUH/////fnE2AogBDAELIAAgA0EIaiACELUoCyADQSBqJAALjAEBA38jAEEQayICJAACQAJAIAEoAogBIgNBwIAGcUHAgAZGDQAgASADQcCABnI2AogBIAJBCGogARC6GCACKAIIIQQgASABKAKIASADQb//eXJxNgKIASACKAIMIQEMAQsgAiABELoYIAIoAgQhASACKAIAIQQLIAAgBDYCACAAIAE2AgQgAkEQaiQAC4cBAQJ/IwBBEGsiAiQAIAEoAgAhAyABQQA2AgACQAJAIAMgASgCBBDbJiIBENEsDQAgAkEIaiABEI4WQQEhAQJAAkAgAi0ACEEBRw0AIAAgAigCDDYCBAwBCyAAIAItAAk6AAFBACEBCyAAIAE6AAAMAQsgAEGABDsBACABENcqCyACQRBqJAALdQEBfgJAAkAgAa0gAq1+IgNCIIinDQAgA6ciAUF4Sw0AIAFBB2pBeHEiASACQQhqaiICIAFJDQECQCACQfj///8HSw0AIAAgATYCCCAAIAI2AgQgAEEINgIADwsgAEEANgIADwsgAEEANgIADwsgAEEANgIAC44BAgN/AX4jAEEgayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAhAhAiADQQA2AhACQCACDQAgAUEANgIYIAFBATYCDCABQbCL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ACAAKAIQEMAkCwuBAQEDfyAALQAmIQIgAEEBOgAmIAEoAgQhAwJAAkACQAJAIAEoAgAOAwABAgALIAMgABCPICAAIAI6ACYPCyADKAIIIgRFDQEgAygCBCEBIARBOGwhAwNAIAAgARC6HyABQThqIQEgA0FIaiIDDQAMAgsLIAMgABChDAsgACACOgAmC3UCAn8BfgJAIAApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQwCQLAkAgACkDECIDUA0AIANCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMAkCwt1AgJ/AX4CQCAAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMAkCwJAIAApAxAiA1ANACADQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDAJAsLdQICfwF+AkAgACkDECIDUA0AIANCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMAkCwJAIAApAwAiA0IDg0IAUg0AIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQwCQLC4IBAQJ/IwBBEGsiAiQAAkACQCABKAKIASIDQYDAAHENACABIANBgMAAcjYCiAEgAiABEF8gAigCACEDIAEgASgCiAFB/79/cTYCiAEgAigCBCEBDAELIAJBCGogARBfIAIoAgwhASACKAIIIQMLIAAgAzYCACAAIAE2AgQgAkEQaiQAC4EBAQJ/IwBBEGsiAiQAAkACQCABKAKIASIDQcAAcQ0AIAEgA0HAAHI2AogBIAIgARC6GCACKAIAIQMgASABKAKIAUG/f3E2AogBIAIoAgQhAQwBCyACQQhqIAEQuhggAigCDCEBIAIoAgghAwsgACADNgIAIAAgATYCBCACQRBqJAALgQEBAn8jAEEQayICJAACQAJAIAEoAogBIgNBwABxDQAgASADQcAAcjYCiAEgAiABEPsJIAIoAgAhAyABIAEoAogBQb9/cTYCiAEgAigCBCEBDAELIAJBCGogARD7CSACKAIMIQEgAigCCCEDCyAAIAM2AgAgACABNgIEIAJBEGokAAuEAQECfyMAQRBrIgMkACADQQxqIAFBDGooAgA2AgAgAyABKAIANgIAIAMgASkCBDcCBAJAAkAgAigCiAEiAUGAnICAAnEiBEUNACACIAFB/+P//31xNgKIASAAIAMgAhCgEyACIAIoAogBIARyNgKIAQwBCyAAIAMgAhCgEwsgA0EQaiQAC3wBAn8jAEEwayIBJAAgASAANgIMAkAgAC0AAEECSQ0AIAFBATYCFCABQbTGgwE2AhAgAUIBNwIcIAFBkwE2AiwgASABQShqNgIYIAEgAUEMajYCKCABQRBqQajHgwEQ4iMACyAAKAIEIQIgAEEMQQQQrBYgAUEwaiQAIAILfQACQCAEKAIAQYCAgIB4Rw0AIAQtAAQhBCAAIAEgAhCGFCAAIARBA2o6ACQgACADKQIANwIMIABBFGogA0EIaikCADcCACAAQRxqIANBEGopAgA3AgAPCyAAQYCAgIB4NgIAIAAgBCkCADcCBCAAQQxqIARBCGopAgA3AgALcgECfyMAQSBrIgEkAAJAAkAgACgCMEECRw0AIABBNGohAgwBCyABIAA2AgggASAAQTRqIgI2AgwgASABQR9qNgIYIAEgAUEMajYCFCABIAFBCGo2AhAgAEEwaiABQRBqQYTmmAEQuwYLIAFBIGokACACC5ABAgJ/AXwjAEGQAWsiAiQAAkACQCABKwMAIgREAAAAAAAAAABhDQACQAJAIAS9Qv///////////wCDQv/////////3/wBVDQAgAkEMaiEBIAQgAkEMahD7ASEDDAELIAIgBBCuHyACKAIEIQMgAigCACEBCyAAIAEgAxCzGQwBCyAAIAEQ5BMLIAJBkAFqJAALeAEEfyMAQRBrIgIkACACQQhqQQBBACABKAIIIgNB/K6bARDUHyACKAIMIQQgASACKAIIIgU2AgggACAENgIMIAAgATYCCCAAIAMgBGs2AhAgACABKAIEIgEgBEHYAGxqNgIEIAAgASAFQdgAbGo2AgAgAkEQaiQAC3YBAn8jAEEQayIEJAAgBEEIaiACIAMgASgCCCIFQfyumwEQ1B8gBCgCDCEDIAEgBCgCCCICNgIIIAAgAzYCDCAAIAE2AgggACAFIANrNgIQIAAgASgCBCIBIANBMGxqNgIEIAAgASACQTBsajYCACAEQRBqJAALiAEBAX8jAEEgayIDJAAgA0EANgIIIANCgICAgBA3AgAgA0G4spsBNgIQIANCoICAgA43AhQgAyADNgIMAkAgASACIANBDGoQ8i1FDQBB/JWcAUE3IANBH2pB0LKbAUGAl5wBEOISAAsgACADKQIANwIAIABBCGogA0EIaigCADYCACADQSBqJAALiAEBAX8jAEEgayIDJAAgA0EANgIIIANCgICAgBA3AgAgA0HgspsBNgIQIANCoICAgA43AhQgAyADNgIMAkAgASACIANBDGoQ8i1FDQBB/JWcAUE3IANBH2pB+LKbAUGAl5wBEOISAAsgACADKQIANwIAIABBCGogA0EIaigCADYCACADQSBqJAALegIBfwF+IwBBEGsiBSQAAkACQAJAIARBgDxxQYA8Rw0AIANFDQEgBUEIaiABIAJBARCMAiAFLQAIQQRGDQEgBSkDCCIGQv8Bg0IEUQ0BIAAgBjcCAAwCCyAAQQQ6AAAMAQtBy7icAUEoQdD8mAEQzB4ACyAFQRBqJAALjgEBAX9BASEBAkACQAJAAkACQAJAAkAgACgCAA4IAAQBAwYGAgUACyAALQAkIQEMBQsgACgCBC0AGCEBDAQLIAAoAgQtACwhAQwDC0EAIQEMAgtBASEBIAAtACQNASAAKAIgKAIYQYCAgIB4RiEBDAELQQEhASAAKAIEIgAtAFANACAAKAIAIQELIAFBAXELiAEBAX8jAEEgayIDJAAgA0EANgIIIANCgICAgBA3AgAgA0HUlZwBNgIQIANCoICAgA43AhQgAyADNgIMAkAgASACIANBDGoQ8i1FDQBB/JWcAUE3IANBH2pB7JWcAUGAl5wBEOISAAsgACADKQIANwIAIABBCGogA0EIaigCADYCACADQSBqJAALhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkG8wYABNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEM4fRQ0AQfyVnAFBNyACQR9qQdTBgAFBgJecARDiEgALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC4YBAQF/IwBBIGsiAiQAIAJBADYCCCACQoCAgIAQNwIAIAJBvMGAATYCECACQqCAgIAONwIUIAIgAjYCDAJAIAEgAkEMahCIHkUNAEH8lZwBQTcgAkEfakHUwYABQYCXnAEQ4hIACyAAIAIp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IAE6AAALawEBfyMAQTBrIgIkACACQQI2AgwgAkGc6pgBNgIIIAJCAjcCFCACQQs2AiwgAkELNgIkIAIgADYCICACIABBBGo2AiggAiACQSBqNgIQIAEoAgAgASgCBCACQQhqEN4FIQAgAkEwaiQAIAALZwEDfyMAQRBrIgIkACAAIAEoAgQgASgCAGsQ8yQgACgCCCEDIAAoAgQhBAJAA0AgAkEIaiABEKMfIAItAAhFDQEgBCADaiACLQAJOgAAIANBAWohAwwACwsgACADNgIIIAJBEGokAAttAQF/IwBBMGsiAyQAIAMgAjYCBCADIAE2AgAgA0ECNgIMIANB8MWYATYCCCADQgI3AhQgA0EUNgIsIANB1AA2AiQgAyAANgIgIAMgA0EgajYCECADIAM2AiggA0EIahDPHyECIANBMGokACACC4MBAQF/AkACQAJAAkACQAJAAkAgACgCAEGAgICAeHMiAUEVIAFBFUkbDhUBAQEBAQEBAQEBAQECAQMBAQQBBQYACyAAEN8qCw8LIAAoAgQgACgCCBDLLA8LIAAoAgQgACgCCBDLLA8LIABBBGoQmCkPCyAAQQRqEJgpDwsgAEEEahDgKgttAQF/IwBBMGsiAyQAIAMgAjYCBCADIAE2AgAgA0ECNgIMIANBuM6AATYCCCADQgI3AhQgA0EUNgIsIANB1AA2AiQgAyAANgIgIAMgA0EgajYCECADIAM2AiggA0EIahDPHyECIANBMGokACACC2sBAn8jAEEQayIBJAAgACAAKAIIIgJBf2o2AggCQAJAIAJBAUcNACAAQQRqKAIAIgJBf0wNASAAKAIAIAJBARCsFiAAEPAtCyABQRBqJAAPC0HIl5wBQSsgAUEPakHM2IABQajZgAEQ4hIAC2wBAX8jAEEwayICJAAgAkECNgIMIAJB4IyCATYCCCACQgI3AhQgAkELNgIsIAJB5gA2AiQgAiAANgIoIAIgAEEEajYCICACIAJBIGo2AhAgASgCACABKAIEIAJBCGoQjCkhACACQTBqJAAgAAtwAgF/AX4jAEEQayICJAAgAkEIakEAKALE/5sBNgIAIAJBACkCvP+bATcDACABrSEDAkADQCADUA0BIAIgA6dBtICcARCbIUIAIQMMAAsLIAAgAikDADcCACAAQQhqIAJBCGooAgA2AgAgAkEQaiQA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AX4gAEEIaiEBAkACQCAAKAIADQAgASkDACIDQgODQgBSDQEgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0BIAEgASgCEBDAJAwBCyABEMETCwJAIAAoAihFDQAgAEEoahDMAQsLVwEDfkIBIAGtIAKtfSIDQgGGIgR9IAQgA0IAUxshAwNAIAAgA0IfgyIEQiCEIAQgA0IFhyIFQgBVG6dB7LObAWotAAAQjQogA0IfViECIAUhAyACDQALC2gBA38CQCABKAIEIgIgASgCACIDKAIITw0AIABBADYCECAAIAI2AgwgACADNgIIIAEgAkEBajYCBCAAIAEoAggiBDYCACAAIAMoAgQgAkEcbGo2AgQgASAEQQFqNgIIDwsgAEEANgIEC24BAn8gASgCACECIAFBADYCAAJAIAEtADwNACABKAIEIQMgASgCKCABKAIQIAEoAhQQiwkCQCABKAI4RQ0AIAFBADYCNCABIAEoAjBBAWo2AjALIAFBAToAPCACRQ0AIAEgAxDFBQsgAEEEOgAAC2sBAn8jAEEQayIBJAACQAJAA0AgAUEIaiAAEJ8MAkAgASgCDEGAgMQAIAEoAghBAXEbIgJBdmoOBAIBAQIACyACQdi/f2pBAkkNASACQYCAxABHDQALQQAhAgwBC0EBIQILIAFBEGokACACC2oAAkACQAJAAkACQAJAAkAgACgCAA4HAAECAwQGBQALIABBCGogASgCFBCTLw8LIABBBGogARD5HQ8LIABBBGogARD+Lw8LIABBBGogARCpBA8LIABBBGogARC9Kg8LIABBBGogARCOLwsLVwEBfgJAAkAgA0HAAHENACADRQ0BIAIgA0E/ca0iBIYgAUEAIANrQT9xrYiEIQIgASAEhiEBDAELIAEgA0E/ca2GIQJCACEBCyAAIAE3AwAgACACNwMIC1cBAX4CQAJAIANBwABxDQAgA0UNASACQQAgA2tBP3GthiABIANBP3GtIgSIhCEBIAIgBIghAgwBCyACIANBP3GtiCEBQgAhAgsgACABNwMAIAAgAjcDCAtpAQF/IwBBEGsiASQAAkACQAJAQQAoArzvngFB/////wdxRQ0AEMwvRQ0BCyAAKAIEQcwAai0AAEEHRw0BCyABQRBqJAAPCyABQQRqIAAoAgBBAEGc5JgBQSEQ6AsgAUEEahD2ARDOLwAL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JAACQAJAIAAoAgAiAC0AAEEBRw0AIAIgAEEBajYCDCABQZ2KnAFBBCACQQxqQdgBEP0LIQEMAQsgASgCAEGZipwBQQQgASgCBCgCDBELACEBCyACQRBqJAAgAQtkAQF/IAFBMGoiAxDWHiABQThqIAJBCGopAgA3AgAgASACKQIANwIwAkAgAS0AXEECRw0AIAFBjKiEASADIAEtADxBA0YbLQAMQQJHOgBcCwJAQeAARQ0AIAAgAUHgAPwKAAALC2EBAn8gACgCCCECAkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAAgAxD/JCABIAAoAgQgACgCCGoQ5A0gACADIAJqNgIIQQALXwEBfwJAIAAoAgBBgICAgHhGDQAgACgCCEEEdCECIAAoAgRBCGohAANAIAJFDQECQCABIAAoAgBPDQAgACABNgIAIABBBGpBADoAAAsgAkFwaiECIABBEGohAAwACwsLaAEBfwJAAkACQCACKAIERQ0AAkAgAigCCCIDDQBBAC0AoPCeARoMAgsgAigCACADQQEgARD1AyECDAILQQAtAKDwngEaCyABEH0hAgsgACABNgIIIAAgAkEBIAIbNgIEIAAgAkU2AgALYwECfwJAIAAoAggiAUUNACAAKAIEIQADQAJAAkAgACgCACICRQ0AIAIQkgEgAkHAAEEIEKwWDAELIABBBGooAgAiAhDHBCACQfAAQQgQrBYLIABBDGohACABQX9qIgENAAsLC2MBAX8jAEEQayICJAACQAJAIAApAwBQDQAgAiAANgIMIAFBvpybAUERIAJBDGpB9gIQ/QshAAwBCyACIABBCGo2AgggAUGks5wBQQUgAkEIakHMAhD9CyEACyACQRBqJAAgAAtiAAJAAkACQAJAAkACQAJAIAAoAgAOBgECAwQFBgALIABBBGoQogMPCyAAQQhqEIErDwsgAEEEahCBJg8LIABBBGoQhCwPCyAAQQRqEK4nDwsgAEEEahDlKSAAQQhqEKIDCwthAQR/IwBBEGsiAyQAIANBCGogAkEEQQhB2LucARDcGSADKAIIIQQgAygCDCEFAkAgAkEDdCIGRQ0AIAUgASAG/AoAAAsgACACNgIIIAAgBTYCBCAAIAQ2AgAgA0EQaiQAC2MBAX8jAEEQayIC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fyAAKAIIIQICQAJAIAFBgAFPDQBBASEDDAELAkAgAUGAEE8NAEECIQMMAQtBA0EEIAFBgIAESRshAwsgACADEP8kIAEgACgCBCAAKAIIahDkDSAAIAMgAmo2AggLXAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCHHAsgACADQQFqNgIIIAAoAgQgA0EYbGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgALXAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCJHAsgACADQQFqNgIIIAAoAgQgA0EUbGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGooAgA2AgALWQEBfyMAQSBrIgIkACACQQA2AhAgAkEIaiABIAJBEGoQzhsgAkEUaiACKAIIIAIoAgwQjRggAEEIaiACQRRqQQhqKAIANgIAIAAgAikCFDcCACACQSBqJAALXAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCHHAsgACADQQFqNgIIIAAoAgQgA0EYbGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgALYAECfyMAQRBrIgIkAAJAAkAgAS0AAEEDRg0AQQAhAQwBCyACQQhqIAEoAgQiASgCACABKAIEKAIYEQYAIAIoAgwhAyACKAIIIQELIAAgAzYCBCAAIAE2AgAgAkEQaiQAC2ABAn8jAEEQayICJAACQAJAIAEtAABBA0YNAEEAIQEMAQsgAkEIaiABKAIEIgEoAgAgASgCBCgCJBEGACACKAIMIQMgAigCCCEBCyAAIAM2AgQgACABNgIAIAJBEGokAAtZAgJ/AX4DQAJAAkAgAUUNACAAKQMAIgRCA4NCAFINASAEpyICIAIoAgAiA0F/ajYCACADQQFHDQEgAiACKAIQEMAkDAELDwsgAUF/aiEBIABBGGohAAwACwtcAQF/AkAgACgCCCIDIAAoAgBHDQAgACACENEdCyAAIANBAWo2AgggACgCBCADQRhsaiIAIAEpAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDAAtnAQF/IwBBEGsiAiQAIAIgAEEUajYCDCABQaSznAFBBUH0m5sBQQQgAEEIakGLAkHomJsBQQQgAEEQakGdAkG7nJsBQQMgAEGeAkHsmJsBQQggAkEMakGnARDeDCEAIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUGks5wBQQUgAkEMakHrAhD9CyEADAELIAIgADYCCCABQY2PmwFBDyACQQhqQa8DEP0LIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUGks5wBQQUgAkEMakHrAhD9CyEADAELIAIgADYCCCABQaWcmwFBDSACQQhqQeYDEP0LIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtADRBBEYNACACIAA2AgwgAUH6g5sBQQYgAkEMakGyAhD9CyEADAELIAIgADYCCCABQePymgFBDCACQQhqQeoDEP0LIQALIAJBEGokACAAC2IBAX8jAEEQayICJAACQAJAIAAtABRBAkYNACACIAA2AgwgAUGks5wBQQUgAkEMakHrAhD9CyEADAELIAIgADYCCCABQa2MmwFBCiACQQhqQaACEP0LIQALIAJBEGokACAAC1oBAn8jAEEQayICJAACQAJAIAAoAgAiA0EBakF+cSADRg0AIAJBCGogABC1ISACKAIMIQAgAigCCCEDDAELIAAoAgghAAsgASADIAAQggYhAyACQRBqJAAgAwtmAQJ/AkACQEEAKALA754BIgFFDQAgACABEIkXIgFBDGooAgAiAk8NASABQQhqKAIAIABBA3RqKAIAIQAgAUEAOgAAIAAPC0HEgJwBQcgAQeyBnAEQky4ACyAAIAJBuKyaARCMFQALYQECfwJAIAAoAggiAkUNACAAKAIEIQMgAkEobCECA0AgAyABEKAOIANBKGohAyACQVhqIgINAAsLAkAgACgCDCIDKAIAQYCAgIB4Rw0AIAEgAygCBBCdAw8LIAMgARCMIAthAQJ/AkAgACgCCCICRQ0AIAAoAgQhAyACQShsIQIDQCADIAEQnw4gA0EoaiEDIAJBWGoiAg0ACwsCQCAAKAIMIgMoAgBBgICAgHhHDQAgASADKAIEEJQrDwsgAyABEIsgC2cBAX8jAEEQayICJAAgAiAAQRRqNgIMIAFBpLOcAUEFQfSbmwFBBCAAQQhqQYsCQeiYmwFBBCAAQRBqQZ0CQbucmwFBAyAA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ACADRw0ACwsLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARDqDQJAIABBMGooAgAiAkUNACACIAEQvQMLIABBOGoiACADRw0ACwsLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCgDgJAIABBMGooAgAiAkUNACABIAIQnQMLIABBOGoiACADRw0ACwsLWAEBfyMAQRBrIgIkACACIAA2AgwgAUHyipsBQQlB9JubAUEEIABBDGpBiwJB6JibAUEEIABBFGpBnQJB+4qbAUEFIAJBDGpB/QUQpw0hACACQRBqJAAgAAtQAQJ/AkAgACgCCCICRQ0AIAAoAgQhAyACQThsIQIDQCADIAEQgRcgA0E4aiEDIAJBSGoiAg0ACwsCQCAAKAIUIgNFDQAgAygCACABELACCwtOAQJ/AkAgACgCCCICRQ0AIAAoAgQhAyACQShsIQIDQAJAIAMoAgBBB0YNACADIAEQiRMLIANBKGohAyACQVhqIgINAAsLIABBFGoQsiMLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCJEwJAIABBMGooAgAiAkUNACABIAIQ5wELIABBOGoiACADRw0ACwsLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCJEwJAIABBMGooAgAiAkUNACABIAIQ5wELIABBOGoiACADRw0ACwsLdAEBfEQAAAAAAADwvyEBAkAgAL1C////////////AINC//////////f/AFUNACAAnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/ANBf3O3IQELIAELTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCJCwJAIABBMGooAgAiAkUNACACIAEQpQILIABBOGoiACADRw0ACwsLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCJCwJAIABBMGooAgAiAkUNACACIAEQpQILIABBOGoiACADRw0ACwsLTQECfwJAIAAoAggiAkUNACAAKAIEIgAgAkE4bGohAwNAIAAgARCjDgJAIABBMGooAgAiAkUNACAB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IAAgASgAADYAACABIAM2AAAgAkF/aiECIAFBBGohASAAQQRqIQAMAAsLOgEBfwJAIABBf0YNACAAIAAoAgQiAkF/ajYCBCACQQFHDQAgAUELakF8cSIBRQ0AIAAgAUEEEKwWCws+AQF/IwBBEGsiAiQAIAIgAEECajYCDCABQcLBgwEgAEGVASAAQQFqQZUBIAJBDGoQpgYhACACQRBqJAAgAAs+AQF/IwBBEGsiAyQAIANBDGogAkEIaigCADYCACADQQI2AgAgAyACKQIANwIEIAAgASADEL4MIANBEGokAAs+AQF/IwBBEGsiAyQAIANBDGogAkEIaigCADYCACADQQY2AgAgAyACKQIANwIEIAAgASADEL4MIANBEGokAAs+AQF/QQAhBgJAIAQgA08NACABLQAAIAIgBGotAABHDQAgACAENgIEQQEhBiAAIARBAWo2AggLIAAgBjYCAAtAAQF/AkAgACgCCCIEIAAoAgBHDQAgACADEIYcCyAAIARBAWo2AgggACgCBCAEQQN0aiIAIAI2AgQgACABNgIAC0EBAX9BGBDrJyICQRBqIAFBEGopAgA3AgAgAkEIaiABQQhqKQIANwIAIAIgASkCADcCACAAIAI2AgQgAEEANgIACzYBAX8gACABQb9/akFfcUEKaiABQVBqIgMgAkEKSxsgAyABQTlLGyIBNgIEIAAgASACSTYCAAtAAQF/AkAgACgCCCIEIAAoAgBHDQAgACADEKkcCyAAIARBAWo2AgggACgCBCAEQQF0aiIAIAI6AAEgACABOgAAC0ABAX8CQCAAKAIIIgQgACgCAEcNACAAIAMQhhwLIAAgBEEBajYCCCAAKAIEIARBA3RqIgAgAjYCBCAAIAE2AgALQAEBfwJAIAAoAggiBCAAKAIARw0AIAAgAxCpHAsgACAEQQFqNgIIIAAoAgQgBEEBdGoiACACOgABIAAgAToAAAs+AQF/A0ACQCACDQAPCyAAKAAAIQMgACABKAAANgAAIAEgAzYAACACQX9qIQIgAUEEaiEBIABBBGohAAwACws+AQF/A0ACQCACDQAPCyAAKAAAIQMgACABKAAANgAAIAEgAzYAACACQX9qIQIgAUEEaiEBIABBBGohAAwACwtAAQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFBhO2YAUEQIABBDGpBiwIgAkEMakGvARD+ByEAIAJBEGokACAAC0ABAX8jAEEQayICJAAgAiAAKAIAIgBBDGo2AgwgAUHM4pgBQQcgAEHcACACQQxqQY0CEP4HIQAgAkEQaiQAIAALPgAgAiACKAIAIACnakHdy92eeWwgAEIgiKdqQd3L3Z55bCABp2pB3cvdnnlsIAFCIIinakHdy92eeWw2AgALPgEBfyMAQRBrIgYkACAGQQhqIAEgAiADIAQgBRDbESAGKAIMIQUgACAGKAIINgIAIAAgBTYCBCAGQRBqJAALOwBB1YGZASAAQQl2Qei+nAFqIABB/8cMSxstAABBBXQgAEEDdkE/cWpBwNCcAWotAAAgAEEHcXZBAXELPwACQAJAIAAoAgAiACgCAEEDRg0AIAAQ7SIMAQsgAEEQahCzAyAAQQRqEPQqIABBIGoQ2ykLIABBKEEIEKwWCz4AIAAoAgAiABCLKCAAQQxqEPsqIABBMGoQ9yogAEE0ahD9IyAAQThqENspIABBGGoQjCggAEHAAEEEEKwWCzkBAn8gAkEDdCECAkADQCACIgNFDQEgA0F4aiECIAEgABCRDCEEIAFBCGohASAERQ0ACwsgA0EARws2AQF/IAAgAUG/f2pBX3FBCmogAUFQaiIDIAJBCksbIAMgAUE5SxsiATYCBCAAIAEgAkk2AgALNgEBfyAAIAFBv39qQV9xQQpqIAFBUGoiAyACQQpLGyADIAFBOUsbIgE2AgQgACABIAJJNgIAC0cAAkAgASACQcn9mwFBBRDcJUUNAEHNAA8LAkAgASACQb7zmwFBBxDcJUUNAEH6AA8LQfkAQaR/IAEgAkHF85sBQQYQ3CUbC0cAAkAgASACQdr9mwFBBhDcJUUNAEHlAA8LAkAgASACQfyonAFBCBDcJUUNAEGRAQ8LQZJ/QaR/IAEgAkGP9JsBQQcQ3CUbC0UBAX8gASgCACAAEPcOAkAgASgCFCIBRQ0AIAAtADRBAUcNACAALwA5IQIgAEGBAjsAOSABKAIAIAAQwgEgACACOwA5CwtBAQF/IwBBEGsiAiQAAkAgAS0AFEECRg0AIAIgASkDACABKAIQELIfIAAgAikDACACKAIIQQEQsQwLIAJBEGokAAs+AQF/A0ACQCACDQAPCyAAKAAAIQMgACABKAAANgAAIAEgAzYAACACQX9qIQIgAUEEaiEBIABBBGohAAwACwtIAQF/AkAgASgCiAEiA0GAgARxRQ0AIAEgA0H//3txNgKIASAAIAIgARDnBCABIAEoAogBQYCABHI2AogBDwsgACACIAEQ5wQLSAEBfwJAIAEoAogBIgNBgIAgcUUNACABIANB//9fcTYCiAEgACACIAEQhg0gASABKAKIAUGAgCByNgKIAQ8LIAAgAiABEIYNC0gBAX8CQCABKAKIASIDQYCAIHFFDQAgASADQf//X3E2AogBIAAgAiABEIUNIAEgASgCiAFBgIAgcjYCiAEPCyAAIAIgARCFDQs+AQF/EOkoGiABKAIIQQR0IQIgASgCBCEBAkADQCACRQ0BIAEoAgwgABD4AyACQXBqIQIgAUEQaiEBDAALCws+AQF/EOkoGiABKAIIQQJ0IQIgASgCBCEBAkADQCACRQ0BIAEoAgAgABD4AyACQXxqIQIgAUEEaiEBDAALCwtHAQF/IABBHGoQsQogACgCDCAAKAIQELMjIAAoAgQiASAAKAIIEO0kIAAoAgAgARDNLSAAQSxqEN4SIAAoAiwgACgCMBDOLQtAAQF/AkACQAJAIAAtACxBfWoiAkEBIAJB/wFxQQNJG0H/AXEOAwABAgALIAEgABCoCBoPCyAAQRhqIAEQriQLCz8AAkACQAJAIAAoAgAOAgECAAsgAEEEahDILA8LIABBCGoQuR0gAEEoahDQKg8LIABBEGoQzCsgAEEwahDJKws8AAJAIAFpQQFHDQAgAEGAgICAeCABa0sNAAJAIABFDQBBAC0AoPCeARogACABEJonIgFFDQELIAEPCwALRAEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQhw4PCyAALQAAIAEQoxIPCyAAIAEQ6BELPQEBfyMAQRBrIgckACAHQQhqIAEtAAAgAyAEEOQHIAcoAgwhASAAIAcoAgg2AgAgACABNgIEIAdBEGokAAs9AQN/AkAgAS0ABCICIAEtAAUiA08NACABIAJBAWo6AAQgASACai0AACEECyAAIAQ6AAEgACACIANJOgAACz8BAn8CQAJAIAEoAgAiAiABKAIEIgNHDQAMAQsgASACQQFqNgIAIAItAAAhAQsgACABOgABIAAgAiADRzoAAAtBAQF/IAEgASgCCCIEQQFqNgIIAkAgBEEASA0AIAAgATYCDCAAIAM2AgggACACNgIEIABBuNmAATYCAA8LELMwAAs4AQJ/AkAgAFANACAAQgODUEUNACAApyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMAkCws8AQF/IwBBEGsiAyQAIANBADYCDCADIAIgA0EMahDXESAAIAEgAygCACADKAIEEOMlIQIgA0EQaiQAIAILRAEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQhw4PCyAALQAAIAEQoxIPCyAAIAEQ6BELOwACQCACIAAgA0H/AXFqLQBAaiIDIAAoAggiAkkNACADIAJBoLqDARCMFQALIAAoAgQgA0ECdGooAgALQAEDfwJAIAEoAhQiAiABKAIMIgNPDQAgASgCCCACai0AACEECyAAIAQ6AAkgACACIANJOgAIIAAgASkCADcCAAs8AQJ/IAAgAhCOJSAAKAIIIQMCQCACQQN0IgRFDQAgACgCBCADQQN0aiABIAT8CgAACyAAIAMgAmo2AggLPAECfyAAIAIQjyUgACgCCCEDAkAgAkEBdCIERQ0AIAAoAgQgA0EBdGogASAE/AoAAAsgACADIAJqNgIICzwBAX8jAEEQayIDJAAgA0EANgIMIAMgAiADQQxqEP8LIAAgASADKAIAIAMoAgQQixshAiADQRBqJAAgAgs+AQF/AkAgACgCCCIDIAAoAgBHDQAgABCzHAsgACADQQFqNgIIIAAoAgQgA0EDdGoiACACNgIEIAAgATYCAAtGAgJ/AX4gAEEIQQkgAb0iBEJ/VSICG0EDIARC/////////weDUCIDGzYCBCAAQcupmwFBxOaXASACG0HIqZsBIAMbNgIAC0cAAkACQAJAAkAgAC0AAA4FAQEBAgMACyAAQQRqEPQFCw8LIAAoAgQgACgCCBCRLQ8LIABBBGoQ4yIgACgCBCAAKAIIEJItCz4BA38gACgCBCEBAkAgACgCCCICRQ0AIAEhAwNAIAMQ1QIgA0EwaiEDIAJBf2oiAg0ACwsgACgCACABEJktCz8BAn8CQCAAKAIIIgFFDQAgACgCBCEAA0AgACgCACICELQCIAJB4ABBCBCsFiAAQQRqIQAgAUF/aiIBDQALCws5AQF/AkAgAUIDg0IAUg0AIAGnIgMgAygCACID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IQAgAkEQaiQAIAALNgACQCACQf///z9xIAB2IgIgASgClAEiAEkNACACIABBnImEARCMFQALIAEoApABIAJBA3RqCzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB5++DAUEJIAJBDGpBzAAQ/QshACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQeSMhAFBAyACQQxqQdIBEP0LIQAgAkEQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHO74MBQQ0gAkEMakHXARD9CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBtu+DAUEYIAJBDGpB2wEQ/QshACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQfDvgwFBEyACQQxqQdUBEP0LIQAgAkEQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGN8IMBQRAgAkEMakHMABD9CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB2++DAUEMIAJBDGpB3AEQ/QshACACQRBqJAAgAAs4AQF/QQEhAgJAIAFBgICAgHhGDQAgASAAQYQFaiIAKAIAEM4aRg0AIAEgACgCABDeG0YhAgsgAgs2AAJAIAEoAiBFDQBBrKCEARDJGgALIAFBfzYCICAAIAFBJGogAhD9HiABIAEoAiBBAWo2AiALOAEBfwJAIAEoAgAiA0H/////B0kNACACEMoaAAsgASADQQFqNgIAIAAgATYCBCAAIAFBBGo2AgALNgECf0EAIQICQCABKAIAIgMgASgCBE8NAEEBIQIgASADQQFqNgIACyAAIAM2AgQgACACNgIACzoBAX8jAEEgayIAJAAgAEEANgIYIABBATYCDCAAQZjNmAE2AgggAEIENwIQIABBCGpBoM2YARDiIwALMwEBfyMAQRBrIgMkACADQQhqIAAQ6hUgAygCCCADKAIMIAEgAhDkJSEAIANBEGokACAACzMBAX8jAEEQayIDJAAgA0EIaiAAEOoVIAMoAgggAygCDCABIAIQ5CUhACADQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQbXtmAFBByACQQxqQc4AEP0LIQAgAkEQaiQAIAALNgEBfyMA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AkAgACgCAA4CAQIACyAAQQRqENIDDwsgACkDCBC+IQ8LIAApAwgQviELNgACQCAALQAUQQJGDQAgACgCABCYJyAAKAIQENcqIAAoAgwQO0UNACAAKAIEIAAoAggQvCMLCzEBAX9BASECAkACQCABEBdBAUYNAEEAIQIMAQsgARAzIQELIAAgATYCBCAAIAI2AgALLQACQANAIAFFDQEgACgCACAAQQRqKAIAENQsIAFBf2ohASAAQRBqIQAMAAsLCy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABDULCABQX9qIQEgAEEUaiEADAALCwstAAJAAkAgAkEBcQ0AIAG4EBshAgwBCyABrRASIQILIAAgAjYCBCAAQQA2AgALMwACQAJAIAFB/////wdJDQAgACABrTcDCEEBIQEMAQsgACABNgIEQQAhAQsgACABNgIACzkBAX9BASEBAkAgAC0ABA0AIAAoAgAiASgCAEHEkJwBQQEgASgCBCgCDBELACEBCyAAIAE6AAQgAQstAAJAA0AgAUUNASAAKAIAIABBBGooAgAQ4CwgAUF/aiEBIABBDGohAAwACwsLLQACQANAIAFFDQEgACgCACAAQQRqKAIAENssIAFBf2ohASAAQQxqIQAMAAsLCy0AAkADQCABRQ0BIAAoAgAgAEEEaigCABDgLCABQX9qIQEgAEEMaiEADAALCwsvAQF/AkAgASgCACIEQQFxRQ0AIAAgASAEIAQgAiADEKUVDwsgACAEIAIgAxCkHws5AQF/QQEhAQJAIAAtAAQNACAAKAIAIgEoAgBByJCcAUEBIAEoAgQoAgwRCwAhAQsgACABOgAEIAELLQACQANAIAFFDQEgACgCACAAQQRqKAIAEIMtIAFBf2ohASAAQSRqIQAMAAsLCzQBAX8gAEEwahDTHiAAKAKABSIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAKABRDnEgsLMgEBfyAAQQRqENMeIAAoAgAiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCABDnEgsLLQACQANAIAFFDQEgACgCACAAQQRqKAIAEIMtIAFBf2ohASAAQRBqIQAMAAsLCy0AAkAgAUUNAANAIAAoAgAgAEEEaigCABD8LCAAQRRqIQAgAUF/aiIBDQALCwstAAJAIAFFDQADQCAAKAIAIABB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ACgCAA4CAQIACyABENAqDwsgASgCABDBLA8LIAEoAgAQwiwLMQEBfyABQXhqIgIgAigCAEEBaiICNgIAAkAgAg0AAAsgACABNgIEIABBnIqeATYCAAsrAQF/IwBBEGsiAiQAIAJBATsBDCACIAE2AgggAiAANgIEIAJBBGoQ5yMACywBAn8CQCAAKAIAIgFFDQAgASABKAIAIgJBf2o2AgAgAkEBRw0AIAAQyBILCyoBAX8jAEEQayIDJAAgAyAAKAIANgIMIANBDGogASACEOMLIANBEGokAAsrAAJAIAEoAgBFDQAgAhDJGgALIAFBfzYCACAAIAE2AgQgACABQQRqNgIACzMAIAEoAgAgACgCAC0AAEECdCIAQdDengFqKAIAIABBxN6eAWooAgAgASgCBCgCDBELAAstAgF/AX4jAEEQayIBJAAgACkCACECIAEgADYCDCABIAI3AgQgAUEEahDLLwALMwAgASgCACAAKAIALQAAQQJ0IgBB0I2eAWooAgAgAEHAjZ4BaigCACABKAIEKAIMEQsACzMAIAEoAgAgACgCAC0AAEECdCIAQeDEngFqKAIAIABBxMSeAWooAgAgASgCBCgCDBELAAsoAQF/IAFBBHQhAkEQIQEDQCAAIAAgAWoQuwggAiABQRBqIgFHDQALCygBAX8jAEEQayIDJAAgAyACNgIMIAAgASADQQxqQQEQUiADQRBqJAALMAACQCAAKAIAQYCAgIB4Rw0AQcjqgwEQziwACyAAQQxqIAEQqQogAEE8aiABEKkKCysAIAAQpQkgACgCsA0gACgCtA0iACgCCEF/akF4cWpBCGogACgCGBEEAGoLMwAgASgCACAAKAIALQAAQQJ0IgBB4MGeAWooAgAgAEHUwZ4BaigCACABKAIEKAIMEQsACy4BAX8CQCABIAAoAhQiAkkNACABIAJB5L2DARCMFQALIAAoAhAgAUECdGooAgALLgEBfwJAIAEgACgCICICSQ0AIAEgAkGwuoMBEIwVAAsgACgCHCABQQJ0aigCAAsuAQF/AkAgASAAKAI4IgJJDQAgASACQZS+gwEQjBUACyAAKAI0IAFBAnRqKAIACzMAIAEoAgAgACgCAC0AAEECdCIAQfjBngFqKAIAIABB7MGeAWooAgAgASgCBCgCDBELAAstACAAEMMDAkAgACgCAEGIgMQARg0AIAAQ3x4PCyAAQQRqEMEpIABBCGoQwSkLLwEBfyAAKAIAIgEgASgCACIBQX9qNgIAAkAgAUEBRw0AIAAoAgAgACgCBBDmEgsLKwEBfyMAQRBrIgMkACADQQE2AgAgAyACNwIEIAAgASADEL4MIANBEGokAAszACABKAIAIAAoAgAtAABBAnQiAEHgxp4BaigCACAAQczGngFqKAIAIAEoAgQoAgwRCwALLAACQCABIANHDQACQCABRQ0AIAAgAiAB/AoAAAsPCyABIANB1NKbARDsLAALLQAgABDDAwJAIAAoAgBBiIDEAEYNACAAEKcbDwsgAEEEahDMKSAAQQhqEMwpCywAIAAgAUEuRiAALQAEcjoABCAAKAIAIgAoAgAgASAAQQRqKAIAKAIQEQcACysBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqQYECQQFBABDNFAALMwAgASgCACAAKAIALQAAQQJ0IgBB2NCeAWooAgAgAEG00J4BaigCACABKAIEKAIMEQsACygAIAEgAiADIAQQ4yUhAyAAIAIgBGs2AgQgACABIARqQQAgAxs2AgALLQACQCAAKAIAIgBFDQAgABDJDyAAKAIAIABBBGooAgAQmS0gAEEUQQQQrBYLCzMAIAEoAgAgACgCAC0AAEECdCIAQYDVngFqKAIAIABB9NSeAWooAgAgASgCBCgCDBELAAszACABKAIAIAAoAgAtAABBAnQiAEGk1Z4BaigCACAAQZjVngFqKAIAIAEoAgQoAgwRCwALMwAgASgCACAAKAIALQAAQQJ0IgBB5NWeAWooAgAgAEGw1Z4BaigCACABKAIEKAIMEQsACzMAIAEoAgAgACgCAC0AAEECdCIAQaTWngFqKAIAIABBmNaeAWooAgAgASgCBCgCDBELAAssACAAIAJCgIGChIiQoMCAf4MiAkIAUjYCACAAIAJ6p0EDdiADaiABcTYCBAs1AQF/QYABIQMCQCABIAJB+vKbAUEGENwlDQBB/wBBpH8gASACQeiqnAFBAxDcJRshAwsgAws1AQF/Qe0AIQMCQCABIAJBmOKbAUEDENwlDQBB7gBBpH8gASACQdfzmwFBBBDcJRshAwsgAws1AQF/Qe8AIQMCQCABIAJB1f2bAUEFENwlDQBB8ABBpH8gASACQcX9mwFBBBDcJRshAwsgAwswAQF/AkAgASgCAEEDRw0AIAAtADkhAiAAQQE6ADkgASgCBCAAENkBIAAgAjoAOQsLLAEBfwNAIAFBGGohAgJAIAEtACxBAkYNACAAIAIQrRMPCyACKAIAIQEMAAsLMAEBfwJAIAEoAgBBAkcNACAALQA5IQIgAEEBOgA5IAEoAgQgABDZASAAIAI6ADkLCzABAX8CQCABKAIAQQFHDQAgAC0AOSECIABBAToAOSABKAIEIAAQ2QEgACACOgA5CwszACABKAIAIAAoAgAtAABBAnQiAEGU2Z4BaigCACAAQYjZngFqKAIAIAEoAgQoAgwRCwALLQACQCAAKAIAIgBFDQAgABDJDyAAKAIAIABBBGooAgAQmS0gAEEUQQQQrBYLCywAIAEgABC5JwJAIAEoAgBBA0cNACABKAIEIgEoAgBBGUcNACAAIAEQyQELCzMAIAEoAgAgACgCAC0AAEECdCIAQfzXngFqKAIAIABB8NeeAWooAgAgASgCBCgCDBELAAszACABKAIAIAAoAgAtAABBAnQiAEGU2J4BaigCACAAQYjYngFqKAIAIAEoAgQoAgwRCwALMwAgASgCACAAKAIALQAAQQJ0IgBB1NieAWooAgAgAEGg2J4BaigCACABKAIEKAIMEQsACy0AAkAgACgCACIARQ0AIAAQmRcgACgCACAAQQRqKAIAEJctIABBFEEEEKwWCwstAAJAIAAoAgAiAEUNACAAELEfIAAoAgAgAEEEaigCABCcLSAAQRRBBBCsFgsLLAACQCABIANHDQACQCABRQ0AIAAgAiAB/AoAAAsPCyABIANB1NKbARDsLAALKQEBfyMAQRBrIgIkACACQQM6AA8gACABQQAgAkEPahCDByACQRBqJAALKgADQAJAIAAtABRBAkYNACABKAIUIAAQqAgaDwsgACgCAEEYaiEADAALCysAIAAgARCQLwJAIAAoAgwiAEUNACABIABBDGooAgAgAEEQaigCABCZJgsLMQEBfkIAIQICQCABLQDgAUGhAUcNACABEMESIQIgARCgCwsgAEEANgIAIAAgAjcDCAswACABKAIAIAAtAABBAnQiAEGEjZ4BaigCACAAQfiMngFqKAIAIAEoAgQoAgwRCwALMAAgASgCACAALQAAQQJ0IgBBnI2eAWooAgAgAEGQjZ4BaigC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Rw0AIAAoAgAQihQLCyUAIAIgAyABQQEQoiQhASAAIANBf2o2AgQgACACQQAgARs2AgALKwAgAEEANgIYIABBADoAFCAAQQA2AhAgACABKQMINwMIIAAgASkDADcDAAstACAALQAAQQJ0IgBB0NGeAWooAgAgAEHE0Z4BaigCACABKAIAIAEoAgQQ6wMLLQAgAC0AAEECdCIAQejRngFqKAIAIABB3NGeAWooAgAgASgCACABKAIEEOsDCy0AIAAtAABBAnQiAEHY0p4BaigCACAAQfTRngFqKAIAIAEoAgAgASgCBBDrAwstACAALQAAQQJ0IgBB/NOeAWooAgAgAEG8054BaigCACABKAIAIAEoAgQQ6wMLLQAgAC0AAEECdCIAQdjUngFqKAIAIABBvNSeAWooAgAgASgCACABKAIEEOsDCy4BAX8gACgCACEBIABBgYDEADYCAAJAIAFBgYDEAEcNACAAQQRqEN4fIQELIAELLgEBfyAAKAIAIQEgAEGBgMQANgIAAkAgAUGBgMQARw0AIABBBGoQlA0hAQsgAQsoAAJAIABFDQAgABDJDyAAKAIAIABBBGooAgAQmS0gAEEUQQQQrBYLCy4AIAEoAgBBvrOcAUGPlZsBIAAoAgAtAAAiABtBB0EFIAAbIAEoAgQoAgwRCwALJQACQANAIAFFDQEgACkDABC+ISABQX9qIQEgAEEIaiEADAALCwspAAJAIABBgICAgHhGDQAgACABENQsDwsgAUEIahCYAyABQSBBCBCsFgstAQF/IAEoAgAgABD3DiAALQA5IQIgAEEBOgA5IAEoAgQgABDZASAAIAI6ADkLLAEBfwJAIAAtADRFDQAgAC8AOSECIABBgQI7ADkgASAAEMIBIAAgAjsAOQsLLgACQCABKAIAQQFHDQBB6KKbAUEqQZSjmwEQqhcACyAAIAEpAwggASgCGBCyHwsqAQF/IAAoAgAiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCABCmEAsLLwEBf0EBIQICQCABKAIAQaDRmwFBAiABKAIEKAIMEQsADQAgACABELQgIQILIAILKAACQCABIANLDQAgACABNgIEIAAgAjYCAA8LIAEgA0GE0ZsBEN0sAAsoAAJAIAEpAwBCAFINACAAQQI6ABQgACABKAIINgIADwsgACABEP4lCysA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KAIAQRpHDQAgAEEIaiABIAIQ+yEhAwsgAwsiAAJAA0AgAUUNASABQX9qIQEgABCwByAAQQRqIQAMAAsLCyIAAkADQCABRQ0BIAFBf2ohASAAEMImIABBKGohAAwACwsLIQAgASgCAEEAIAJrQQxsakF0aigCAEHdy92eeWxBD3etCywBAX8gACgCACIBEKQBIAFBwABBCBCsFiAAKAIEIgAQzAMgAEHgAEEIEKwWCyYBAX8CQCABIAAoAgAgACgCCCICa00NACAAIAIgAUEEQQQQ1R0LCyYBAX8CQCABIAAoAgAgACgCCCICa00NACAAIAIgAUEIQTgQ1R0LCywBAX8gACgCACIBEMcBIAFBwABBCBCsFiAAKAIEIgAQ2AMgAEHgAEEIEKwWCywBAX8gACgCACIBELcBIAFBwABBCBCsFiAAKAIEIgAQ2QMgAEHgAEEIEKwWCy0BAn8CQCAAKAIAIgFBgICAgHhGDQAgACgCBCICIAAoAggQlyUgASACEJktCwssAQF/IAAoAgAiARC1ASABQcAAQQgQrBYgACgCBCIAEM0DIABB4ABBCBCsFgssAQF/IAAoAgAiARC4ASABQcAAQQgQrBYgACgCBCIAENoDIABB4ABBCBCsFgsmAQF/AkAgASAAKAIAIAAoAggiAmtNDQAgACACIAFBCEEwENUdCwssAQF/IAAoAgAiARDBASABQcAAQQgQrBYgACgCBCIAEM4DIABB4ABBCBCsFgssAQF/IAAoAgAiARCxASABQcAAQQgQrBYgACgCBCIAEM8DIABB4ABBCBCsFgssAQF/IAAoAgAiARCyASABQcAAQQgQrBYgACgCBCIAEN4DIABB4ABBCBCsFgssAQF/IAAoAgAiARCzASABQcAAQQgQrBYgACgCBCIAEOEDIABB4ABBCBCsFgssAQF/IAAoAgAiARClASABQcAAQQgQrBYgACgCBCIAENADIABB4ABBCBCsFgsmAQF/AkAgASAAKAIAIAAoAggiAmtNDQAgACACIAFBBEEMENUdCwsiAAJAA0AgAUUNASABQX9qIQEgABDBJyAAQRBqIQAMAAsLCyIAAkADQCABRQ0BIAFBf2ohASAAELQtIABBDGohAAwACwsLIgACQANAIAFFDQEgAUF/aiEBIAAQkCogAEEMaiEADAALCwstAQJ/AkAgACgCACIB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ASgCACACQQR0a0FwaigCAEHdy92eeWxBD3etCyIAQd7qmwFB1OqbASAAQQFxIgAbQQtBCiAAGyABIAIQ6wMLJAAgAEEANgIQIABBADoAFCAAIAEpAwg3AwggACABKQMANwMACyUBAX8gACgCBCIBIAAoAggQ6CIgACgCACABEJotIABBFGoQ9ioLJQEBfiAAKQMIIQECQCAAKAIADQAgARC+IQ8LIAEgACkDGBCnLgslAQF/IAAoAgQiASAAKAIIEOgiIAAoAgAgARCaLSAAQRRqEIIrCyUBAX8gACgCBCIBIAAoAggQ6CIgACgCACABEJotIABBFGoQhysLJQEBfyAAKAIEIgEgACgCCBDoIiAAKAIAIAEQmi0gAEEUahCLKwslACABKAIAIAAtAABBAnRBjNWeAWooAgBBBiABKAIEKAIMEQsACyUBAX8gACgCBCIBIAAoAggQ6CIgACgCACABEJotIABBFGoQjisLHgAgASgCACACQQN0a0F4aigCAEHdy92eeWxBD3etCyAAAkADQCAAKAIAIgAtACxBAkcNASAAQRhqIQAMAAsLCyMAAkAgACgCAEEDRw0AIAEgACgCBBCJIAsgASAAKAIgEO8HCyUAIAEoAgAgAC0AAEECdEGg2Z4BaigCAEEGIAEoAgQoAgwRCwALIwAgACgCICABEKUCAkAgACgCAEECSQ0AIAAoAgQgARClAgsLIwAgACgCICABEKYBAkAgACgCAEECSQ0AIAAoAgQgARCmAQsLJQAgACABKAIINgIEIABBACABKAIEIAEoAgBBgICAgHhGGzYCAAsjAQF/AkBBBEE0EIEnIgANAAALIABBADsBMiAAQQA2AgAgAAskAQF/AkBBBEHkABCBJyIADQAACyAAQQA7ATIgAEEANgIAIAALIAAgAEEIahChEAJAIAAoAkhBCkYNACAAQcgAahChEAsLIQEBf0EAIQICQCABEKAVRQ0AIAEgABDkDkEBcyECCyACCyMBAX8gAEEEaiEBAkAgACgCAA0AIAEoAgAQgCwPCyABEOcHCyUBAX8gACgCBCIBIAAoAggQ6CIgACgCACABEJotIABBFGoQnysLJQEBfiAAKQMIIQECQCAAKAIADQAgARC+IQ8LIAEgACkDGBCnLgsgAAJAIAEoAgAiAUUNACAAIAEgAhCQCg8LIABBBDoAAAsgAAJAIAEoAgAiAUUNACAAIAEgAhCFBQ8LIABBBDoAAAsjACABKAIgIAAQ+AMCQCABKAIAQQJHDQAgASgCBCAAEPgDCwsfAAJAIABFDQAgASAAQQxqKAIAIABBEGooAgAQmSYLCx8AAkAgAEUNACABIABBBGooAgAgAEEIaigCABDDHwsLGwAgACABIAIgASACSRsgASACIAEgAksbEMMfCyQAAkAgASgCAEGAgICAeEYNACAAIAEgAhClGg8LIABBBDoAAAshACABKAIUIAAQqAgaAkAgACgCGCIARQ0AIAAgARC+BAsLHwACQCAARQ0AIAEgAEEMaigCACAAQRBqKAIAEMMfCwslAQF/IAAoAgQiASAAKAIIEOgiIAAoAgAgARCaLSAAQRRqELQrCx8AIAAgAhDXByAAQTBqIAJBMGoQ1wcgAkEIIAEQyQcLIQEBf0EAIQECQCAAKAIAQRFHDQAgAEEIahDVEyEBCyABCxsAIAAgASACIAMgAUEBcmdBAXRBPnNBABCtAQsbACAAIAEgAiADIAFBAXJnQQF0QT5zQQAQrgELJQEBfyAAKAIEIgEgACgCCBDoIiAAKAIAIAEQmi0gAEEUahC6KwslAQF/IAAoAgQiASAAKAIIEOgiIAAoAgAgARCaLSAAQRRqEMUrCyUBAX8gACgCBCIBIAAoAggQ6CIgACgCACABEJotIABBFGoQyisLIwAgAEEBNgIEIAAgASgCAEGBgICAeEciATYCCCAAIAE2AgALIwACQEEAIAAoAgARBAAiAA0AQdiEngEQyBoACyAAIAE2AgALJQAgACABKAIEIAEoAgggAkG4g4ABELglKAIANgIEIAAgATYCAAslACAAIAEoAgQgASgCCCACQciDgAEQuCUoAgg2AgQgACABNgIACyIBAX8CQEHkABC5LyIADQAACyAAQQA7ATIgAEEANgIAIAALIQEBfwJAQTQQuS8iAA0AAAsgAEEAOwEyIABBADYCACAACyUAAkAgAC0AAA0AIAFBqIecAUEFEIIGDwsgAUGth5wBQQQQggYLGwACQCACIAFJDQAgAiABIAMQjBUACyAAIAJqCxsAAkAgAiABSQ0AIAIgASADEIwVAAsgACACagsiACAAKAIQIAAoAhQgASAAKAI8dkF+akHguoMBELwlKAIICykAIABBHGpBACACQsni9JXs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QEHAABB9IgANAAALIAALGwEBf0EALQCg8J4BGgJAQSAQfSIADQAACyAACxgAAkAgACgCEEECRg0AIAAgARCxGQsgAAsXAAJAIAEgACgCCE0NACAAIAEQswIaCwscACAAKAIAIAAoAgQQ9ywgACgCDCAAKAIQEPcsCx0BAX8gACgCBCIBIAAoAggQ6SIgACgCACABEJwtCx0BAX8gACgCBCIBIAAoAggQlyUgACgCACABEJktCx0BAX8gACgCBCIBIAAoAggQliUgACgCACABEJ8tCx0BAX8gACgCBCIBIAAoAggQsRAgACgCACABEJ0tCx0BAX8gACgCBCIBIAAoAggQgxMgACgCACABEJgtCx0BAX8gACgCBCIBIAAoAggQ5yIgACgCACABEJctCx0BAX8gACgCBCIBIAAoAggQ+w8gACgCACABEJstCx0BAX8gACgCBCIBIAAoAggQ5yIgACgCACABEJctCx0BAX8gACgCBCIBIAAoAggQlyUgACgCACABEJktCx0BAX8gACgCBCIBIAAoAggQlSUgACgCACABEJotCx0BAX8gACgCBCIBIAAoAggQ7wggACgCACABEKEtCx0BAX8gACgCBCIBIAAoAggQ6SIgACgCACABEJwtCx0BAX8gACgCBCIBIAAoAggQ/gwgACgCACABEJgtCxcAAkAgAC0ALEECRw0AIABBGGoQhyYLCxwBAX8gACgCBCECIAEgACgCABD5JiABIAIQhRMLHQEBfyAAKAIEIgEgACgCCBCVJSAAKAIAIAEQmi0LGQACQCAAKAIAQQNHDQAgASAAKAIEEIkgCwsZAAJAIAAoAgBBAUcNACABIAAoAgQQiSALCx0BAX8gACgCBCIBIAAoAggQ5yIgACgCACABEJctCxkAAkAgACgCAEEDRw0AIAAoAgQgARC9AwsLGQACQCAAKAIAQQNHDQAgASAAKAIEEJ0DCwsdAQF/IAAoAgQiASAAKAIIEO8IIAAoAgAgARChLQsdAQF/IAAoAgQiASAAKAIIEPsPIAAoAgAgARCbLQsdAQF/IAAoAgQiASAAKAIIEIMTIAAoAgAgARCYLQsdAQF/IAAoAgQiASAAKAIIEP4MIAAoAgAgARCYLQsXAAJAIAAtACxBAkcNACAAQRhqEIcmCwsZAAJAIAAoAgBBA0cNACABIAAoAgQQqAELCxkA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ACgCzAJJCw8AIAAQkxMgAEEQahCTEwsiACAAQsni9JXsydDNgX83AwggAELcle3gpNnnz9UANwMACxMAIABB9NaAATYCBCAAIAE2AgALIQAgAEKNgobh8IGRkng3AwggAEKFgoK0n+Dg05d/NwMACxAAIAAgASACIANB3gAQwhgLEAAgACABIAIgA0HeABClDwsQACAAIAEoAgAgAiADEKQfCxAAIAAgASgCACACIAMQ6RULEAAgACABKAIAIAIgAxDUCwsQACAAIAEgAiADQd8AEMIYCxAAIAAgASACIANB3wAQpQ8LEAAgACgCACABIAIQ+gxBAAsSAEEALQCg8J4BGiABIAAQmicLEQAgASgCACABKAIEIAAQ3gULEQAgASAAKAIAIAAoAgQQggYLDwACQCAARQ0AIAEQ1yoLCw8AAkAgAEUNACAAEO4lCwsOACABQX9qIAAoArgCSQsOACABQX9qIAAoAswCSQsOACABQX9qIAAoAtQCSQsPACAAENgRIABBMGoQ3RcLEQAgASAAKAIEIAAoAggQggYLDgAgACABIAEgAmoQvCALEQAgABCyGjYCGCAAQQA2AgALEQAgACgCACIAEOUQIAAQii4LDgAgACABIAEgAmoQvCALEQAgACgCACAAKAIEIAEQ5BILIQAgAEK4iaWnht/nyE83AwggAEKotufllOOs/dcANwMACxEAIAEgACgCBCAAKAIIEIIGCxEAIAAoAgAgACgCBCABEIoPCxAAIAAgAhDJECABIAIQyRALDgAgACABIAEgAmoQ0CALEgBBAC0AoPCeARogASAAEJonCxAAIAAQ+SogAEEUQQQQrBYLDwAgABCzAyAAQQRqEKIGCw8AIAAQhiggAEEMahCJKAsPACAAEPYCIABBBGoQhgYLDwACQCAARQ0AIAAQ/CsLCxAAIAAQ8iogAEEUQQQQrBYLDwAgABCiAyAAQQRqEIsGCw8AIAAQkSggAEEMahCJKAsPACAAEOUpIABBFGoQgisLDwAgAEEwahCNKCAAEJsXCw8AIAAQtAMgAEEEahCMBgsPACAAEIsDIABBBGoQjQYLDwAgABDpAiAAQQRqEI4GCw8AAkAgAEUNACAAEIosCwsQACAAEJErIABBFEEEEKwWCxAAIAAgASAAKAJ4IAIQoyQLEAAgACABIAEoAnhBARCNAQsRACAAKAIEIAAoAgggARCCEgsRACAAKAIEIAAoAgggARCDEgsRACAAQf8BcUHU154Bai0AAAsRACAAKAIEIAAoAgggARCEEgsRACAAKAIEIAAoAgggARCFEgsQACABIAAQ4RogAUEAOgAYCxAAIAEgABCADyABQQA6ABgLEQAgASAAKAIEIAAoAggQggYLDwACQCAARQ0AIAAQliwLCxAAIAAQoCsgAEEUQQQQrBYLEgEBfyAAEJESIQEgABCgCyABCxIAQQAtAKDwngEaIAEgABCaJwsRACAAKAIAIgAQ6AMgABCFLwsPACAAEJcqIABBFGoQnysLDwAgABCZLCAAQQRqEPQGCxIAQQAtAKDwngEaIAEgABCaJwsPACAAIAFBACACIAIQmwYLDwAgABC6AyAAQQRqEI8GCw8AAkAgAEUNACAAENEmCwsRACAAIAEoAgAoAgAgAhC8AQsRACAAIAEoAgAoAgAgAhCFBQsRACAAIAEoAgAoAgAgAhCTEgsRACAAKAIAIgAQrQMgABCFLwsPACAAEKMsIABBBGoQkAYLEgBBAC0AoPCeARogASAAEJonCxAAIAAgASgCACgCACACEHsLEQAgACgCACIAEIsEIAAQhS8LDwAgAEEgahCnLCAAEK8kCw8AIAAQpywgAEEEahCRBgsSACAAKAIAEI4nIAAoAgQQjicLEgBBAC0AoPCeARogASAAEJonCxEAIAAoAgAiABCuAyAAEIUvCw8AIAAQrCwgAEEEahChBgsPACAAELgdIABBIGoQrCwLIQAgAELQr6/Z4cDf4pJ/NwMIIABCxITPwofQy/snNwMACxMAIABBDTYCBCAAQdObnAE2AgALIQAgAEL65LXqxJrouSM3AwggAEKoquuW4aGfiqF/NwMACyEAIABC+Mzr1K/1sKlzNwMIIABC+tj2j+Dxt/DSADcDAAsTACAAQR82AgQgAEG0m5wBNgIACyEAIABC/Nf7/tHxgf67fzcDCCAAQvToq6SjnLOEVTcDAAshACAAQofz952r/suKq383AwggAEKokZWU3Oqn13c3AwALIQAgAEKq3ufd3uK3inw3AwggAELJlOPr1ridwNMANwMACyIAIABCsOXHhe7Rm+a4fzcDCCAAQuCaypuR3I+tygA3AwALEwAgAEEoNgIEIABBkJecATYCAAsTACAAQZyenAE2AgQg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ACACIAAgARCCBgsMACAAKAIAIAEQuxMLCgAgABD/EhpBAQsMACAAKAIAIAEQ0isLDAAgACgCACABEIAHCwwAIAAoAgAgARCHDgsMACAAKAIAIAEQqyYLDAAgACgCACABEO0JCwwAIAAoAqQNQcQCagsLACAALQCsCkEBcQsMACAAKAKkDUHEAmoLDAAgACgCpA1BxAJqCwsAIAAoAowDQQJLCwoAIABBBGoQhiULCwAgASAAKAK0Ak0LCwAgASAAKALIAk0LCwAgASAAKALQAk0LCwAgACgCjANBAksLDAAgACgCACABEN8XCwwAIAAoAgAgARDSCgsMACAAKAIAIAEQ3BcLCgAgAEEwahDWHgsLACAAQRhBBBCsFgsLACAAQTRBBBCsFgsLACAAQRxBBBCsFgsOACAAQbS5iAFBChCLDQsPACAAQYS6iAFBxwAQiw0LDAAgACgCACABEIIQCwsAIAAgARCMCkEACwwAIAAoAgAgARCGHgsLACAAIAEQuBdBAAsOACABQeDalwFBAhCCBgsMACAAKAIAIAEQ1ysLCgAgACABEJQuAAsKACAAIAEQ+iMACwwAIAAoAgAgARCrJgsMACAAKAIAIAEQ+QwLDAAgACABKQIANwMACwwAIAAoAgAgARDZFQsKACAAEI8OGkEBCwoAIAAQtQIaQQELCwAgACABQQQQ+B4LDAAgACgCACABEOgrCwoAIAAQ8Q0aQQELDAAgACgCACABEMEXCwwAIAAoAgAgARDsBAsMACAAKAIAIAEQzwILDAAgACgCACABEMwgCwwAIAAoAgAgARDUGQsMACAAEL4hIAEQviELDAAgACgCACABENMaCwwAIAAoAgAgARDgDAsMACAAKAIAIAEQ0hkLDAAgABC+ISABEPUqCwwAIAAoAgAgARDVCgsMACAAKAIAIAEQqi4LDAAgACgCACABEJAFCwwAIAAoAgAgARDUGgsMACAAKAIAIAEQuwoLDAAgACgCACABEKsNCwwAIAAoAgAgARDTHAsMACAAKAIAIAEQ9BALDAAgACgCACABEKQuCwwAIAAoAgAgARDTDAsMACAAKAIAIAEQ5CILDAAgACgCACABEKUuCwsAIABBAToADEEBCwwAIAAQvyEgARD/KgsMACAAEL8hIAEQvyELDAAgACgCACABEOwQCwwAIAAoAgAgARDAIQsM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YXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvcmFiaW5rYXJwLnJzZRcgAG8AAAA9AAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IGhhc2hfbGVuID49IDEAZRcgAG8AAAA/AAAACQAAAGUXIABvAAAASAAAABYAAABlFyAAbwAAAE0AAAAsAAAAZRcgAG8AAABPAAAAFwAAAGUXIABvAAAATwAAACAAAABAAAAAZRcgAG8AAABgAAAAKwAAAGUXIABvAAAAbwAAABEAAABlFyAAbwAAAFsAAAAJAAAAZRcgAG8AAACOAAAAIwAAAGUXIABvAAAAlwAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvYWxwaGFiZXQucnOx5yAADAAAABqPJgACAAAARAgnAAEAAABCeXRlQ2xhc3Nlcyg8b25lLWNsYXNzLXBlci1ieXRlPikAAAAsGSAAIQAAAKgYIABsAAAA9QAAAC4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvZGVidWcucnMAAABoGSAAaQAAABgAAAA9AAAAaBkgAGkAAAAVAAAADQAAAEJvcnJvd2VkT3duZWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9wYXR0ZXJuLnJzAAABGiAAbQAAAF0AAAAaAAAAARogAG0AAABdAAAAMAAAAAAAAAAAAAAAAQAAAO4DAABDb3dCeXRlc25lZWRsZVBhdHRlcm5zYnlfaWRvcmRlcnRvdGFsX3BhdHRlcm5fYnl0ZXNpbXBtZW1vcnlfdXNhZ2UAAO8DAABcAQAABAAAAKEAAADvAwAAXAEA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ABEGGQAFAAAvAAAHHxFPER4SMBAEHxUFEwAt00CASwQ5BxFAAgEBDAIOAAgAKQoABAEHAQIBAA8BHQMCAQ4ECAAAawUNAwkHCgQBAFUBRwECAgECAgIEAQwBAQEHAUEBBAIIAQcBHAEEAQUBAQMHAQACGQEZAR8BGQEfARkBHwEZAR8BGQEIAB8GBtUHARECBwECAQUFPiEBcC0KBxABAB4SLAAc5B4CAQAHAQQBAgEPAcU7RAMBAwEABAEbAQIBAQIBAQoBBAEBAQEGAQQBAQEBAQEDAQIBAQIBAQEBAQEBAQEBAgEBAgQBBwEEAQQBAQEKAREFAwEFAREAGgYaBhoAACAABt4CAA4ADwAAAAAABQAAAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDOwkqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgIBAQMDAQQHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwAEHAMdAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAoEAyYJDAIgBAIGOAEBAgMBAQU4CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsBASwDMAECBAICAgEkAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABEEFAAJPBEYLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJAQEIBAIBXwMCBAYBAgGdAQMIFQI5AgEBAQEMAQkBDgcDBUMBAgYBAQIBAQMEAwEBDgJVCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAghlAQEBAgQBBQAJAQL1AQoEBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQMXAQABBg8ADAMDAAU7BwABPwRRAQsCAAIALgIXAAUDBggIAgceBJQDADcEMggBDgEWBQEPAAcBEQIHAQIBBWQBoAcAAT0EAAT+AgAHbQcAYIDwADAKeAIFAQIDAAqGCsYKAAp2CgQGbAp2CnYKAgZuDXMKCAdnCmgHBxNtCmAKdgpGFAAKRgoAFAAD7woGChYKAAqAC6UKBgq2ClYKhgoGCgABAwYGCsYzAgUAPE4WAB4AAQABGQkOAwAEigoeCAEPIAonDwAKvAoABpoKJgrGChYKVgoACgAKAC0MORECABskBB0BCAGGBcoKAAgZBycJSwUWBqACAhACLkAJNAIeA0sFaAgYCCkHAAYwCgYKAB+eCioEcAeGHoAKPAqQCgcU+woACnYKAApmCgYUTAwAE10KAApWHeMKRgoACmYVAG8ACgAKVgqGCgEHAAoAFwAKABQMFGwZADIACgAKAAr3CgAJgAoAOwEDAQRMLQEPAA0ACgAAAAAAAAEAAAAAAAAACgAAAAAAAABkAAAAAAAAAOgDAAAAAAAAECcAAAAAAACghgEAAAAAAEBCDwAAAAAAgJaYAAAAAAAA4fUFAAAAAADKmjsAAAAAAOQLVAIAAAAA6HZIFwAAAAAQpdToAAAAAKByThgJAAAAQHoQ81oAAACAxqR+jQMAbGlicmFyeS9jb3JlL3NyYy9udW0vZGVjMmZsdC9kZWNpbWFsX3NlcS5ycwBAOSAAKwAAAFYAAAAnAAAAQDkgACsAAACIAAAAEwAAAEA5IAArAAAAsAAAACAAAABAOSAAKwAAAMcAAAAlAAAAQDkgACsAAAD0AAAAFQAAAEA5IAArAAAA/wAAABgAAAAAAAAIAQgDCAYQCRANEBIYFxgdGCQgKyAzIDwgRihQKFsoZzBzMIAwjjicOKs4uzjMQN1A70ACSRVJKUk+UVNRaVGAUZhZsFnJWeNh/WEYYjRqUGptaotqqnLJculyCnsre017cIOTg7eD3IMCjCiMT4x3lJ+UyJTynBwFHAUcBRwFBQIFAQIFBgIFAwECBQEFBgIFBwgBAgUDCQAGAgUBCQUDAQIFCQcGBQYCBQQICAIIAQIFAgQEAQQABgIFAQICAAcAAwECBQYBAAMFAQUGAgUDAAUBBwUHCAECBQEFAgUIBwgJAAYCBQcGAgkDCQQFAwECBQMIAQQGCQcCBgUGAgUBCQAHAwQIBgMCCAECBQkFAwYHBAMBBgQABgIFBAcGCAMHAQUIAgADAQIFAgMIBAEIBQcJAQABBQYCBQEBCQIACQIICQUFAAcIAQIFBQkGAAQGBAQHBwUDCQAGAgUCCQgAAgMCAgMIBwYJBQMBAgUBBAkAAQEGAQEJAwgEBwYFBgIFBwQFAAUIAAUJBgkCAwgCCAECBQMHAgUCCQACCQgEBgEJAQQABgIFAQgGAgYEBQEECQIDAAkFBwADAQIFCQMBAwICBQcEBgEFBAcIBQEFBgIFBAYFBgYBAggHAwAHBwMJAgUHCAECBQIDAggDAAYEAwYFAwgGCQYCCAkABgIFAQEGBAEFAwIBCAIGCQMECAEEBAUDAQIFBQgCAAcGBgAJAQMEBgcEAAcCAgYFBgIFAgkBAAMIAwAEBQYHAwMHAAMGAQMCCAECBQEEBQUBCQEFAgIIAwYGCAUBCAAGBgQABgIFBwIHBQkFBwYBBAEIAwQCBQkAAwMCAAMBAgUDBgMHCQcICAAHAAkBBwECCQUBBgYAAQUGAgUBCAEICQgJBAADBQQFCAUGBAcFCAMAAAcIAQIFCQAJBAkEBwABBwcCCQIIAgMHCQEFAAMJAAYCBQQFBAcEBwMFAAgIBgQGBAEBCAkFBwUBCQUDAQIFAgIHAwcDBgcFBAQDAgMCAAUJBAcIBwUJBwYFBgIFAQEDBggGCAMHBwIBBgEGAAIJBwMJAwcJCAgCCAECBQUGCAQDBAEICAYACAAIAAEECAYJBggJCQQBBAAGAgUCCAQCAQcACQQDAAQABAAABwQDBAgEBAkHAAcAAwECBQEEAgEACAUEBwEFAgACAAADBwEHBAICBAgFAwUBBQYCBQcBAAUEAgcDBQcGAAEAAAEIBQgHAQECBAIGBwUHCAECBQMFBQIHAQMGBwgIAAAFAAAJAgkDBQUGAgEDAwcICQAGAgUBBwcGAwUGCAMJBAAAAgUABAYEBgcHCAEABgYICQQFAwECBQgICAEHCAQBCQcAAAECBQIDAgMDCAkABQMDBAQHAgYFBgIFBAQEAAgJAgAJCAUAAAYCBgEGAQYJBAUCBgYHAgMGAwIIAQIFAgICAAQEBgAECQIFAAMBAwAIAAgEBwIGAwMDBgEI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AG8BAAAOAAAAAAAAAAwAAAAEAAAAcQQAAHIEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oc3RyLTIuMS4wL3NyYy9saWIucnMAABSIIABaAAAAFAEAADwAAAAAAAAAAAAAAAEAAABzBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaHN0ci0yLjEuMC9zcmMvZHluYW1pYy5ycwAAkIggAF4AAABxAAAAIAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5yc3JldHVybiB0aGlzAIkgAF0AAAD7GAAAAQAAAPSCJwBvAAAAJAEAAA4AAABDRCYAcAAAAE0AAAAuAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbWVtY2hyLTIuNy41L3NyYy9hcmNoL2FsbC90d293YXkucnOYiSAAaAAAAL8AAAAuAAAAmIkgAGgAAADHAAAAKQAAAJiJIABoAAAAzAAAADQAAACYiSAAaAAAANQAAAAkAAAAmIkgAGgAAADUAAAAMQAAAJiJIABoAAAA1wAAACIAAACYiSAAaAAAANcAAAAzAAAAmIkgAGgAAADxAAAALgAAAJiJIABoAAAA+AAAACkAAACYiSAAaAAAAP0AAAA0AAAAmIkgAGgAAAAEAQAAGAAAAJiJIABoAAAABAEAACUAAACYiSAAaAAAAMIBAAAdAAAAmIkgAGgAAADDAQAAGQAAAJiJIABoAAAACgIAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjUvc3JjL2FyY2gvYWxsL21vZC5ycwAAAPCKIABlAAAALAAAAB4AAAA8c2VhcmNoZXIgZnVuY3Rpb24+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AAT8AAACAAAAAf4AAAIAAAAAAAAAAAAAAHSkIABkAAAAVgMAACsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2RpdmlzaW9uLnJzAAAAvKAgAG0AAAAcAAAABgAAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAAA8oSAAGQAAALygIABtAAAAVwAAAAkAAAC8oCAAbQAAAN0AAAA5AAAAvKAgAG0AAADuAAAAHwAAALygIABtAAAA0gAAAAkAAAC8oCAAbQAAABUBAAAOAAAAvKAgAG0AAAAWAQAADgAAALygIABtAAAAGgEAAA8AAAC8oCAAbQAAAFEBAAAMAAAAvKAgAG0AAAAgAQAAIQAAALygIABtAAAAIQEAABgAAAC8oCAAbQAAAEIBAAA8AAAAvKAgAG0AAABGAQAAKQAAALygIABtAAAASwEAAA8AAAC8oCAAbQAAAE4BAAAbAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pdGVyLnJzAABAoiAATgAAAPYFAAAVAAAAAAAAAAQAAAAEAAAATgAAAG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm9uLXplcm8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAAADMoiAAaQAAAGYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAAAEijIABtAAAAOwAAABoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3NoaWZ0LnJzAADIoyAAagAAAB4AAAAcAAAAyKMgAGoAAAAoAAAAGQAAAMijIABqAAAALgAAABIAAADIoyAAagAAAEoAAAAjAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC5yc3SkIABkAAAAYwMAABcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJz6KQgAHAAAAA0AAAAGgAAAOikIABwAAAANQAAABoAAABDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEueKUgADQAAADopCAAcAAAAEUAAAAFAAAA6KQgAHAAAABdAAAAGgAAAOikIABwAAAAXgAAABoAAABhc3NlcnRpb24gZmFpbGVkOiBhX2hpLmlzX2VtcHR5KCkAAADopCAAcAAAAGIAAAAFAAAA6KQgAHAAAABlAAAABQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnMopiAAZAAAAIMBAAABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvaW1wX3N0ZC5yc5ymIABkAAAAoQAAADYAAACcpiAAZAAAAJsAAAAJAAAAMzg7NTswMzg7NTsxMzg7NTsyMzg7NTszMzg7NTs0Mzg7NTs1Mzg7NTs2Mzg7NTs3Mzg7NTs4Mzg7NTs5Mzg7NTsxMDM4OzU7MTEzODs1OzEyMzg7NTsxMzM4OzU7MTQzODs1OzE1Mzg7NTsxNjM4OzU7MTczODs1OzE4Mzg7NTsxOTM4OzU7MjAzODs1OzIxMzg7NTsyMjM4OzU7MjMzODs1OzI0Mzg7NTsyNTM4OzU7MjYzODs1OzI3Mzg7NTsyODM4OzU7MjkzODs1OzMwMzg7NTszMTM4OzU7MzIzODs1OzMzMzg7NTszNDM4OzU7MzUzODs1OzM2Mzg7NTszNzM4OzU7MzgzODs1OzM5Mzg7NTs0MDM4OzU7NDEzODs1OzQyMzg7NTs0MzM4OzU7NDQzODs1OzQ1Mzg7NTs0NjM4OzU7NDczODs1OzQ4Mzg7NTs0OTM4OzU7NTAzODs1OzUxMzg7NTs1MjM4OzU7NTMzODs1OzU0Mzg7NTs1NTM4OzU7NTYzODs1OzU3Mzg7NTs1ODM4OzU7NTkzODs1OzYwMzg7NTs2MTM4OzU7NjIzODs1OzYzMzg7NTs2NDM4OzU7NjUzODs1OzY2Mzg7NTs2NzM4OzU7NjgzODs1OzY5Mzg7NTs3MDM4OzU7NzEzODs1OzcyMzg7NTs3MzM4OzU7NzQzODs1Ozc1Mzg7NTs3NjM4OzU7NzczODs1Ozc4Mzg7NTs3OTM4OzU7ODAzODs1OzgxMzg7NTs4MjM4OzU7ODMzODs1Ozg0Mzg7NTs4NTM4OzU7ODYzODs1Ozg3Mzg7NTs4ODM4OzU7ODkzODs1OzkwMzg7NTs5MTM4OzU7OTIzODs1OzkzMzg7NTs5NDM4OzU7OTUzODs1Ozk2Mzg7NTs5NzM4OzU7OTgzODs1Ozk5Mzg7NTsxMDAzODs1OzEwMTM4OzU7MTAyMzg7NTsxMDMzODs1OzEwNDM4OzU7MTA1Mzg7NTsxMDYzODs1OzEwNzM4OzU7MTA4Mzg7NTsxMDkzODs1OzExMDM4OzU7MTExMzg7NTsxMTIzODs1OzExMzM4OzU7MTE0Mzg7NTsxMTUzODs1OzExNjM4OzU7MTE3Mzg7NTsxMTgzODs1OzExOTM4OzU7MTIwMzg7NTsxMjEzODs1OzEyMjM4OzU7MTIzMzg7NTsxMjQzODs1OzEyNTM4OzU7MTI2Mzg7NTsxMjczODs1OzEyODM4OzU7MTI5Mzg7NTsxMzAzODs1OzEzMTM4OzU7MTMyMzg7NTsxMzMzODs1OzEzNDM4OzU7MTM1Mzg7NTsxMzYzODs1OzEzNzM4OzU7MTM4Mzg7NTsxMzkzODs1OzE0MDM4OzU7MTQxMzg7NTsxNDIzODs1OzE0MzM4OzU7MTQ0Mzg7NTsxNDUzODs1OzE0NjM4OzU7MTQ3Mzg7NTsxNDgzODs1OzE0OTM4OzU7MTUwMzg7NTsxNTEzODs1OzE1MjM4OzU7MTUzMzg7NTsxNTQzODs1OzE1NTM4OzU7MTU2Mzg7NTsxNTczODs1OzE1ODM4OzU7MTU5Mzg7NTsxNjAzODs1OzE2MTM4OzU7MTYyMzg7NTsxNjMzODs1OzE2NDM4OzU7MTY1Mzg7NTsxNjYzODs1OzE2NzM4OzU7MTY4Mzg7NTsxNjkzODs1OzE3MDM4OzU7MTcxMzg7NTsxNzIzODs1OzE3MzM4OzU7MTc0Mzg7NTsxNzUzODs1OzE3NjM4OzU7MTc3Mzg7NTsxNzgzODs1OzE3OTM4OzU7MTgwMzg7NTsxODEzODs1OzE4MjM4OzU7MTgzMzg7NTsxODQzODs1OzE4NTM4OzU7MTg2Mzg7NTsxODczODs1OzE4ODM4OzU7MTg5Mzg7NTsxOTAzODs1OzE5MTM4OzU7MTkyMzg7NTsxOTMzODs1OzE5NDM4OzU7MTk1Mzg7NTsxOTYzODs1OzE5NzM4OzU7MTk4Mzg7NTsxOTkzODs1OzIwMDM4OzU7MjAxMzg7NTsyMDIzODs1OzIwMzM4OzU7MjA0Mzg7NTsyMDUzODs1OzIwNjM4OzU7MjA3Mzg7NTsyMDgzODs1OzIwOTM4OzU7MjEwMzg7NTsyMTEzODs1OzIxMjM4OzU7MjEzMzg7NTsyMTQzODs1OzIxNTM4OzU7MjE2Mzg7NTsyMTczODs1OzIxODM4OzU7MjE5Mzg7NTsyMjAzODs1OzIyMTM4OzU7MjIyMzg7NTsyMjMzODs1OzIyNDM4OzU7MjI1Mzg7NTsyMjYzODs1OzIyNzM4OzU7MjI4Mzg7NTsyMjkzODs1OzIzMDM4OzU7MjMxMzg7NTsyMzIzODs1OzIzMzM4OzU7MjM0Mzg7NTsyMzUzODs1OzIzNjM4OzU7MjM3Mzg7NTsyMzgzODs1OzIzOTM4OzU7MjQwMzg7NTsyNDEzODs1OzI0MjM4OzU7MjQzMzg7NTsyNDQzODs1OzI0NTM4OzU7MjQ2Mzg7NTsyNDczODs1OzI0ODM4OzU7MjQ5Mzg7NTsyNTAzODs1OzI1MTM4OzU7MjUyMzg7NTsyNTMzODs1OzI1NDM4OzU7MjU1NDg7NTswNDg7NTsxNDg7NTsyNDg7NTszNDg7NTs0NDg7NTs1NDg7NTs2NDg7NTs3NDg7NTs4NDg7NTs5NDg7NTsxMDQ4OzU7MTE0ODs1OzEyNDg7NTsxMzQ4OzU7MTQ0ODs1OzE1NDg7NTsxNjQ4OzU7MTc0ODs1OzE4NDg7NTsxOTQ4OzU7MjA0ODs1OzIxNDg7NTsyMjQ4OzU7MjM0ODs1OzI0NDg7NTsyNTQ4OzU7MjY0ODs1OzI3NDg7NTsyODQ4OzU7Mjk0ODs1OzMwNDg7NTszMTQ4OzU7MzI0ODs1OzMzNDg7NTszNDQ4OzU7MzU0ODs1OzM2NDg7NTszNzQ4OzU7Mzg0ODs1OzM5NDg7NTs0MDQ4OzU7NDE0ODs1OzQyNDg7NTs0MzQ4OzU7NDQ0ODs1OzQ1NDg7NTs0NjQ4OzU7NDc0ODs1OzQ4NDg7NTs0OTQ4OzU7NTA0ODs1OzUxNDg7NTs1MjQ4OzU7NTM0ODs1OzU0NDg7NTs1NTQ4OzU7NTY0ODs1OzU3NDg7NTs1ODQ4OzU7NTk0ODs1OzYwNDg7NTs2MTQ4OzU7NjI0ODs1OzYzNDg7NTs2NDQ4OzU7NjU0ODs1OzY2NDg7NTs2NzQ4OzU7Njg0ODs1OzY5NDg7NTs3MDQ4OzU7NzE0ODs1OzcyNDg7NTs3MzQ4OzU7NzQ0ODs1Ozc1NDg7NTs3NjQ4OzU7Nzc0ODs1Ozc4NDg7NTs3OTQ4OzU7ODA0ODs1OzgxNDg7NTs4MjQ4OzU7ODM0ODs1Ozg0NDg7NTs4NTQ4OzU7ODY0ODs1Ozg3NDg7NTs4ODQ4OzU7ODk0ODs1OzkwNDg7NTs5MTQ4OzU7OTI0ODs1OzkzNDg7NTs5NDQ4OzU7OTU0ODs1Ozk2NDg7NTs5NzQ4OzU7OTg0ODs1Ozk5NDg7NTsxMDA0ODs1OzEwMTQ4OzU7MTAyNDg7NTsxMDM0ODs1OzEwNDQ4OzU7MTA1NDg7NTsxMDY0ODs1OzEwNzQ4OzU7MTA4NDg7NTsxMDk0ODs1OzExMDQ4OzU7MTExNDg7NTsxMTI0ODs1OzExMzQ4OzU7MTE0NDg7NTsxMTU0ODs1OzExNjQ4OzU7MTE3NDg7NTsxMTg0ODs1OzExOTQ4OzU7MTIwNDg7NTsxMjE0ODs1OzEyMjQ4OzU7MTIzNDg7NTsxMjQ0ODs1OzEyNTQ4OzU7MTI2NDg7NTsxMjc0ODs1OzEyODQ4OzU7MTI5NDg7NTsxMzA0ODs1OzEzMTQ4OzU7MTMyNDg7NTsxMzM0ODs1OzEzNDQ4OzU7MTM1NDg7NTsxMzY0ODs1OzEzNzQ4OzU7MTM4NDg7NTsxMzk0ODs1OzE0MDQ4OzU7MTQxNDg7NTsxNDI0ODs1OzE0MzQ4OzU7MTQ0NDg7NTsxNDU0ODs1OzE0NjQ4OzU7MTQ3NDg7NTsxNDg0ODs1OzE0OTQ4OzU7MTUwNDg7NTsxNTE0ODs1OzE1MjQ4OzU7MTUzNDg7NTsxNTQ0ODs1OzE1NTQ4OzU7MTU2NDg7NTsxNTc0ODs1OzE1ODQ4OzU7MTU5NDg7NTsxNjA0ODs1OzE2MTQ4OzU7MTYyNDg7NTsxNjM0ODs1OzE2NDQ4OzU7MTY1NDg7NTsxNjY0ODs1OzE2NzQ4OzU7MTY4NDg7NTsxNjk0ODs1OzE3MDQ4OzU7MTcxNDg7NTsxNzI0ODs1OzE3MzQ4OzU7MTc0NDg7NTsxNzU0ODs1OzE3NjQ4OzU7MTc3NDg7NTsxNzg0ODs1OzE3OTQ4OzU7MTgwNDg7NTsxODE0ODs1OzE4MjQ4OzU7MTgzNDg7NTsxODQ0ODs1OzE4NTQ4OzU7MTg2NDg7NTsxODc0ODs1OzE4ODQ4OzU7MTg5NDg7NTsxOTA0ODs1OzE5MTQ4OzU7MTkyNDg7NTsxOTM0ODs1OzE5NDQ4OzU7MTk1NDg7NTsxOTY0ODs1OzE5NzQ4OzU7MTk4NDg7NTsxOTk0ODs1OzIwMDQ4OzU7MjAxNDg7NTsyMDI0ODs1OzIwMzQ4OzU7MjA0NDg7NTsyMDU0ODs1OzIwNjQ4OzU7MjA3NDg7NTsyMDg0ODs1OzIwOTQ4OzU7MjEwNDg7NTsyMTE0ODs1OzIxMjQ4OzU7MjEzNDg7NTsyMTQ0ODs1OzIxNTQ4OzU7MjE2NDg7NTsyMTc0ODs1OzIxODQ4OzU7MjE5NDg7NTsyMjA0ODs1OzIyMTQ4OzU7MjIyNDg7NTsyMjM0ODs1OzIyNDQ4OzU7MjI1NDg7NTsyMjY0ODs1OzIyNzQ4OzU7MjI4NDg7NTsyMjk0ODs1OzIzMDQ4OzU7MjMxNDg7NTsyMzI0ODs1OzIzMzQ4OzU7MjM0NDg7NTsyMzU0ODs1OzIzNjQ4OzU7MjM3NDg7NTsyMzg0ODs1OzIzOTQ4OzU7MjQwNDg7NTsyNDE0ODs1OzI0MjQ4OzU7MjQzNDg7NTsyNDQ0ODs1OzI0NTQ4OzU7MjQ2NDg7NTsyNDc0ODs1OzI0ODQ4OzU7MjQ5NDg7NTsyNTA0ODs1OzI1MTQ4OzU7MjUyNDg7NTsyNTM0ODs1OzI1NDQ4OzU7MjU1Mzg7MjsAAABEtiAABQAAAIwdJwABAAAAjB0nAAEAAAA0ODsyOwAAAGS2IAAFAAAAjB0nAAEAAACMHScAAQAAADMwMzEzMjMzMzQzNTM2MzczOTkwOTE5MjkzOTQ5NTk2OTc0MDQxNDI0MzQ0NDU0NjQ3NDkxMDAxMDExMDIxMDMxMDQxMDUxMDYxMDczODsyOzI0MDsyNDg7MjU1Mzg7MjsyNTA7MjM1OzIxNTM4OzI7MDAwOzI1NTsyNTUzODsyOzEyNzsyNTU7MjEyMzg7MjsyNDA7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyMjAzODsyOzI1NTsyMjg7MTk2Mzg7MjswMDA7MDAwOzAwMDM4OzI7MjU1OzIzNTsyMDUzODsyOzAwMDswMDA7MjU1Mzg7MjsxMzg7MDQzOzIyNjM4OzI7MTY1OzA0MjswNDIzODsyOzIyMjsxODQ7MTM1Mzg7MjswOTU7MTU4OzE2MDM4OzI7MTI3OzI1NTswMDAzODsyOzIxMDsxMDU7MDMwMzg7MjsyNTU7MTI3OzA4MDM4OzI7MTAwOzE0OTsyMzczODsyOzI1NTsyNDg7MjIwMzg7MjsyMjA7MDIwOzA2MDM4OzI7MDAwOzAwMDsxMzkzODsyOzAwMDsxMzk7MTM5Mzg7MjsxODQ7MTM0OzAxMTM4OzI7MTY5OzE2OTsxNjkzODsyOzAwMDsxMDA7MDAwMzg7MjsxODk7MTgzOzEwNzM4OzI7MTM5OzAwMDsxMzkzODsyOzA4NTsxMDc7MDQ3Mzg7MjsyNTU7MTQwOzAwMDM4OzI7MTUzOzA1MDsyMDQzODsyOzEzOTswMDA7MDAwMzg7MjsyMzM7MTUwOzEyMjM4OzI7MTQzOzE4ODsxNDMzODsyOzA3MjswNjE7MTM5Mzg7MjswNDc7MDc5OzA3OTM4OzI7MDAwOzIwNjsyMDkzODsyOzE0ODswMDA7MjExMzg7MjsyNTU7MDIwOzE0NzM4OzI7MDAwOzE5MTsyNTUzODsyOzEwNTsxMDU7MTA1Mzg7MjswMzA7MTQ0OzI1NTM4OzI7MTc4OzAzNDswMzQzODsyOzI1NTsyNTA7MjQwMzg7MjswMzQ7MTM5OzAzNDM4OzI7MjU1OzAwMDsyNTUzODsyOzIyMDsyMjA7MjIwMzg7MjsyNDg7MjQ4OzI1NTM4OzI7MjU1OzIxNTswMDAzODsyOzIxODsxNjU7MDMyMzg7MjsxMjg7MTI4OzEyODM4OzI7MDAwOzEyODswMDAzODsyOzE3MzsyNTU7MDQ3Mzg7MjsyNDA7MjU1OzI0MDM4OzI7MjU1OzEwNTsxODAzODsyOzIwNTswOTI7MDkyMzg7MjswNzU7MDAwOzEzMDM4OzI7MjU1OzI1NTsyNDAzODsyOzI0MDsyMzA7MTQwMzg7MjsyMzA7MjMwOzI1MDM4OzI7MjU1OzI0MDsyNDUzODsyOzEyNDsyNTI7MDAwMzg7MjsyNTU7MjUwOzIwNTM4OzI7MTczOzIxNjsyMzAzODsyOzI0MDsxMjg7MTI4Mzg7MjsyMjQ7MjU1OzI1NTM4OzI7MjUwOzI1MDsyMTAzODsyOzIxMTsyMTE7MjExMzg7MjsxNDQ7MjM4OzE0NDM4OzI7MjU1OzE4MjsxOTMzODsyOzI1NTsxNjA7MTIyMzg7MjswMzI7MTc4OzE3MDM4OzI7MTM1OzIwNjsyNTAzODsyOzExOTsxMzY7MTUzMzg7MjsxNzY7MTk2OzIyMjM4OzI7MjU1OzI1NTsyMjQzODsyOzAwMDsyNTU7MDAwMzg7MjswNTA7MjA1OzA1MDM4OzI7MjUwOzI0MDsyMzAzODsyOzEyODswMDA7MDAwMzg7MjsxMDI7MjA1OzE3MDM4OzI7MDAwOzAwMDsyMDUzODsyOzE4NjswODU7MjExMzg7MjsxNDc7MTEyOzIxOTM4OzI7MDYwOzE3OTsxMTMzODsyOzEyMzsxMDQ7MjM4Mzg7MjswMDA7MjUwOzE1NDM4OzI7MDcyOzIwOTsyMDQzODsyOzE5OTswMjE7MTMzMzg7MjswMjU7MDI1OzExMjM4OzI7MjQ1OzI1NTsyNTAzODsyOzI1NTsyMjg7MjI1Mzg7MjsyNTU7MjI4OzE4MTM4OzI7MjU1OzIyMjsxNzMzODsyOzAwMDswMDA7MTI4Mzg7MjsyNTM7MjQ1OzIzMDM4OzI7MTI4OzEyODswMDAzODsyOzEwNzsxNDI7MDM1Mzg7MjsyNTU7MTY1OzAwMDM4OzI7MjU1OzA2OTswMDAzODsyOzIxODsxMTI7MjE0Mzg7MjsyMzg7MjMyOzE3MDM4OzI7MTUyOzI1MTsxNTIzODsyOzE3NTsyMzg7MjM4Mzg7MjsyMTk7MTEyOzE0NzM4OzI7MjU1OzIzOTsyMTMzODsyOzI1NTsyMTg7MTg1Mzg7MjsyMDU7MTMzOzA2MzM4OzI7MjU1OzE5MjsyMDMzODsyOzIyMTsxNjA7MjIxMzg7MjsxNzY7MjI0OzIzMDM4OzI7MTI4OzAwMDsxMjgzODsyOzEwMjswNTE7MTUzMzg7MjsyNTU7MDAwOzAwMDM4OzI7MTg4OzE0MzsxNDMzODsyOzA2NTsxMDU7MjI1Mzg7MjsxMzk7MDY5OzAxOTM4OzI7MjUwOzEyODsxMTQzODsyOzI0NDsxNjQ7MDk2Mzg7MjswNDY7MTM5OzA4NzM4OzI7MjU1OzI0NTsyMzgzODsyOzE2MDswODI7MDQ1Mzg7MjsxOTI7MTkyOzE5MjM4OzI7MTM1OzIwNjsyMzUzODsyOzEwNjswOTA7MjA1Mzg7MjsxMTI7MTI4OzE0NDM4OzI7MjU1OzI1MDsyNTAzODsyOzAwMDsyNTU7MTI3Mzg7MjswNzA7MTMwOzE4MDM4OzI7MjEwOzE4MDsxNDAzODsyOzAwMDsxMjg7MTI4Mzg7MjsyMTY7MTkxOzIxNjM4OzI7MjU1OzA5OTswNzEzODsyOzA2NDsyMjQ7MjA4Mzg7MjsyMzg7MTMwOzIzODM4OzI7MjQ1OzIyMjsxNzkzODsyOzI1NTsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzI0NTM4OzI7MjU1OzI1NTswMDAzODsyOzE1NDsyMDU7MDUwNDg7MjsyNDA7MjQ4OzI1NTQ4OzI7MjUwOzIzNTsyMTU0ODsyOzAwMDsyNTU7MjU1NDg7MjsxMjc7MjU1OzIxMjQ4OzI7MjQwOzI1NTsyNTU0ODsyOzI0NTsyNDU7MjIwNDg7MjsyNTU7MjI4OzE5NjQ4OzI7MDAwOzAwMDswMDA0ODsyOzI1NTsyMzU7MjA1NDg7MjswMDA7MDAwOzI1NTQ4OzI7MTM4OzA0MzsyMjY0ODsyOzE2NTswNDI7MDQyNDg7MjsyMjI7MTg0OzEzNTQ4OzI7MDk1OzE1ODsxNjA0ODsyOzEyNzsyNTU7MDAwNDg7MjsyMTA7MTA1OzAzMDQ4OzI7MjU1OzEyNzswODA0ODsyOzEwMDsxNDk7MjM3NDg7MjsyNTU7MjQ4OzIyMDQ4OzI7MjIwOzAyMDswNjA0ODsyOzAwMDswMDA7MTM5NDg7MjswMDA7MTM5OzEzOTQ4OzI7MTg0OzEzNDswMTE0ODsyOzE2OTsxNjk7MTY5NDg7MjswMDA7MTAwOzAwMDQ4OzI7MTg5OzE4MzsxMDc0ODsyOzEzOTswMDA7MTM5NDg7MjswODU7MTA3OzA0NzQ4OzI7MjU1OzE0MDswMDA0ODsyOzE1MzswNTA7MjA0NDg7MjsxMzk7MDAwOzAwMDQ4OzI7MjMzOzE1MDsxMjI0ODsyOzE0MzsxODg7MTQzNDg7MjswNzI7MDYxOzEzOTQ4OzI7MDQ3OzA3OTswNzk0ODsyOzAwMDsyMDY7MjA5NDg7MjsxNDg7MDAwOzIxMTQ4OzI7MjU1OzAyMDsxNDc0ODsyOzAwMDsxOTE7MjU1NDg7MjsxMDU7MTA1OzEwNTQ4OzI7MDMwOzE0NDsyNTU0ODsyOzE3ODswMzQ7MDM0NDg7MjsyNTU7MjUwOzI0MDQ4OzI7MDM0OzEzOTswMzQ0ODsyOzI1NTswMDA7MjU1NDg7MjsyMjA7MjIwOzIyMDQ4OzI7MjQ4OzI0ODsyNTU0ODsyOzI1NTsyMTU7MDAwNDg7MjsyMTg7MTY1OzAzMjQ4OzI7MTI4OzEyODsxMjg0ODsyOzAwMDsxMjg7MDAwNDg7MjsxNzM7MjU1OzA0NzQ4OzI7MjQwOzI1NTsyNDA0ODsyOzI1NTsxMDU7MTgwNDg7MjsyMDU7MDkyOzA5MjQ4OzI7MDc1OzAwMDsxMzA0ODsyOzI1NTsyNTU7MjQwNDg7MjsyNDA7MjMwOzE0MDQ4OzI7MjMwOzIzMDsyNTA0ODsyOzI1NTsyNDA7MjQ1NDg7MjsxMjQ7MjUyOzAwMDQ4OzI7MjU1OzI1MDsyMDU0ODsyOzE3MzsyMTY7MjMwNDg7MjsyNDA7MTI4OzEyODQ4OzI7MjI0OzI1NTsyNTU0ODsyOzI1MDsyNTA7MjEwNDg7MjsyMTE7MjExOzIxMTQ4OzI7MTQ0OzIzODsxNDQ0ODsyOzI1NTsxODI7MTkzNDg7MjsyNTU7MTYwOzEyMjQ4OzI7MDMyOzE3ODsxNzA0ODsyOzEzNTsyMDY7MjUwNDg7MjsxMTk7MTM2OzE1MzQ4OzI7MTc2OzE5NjsyMjI0ODsyOzI1NTsyNTU7MjI0NDg7MjswMDA7MjU1OzAwMDQ4OzI7MDUwOzIwNTswNTA0ODsyOzI1MDsyNDA7MjMwNDg7MjsxMjg7MDAwOzAwMDQ4OzI7MTAyOzIwNTsxNzA0ODsyOzAwMDswMDA7MjA1NDg7MjsxODY7MDg1OzIxMTQ4OzI7MTQ3OzExMjsyMTk0ODsyOzA2MDsxNzk7MTEzNDg7MjsxMjM7MTA0OzIzODQ4OzI7MDAwOzI1MDsxNTQ0ODsyOzA3MjsyMDk7MjA0NDg7MjsxOTk7MDIxOzEzMzQ4OzI7MDI1OzAyNTsxMTI0ODsyOzI0NTsyNTU7MjUwNDg7MjsyNTU7MjI4OzIyNTQ4OzI7MjU1OzIyODsxODE0ODsyOzI1NTsyMjI7MTczNDg7MjswMDA7MDAwOzEyODQ4OzI7MjUzOzI0NTsyMzA0ODsyOzEyODsxMjg7MDAwNDg7MjsxMDc7MTQyOzAzNTQ4OzI7MjU1OzE2NTswMDA0ODsyOzI1NTswNjk7MDAwNDg7MjsyMTg7MTEyOzIxNDQ4OzI7MjM4OzIzMjsxNzA0ODsyOzE1MjsyNTE7MTUyNDg7MjsxNzU7MjM4OzIzODQ4OzI7MjE5OzExMjsxNDc0ODsyOzI1NTsyMzk7MjEzNDg7MjsyNTU7MjE4OzE4NTQ4OzI7MjA1OzEzMzswNjM0ODsyOzI1NTsxOTI7MjAzNDg7MjsyMjE7MTYwOzIyMTQ4OzI7MTc2OzIyNDsyMzA0ODsyOzEyODswMDA7MTI4NDg7MjsxMDI7MDUxOzE1MzQ4OzI7MjU1OzAwMDswMDA0ODsyOzE4ODsxNDM7MTQzNDg7MjswNjU7MTA1OzIyNTQ4OzI7MTM5OzA2OTswMTk0ODsyOzI1MDsxMjg7MTE0NDg7MjsyNDQ7MTY0OzA5NjQ4OzI7MDQ2OzEzOTswODc0ODsyOzI1NTsyNDU7MjM4NDg7MjsxNjA7MDgyOzA0NTQ4OzI7MTkyOzE5MjsxOTI0ODsyOzEzNTsyMDY7MjM1NDg7MjsxMDY7MDkwOzIw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AM7bIAAEAAAA0tsgABUAAADn2yAAHAAAAAPcIAAHAAAACtwgABMAAABQcm9wZXJ0aWVzSVNlYXJjaGVycGF0dGVybnNyYWJpbmthcnBzZWFyY2hfa2luZFRlZGR5UmFiaW5LYXJwL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9kZmEucnMAvdwgAGIAAADhAAAAEwAAAL3cIABiAAAABQEAABoAAAC93CAAYgAAAB0BAAAVAAAAvdwgAGIAAAAdAQAAHQAAAL3cIABiAAAAFgEAABUAAABJbnZhbGlkSW5wdXRBbmNob3JlZEludmFsaWRJbnB1dFVuYW5jaG9yZWRVbnN1cHBvcnRlZFN0cmVhbVVuc3VwcG9ydGVkT3ZlcmxhcHBpbmdVbnN1cHBvcnRlZEVtcHR5YnVja2V0c2hhc2hfbGVuaGFzaF8ycG93L3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm94ZWQucnMA6d0gAEoAAADpBgAAHwAAACzaIABtAAAAxQAAABwAAAAs2iAAbQAAAN0AAAAZAAAALNogAG0AAADdAAAAIgAAACzaIABtAAAA6gAAAC0AAAAs2iAAbQAAAOcAAAAtAAAALNogAG0AAADkAAAALQAAACzaIABtAAAA4QAAAC0AAAAs2iAAbQAAANQAAAApAAAALNogAG0AAADOAAAAKQAAACzaIABtAAAA9QAAACAAAAAs2iAAbQAAABoBAAAaAAAALNogAG0AAAAwAQAAFwAAACzaIABtAAAAKQEAADcAAABkCCEAcAAAAJkCAAAaAAAAZAghAHAAAACtAgAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9tZXRhL3JldmVyc2VfaW5uZXIucnMANN8gAHMAAABLAAAAGgAAADTfIABzAAAAXAAAADAAAAAAAAAAAQAAAAEAAACZAAAANQUA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AFAFAABRBQAAEAAAAAQAAADaAAAAAAAAAAEAAAABAAAAUgUAAAAAAAAIAAAABAAAAFMFAAAAAAAACAAAAAQAAAAzBQAAAAAAAAQAAAAEAAAARwAAAHV0ZjhfZW1wdHlhdXRvcHJld2hpY2hfY2FwdHVyZXNuZmFfc2l6ZV9saW1pdG9uZXBhc3Nfc2l6ZV9saW1pdGh5YnJpZF9jYWNoZV9jYXBhY2l0eWh5YnJpZGRmYWRmYV9zaXplX2xpbWl0ZGZhX3N0YXRlX2xpbWl0b25lcGFzc2JhY2t0cmFja2xpbmVfdGVybWluYXRvcgAAAPobIQAKAAAAQO4gAAoAAABK7iAABwAAAAQcIQADAAAAUe4gAA4AAABf7iAADgAAAG3uIAASAAAAf+4gABUAAACU7iAABgAAAJruIAADAAAAne4gAA4AAACr7iAADwAAALruIAAHAAAAwe4gAAkAAADvBiEADAAAAMruIAAPAAAAR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhAAAAAAAAAAAAAQAAAE4FAABDRCYAcAAAALwAAAAqAAAAQ0QmAHAAAAC5AAAAKgAAAENEJgBwAAAAOgAAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjUvc3JjL21lbW1lbS9zZWFyY2hlci5yc9zvIABoAAAAdAIAABsAAADYASEAawAAAMcEAAAeAAAA2AEhAGsAAADpBQAAHgAAAG5vIHF1aXQgaW4gc3RhcnQgd2l0aG91dCBsb29rLWJlaGluZNgBIQBrAAAARQYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBpZC5pc19tYXRjaCgpANgBIQBrAAAAtQYAAAkAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gdXBkYXRlANgBIQBrAAAAtwcAACQAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gZmluaXNoANgBIQBrAAAAwwcAACIAAADYASEAawAAAI4KAAAdAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL2h5YnJpZC9zZWFyY2gucnMAAEjxIABuAAAAWQAAACkAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzaWQgYmVpbmcgdW5rbm93biBpcyBhIGJ1Z8jxIABEAAAASPEgAG4AAAAdAQAAEQAAAEjxIABuAAAAGgEAAC0AAABI8SAAbgAAAFcBAAApAAAASPEgAG4AAACtAQAAEQAAAEjxIABuAAAAqgEAAC0AAABI8SAAbgAAAPsBAAAlAAAASPEgAG4AAAAiAgAAEQAAAEjxIABuAAAAHQIAABUAAABI8SAAbgAAAOICAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvbGltaXRlZC5ycwAAAKTyIABtAAAAjgAAACUAAACk8iAAbQAAAOgAAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvc3RvcGF0LnJzNPMgAGwAAABuAAAAJQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL3dpcmUucnMAALDzIABqAAAAVwIAAA4AAACw8yAAagAAAHgDAAAMAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvZW1wdHkucnMAPPQgAGsAAAD5AAAAOgAAAAAAAAAIAAAABAAAAFQFAAAAAAAABAAAAAQAAAB4AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvd3JhcHBlcnMucnMAANj0IABuAAAAiQAAABkAAADY9CAAbgAAAEUBAAAdAAAA2PQgAG4AAAD7AQAAHQAAANj0IABuAAAAHwMAAB0AAADY9CAAbgAAACwEAAANAAAA2PQgAG4AAAC0BAAAHQAAANj0IABuAAAARAUAAA0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL2JhY2t0cmFjay5ycwC49SAAdwAAAJkFAAAVAAAAuPUgAHcAAACiBQAAGgAAALj1IAB3AAAAAQYAACEAAAC49SAAdwAAAAUGAAAlAAAAuPUgAHcAAAAhBwAAFwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL2VzY2FwZS5yc4D2IABsAAAAKAAAAD0AAACA9iAAbAAAACUAAAANAAAAVQUAAGAAAAAQAAAAVgUAAPYEAAAEAAAABAAAAI0AAAAAAAAAIAAAABAAAABXBQAAAAAAAAEAAAABAAAA3gAAAFEFAAAQAAAABAAAANoAAAAAAAAAAQAAAAEAAABQBQAAAAAAADAAAAAQAAAAWAUAAAAAAAAIAAAABAAAADMFAAAAAAAACAAAAAQAAABTBQAAZm9yd2FyZHJldmVyc2VQaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzRW5naW5lSHlicmlkRW5naW5lREZBRW5naW5lUmV2ZXJzZUh5YnJpZEVuZ2luZVJldmVyc2VERkFSZXZlcnNlREZBRW5naW5ldmlzaXRlZF9jYXBhY2l0eUJvdW5kZWRCYWNrdHJhY2tlcgAAAAAACAAAAAQAAABZBQAAAAAAAAQAAAAEAAAAWgUAAAAAAAAEAAAABAAAAFsFAABQcm9wZXJ0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AAAAAAABAAAAAQAAAFAFAAAAAAAAMAAAABAAAABYBQAAAAAAAAgAAAAEAAAAMwUAAAAAAAAIAAAABAAAAFMFAAAAAAAABAAAAAQAAABjBQAAc3RhcnRzX2Zvcl9lYWNoX3BhdHRlcm5ieXRlX2NsYXNzZXN1bmljb2RlX3dvcmRfYm91bmRhcnlzcGVjaWFsaXplX3N0YXJ0X3N0YXRlc3NraXBfY2FjaGVfY2FwYWNpdHlfY2hlY2ttaW5pbXVtX2NhY2hlX2NsZWFyX2NvdW50bWluaW11bV9ieXRlc19wZXJfc3RhdGX6GyEACgAAAAQcIQADAAAA2AYhABcAAADvBiEADAAAAPsGIQAVAAAAFwYhAAcAAAAQByEAFwAAAB4GIQAOAAAAJwchABkAAABAByEAGQAAAFkHIQAXAAAAQ2FjaGVFcnJvckxhenlTdGF0ZUlETGF6eVN0YXRlSURFcnJvcmF0dGVtcHRlZEJ5dGVTZXRiaXRzL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm94ZWQvY29udmVydC5ycwABCCEAUgAAAFIAAAATAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvbm9uY29udGlndW91cy5yc2QIIQBwAAAAIgEAACAAAABkCCEAcAAAAFQBAAAdAAAAZAghAHAAAABmAQAAFwAAAGV4cGVjdGVkIG51bWJlciBvZiBwYXR0ZXJucyB0byBtYXRjaCBwYXR0ZXJuIElEAAQJIQAvAAAAZAghAHAAAAA0BAAADQAAAGQIIQBwAAAAOQQAACMAAABkCCEAcAAAAFUEAAA5AAAAZAghAHAAAADKAwAAGQAAAGQIIQBwAAAAywMAABoAAABkCCEAcAAAAM8DAAAYAAAAZAghAHAAAADjAwAAGQAAAGQIIQBwAAAAFgQAABkAAABkCCEAcAAAABcEAAAYAAAAZAghAHAAAAAYBAAAGgAAAGQIIQBwAAAAGQQAAB8AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvc2VhcmNoLnJzAADsCSEAagAAAE4BAAAJAAAAaW52YWxpZCBtYXRjaCBzcGFuAABoCiEAEgAAAOwJIQBqAAAAWwMAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9hcGkucnMAAACUCiEAaQAAABkCAAAcAAAAlAohAGkAAAAfAgAAMQAAADEFAAAEAAAABAAAADIFAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvYnl0ZXNldC5ycwAwCyEAdwAAACMAAAARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcHJlZmlsdGVyL21lbWNoci5ycwAAuAshAHYAAAAnAAAALQAAALgLIQB2AAAAVQAAABYAAAC4CyEAdgAAAFYAAAAWAAAAuAshAHYAAABkAAAANgAAALgLIQB2AAAAkgAAABYAAAC4CyEAdgAAAJMAAAAWAAAAuAshAHYAAACUAAAAFgAAALgLIQB2AAAAogAAAD4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvbWVtbWVtLnJzAACwDCEAdgAAACsAAAAnAAAAsAwhAHYAAAA7AAAAGAAAAGFoby1jb3Jhc2ljayBERkEgc2hvdWxkIG5ldmVyIGZhaWwvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvdGVkZHkucnMAag0hAHUAAABxAAAAEgAAAHJlZ2V4OiB0aHJlYWQgSUQgYWxsb2NhdGlvbiBzcGFjZSBleGhhdXN0ZWQA8A0hACsAAAD0GicAagAAAF4BAAARAAAAAAAAAAAAAAABAAAATgUAAFRyeUZyb21JbnRFcnJvci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vY29tcGlsZXIucnMAAABTDiEAdgAAALUDAAAWAAAAUw4hAHYAAAC2AwAAFgAAAFMOIQB2AAAA3QMAAA4AAABTDiEAdgAAADAEAAAoAAAAUw4hAHYAAAAsBAAAFgAAAFMOIQB2AAAARQUAABkAAABTDiEAdgAAAEcFAAATAAAAUw4hAHYAAACdBQAALAAAAFMOIQB2AAAAngUAADIAAABTDiEAdgAAAIUFAAAwAAAAUw4hAHYAAACOBQAAMAAAAFMOIQB2AAAAjwUAADYAAABTDiEAdgAAAGYFAAAdAAAAUw4hAHYAAABsBQAAPwAAAFMOIQB2AAAAbQUAADsAAABTDiEAdgAAAGoFAAAXAAAAUw4hAHYAAADtBQAAKgAAAFMOIQB2AAAATwYAABYAAABTDiEAdgAAAFMGAAAWAAAAUw4hAHYAAABaBgAAFgAAAFMOIQB2AAAAXgYAABYAAABTDiEAdgAAAGIGAAAWAAAAUw4hAHYAAABtBgAAFgAAAFMOIQB2AAAAdAYAABYAAABTDiEAdgAAAHgGAAAWAAAAUw4hAHYAAAB8BgAAFgAAAFMOIQB2AAAAhQYAABYAAABTDiEAdgAAAJAGAAAWAAAAUw4hAHYAAACUBgAAFgAAAFMOIQB2AAAAmAYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBwcmVmaXhfbGVuIDwgcmFuZ2VzLmxlbigpAFMOIQB2AAAA/gYAAAkAAABub24tZW1wdHkgbm9kZXMAUw4hAHYAAAAiBwAADgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3RhdGUudW5jb21waWxlZFtsYXN0XS5sYXN0LmlzX25vbmUoKVMOIQB2AAAAIwcAAAkAAABTDiEAdgAAACkHAAAjAAAAUw4hAHYAAAAxBwAAHwAAAFMOIQB2AAAANQcAADoAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLnN0YXRlLnVuY29tcGlsZWRbMF0ubGFzdC5pc19ub25lKCkAAABTDiEAdgAAADwHAAAJAAAAUw4hAHYAAAA9BwAAJQAAAFMOIQB2AAAAOwcAAAkAAABTDiEAdgAAAEYHAAAOAAAAUw4hAHYAAABOBwAAGAAAAEFsbEltcGxpY2l0AH8EAAAEAAAABAAAAIAEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbWV0YS9saXRlcmFsLnJzAAAALBIhAG0AAAAeAAAADQAAACwSIQBtAAAAPgAAAA4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgvBIhAEAAAAAsEiEAbQAAADgAAAAeAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCAAABQTIQBKAAAALBIhAG0AAAA8AAAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vbmZhLnJzAAAAeBMhAHEAAAB5AgAAFwAAAHgTIQBxAAAAgwcAABQAAAAAAAAAAAAAAAAAAAACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL25mYS90aG9tcHNvbi9waWtldm0ucnMcFCEAdAAA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k4qSct+X+dju7P3j2ub3h7Tx6fb054v18/vrycTw1pi2zbV/G9TT0tXkxamfg6xpUGJgYVHPkXRzkIKZeWuEbW58b1Jsdo1xgXd9pXVcalNIY11BT6bto8e+4dHLxtnbzur4nu//////////////////////////////////////////////////////////////////////////////////////dHJpZWQgdG8gdW53cmFwIGV4cHIgZnJvbSBIaXJGcmFtZSwgZ290OiAAAADYLSEAKQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNS9zcmMvaGlyL3RyYW5zbGF0ZS5ycwwuIQBsAAAAAQEAABIAAAB0cmllZCB0byB1bndyYXAgVW5pY29kZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAiC4hADIAAAAMLiEAbAAAAAoBAAASAAAAdHJpZWQgdG8gdW53cmFwIGJ5dGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAA1C4hAC8AAAAMLiEAbAAAABcBAAASAAAAdHJpZWQgdG8gdW53cmFwIHJlcGV0aXRpb24gZnJvbSBIaXJGcmFtZSwgZ290OiAAHC8hAC8AAAAMLiEAbAAAACUBAAARAAAAdHJpZWQgdG8gdW53cmFwIGdyb3VwIGZyb20gSGlyRnJhbWUsIGdvdDogAABkLyEAKgAAAAwuIQBsAAAANAEAABEAAAB0cmllZCB0byB1bndyYXAgYWx0IHBpcGUgZnJvbSBIaXJGcmFtZSwgZ290OiAAAACoLyEALQAAAAwuIQBsAAAAPwEAABEAAAAMLiEAbAAAAE4BAAAnAAAADC4hAGwAAABPAQAAFwAAAAwuIQBsAAAATgEAAAkAAAAMLiEAbAAAAKwBAAAuAAAADC4hAGwAAACjAQAALgAAAAwuIQBsAAAAtwEAACcAAAAMLiEAbAAAALgBAAAcAAAADC4hAGwAAAC8AQAAJwAAAAwuIQBsAAAAvQEAACwAAAAMLiEAbAAAAM4BAAAgAAAADC4hAGwAAADPAQAAGwAAAAwuIQBsAAAAxQEAAB8AAAAMLiEAbAAAAP4BAAAuAAAADC4hAGwAAAD6AQAALgAAAAwuIQBsAAAACgIAAC4AAAAMLiEAbAAAAAYCAAAuAAAADC4hAGwAAAAZAgAALgAAAAwuIQBsAAAAFAIAAC4AAAAMLiEAbAAAACACAAAqAAAADC4hAGwAAAAsAgAALgAAAAwuIQBsAAAAJwIAAC4AAAAMLiEAbAAAAD4CAAAvAAAADC4hAGwAAABFAgAALwAAAAwuIQBsAAAAMwIAAC8AAAAMLiEAbAAAADoCAAAvAAAADC4hAGwAAACMAgAAJgAAAAwuIQBsAAAAjQIAACYAAAAMLiEAbAAAAI4CAAAmAAAADC4hAGwAAABzAgAAJgAAAAwuIQBsAAAAdAIAACYAAAAMLiEAbAAAAHUCAAAmAAAADC4hAGwAAAC4AgAAHAAAAAwuIQBsAAAAuAIAACkAAAAMLiEAbAAAAMMCAAAsAAAADC4hAGwAAADHAgAAEwAAAAwuIQBsAAAA0QIAACwAAAAMLiEAbAAAANMCAAAVAAAADC4hAGwAAADVAgAAEwAAAAwuIQBsAAAA2wIAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IFVuaWNvZGUgY2xhc3NgMiEAVAAAAAwuIQBsAAAA6QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGJ5dGUgY2xhc3MAAADMMiEAUQAAAAwuIQBsAAAA7AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IHJlcGV0aXRpb24AAAA4MyEAUQAAAAwuIQBsAAAA7wIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGdyb3VwpDMhAEwAAAAMLiEAbAAAAPICAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgbWFya2VyAAAACDQhAFEAAAAMLiEAbAAAAPUCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcnQ0IQBYAAAADC4hAGwAAAD4AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgVW5pY29kZSBjbGFzcwAAAOQ0IQBRAAAADC4hAGwAAAAIAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYnl0ZSBjbGFzcwAAUDUhAE4AAAAMLiEAbAAAAAsDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCByZXBldGl0aW9uAAC4NSEATgAAAAwuIQBsAAAADgMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGdyb3VwAAAAIDYhAEkAAAAMLiEAbAAAABEDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBjb25jYXQgbWFya2VyAAAAhDYhAFEAAAAMLiEAbAAAABQDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgAAAPA2IQBVAAAADC4hAGwAAAAXAwAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuZmxhZ3MoKS51bmljb2RlKCkMLiEAbAAAAEMEAAAJAAAABQxhc3NlcnRpb24gZmFpbGVkOiAhc2VsZi5mbGFncygpLnVuaWNvZGUoKQAMLiEAbAAAAFkEAAAJAAAAMDlBWmF6QVphegB/CQkgIAAff38wOSF+YXogfiEvOkBbYHt+CQkKCgsLDAwNDSAgQVowOUFaX19hejA5QUZhZrQBIgBmAAAAVwEAABkAAABhAAAAYgAAAGMAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAKiEAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAfwEAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABBAAAAQgAAAEMAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAKiEAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAfwEAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAACcAwAAvAMAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAACshAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAACeHgAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAKyEAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAHgBAAABAQAAAAEAAAMBAAACAQAABQEAAAQBAAAHAQAABgEAAAkBAAAIAQAACwEAAAoBAAANAQAADAEAAA8BAAAOAQAAEQEAABABAAATAQAAEgEAABUBAAAUAQAAFwEAABYBAAAZAQAAGAEAABsBAAAaAQAAHQEAABwBAAAfAQAAHgEAACEBAAAgAQAAIwEAACIBAAAlAQAAJAEAACcBAAAmAQAAKQEAACgBAAArAQAAKgEAAC0BAAAsAQAALwEAAC4BAAAzAQAAMgEAADUBAAA0AQAANwEAADYBAAA6AQAAOQEAADwBAAA7AQAAPgEAAD0BAABAAQAAPwEAAEIBAABBAQAARAEAAEMBAABGAQAARQEAAEgBAABHAQAASwEAAEoBAABNAQAATAEAAE8BAABOAQAAUQEAAFABAABTAQAAUgEAAFUBAABUAQAAVwEAAFYBAABZAQAAWAEAAFsBAABaAQAAXQEAAFwBAABfAQAAXgEAAGEBAABgAQAAYwEAAGIBAABlAQAAZAEAAGcBAABmAQAAaQEAAGgBAABrAQAAagEAAG0BAABsAQAAbwEAAG4BAABxAQAAcAEAAHMBAAByAQAAdQEAAHQBAAB3AQAAdgEAAP8AAAB6AQAAeQEAAHwBAAB7AQAAfgEAAH0BAABTAAAAcwAAAEMCAABTAgAAgwEAAIIBAACFAQAAhAEAAFQCAACIAQAAhwEAAFYCAABXAgAAjAEAAIsBAADdAQAAWQIAAFsCAACSAQAAkQEAAGACAABjAgAA9gEAAGkCAABoAgAAmQEAAJgBAAA9AgAA3KcAAG8CAAByAgAAIAIAAHUCAAChAQAAoAEAAKMBAACiAQAApQEAAKQBAACAAgAAqAEAAKcBAACDAgAArQEAAKwBAACIAgAAsAEAAK8BAACKAgAAiwIAALQBAACzAQAAtgEAALUBAACSAgAAuQEAALgBAAC9AQAAvAEAAPcBAADFAQAAxgEAAMQBAADGAQAAxAEAAMUBAADIAQAAyQEAAMcBAADJAQAAxwEAAMgBAADLAQAAzAEAAMoBAADMAQAAygEAAMsBAADOAQAAzQEAANABAADPAQAA0gEAANEBAADUAQAA0wEAANYBAADVAQAA2AEAANcBAADaAQAA2QEAANwBAADbAQAAjgEAAN8BAADeAQAA4QEAAOABAADjAQAA4gEAAOUBAADkAQAA5wEAAOYBAADpAQAA6AEAAOsBAADqAQAA7QEAAOwBAADvAQAA7gEAAPIBAADzAQAA8QEAAPMBAADxAQAA8gEAAPUBAAD0AQAAlQEAAL8BAAD5AQAA+AEAAPsBAAD6AQAA/QEAAPwBAAD/AQAA/gEAAAECAAAAAgAAAwIAAAICAAAFAgAABAIAAAcCAAAGAgAACQIAAAgCAAALAgAACgIAAA0CAAAMAgAADwIAAA4CAAARAgAAEAIAABMCAAASAgAAFQIAABQCAAAXAgAAFgIAABkCAAAYAgAAGwIAABoCAAAdAgAAHAIAAB8CAAAeAgAAngEAACMCAAAiAgAAJQIAACQCAAAnAgAAJgIAACkCAAAoAgAAKwIAACoCAAAtAgAALAIAAC8CAAAuAgAAMQIAADACAAAzAgAAMgIAAGUsAAA8AgAAOwIAAJoBAABmLAAAfiwAAH8sAABCAgAAQQIAAIABAACJAgAAjAIAAEcCAABGAgAASQIAAEgCAABLAgAASgIAAE0CAABMAgAATwIAAE4CAABvLAAAbSwAAHAsAACBAQAAhgEAAIkBAACKAQAAjwEAAJABAACrpwAAkwEAAKynAACUAQAAy6cAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAA0x8AALEDAACyAwAA0AMAALMDAAC0AwAAtQMAAPUDAAC2AwAAtwMAALgDAADRAwAA9AMAAEUDAAC5AwAAvh8AALoDAADwAwAAuwMAALUAAAC8AwAAvQMAAL4DAAC/AwAAwAMAANYDAADBAwAA8QMAAMIDAADDAwAAxAMAAMUDAADGAwAA1QMAAMcDAADIAwAAyQMAACYhAADKAwAAywMAAIYDAACIAwAAiQMAAIoDAADjHwAAkQMAAJIDAADQAwAAkwMAAJQDAACVAwAA9QMAAJYDAACXAwAAmAMAANEDAAD0AwAARQMAAJkDAAC+HwAAmgMAAPADAACbAwAAtQAAAJwDAACdAwAAngMAAJ8DAACgAwAA1gMAAKEDAADxAwAAowMAAMMDAACjAwAAwgMAAKQDAAClAwAApgMAANUDAACnAwAAqAMAAKkDAAAmIQAAqgMAAKsDAACMAwAAjgMAAI8DAADXAwAAkgMAALIDAACYAwAAuAMAAPQDAACmAwAAxgMAAKADAADAAwAAzwMAANkDAADYAwAA2wMAANoDAADdAwAA3AMAAN8DAADeAwAA4QMAAOADAADjAwAA4gMAAOUDAADkAwAA5wMAAOYDAADpAwAA6AMAAOsDAADqAwAA7QMAAOwDAADvAwAA7gMAAJoDAAC6AwAAoQMAAMEDAAD5AwAAfwMAAJgDAAC4AwAA0QMAAJUDAAC1AwAA+AMAAPcDAADyAwAA+wMAAPoDAAB7AwAAfAMAAH0DAABQBAAAUQQA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ACkeAAAoHgAAKx4AACoeAAAtHgAALB4AAC8eAAAuHgAAMR4AADAeAAAzHgAAMh4AADUeAAA0HgAANx4AADYeAAA5HgAAOB4AADseAAA6HgAAPR4AADweAAA/HgAAPh4AAEEeAABAHgAAQx4AAEIeAABFHgAARB4AAEceAABGHgAASR4AAEgeAABLHgAASh4AAE0eAABMHgAATx4AAE4eAABRHgAAUB4AAFMeAABSHgAAVR4AAFQeAABXHgAAVh4AAFkeAABYHgAAWx4AAFoeAABdHgAAXB4AAF8eAABeHgAAYR4AAJseAABgHgAAmx4AAGMeAABiHgAAZR4AAGQeAABnHgAAZh4AAGkeAABoHgAAax4AAGoeAABtHgAAbB4AAG8eAABuHgAAcR4AAHAeAABzHgAAch4AAHUeAAB0HgAAdx4AAHYeAAB5HgAAeB4AAHseAAB6HgAAfR4AAHweAAB/HgAAfh4AAIEeAACAHgAAgx4AAIIeAACFHgAAhB4AAIceAACGHgAAiR4AAIgeAACLHgAAih4AAI0eAACMHgAAjx4AAI4eAACRHgAAkB4AAJMeAACSHgAAlR4AAJQeAABgHgAAYR4AAN8AAAChHgAAoB4AAKMeAACiHgAApR4AAKQeAACnHgAAph4AAKkeAACoHgAAqx4AAKoeAACtHgAArB4AAK8eAACuHgAAsR4AALAeAACzHgAAsh4AALUeAAC0HgAAtx4AALYeAAC5HgAAuB4AALseAAC6HgAAvR4AALweAAC/HgAAvh4AAMEeAADAHgAAwx4AAMIeAADFHgAAxB4AAMceAADGHgAAyR4AAMgeAADLHgAAyh4AAM0eAADMHgAAzx4AAM4eAADRHgAA0B4AANMeAADSHgAA1R4AANQeAADXHgAA1h4AANkeAADYHgAA2x4AANoeAADdHgAA3B4AAN8eAADeHgAA4R4AAOAeAADjHgAA4h4AAOUeAADkHgAA5x4AAOYeAADpHgAA6B4AAOseAADqHgAA7R4AAOweAADvHgAA7h4AAPEeAADwHgAA8x4AAPIeAAD1HgAA9B4AAPceAAD2HgAA+R4AAPgeAAD7HgAA+h4AAP0eAAD8HgAA/x4AAP4eAAAIHwAACR8AAAofAAALHwAADB8AAA0fAAAOHwAADx8AAAAfAAABHwAAAh8AAAMfAAAEHwAABR8AAAYfAAAHHwAAGB8AABkfAAAaHwAAGx8AABwfAAAdHwAAEB8AABEfAAASHwAAEx8AABQfAAAVHwAAKB8AACkfAAAqHwAAKx8AACwfAAAtHwAALh8AAC8fAAAgHwAAIR8AACIfAAAjHwAAJB8AACUfAAAmHwAAJx8AADgfAAA5HwAAOh8AADsfAAA8HwAAPR8AAD4fAAA/HwAAMB8AADEfAAAyHwAAMx8AADQfAAA1HwAANh8AADcfAABIHwAASR8AAEofAABLHwAATB8AAE0fAABAHwAAQR8AAEIfAABDHwAARB8AAEUfAABZHwAAWx8AAF0fAABfHwAAUR8AAFMfAABVHwAAVx8AAGgfAABpHwAAah8AAGsfAABsHwAAbR8AAG4fAABvHwAAYB8AAGEfAABiHwAAYx8AAGQfAABlHwAAZh8AAGcfAAC6HwAAux8AAMgfAADJHwAAyh8AAMsfAADaHwAA2x8AAPgfAAD5HwAA6h8AAOsfAAD6HwAA+x8AAIgfAACJHwAAih8AAIsfAACMHwAAjR8AAI4fAACPHwAAgB8AAIEfAACCHwAAgx8AAIQfAACFHwAAhh8AAIcfAACYHwAAmR8AAJofAACbHwAAnB8AAJ0fAACeHwAAnx8AAJAfAACRHwAAkh8AAJMfAACUHwAAlR8AAJYfAACXHwAAqB8AAKkfAACqHwAAqx8AAKwfAACtHwAArh8AAK8fAACgHwAAoR8AAKIfAACjHwAApB8AAKUfAACmHwAApx8AALgfAAC5HwAAvB8AALAfAACxHwAAcB8AAHEfAACzHwAARQMAAJkDAAC5AwAAzB8AAHIfAABzHwAAdB8AAHUfAADDHwAA2B8AANkfAACQAwAA0B8AANEfAAB2HwAAdx8AAOgfAADpHwAAsAMAAOwfAADgHwAA4R8AAHofAAB7HwAA5R8AAPwfAAB4HwAAeR8AAHwfAAB9HwAA8x8AAKkDAADJAwAASwAAAGsAAADFAAAA5QAAAE4hAAAyIQAAcCEAAHEhAAByIQAAcyEAAHQhAAB1IQAAdiEAAHchAAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJinAACbpwAAmqcAAJ2nAACcpwAAn6cAAJ6nAAChpwAAoKcAAKOnAACipwAApacAAKSnAACnpwAApqcAAKmnAACopwAAZgIAAFwCAABhAgAAbAIAAGoCAACeAgAAhwIAAJ0CAABTqwAAtacAALSnAAC3pwAAtqcAALmnAAC4pwAAu6cAALqnAAC9pwAAvKcAAL+nAAC+pwAAwacAAMCnAADDpwAAwqcAAJSnAACCAgAAjh0AAMinAADHpwAAyqcAAMmnAABkAgAAzacAAMynAADRpwAA0KcAANenAADWpwAA2acAANinAADbpwAA2qcAAJsBAAD2pwAA9acAALOnAACgEwAAoRMAAKITAACjEwAApBMAAKUTAACmEwAApxMAAKgTAACpEwAAqhMAAKsTAACsEwAArRMAAK4TAACvEwAAsBMAALETAACyEwAAsxMAALQTAAC1EwAAthMAALcTAAC4EwAAuRMAALoTAAC7EwAAvBMAAL0TAAC+EwAAvxMAAMATAADBEwAAwhMAAMMTAADEEwAAxRMAAMYTAADHEwAAyBMAAMkTAADKEwAAyxMAAMwTAADNEwAAzhMAAM8TAADQEwAA0RMAANITAADTEwAA1BMAANUTAADWEwAA1xMAANgTAADZEwAA2hMAANsTAADcEwAA3RMAAN4TAADfEwAA4BMAAOETAADiEwAA4xMAAOQTAADlEwAA5hMAAOcTAADoEwAA6RMAAOoTAADrEwAA7BMAAO0TAADuEwAA7xMAAAb7AAAF+wAAQf8AAEL/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+BAEAvwQBAMAEAQDBBAEAwgQBAMMEAQDEBAEAxQQBAMYEAQDHBAEAyAQBAMkEAQDKBAEAywQBAMwEAQDNBAEAzgQBAM8EAQDQBAEA0QQBANIEAQDTBAEAlwUBAJgFAQCZBQEAmgUBAJsFAQCcBQEAnQUBAJ4FAQCfBQEAoAUBAKEFAQCjBQEApAUBAKUFAQCmBQEApwUBAKgFAQCpBQEAqgUBAKsFAQCsBQEArQUBAK4FAQCvBQEAsAUBALEFAQCzBQEAtAUBALUFAQC2BQEAtwUBALgFAQC5BQEAuwUBALwFAQBwBQEAcQUBAHIFAQBzBQEAdAUBAHUFAQB2BQEAdwUBAHgFAQB5BQEAegUBAHwFAQB9BQEAfgUBAH8FAQCABQEAgQUBAIIFAQCDBQEAhAUBAIUFAQCGBQEAhwUBAIgFAQCJBQEAigUBAIwFAQCNBQEAjgUBAI8FAQCQBQEAkQUBAJIFAQCUBQEAlQUBAMAMAQDBDAEAwgwBAMMMAQDEDAEAxQwBAMYMAQDHDAEAyAwBAMkMAQDKDAEAywwBAMwMAQDNDAEAzgwBAM8MAQDQDAEA0QwBANIMAQDTDAEA1AwBANUMAQDWDAEA1wwBANgMAQDZDAEA2gwBANsMAQDcDAEA3QwBAN4MAQDfDAEA4AwBAOEMAQDiDAEA4wwBAOQMAQDlDAEA5gwBAOcMAQDoDAEA6QwBAOoMAQDrDAEA7AwBAO0MAQDuDAEA7wwBAPAMAQDxDAEA8gwBAIAMAQCBDAEAggwBAIMMAQCEDAEAhQwBAIYMAQCHDAEAiAwBAIkMAQCKDAEAiwwBAIwMAQCNDAEAjgwBAI8MAQCQDAEAkQwBAJIMAQCTDAEAlAwBAJUMAQCWDAEAlwwBAJgMAQCZDAEAmgwBAJsMAQCcDAEAnQwBAJ4MAQCfDAEAoAwBAKEMAQCiDAEAowwBAKQMAQClDAEApgwBAKcMAQCoDAEAqQwBAKoMAQCrDAEArAwBAK0MAQCuDAEArwwBALAMAQCxDAEAsgwBAHANAQBxDQEAcg0BAHMNAQB0DQEAdQ0BAHYNAQB3DQEAeA0BAHkNAQB6DQEAew0BAHwNAQB9DQEAfg0BAH8NAQCADQEAgQ0BAIINAQCDDQEAhA0BAIUNAQBQDQEAUQ0BAFINAQBTDQEAVA0BAFUNAQBWDQEAVw0BAFgNAQBZDQEAWg0BAFsNAQBcDQEAXQ0BAF4NAQBfDQEAYA0BAGENAQBiDQEAYw0BAGQNAQBlDQEAwBgBAMEYAQDCGAEAwxgBAMQYAQDFGAEAxhgBAMcYAQDIGAEAyRgBAMoYAQDLGAEAzBgBAM0YAQDOGAEAzxgBANAYAQDRGAEA0hgBANMYAQDUGAEA1RgBANYYAQDXGAEA2BgBANkYAQDaGAEA2xgBANwYAQDdGAEA3hgBAN8YAQCgGAEAoRgBAKIYAQCjGAEApBgBAKUYAQCmGAEApxgBAKgYAQCpGAEAqhgBAKsYAQCsGAEArRgBAK4YAQCvGAEAsBgBALEYAQCyGAEAsxgBALQYAQC1GAEAthgBALcYAQC4GAEAuRgBALoYAQC7GAEAvBgBAL0YAQC+GAEAvxgBAGBuAQBhbgEAYm4BAGNuAQBkbgEAZW4BAGZuAQBnbgEAaG4BAGluAQBqbgEAa24BAGxuAQBtbgEAbm4BAG9uAQBwbgEAcW4BAHJuAQBzbgEAdG4BAHVuAQB2bgEAd24BAHhuAQB5bgEAem4BAHtuAQB8bgEAfW4BAH5uAQB/bgEAQG4BAEFuAQBCbgEAQ24BAERuAQBFbgEARm4BAEduAQBIbgEASW4BAEpuAQBLbgEATG4BAE1uAQBObgEAT24BAFBuAQBRbgEAUm4BAFNuAQBUbgEAVW4BAFZuAQBXbgEAWG4BAFluAQBabgEAW24BAFxuAQBdbgEAXm4BAF9uAQAi6QEAI+kBACTpAQAl6QEAJukBACfpAQAo6QEAKekBACrpAQAr6QEALOkBAC3pAQAu6QEAL+kBADDpAQAx6QEAMukBADPpAQA06QEANekBADbpAQA36QEAOOkBADnpAQA66QEAO+kBADzpAQA96QEAPukBAD/pAQBA6QEAQekBAELpAQBD6QEAAOkBAAHpAQAC6QEAA+kBAATpAQAF6QEABukBAAfpAQAI6QEACekBAArpAQAL6QEADOkBAA3pAQAO6QEAD+kBABDpAQAR6QEAEukBABPpAQAU6QEAFekBABbpAQAX6QEAGOkBABnpAQAa6QEAG+kBABzpAQAd6QEAHukBAB/pAQAg6QEAIekBAEEAAAAkOCEAAQAAAEIAAAAoOCEAAQAAAEMAAAAsOCEAAQAAAEQAAACwQiYAAQAAAEUAAAAwOCEAAQAAAEYAAAA0OCEAAQAAAEcAAAA4OCEAAQAAAEgAAAA8OCEAAQAAAEkAAABAOCEAAQAAAEoAAABEOCEAAQAAAEsAAABIOCEAAgAAAEwAAABQOCEAAQAAAE0AAABUOCEAAQAAAE4AAABYOCEAAQAAAE8AAABcOCEAAQAAAFAAAABgOCEAAQAAAFEAAABkOCEAAQAAAFIAAABoOCEAAQAAAFMAAABsOCEAAgAAAFQAAAB0OCEAAQAAAFUAAAB4OCEAAQAAAFYAAAB8OCEAAQAAAFcAAACAOCEAAQAAAFgAAACEOCEAAQAAAFkAAACIOCEAAQAAAFoAAACMOCEAAQAAAGEAAACQOCEAAQAAAGIAAACUOCEAAQAAAGMAAACYOCEAAQAAAGQAAACsQiYAAQAAAGUAAACcOCEAAQAAAGYAAACgOCEAAQAAAGcAAACkOCEAAQAAAGgAAACoOCEAAQAAAGkAAACsOCEAAQAAAGoAAACwOCEAAQAAAGsAAAC0OCEAAgAAAGwAAAC8OCEAAQAAAG0AAADAOCEAAQAAAG4AAADEOCEAAQAAAG8AAADIOCEAAQAAAHAAAADMOCEAAQAAAHEAAADQOCEAAQAAAHIAAADUOCEAAQAAAHMAAADYOCEAAgAAAHQAAADgOCEAAQAAAHUAAADkOCEAAQAAAHYAAADoOCEAAQAAAHcAAADsOCEAAQAAAHgAAADwOCEAAQAAAHkAAAD0OCEAAQAAAHoAAAD4OCEAAQAAALUAAAD8OCEAAgAAAMAAAAAEOSEAAQAAAMEAAAAIOSEAAQAAAMIAAAAMOSEAAQAAAMMAAAAQOSEAAQAAAMQAAAAUOSEAAQAAAMUAAAAYOSEAAgAAAMYAAAAgOSEAAQAAAMcAAAAkOSEAAQAAAMgAAAAoOSEAAQAAAMkAAAAsOSEAAQAAAMoAAAAwOSEAAQAAAMsAAAA0OSEAAQAAAMwAAAA4OSEAAQAAAM0AAAA8OSEAAQAAAM4AAABAOSEAAQAAAM8AAABEOSEAAQAAANAAAABIOSEAAQAAANEAAABMOSEAAQAAANIAAABQOSEAAQAAANMAAABUOSEAAQAAANQAAABYOSEAAQAAANUAAABcOSEAAQAAANYAAABgOSEAAQAAANgAAABkOSEAAQAAANkAAABoOSEAAQAAANoAAABsOSEAAQAAANsAAABwOSEAAQAAANwAAAB0OSEAAQAAAN0AAAB4OSEAAQAAAN4AAAB8OSEAAQAAAN8AAACAOSEAAQAAAOAAAACEOSEAAQAAAOEAAACIOSEAAQAAAOIAAACMOSEAAQAAAOMAAACQOSEAAQAAAOQAAACUOSEAAQAAAOUAAACYOSEAAgAAAOYAAACgOSEAAQAAAOcAAACkOSEAAQAAAOgAAACoOSEAAQAAAOkAAACsOSEAAQAAAOoAAACwOSEAAQAAAOsAAAC0OSEAAQAAAOwAAAC4OSEAAQAAAO0AAAC8OSEAAQAAAO4AAADAOSEAAQAAAO8AAADEOSEAAQAAAPAAAADIOSEAAQAAAPEAAADMOSEAAQAAAPIAAADQOSEAAQAAAPMAAADUOSEAAQAAAPQAAADYOSEAAQAAAPUAAADcOSEAAQAAAPYAAADgOSEAAQAAAPgAAADkOSEAAQAAAPkAAADoOSEAAQAAAPoAAADsOSEAAQAAAPsAAADwOSEAAQAAAPwAAAD0OSEAAQAAAP0AAAD4OSEAAQAAAP4AAAD8OSEAAQAAAP8AAAAAOiEAAQAAAAABAAAEOiEAAQAAAAEBAAAIOiEAAQAAAAIBAAAMOiEAAQAAAAMBAAAQOiEAAQAAAAQBAAAUOiEAAQAAAAUBAAAYOiEAAQAAAAYBAAAcOiEAAQAAAAcBAAAgOiEAAQAAAAgBAAAkOiEAAQAAAAkBAAAoOiEAAQAAAAoBAAAsOiEAAQAAAAsBAAAwOiEAAQAAAAwBAAA0OiEAAQAAAA0BAAA4OiEAAQAAAA4BAAA8OiEAAQAAAA8BAABAOiEAAQAAABABAABEOiEAAQAAABEBAABIOiEAAQAAABIBAABMOiEAAQAAABMBAABQOiEAAQAAABQBAABUOiEAAQAAABUBAABYOiEAAQAAABYBAABcOiEAAQAAABcBAABgOiEAAQAAABgBAABkOiEAAQAAABkBAABoOiEAAQAAABoBAABsOiEAAQAAABsBAABwOiEAAQAAABwBAAB0OiEAAQAAAB0BAAB4OiEAAQAAAB4BAAB8OiEAAQAAAB8BAACAOiEAAQAAACABAACEOiEAAQAAACEBAACIOiEAAQAAACIBAACMOiEAAQAAACMBAACQOiEAAQAAACQBAACUOiEAAQAAACUBAACYOiEAAQAAACYBAACcOiEAAQAAACcBAACgOiEAAQAAACgBAACkOiEAAQAAACkBAACoOiEAAQAAACoBAACsOiEAAQAAACsBAACwOiEAAQAAACwBAAC0OiEAAQAAAC0BAAC4OiEAAQAAAC4BAAC8OiEAAQAAAC8BAADAOiEAAQAAADIBAADEOiEAAQAAADMBAADIOiEAAQAAADQBAADMOiEAAQAAADUBAADQOiEAAQAAADYBAADUOiEAAQAAADcBAADYOiEAAQAAADkBAADcOiEAAQAAADoBAADgOiEAAQAAADsBAADkOiEAAQAAADwBAADoOiEAAQAAAD0BAADsOiEAAQAAAD4BAADwOiEAAQAAAD8BAAD0OiEAAQAAAEABAAD4OiEAAQAAAEEBAAD8OiEAAQAAAEIBAAAAOyEAAQAAAEMBAAAEOyEAAQAAAEQBAAAIOyEAAQAAAEUBAAAMOyEAAQAAAEYBAAAQOyEAAQAAAEcBAAAUOyEAAQAAAEgBAAAYOyEAAQAAAEoBAAAcOyEAAQAAAEsBAAAgOyEAAQAAAEwBAAAkOyEAAQAAAE0BAAAoOyEAAQAAAE4BAAAsOyEAAQAAAE8BAAAwOyEAAQAAAFABAAA0OyEAAQAAAFEBAAA4OyEAAQAAAFIBAAA8OyEAAQAAAFMBAABAOyEAAQAAAFQBAABEOyEAAQAAAFUBAABIOyEAAQAAAFYBAABMOyEAAQAAAFcBAABQOyEAAQAAAFgBAABUOyEAAQAAAFkBAABYOyEAAQAAAFoBAABcOyEAAQAAAFsBAABgOyEAAQAAAFwBAABkOyEAAQAAAF0BAABoOyEAAQAAAF4BAABsOyEAAQAAAF8BAABwOyEAAQAAAGABAAB0OyEAAQAAAGEBAAB4OyEAAQAAAGIBAAB8OyEAAQAAAGMBAACAOyEAAQAAAGQBAACEOyEAAQAAAGUBAACIOyEAAQAAAGYBAACMOyEAAQAAAGcBAACQOyEAAQAAAGgBAACUOyEAAQAAAGkBAACYOyEAAQAAAGoBAACcOyEAAQAAAGsBAACgOyEAAQAAAGwBAACkOyEAAQAAAG0BAACoOyEAAQAAAG4BAACsOyEAAQAAAG8BAACwOyEAAQAAAHABAAC0OyEAAQAAAHEBAAC4OyEAAQAAAHIBAAC8OyEAAQAAAHMBAADAOyEAAQAAAHQBAADEOyEAAQAAAHUBAADIOyEAAQAAAHYBAADMOyEAAQAAAHcBAADQOyEAAQAAAHgBAADUOyEAAQAAAHkBAADYOyEAAQAAAHoBAADcOyEAAQAAAHsBAADgOyEAAQAAAHwBAADkOyEAAQAAAH0BAADoOyEAAQAAAH4BAADsOyEAAQAAAH8BAADwOyEAAgAAAIABAAD4OyEAAQAAAIEBAAD8OyEAAQAAAIIBAAAAPCEAAQAAAIMBAAAEPCEAAQAAAIQBAAAIPCEAAQAAAIUBAAAMPCEAAQAAAIYBAAAQPCEAAQAAAIcBAAAUPCEAAQAAAIgBAAAYPCEAAQAAAIkBAAAcPCEAAQAAAIoBAAAgPCEAAQAAAIsBAAAkPCEAAQAAAIwBAAAoPCEAAQAAAI4BAAAsPCEAAQAAAI8BAAAwPCEAAQAAAJABAAA0PCEAAQAAAJEBAAA4PCEAAQAAAJIBAAA8PCEAAQAAAJMBAABAPCEAAQAAAJQBAABEPCEAAQAAAJUBAABIPCEAAQAAAJYBAABMPCEAAQAAAJcBAABQPCEAAQAAAJgBAABUPCEAAQAAAJkBAABYPCEAAQAAAJoBAABcPCEAAQAAAJsBAABgPCEAAQAAAJwBAABkPCEAAQAAAJ0BAABoPCEAAQAAAJ4BAABsPCEAAQAAAJ8BAABwPCEAAQAAAKABAAB0PCEAAQAAAKEBAAB4PCEAAQAAAKIBAAB8PCEAAQAAAKMBAACAPCEAAQAAAKQBAACEPCEAAQAAAKUBAACIPCEAAQAAAKYBAACMPCEAAQAAAKcBAACQPCEAAQAAAKgBAACUPCEAAQAAAKkBAACYPCEAAQAAAKwBAACcPCEAAQAAAK0BAACgPCEAAQAAAK4BAACkPCEAAQAAAK8BAACoPCEAAQAAALABAACsPCEAAQAAALEBAACwPCEAAQAAALIBAAC0PCEAAQAAALMBAAC4PCEAAQAAALQBAAC8PCEAAQAAALUBAADAPCEAAQAAALYBAADEPCEAAQAAALcBAADIPCEAAQAAALgBAADMPCEAAQAAALkBAADQPCEAAQAAALwBAADUPCEAAQAAAL0BAADYPCEAAQAAAL8BAADcPCEAAQAAAMQBAADgPCEAAgAAAMUBAADoPCEAAgAAAMYBAADwPCEAAgAAAMcBAAD4PCEAAgAAAMgBAAAAPSEAAgAAAMkBAAAIPSEAAgAAAMoBAAAQPSEAAgAAAMsBAAAYPSEAAgAAAMwBAAAgPSEAAgAAAM0BAAAoPSEAAQAAAM4BAAAsPSEAAQAAAM8BAAAwPSEAAQAAANABAAA0PSEAAQAAANEBAAA4PSEAAQAAANIBAAA8PSEAAQAAANMBAABAPSEAAQAAANQBAABEPSEAAQAAANUBAABIPSEAAQAAANYBAABMPSEAAQAAANcBAABQPSEAAQAAANgBAABUPSEAAQAAANkBAABYPSEAAQAAANoBAABcPSEAAQAAANsBAABgPSEAAQAAANwBAABkPSEAAQAAAN0BAABoPSEAAQAAAN4BAABsPSEAAQAAAN8BAABwPSEAAQAAAOABAAB0PSEAAQAAAOEBAAB4PSEAAQAAAOIBAAB8PSEAAQAAAOMBAACAPSEAAQAAAOQBAACEPSEAAQAAAOUBAACIPSEAAQAAAOYBAACMPSEAAQAAAOcBAACQPSEAAQAAAOgBAACUPSEAAQAAAOkBAACYPSEAAQAAAOoBAACcPSEAAQAAAOsBAACgPSEAAQAAAOwBAACkPSEAAQAAAO0BAACoPSEAAQAAAO4BAACsPSEAAQAAAO8BAACwPSEAAQAAAPEBAAC0PSEAAgAAAPIBAAC8PSEAAgAAAPMBAADEPSEAAgAAAPQBAADMPSEAAQAAAPUBAADQPSEAAQAAAPYBAADUPSEAAQAAAPcBAADYPSEAAQAAAPgBAADcPSEAAQAAAPkBAADgPSEAAQAAAPoBAADkPSEAAQAAAPsBAADoPSEAAQAAAPwBAADsPSEAAQAAAP0BAADwPSEAAQAAAP4BAAD0PSEAAQAAAP8BAAD4PSEAAQAAAAACAAD8PSEAAQAAAAECAAAAPiEAAQAAAAICAAAEPiEAAQAAAAMCAAAIPiEAAQAAAAQCAAAMPiEAAQAAAAUCAAAQPiEAAQAAAAYCAAAUPiEAAQAAAAcCAAAYPiEAAQAAAAgCAAAcPiEAAQAAAAkCAAAgPiEAAQAAAAoCAAAkPiEAAQAAAAsCAAAoPiEAAQAAAAwCAAAsPiEAAQAAAA0CAAAwPiEAAQAAAA4CAAA0PiEAAQAAAA8CAAA4PiEAAQAAABACAAA8PiEAAQAAABECAABAPiEAAQAAABICAABEPiEAAQAAABMCAABIPiEAAQAAABQCAABMPiEAAQAAABUCAABQPiEAAQAAABYCAABUPiEAAQAAABcCAABYPiEAAQAAABgCAABcPiEAAQAAABkCAABgPiEAAQAAABoCAABkPiEAAQAAABsCAABoPiEAAQAAABwCAABsPiEAAQAAAB0CAABwPiEAAQAAAB4CAAB0PiEAAQAAAB8CAAB4PiEAAQAAACACAAB8PiEAAQAAACICAACAPiEAAQAAACMCAACEPiEAAQAAACQCAACIPiEAAQAAACUCAACMPiEAAQAAACYCAACQPiEAAQAAACcCAACUPiEAAQAAACgCAACYPiEAAQAAACkCAACcPiEAAQAAACoCAACgPiEAAQAAACsCAACkPiEAAQAAACwCAACoPiEAAQAAAC0CAACsPiEAAQAAAC4CAACwPiEAAQAAAC8CAAC0PiEAAQAAADACAAC4PiEAAQAAADECAAC8PiEAAQAAADICAADAPiEAAQAAADMCAADEPiEAAQAAADoCAADIPiEAAQAAADsCAADMPiEAAQAAADwCAADQPiEAAQAAAD0CAADUPiEAAQAAAD4CAADYPiEAAQAAAD8CAADcPiEAAQAAAEACAADgPiEAAQAAAEECAADkPiEAAQAAAEICAADoPiEAAQAAAEMCAADsPiEAAQAAAEQCAADwPiEAAQAAAEUCAAD0PiEAAQAAAEYCAAD4PiEAAQAAAEcCAAD8PiEAAQAAAEgCAAAAPyEAAQAAAEkCAAAEPyEAAQAAAEoCAAAIPyEAAQAAAEsCAAAMPyEAAQAAAEwCAAAQPyEAAQAAAE0CAAAUPyEAAQAAAE4CAAAYPyEAAQAAAE8CAAAcPyEAAQAAAFACAAAgPyEAAQAAAFECAAAkPyEAAQAAAFICAAAoPyEAAQAAAFMCAAAsPyEAAQAAAFQCAAAwPyEAAQAAAFYCAAA0PyEAAQAAAFcCAAA4PyEAAQAAAFkCAAA8PyEAAQAAAFsCAABAPyEAAQAAAFwCAABEPyEAAQAAAGACAABIPyEAAQAAAGECAABMPyEAAQAAAGMCAABQPyEAAQAAAGQCAABUPyEAAQAAAGUCAABYPyEAAQAAAGYCAABcPyEAAQAAAGgCAABgPyEAAQAAAGkCAABkPyEAAQAAAGoCAABoPyEAAQAAAGsCAABsPyEAAQAAAGwCAABwPyEAAQAAAG8CAAB0PyEAAQAAAHECAAB4PyEAAQAAAHICAAB8PyEAAQAAAHUCAACAPyEAAQAAAH0CAACEPyEAAQAAAIACAACIPyEAAQAAAIICAACMPyEAAQAAAIMCAACQPyEAAQAAAIcCAACUPyEAAQAAAIgCAACYPyEAAQAAAIkCAACcPyEAAQAAAIoCAACgPyEAAQAAAIsCAACkPyEAAQAAAIwCAACoPyEAAQAAAJICAACsPyEAAQAAAJ0CAACwPyEAAQAAAJ4CAAC0PyEAAQAAAEUDAAC4PyEAAwAAAHADAADEPyEAAQAAAHEDAADIPyEAAQAAAHIDAADMPyEAAQAAAHMDAADQPyEAAQAAAHYDAADUPyEAAQAAAHcDAADYPyEAAQAAAHsDAADcPyEAAQAAAHwDAADgPyEAAQAAAH0DAADkPyEAAQAAAH8DAADoPyEAAQAAAIYDAADsPyEAAQAAAIgDAADwPyEAAQAAAIkDAAD0PyEAAQAAAIoDAAD4PyEAAQAAAIwDAAD8PyEAAQAAAI4DAAAAQCEAAQAAAI8DAAAEQCEAAQAAAJADAAAIQCEAAQAAAJEDAAAMQCEAAQAAAJIDAAAQQCEAAgAAAJMDAAAYQCEAAQAAAJQDAAAcQCEAAQAAAJUDAAAgQCEAAgAAAJYDAAAoQCEAAQAAAJcDAAAsQCEAAQAAAJgDAAAwQCEAAwAAAJkDAAA8QCEAAwAAAJoDAABIQCEAAgAAAJsDAABQQCEAAQAAAJwDAABUQCEAAgAAAJ0DAABcQCEAAQAAAJ4DAABgQCEAAQAAAJ8DAABkQCEAAQAAAKADAABoQCEAAgAAAKEDAABwQCEAAgAAAKMDAAB4QCEAAgAAAKQDAACAQCEAAQAAAKUDAACEQCEAAQAAAKYDAACIQCEAAgAAAKcDAACQQCEAAQAAAKgDAACUQCEAAQAAAKkDAACYQCEAAgAAAKoDAACgQCEAAQAAAKsDAACkQCEAAQAAAKwDAACoQCEAAQAAAK0DAACsQCEAAQAAAK4DAACwQCEAAQAAAK8DAAC0QCEAAQAAALADAAC4QCEAAQAAALEDAAC8QCEAAQAAALIDAADAQCEAAgAAALMDAADIQCEAAQAAALQDAADMQCEAAQAAALUDAADQQCEAAgAAALYDAADYQCEAAQAAALcDAADcQCEAAQAAALgDAADgQCEAAwAAALkDAADsQCEAAwAAALoDAAD4QCEAAgAAALsDAAAAQSEAAQAAALwDAAAEQSEAAgAAAL0DAAAMQSEAAQAAAL4DAAAQQSEAAQAAAL8DAAAUQSEAAQAAAMADAAAYQSEAAgAAAMEDAAAgQSEAAgAAAMIDAAAoQSEAAgAAAMMDAAAwQSEAAgAAAMQDAAA4QSEAAQAAAMUDAAA8QSEAAQAAAMYDAABAQSEAAgAAAMcDAABIQSEAAQAAAMgDAABMQSEAAQAAAMkDAABQQSEAAgAAAMoDAABYQSEAAQAAAMsDAABcQSEAAQAAAMwDAABgQSEAAQAAAM0DAABkQSEAAQAAAM4DAABoQSEAAQAAAM8DAABsQSEAAQAAANADAABwQSEAAgAAANEDAAB4QSEAAwAAANUDAACEQSEAAgAAANYDAACMQSEAAgAAANcDAACUQSEAAQAAANgDAACYQSEAAQAAANkDAACcQSEAAQAAANoDAACgQSEAAQAAANsDAACkQSEAAQAAANwDAACoQSEAAQAAAN0DAACsQSEAAQAAAN4DAACwQSEAAQAAAN8DAAC0QSEAAQAAAOADAAC4QSEAAQAAAOEDAAC8QSEAAQAAAOIDAADAQSEAAQAAAOMDAADEQSEAAQAAAOQDAADIQSEAAQAAAOUDAADMQSEAAQAAAOYDAADQQSEAAQAAAOcDAADUQSEAAQAAAOgDAADYQSEAAQAAAOkDAADcQSEAAQAAAOoDAADgQSEAAQAAAOsDAADkQSEAAQAAAOwDAADoQSEAAQAAAO0DAADsQSEAAQAAAO4DAADwQSEAAQAAAO8DAAD0QSEAAQAAAPADAAD4QSEAAgAAAPEDAAAAQiEAAgAAAPIDAAAIQiEAAQAAAPMDAAAMQiEAAQAAAPQDAAAQQiEAAwAAAPUDAAAcQiEAAgAAAPcDAAAkQiEAAQAAAPgDAAAoQiEAAQAAAPkDAAAsQiEAAQAAAPoDAAAwQiEAAQAAAPsDAAA0QiEAAQAAAP0DAAA4QiEAAQAAAP4DAAA8QiEAAQAAAP8DAABAQiEAAQAAAAAEAABEQiEAAQAAAAEEAABIQiEAAQAAAAIEAABMQiEAAQAAAAMEAABQQiEAAQAAAAQEAABUQiEAAQAAAAUEAABYQiEAAQAAAAYEAABcQiEAAQAAAAcEAABgQiEAAQAAAAgEAABkQiEAAQAAAAkEAABoQiEAAQAAAAoEAABsQiEAAQAAAAsEAABwQiEAAQAAAAwEAAB0QiEAAQAAAA0EAAB4QiEAAQAAAA4EAAB8QiEAAQAAAA8EAACAQiEAAQAAABAEAACEQiEAAQAAABEEAACIQiEAAQAAABIEAACMQiEAAgAAABMEAACUQiEAAQAAABQEAACYQiEAAgAAABUEAACgQiEAAQAAABYEAACkQiEAAQAAABcEAACoQiEAAQAAABgEAACsQiEAAQAAABkEAACwQiEAAQAAABoEAAC0QiEAAQAAABsEAAC4QiEAAQAAABwEAAC8QiEAAQAAAB0EAADAQiEAAQAAAB4EAADEQiEAAgAAAB8EAADMQiEAAQAAACAEAADQQiEAAQAAACEEAADUQiEAAgAAACIEAADcQiEAAwAAACMEAADoQiEAAQAAACQEAADsQiEAAQAAACUEAADwQiEAAQAAACYEAAD0QiEAAQAAACcEAAD4QiEAAQAAACgEAAD8QiEAAQAAACkEAAAAQyEAAQAAACoEAAAEQyEAAgAAACsEAAAMQyEAAQAAACwEAAAQQyEAAQAAAC0EAAAUQyEAAQAAAC4EAAAYQyEAAQAAAC8EAAAcQyEAAQAAADAEAAAgQyEAAQAAADEEAAAkQyEAAQAAADIEAAAoQyEAAgAAADMEAAAwQyEAAQAAADQEAAA0QyEAAgAAADUEAAA8QyEAAQAAADYEAABAQyEAAQAAADcEAABEQyEAAQAAADgEAABIQyEAAQAAADkEAABMQyEAAQAAADoEAABQQyEAAQAAADsEAABUQyEAAQAAADwEAABYQyEAAQAAAD0EAABcQyEAAQAAAD4EAABgQyEAAgAAAD8EAABoQyEAAQAAAEAEAABsQyEAAQAAAEEEAABwQyEAAgAAAEIEAAB4QyEAAwAAAEMEAACEQyEAAQAAAEQEAACIQyEAAQAAAEUEAACMQyEAAQAAAEYEAACQQyEAAQAAAEcEAACUQyEAAQAAAEgEAACYQyEAAQAAAEkEAACcQyEAAQAAAEoEAACgQyEAAgAAAEsEAACoQyEAAQAAAEwEAACsQyEAAQAAAE0EAACwQyEAAQAAAE4EAAC0QyEAAQAAAE8EAAC4QyEAAQAAAFAEAAC8QyEAAQAAAFEEAADAQyEAAQAAAFIEAADEQyEAAQAAAFMEAADIQyEAAQAAAFQEAADMQyEAAQAAAFUEAADQQyEAAQAAAFYEAADUQyEAAQAAAFcEAADYQyEAAQAAAFgEAADcQyEAAQAAAFkEAADgQyEAAQAAAFoEAADkQyEAAQAAAFsEAADoQyEAAQAAAFwEAADsQyEAAQAAAF0EAADwQyEAAQAAAF4EAAD0QyEAAQAAAF8EAAD4QyEAAQAAAGAEAAD8QyEAAQAAAGEEAAAARCEAAQAAAGIEAAAERCEAAgAAAGMEAAAMRCEAAgAAAGQEAAAURCEAAQAAAGUEAAAYRCEAAQAAAGYEAAAcRCEAAQAAAGcEAAAgRCEAAQAAAGgEAAAkRCEAAQAAAGkEAAAoRCEAAQAAAGoEAAAsRCEAAQAAAGsEAAAwRCEAAQAAAGwEAAA0RCEAAQAAAG0EAAA4RCEAAQAAAG4EAAA8RCEAAQAAAG8EAABARCEAAQAAAHAEAABERCEAAQAAAHEEAABIRCEAAQAAAHIEAABMRCEAAQAAAHMEAABQRCEAAQAAAHQEAABURCEAAQAAAHUEAABYRCEAAQAAAHYEAABcRCEAAQAAAHcEAABgRCEAAQAAAHgEAABkRCEAAQAAAHkEAABoRCEAAQAAAHoEAABsRCEAAQAAAHsEAABwRCEAAQAAAHwEAAB0RCEAAQAAAH0EAAB4RCEAAQAAAH4EAAB8RCEAAQAAAH8EAACARCEAAQAAAIAEAACERCEAAQAAAIEEAACIRCEAAQAAAIoEAACMRCEAAQAAAIsEAACQRCEAAQAAAIwEAACURCEAAQAAAI0EAACYRCEAAQAAAI4EAACcRCEAAQAAAI8EAACgRCEAAQAAAJAEAACkRCEAAQAAAJEEAACoRCEAAQAAAJIEAACsRCEAAQAAAJMEAACwRCEAAQAAAJQEAAC0RCEAAQAAAJUEAAC4RCEAAQAAAJYEAAC8RCEAAQAAAJcEAADARCEAAQAAAJgEAADERCEAAQAAAJkEAADIRCEAAQAAAJoEAADMRCEAAQAAAJsEAADQRCEAAQAAAJwEAADURCEAAQAAAJ0EAADYRCEAAQAAAJ4EAADcRCEAAQAAAJ8EAADgRCEAAQAAAKAEAADkRCEAAQAAAKEEAADoRCEAAQAAAKIEAADsRCEAAQAAAKMEAADwRCEAAQAAAKQEAAD0RCEAAQAAAKUEAAD4RCEAAQAAAKYEAAD8RCEAAQAAAKcEAAAARSEAAQAAAKgEAAAERSEAAQAAAKkEAAAIRSEAAQAAAKoEAAAMRSEAAQAAAKsEAAAQRSEAAQAAAKwEAAAURSEAAQAAAK0EAAAYRSEAAQAAAK4EAAAcRSEAAQAAAK8EAAAgRSEAAQAAALAEAAAkRSEAAQAAALEEAAAoRSEAAQAAALIEAAAsRSEAAQAAALMEAAAwRSEAAQAAALQEAAA0RSEAAQAAALUEAAA4RSEAAQAAALYEAAA8RSEAAQAAALcEAABARSEAAQAAALgEAABERSEAAQAAALkEAABIRSEAAQAAALoEAABMRSEAAQAAALsEAABQRSEAAQAAALwEAABURSEAAQAAAL0EAABYRSEAAQAAAL4EAABcRSEAAQAAAL8EAABgRSEAAQAAAMAEAABkRSEAAQAAAMEEAABoRSEAAQAAAMIEAABsRSEAAQAAAMMEAABwRSEAAQAAAMQEAAB0RSEAAQAAAMUEAAB4RSEAAQAAAMYEAAB8RSEAAQAAAMcEAACARSEAAQAAAMgEAACERSEAAQAAAMkEAACIRSEAAQAAAMoEAACMRSEAAQAAAMsEAACQRSEAAQAAAMwEAACURSEAAQAAAM0EAACYRSEAAQAAAM4EAACcRSEAAQAAAM8EAACgRSEAAQAAANAEAACkRSEAAQAAANEEAACoRSEAAQAAANIEAACsRSEAAQAAANMEAACwRSEAAQAAANQEAAC0RSEAAQAAANUEAAC4RSEAAQAAANYEAAC8RSEAAQAAANcEAADARSEAAQAAANgEAADERSEAAQAAANkEAADIRSEAAQAAANoEAADMRSEAAQAAANsEAADQRSEAAQAAANwEAADURSEAAQAAAN0EAADYRSEAAQAAAN4EAADcRSEAAQAAAN8EAADgRSEAAQAAAOAEAADkRSEAAQAAAOEEAADoRSEAAQAAAOIEAADsRSEAAQAAAOMEAADwRSEAAQAAAOQEAAD0RSEAAQAAAOUEAAD4RSEAAQAAAOYEAAD8RSEAAQAAAOcEAAAARiEAAQAAAOgEAAAERiEAAQAAAOkEAAAIRiEAAQAAAOoEAAAMRiEAAQAAAOsEAAAQRiEAAQAAAOwEAAAURiEAAQAAAO0EAAAYRiEAAQAAAO4EAAAcRiEAAQAAAO8EAAAgRiEAAQAAAPAEAAAkRiEAAQAAAPEEAAAoRiEAAQAAAPIEAAAsRiEAAQAAAPMEAAAwRiEAAQAAAPQEAAA0RiEAAQAAAPUEAAA4RiEAAQAAAPYEAAA8RiEAAQAAAPcEAABARiEAAQAAAPgEAABERiEAAQAAAPkEAABIRiEAAQAAAPoEAABMRiEAAQAAAPsEAABQRiEAAQAAAPwEAABURiEAAQAAAP0EAABYRiEAAQAAAP4EAABcRiEAAQAAAP8EAABgRiEAAQAAAAAFAABkRiEAAQAAAAEFAABoRiEAAQAAAAIFAABsRiEAAQAAAAMFAABwRiEAAQAAAAQFAAB0RiEAAQAAAAUFAAB4RiEAAQAAAAYFAAB8RiEAAQAAAAcFAACARiEAAQAAAAgFAACERiEAAQAAAAkFAACIRiEAAQAAAAoFAACMRiEAAQAAAAsFAACQRiEAAQAAAAwFAACURiEAAQAAAA0FAACYRiEAAQAAAA4FAACcRiEAAQAAAA8FAACgRiEAAQAAABAFAACkRiEAAQAAABEFAACoRiEAAQAAABIFAACsRiEAAQAAABMFAACwRiEAAQAAABQFAAC0RiEAAQAAABUFAAC4RiEAAQAAABYFAAC8RiEAAQAAABcFAADARiEAAQAAABgFAADERiEAAQAAABkFAADIRiEAAQAAABoFAADMRiEAAQAAABsFAADQRiEAAQAAABwFAADURiEAAQAAAB0FAADYRiEAAQAAAB4FAADcRiEAAQAAAB8FAADgRiEAAQAAACAFAADkRiEAAQAAACEFAADoRiEAAQAAACIFAADsRiEAAQAAACMFAADwRiEAAQAAACQFAAD0RiEAAQAAACUFAAD4RiEAAQAAACYFAAD8RiEAAQAAACcFAAAARyEAAQAAACgFAAAERyEAAQAAACkFAAAIRyEAAQAAACoFAAAMRyEAAQAAACsFAAAQRyEAAQAAACwFAAAURyEAAQAAAC0FAAAYRyEAAQAAAC4FAAAcRyEAAQAAAC8FAAAgRyEAAQAAADEFAAAkRyEAAQAAADIFAAAoRyEAAQAAADMFAAAsRyEAAQAAADQFAAAwRyEAAQAAADUFAAA0RyEAAQAAADYFAAA4RyEAAQAAADcFAAA8RyEAAQAAADgFAABARyEAAQAAADkFAABERyEAAQAAADoFAABIRyEAAQAAADsFAABMRyEAAQAAADwFAABQRyEAAQAAAD0FAABURyEAAQAAAD4FAABYRyEAAQAAAD8FAABcRyEAAQAAAEAFAABgRyEAAQAAAEEFAABkRyEAAQAAAEIFAABoRyEAAQAAAEMFAABsRyEAAQAAAEQFAABwRyEAAQAAAEUFAAB0RyEAAQAAAEYFAAB4RyEAAQAAAEcFAAB8RyEAAQAAAEgFAACARyEAAQAAAEkFAACERyEAAQAAAEoFAACIRyEAAQAAAEsFAACMRyEAAQAAAEwFAACQRyEAAQAAAE0FAACURyEAAQAAAE4FAACYRyEAAQAAAE8FAACcRyEAAQAAAFAFAACgRyEAAQAAAFEFAACkRyEAAQAAAFIFAACoRyEAAQAAAFMFAACsRyEAAQAAAFQFAACwRyEAAQAAAFUFAAC0RyEAAQAAAFYFAAC4RyEAAQAAAGEFAAC8RyEAAQAAAGIFAADARyEAAQAAAGMFAADERyEAAQAAAGQFAADIRyEAAQAAAGUFAADMRyEAAQAAAGYFAADQRyEAAQAAAGcFAADURyEAAQAAAGgFAADYRyEAAQAAAGkFAADcRyEAAQAAAGoFAADgRyEAAQAAAGsFAADkRyEAAQAAAGwFAADoRyEAAQAAAG0FAADsRyEAAQAAAG4FAADwRyEAAQAAAG8FAAD0RyEAAQAAAHAFAAD4RyEAAQAAAHEFAAD8RyEAAQAAAHIFAAAASCEAAQAAAHMFAAAESCEAAQAAAHQFAAAISCEAAQAAAHUFAAAMSCEAAQAAAHYFAAAQSCEAAQAAAHcFAAAUSCEAAQAAAHgFAAAYSCEAAQAAAHkFAAAcSCEAAQAAAHoFAAAgSCEAAQAAAHsFAAAkSCEAAQAAAHwFAAAoSCEAAQAAAH0FAAAsSCEAAQAAAH4FAAAwSCEAAQAAAH8FAAA0SCEAAQAAAIAFAAA4SCEAAQAAAIEFAAA8SCEAAQAAAIIFAABASCEAAQAAAIMFAABESCEAAQAAAIQFAABISCEAAQAAAIUFAABMSCEAAQAAAIYFAABQSCEAAQAAAKAQAABUSCEAAQAAAKEQAABYSCEAAQAAAKIQAABcSCEAAQAAAKMQAABgSCEAAQAAAKQQAABkSCEAAQAAAKUQAABoSCEAAQAAAKYQAABsSCEAAQAAAKcQAABwSCEAAQAAAKgQAAB0SCEAAQAAAKkQAAB4SCEAAQAAAKoQAAB8SCEAAQAAAKsQAACASCEAAQAAAKwQAACESCEAAQAAAK0QAACISCEAAQAAAK4QAACMSCEAAQAAAK8QAACQSCEAAQAAALAQAACUSCEAAQAAALEQAACYSCEAAQAAALIQAACcSCEAAQAAALMQAACgSCEAAQAAALQQAACkSCEAAQAAALUQAACoSCEAAQAAALYQAACsSCEAAQAAALcQAACwSCEAAQAAALgQAAC0SCEAAQAAALkQAAC4SCEAAQAAALoQAAC8SCEAAQAAALsQAADASCEAAQAAALwQAADESCEAAQAAAL0QAADISCEAAQAAAL4QAADMSCEAAQAAAL8QAADQSCEAAQAAAMAQAADUSCEAAQAAAMEQAADYSCEAAQAAAMIQAADcSCEAAQAAAMMQAADgSCEAAQAAAMQQAADkSCEAAQAAAMUQAADoSCEAAQAAAMcQAADsSCEAAQAAAM0QAADwSCEAAQAAANAQAAD0SCEAAQAAANEQAAD4SCEAAQAAANIQAAD8SCEAAQAAANMQAAAASSEAAQAAANQQAAAESSEAAQAAANUQAAAISSEAAQAAANYQAAAMSSEAAQAAANcQAAAQSSEAAQAAANgQAAAUSSEAAQAAANkQAAAYSSEAAQAAANoQAAAcSSEAAQAAANsQAAAgSSEAAQAAANwQAAAkSSEAAQAAAN0QAAAoSSEAAQAAAN4QAAAsSSEAAQAAAN8QAAAwSSEAAQAAAOAQAAA0SSEAAQAAAOEQAAA4SSEAAQAAAOIQAAA8SSEAAQAAAOMQAABASSEAAQAAAOQQAABESSEAAQAAAOUQAABISSEAAQAAAOYQAABMSSEAAQAAAOcQAABQSSEAAQAAAOgQAABUSSEAAQAAAOkQAABYSSEAAQAAAOoQAABcSSEAAQAAAOsQAABgSSEAAQAAAOwQAABkSSEAAQAAAO0QAABoSSEAAQAAAO4QAABsSSEAAQAAAO8QAABwSSEAAQAAAPAQAAB0SSEAAQAAAPEQAAB4SSEAAQAAAPIQAAB8SSEAAQAAAPMQAACASSEAAQAAAPQQAACESSEAAQAAAPUQAACISSEAAQAAAPYQAACMSSEAAQAAAPcQAACQSSEAAQAAAPgQAACUSSEAAQAAAPkQAACYSSEAAQAAAPoQAACcSSEAAQAAAP0QAACgSSEAAQAAAP4QAACkSSEAAQAAAP8QAACoSSEAAQAAAKATAACsSSEAAQAAAKETAACwSSEAAQAAAKITAAC0SSEAAQAAAKMTAAC4SSEAAQAAAKQTAAC8SSEAAQAAAKUTAADASSEAAQAAAKYTAADESSEAAQAAAKcTAADISSEAAQAAAKgTAADMSSEAAQAAAKkTAADQSSEAAQAAAKoTAADUSSEAAQAAAKsTAADYSSEAAQAAAKwTAADcSSEAAQAAAK0TAADgSSEAAQAAAK4TAADkSSEAAQAAAK8TAADoSSEAAQAAALATAADsSSEAAQAAALETAADwSSEAAQAAALITAAD0SSEAAQAAALMTAAD4SSEAAQAAALQTAAD8SSEAAQAAALUTAAAASiEAAQAAALYTAAAESiEAAQAAALcTAAAISiEAAQAAALgTAAAMSiEAAQAAALkTAAAQSiEAAQAAALoTAAAUSiEAAQAAALsTAAAYSiEAAQAAALwTAAAcSiEAAQAAAL0TAAAgSiEAAQAAAL4TAAAkSiEAAQAAAL8TAAAoSiEAAQAAAMATAAAsSiEAAQAAAMETAAAwSiEAAQAAAMITAAA0SiEAAQAAAMMTAAA4SiEAAQAAAMQTAAA8SiEAAQAAAMUTAABASiEAAQAAAMYTAABESiEAAQAAAMcTAABISiEAAQAAAMgTAABMSiEAAQAAAMkTAABQSiEAAQAAAMoTAABUSiEAAQAAAMsTAABYSiEAAQAAAMwTAABcSiEAAQAAAM0TAABgSiEAAQAAAM4TAABkSiEAAQAAAM8TAABoSiEAAQAAANATAABsSiEAAQAAANETAABwSiEAAQAAANITAAB0SiEAAQAAANMTAAB4SiEAAQAAANQTAAB8SiEAAQAAANUTAACASiEAAQAAANYTAACESiEAAQAAANcTAACISiEAAQAAANgTAACMSiEAAQAAANkTAACQSiEAAQAAANoTAACUSiEAAQAAANsTAACYSiEAAQAAANwTAACcSiEAAQAAAN0TAACgSiEAAQAAAN4TAACkSiEAAQAAAN8TAACoSiEAAQAAAOATAACsSiEAAQAAAOETAACwSiEAAQAAAOITAAC0SiEAAQAAAOMTAAC4SiEAAQAAAOQTAAC8SiEAAQAAAOUTAADASiEAAQAAAOYTAADESiEAAQAAAOcTAADISiEAAQAAAOgTAADMSiEAAQAAAOkTAADQSiEAAQAAAOoTAADUSiEAAQAAAOsTAADYSiEAAQAAAOwTAADcSiEAAQAAAO0TAADgSiEAAQAAAO4TAADkSiEAAQAAAO8TAADoSiEAAQAAAPATAADsSiEAAQAAAPETAADwSiEAAQAAAPITAAD0SiEAAQAAAPMTAAD4SiEAAQAAAPQTAAD8SiEAAQAAAPUTAAAASyEAAQAAAPgTAAAESyEAAQAAAPkTAAAISyEAAQAAAPoTAAAMSyEAAQAAAPsTAAAQSyEAAQAAAPwTAAAUSyEAAQAAAP0TAAAYSyEAAQAAAIAcAAAcSyEAAgAAAIEcAAAkSyEAAgAAAIIcAAAsSyEAAgAAAIMcAAA0SyEAAgAAAIQcAAA8SyEAAwAAAIUcAABISyEAAwAAAIYcAABUSyEAAgAAAIccAABcSyEAAgAAAIgcAABkSyEAAgAAAIkcAABsSyEAAQAAAIocAABwSyEAAQAAAJAcAAB0SyEAAQAAAJEcAAB4SyEAAQAAAJIcAAB8SyEAAQAAAJMcAACASyEAAQAAAJQcAACESyEAAQAAAJUcAACISyEAAQAAAJYcAACMSyEAAQAAAJccAACQSyEAAQAAAJgcAACUSyEAAQAAAJkcAACYSyEAAQAAAJocAACcSyEAAQAAAJscAACgSyEAAQAAAJwcAACkSyEAAQAAAJ0cAACoSyEAAQAAAJ4cAACsSyEAAQAAAJ8cAACwSyEAAQAAAKAcAAC0SyEAAQAAAKEcAAC4SyEAAQAAAKIcAAC8SyEAAQAAAKMcAADASyEAAQAAAKQcAADESyEAAQAAAKUcAADISyEAAQAAAKYcAADMSyEAAQAAAKccAADQSyEAAQAAAKgcAADUSyEAAQAAAKkcAADYSyEAAQAAAKocAADcSyEAAQAAAKscAADgSyEAAQAAAKwcAADkSyEAAQAAAK0cAADoSyEAAQAAAK4cAADsSyEAAQAAAK8cAADwSyEAAQAAALAcAAD0SyEAAQAAALEcAAD4SyEAAQAAALIcAAD8SyEAAQAAALMcAAAATCEAAQAAALQcAAAETCEAAQAAALUcAAAITCEAAQAAALYcAAAMTCEAAQAAALccAAAQTCEAAQAAALgcAAAUTCEAAQAAALkcAAAYTCEAAQAAALocAAAcTCEAAQAAAL0cAAAgTCEAAQAAAL4cAAAkTCEAAQAAAL8cAAAoTCEAAQAAAHkdAAAsTCEAAQAAAH0dAAAwTCEAAQAAAI4dAAA0TCEAAQAAAAAeAAA4TCEAAQAAAAEeAAA8TCEAAQAAAAIeAABATCEAAQAAAAMeAABETCEAAQAAAAQeAABITCEAAQAAAAUeAABMTCEAAQAAAAYeAABQTCEAAQAAAAceAABUTCEAAQAAAAgeAABYTCEAAQAAAAkeAABcTCEAAQAAAAoeAABgTCEAAQAAAAseAABkTCEAAQAAAAweAABoTCEAAQAAAA0eAABsTCEAAQAAAA4eAABwTCEAAQAAAA8eAAB0TCEAAQAAABAeAAB4TCEAAQAAABEeAAB8TCEAAQAAABIeAACATCEAAQAAABMeAACETCEAAQAAABQeAACITCEAAQAAABUeAACMTCEAAQAAABYeAACQTCEAAQAAABceAACUTCEAAQAAABgeAACYTCEAAQAAABkeAACcTCEAAQAAABoeAACgTCEAAQAAABseAACkTCEAAQAAABweAACoTCEAAQAAAB0eAACsTCEAAQAAAB4eAACwTCEAAQAAAB8eAAC0TCEAAQAAACAeAAC4TCEAAQAAACEeAAC8TCEAAQAAACIeAADATCEAAQAAACMeAADETCEAAQAAACQeAADITCEAAQAAACUeAADMTCEAAQAAACYeAADQTCEAAQAAACceAADUTCEAAQAAACgeAADYTCEAAQAAACkeAADcTCEAAQAAACoeAADgTCEAAQAAACseAADkTCEAAQAAACweAADoTCEAAQAAAC0eAADsTCEAAQAAAC4eAADwTCEAAQAAAC8eAAD0TCEAAQAAADAeAAD4TCEAAQAAADEeAAD8TCEAAQAAADIeAAAATSEAAQAAADMeAAAETSEAAQAAADQeAAAITSEAAQAAADUeAAAMTSEAAQAAADYeAAAQTSEAAQAAADceAAAUTSEAAQAAADgeAAAYTSEAAQAAADkeAAAcTSEAAQAAADoeAAAgTSEAAQAAADseAAAkTSEAAQAAADweAAAoTSEAAQAAAD0eAAAsTSEAAQAAAD4eAAAwTSEAAQAAAD8eAAA0TSEAAQAAAEAeAAA4TSEAAQAAAEEeAAA8TSEAAQAAAEIeAABATSEAAQAAAEMeAABETSEAAQAAAEQeAABITSEAAQAAAEUeAABMTSEAAQAAAEYeAABQTSEAAQAAAEceAABUTSEAAQAAAEgeAABYTSEAAQAAAEkeAABcTSEAAQAAAEoeAABgTSEAAQAAAEseAABkTSEAAQAAAEweAABoTSEAAQAAAE0eAABsTSEAAQAAAE4eAABwTSEAAQAAAE8eAAB0TSEAAQAAAFAeAAB4TSEAAQAAAFEeAAB8TSEAAQAAAFIeAACATSEAAQAAAFMeAACETSEAAQAAAFQeAACITSEAAQAAAFUeAACMTSEAAQAAAFYeAACQTSEAAQAAAFceAACUTSEAAQAAAFgeAACYTSEAAQAAAFkeAACcTSEAAQAAAFoeAACgTSEAAQAAAFseAACkTSEAAQAAAFweAACoTSEAAQAAAF0eAACsTSEAAQAAAF4eAACwTSEAAQAAAF8eAAC0TSEAAQAAAGAeAAC4TSEAAgAAAGEeAADATSEAAgAAAGIeAADITSEAAQAAAGMeAADMTSEAAQAAAGQeAADQTSEAAQAAAGUeAADUTSEAAQAAAGYeAADYTSEAAQAAAGceAADcTSEAAQAAAGgeAADgTSEAAQAAAGkeAADkTSEAAQAAAGoeAADoTSEAAQAAAGseAADsTSEAAQAAAGweAADwTSEAAQAAAG0eAAD0TSEAAQAAAG4eAAD4TSEAAQAAAG8eAAD8TSEAAQAAAHAeAAAATiEAAQAAAHEeAAAETiEAAQAAAHIeAAAITiEAAQAAAHMeAAAMTiEAAQAAAHQeAAAQTiEAAQAAAHUeAAAUTiEAAQAAAHYeAAAYTiEAAQAAAHceAAAcTiEAAQAAAHgeAAAgTiEAAQAAAHkeAAAkTiEAAQAAAHoeAAAoTiEAAQAAAHseAAAsTiEAAQAAAHweAAAwTiEAAQAAAH0eAAA0TiEAAQAAAH4eAAA4TiEAAQAAAH8eAAA8TiEAAQAAAIAeAABATiEAAQAAAIEeAABETiEAAQAAAIIeAABITiEAAQAAAIMeAABMTiEAAQAAAIQeAABQTiEAAQAAAIUeAABUTiEAAQAAAIYeAABYTiEAAQAAAIceAABcTiEAAQAAAIgeAABgTiEAAQAAAIkeAABkTiEAAQAAAIoeAABoTiEAAQAAAIseAABsTiEAAQAAAIweAABwTiEAAQAAAI0eAAB0TiEAAQAAAI4eAAB4TiEAAQAAAI8eAAB8TiEAAQAAAJAeAACATiEAAQAAAJEeAACETiEAAQAAAJIeAACITiEAAQAAAJMeAACMTiEAAQAAAJQeAACQTiEAAQAAAJUeAACUTiEAAQAAAJseAACYTiEAAgAAAJ4eAACgTiEAAQAAAKAeAACkTiEAAQAAAKEeAACoTiEAAQAAAKIeAACsTiEAAQAAAKMeAACwTiEAAQAAAKQeAAC0TiEAAQAAAKUeAAC4TiEAAQAAAKYeAAC8TiEAAQAAAKceAADATiEAAQAAAKgeAADETiEAAQAAAKkeAADITiEAAQAAAKoeAADMTiEAAQAAAKseAADQTiEAAQAAAKweAADUTiEAAQAAAK0eAADYTiEAAQAAAK4eAADcTiEAAQAAAK8eAADgTiEAAQAAALAeAADkTiEAAQAAALEeAADoTiEAAQAAALIeAADsTiEAAQAAALMeAADwTiEAAQAAALQeAAD0TiEAAQAAALUeAAD4TiEAAQAAALYeAAD8TiEAAQAAALceAAAATyEAAQAAALgeAAAETyEAAQAAALkeAAAITyEAAQAAALoeAAAMTyEAAQAAALseAAAQTyEAAQAAALweAAAUTyEAAQAAAL0eAAAYTyEAAQAAAL4eAAAcTyEAAQAAAL8eAAAgTyEAAQAAAMAeAAAkTyEAAQAAAMEeAAAoTyEAAQAAAMIeAAAsTyEAAQAAAMMeAAAwTyEAAQAAAMQeAAA0TyEAAQAAAMUeAAA4TyEAAQAAAMYeAAA8TyEAAQAAAMceAABATyEAAQAAAMgeAABETyEAAQAAAMkeAABITyEAAQAAAMoeAABMTyEAAQAAAMseAABQTyEAAQAAAMweAABUTyEAAQAAAM0eAABYTyEAAQAAAM4eAABcTyEAAQAAAM8eAABgTyEAAQAAANAeAABkTyEAAQAAANEeAABoTyEAAQAAANIeAABsTyEAAQAAANMeAABwTyEAAQAAANQeAAB0TyEAAQAAANUeAAB4TyEAAQAAANYeAAB8TyEAAQAAANceAACATyEAAQAAANgeAACETyEAAQAAANkeAACITyEAAQAAANoeAACMTyEAAQAAANseAACQTyEAAQAAANweAACUTyEAAQAAAN0eAACYTyEAAQAAAN4eAACcTyEAAQAAAN8eAACgTyEAAQAAAOAeAACkTyEAAQAAAOEeAACoTyEAAQAAAOIeAACsTyEAAQAAAOMeAACwTyEAAQAAAOQeAAC0TyEAAQAAAOUeAAC4TyEAAQAAAOYeAAC8TyEAAQAAAOceAADATyEAAQAAAOgeAADETyEAAQAAAOkeAADITyEAAQAAAOoeAADMTyEAAQAAAOseAADQTyEAAQAAAOweAADUTyEAAQAAAO0eAADYTyEAAQAAAO4eAADcTyEAAQAAAO8eAADgTyEAAQAAAPAeAADkTyEAAQAAAPEeAADoTyEAAQAAAPIeAADsTyEAAQAAAPMeAADwTyEAAQAAAPQeAAD0TyEAAQAAAPUeAAD4TyEAAQAAAPYeAAD8TyEAAQAAAPceAAAAUCEAAQAAAPgeAAAEUCEAAQAAAPkeAAAIUCEAAQAAAPoeAAAMUCEAAQAAAPseAAAQUCEAAQAAAPweAAAUUCEAAQAAAP0eAAAYUCEAAQAAAP4eAAAcUCEAAQAAAP8eAAAgUCEAAQAAAAAfAAAkUCEAAQAAAAEfAAAoUCEAAQAAAAIfAAAsUCEAAQAAAAMfAAAwUCEAAQAAAAQfAAA0UCEAAQAAAAUfAAA4UCEAAQAAAAYfAAA8UCEAAQAAAAcfAABAUCEAAQAAAAgfAABEUCEAAQAAAAkfAABIUCEAAQAAAAofAABMUCEAAQAAAAsfAABQUCEAAQAAAAwfAABUUCEAAQAAAA0fAABYUCEAAQAAAA4fAABcUCEAAQAAAA8fAABgUCEAAQAAABAfAABkUCEAAQAAABEfAABoUCEAAQAAABIfAABsUCEAAQAAABMfAABwUCEAAQAAABQfAAB0UCEAAQAAABUfAAB4UCEAAQAAABgfAAB8UCEAAQAAABkfAACAUCEAAQAAABofAACEUCEAAQAAABsfAACIUCEAAQAAABwfAACMUCEAAQAAAB0fAACQUCEAAQAAACAfAACUUCEAAQAAACEfAACYUCEAAQAAACIfAACcUCEAAQAAACMfAACgUCEAAQAAACQfAACkUCEAAQAAACUfAACoUCEAAQAAACYfAACsUCEAAQAAACcfAACwUCEAAQAAACgfAAC0UCEAAQAAACkfAAC4UCEAAQAAACofAAC8UCEAAQAAACsfAADAUCEAAQAAACwfAADEUCEAAQAAAC0fAADIUCEAAQAAAC4fAADMUCEAAQAAAC8fAADQUCEAAQAAADAfAADUUCEAAQAAADEfAADYUCEAAQAAADIfAADcUCEAAQAAADMfAADgUCEAAQAAADQfAADkUCEAAQAAADUfAADoUCEAAQAAADYfAADsUCEAAQAAADcfAADwUCEAAQAAADgfAAD0UCEAAQAAADkfAAD4UCEAAQAAADofAAD8UCEAAQAAADsfAAAAUSEAAQAAADwfAAAEUSEAAQAAAD0fAAAIUSEAAQAAAD4fAAAMUSEAAQAAAD8fAAAQUSEAAQAAAEAfAAAUUSEAAQAAAEEfAAAYUSEAAQAAAEIfAAAcUSEAAQAAAEMfAAAgUSEAAQAAAEQfAAAkUSEAAQAAAEUfAAAoUSEAAQAAAEgfAAAsUSEAAQAAAEkfAAAwUSEAAQAAAEofAAA0USEAAQAAAEsfAAA4USEAAQAAAEwfAAA8USEAAQAAAE0fAABAUSEAAQAAAFEfAABEUSEAAQAAAFMfAABIUSEAAQAAAFUfAABMUSEAAQAAAFcfAABQUSEAAQAAAFkfAABUUSEAAQAAAFsfAABYUSEAAQAAAF0fAABcUSEAAQAAAF8fAABgUSEAAQAAAGAfAABkUSEAAQAAAGEfAABoUSEAAQAAAGIfAABsUSEAAQAAAGMfAABwUSEAAQAAAGQfAAB0USEAAQAAAGUfAAB4USEAAQAAAGYfAAB8USEAAQAAAGcfAACAUSEAAQAAAGgfAACEUSEAAQAAAGkfAACIUSEAAQAAAGofAACMUSEAAQAAAGsfAACQUSEAAQAAAGwfAACUUSEAAQAAAG0fAACYUSEAAQAAAG4fAACcUSEAAQAAAG8fAACgUSEAAQAAAHAfAACkUSEAAQAAAHEfAACoUSEAAQAAAHIfAACsUSEAAQAAAHMfAACwUSEAAQAAAHQfAAC0USEAAQAAAHUfAAC4USEAAQAAAHYfAAC8USEAAQAAAHcfAADAUSEAAQAAAHgfAADEUSEAAQAAAHkfAADIUSEAAQAAAHofAADMUSEAAQAAAHsfAADQUSEAAQAAAHwfAADUUSEAAQAAAH0fAADYUSEAAQAAAIAfAADcUSEAAQAAAIEfAADgUSEAAQAAAIIfAADkUSEAAQAAAIMfAADoUSEAAQAAAIQfAADsUSEAAQAAAIUfAADwUSEAAQAAAIYfAAD0USEAAQAAAIcfAAD4USEAAQAAAIgfAAD8USEAAQAAAIkfAAAAUiEAAQAAAIofAAAEUiEAAQAAAIsfAAAIUiEAAQAAAIwfAAAMUiEAAQAAAI0fAAAQUiEAAQAAAI4fAAAUUiEAAQAAAI8fAAAYUiEAAQAAAJAfAAAcUiEAAQAAAJEfAAAgUiEAAQAAAJIfAAAkUiEAAQAAAJMfAAAoUiEAAQAAAJQfAAAsUiEAAQAAAJUfAAAwUiEAAQAAAJYfAAA0UiEAAQAAAJcfAAA4UiEAAQAAAJgfAAA8UiEAAQAAAJkfAABAUiEAAQAAAJofAABEUiEAAQAAAJsfAABIUiEAAQAAAJwfAABMUiEAAQAAAJ0fAABQUiEAAQAAAJ4fAABUUiEAAQAAAJ8fAABYUiEAAQAAAKAfAABcUiEAAQAAAKEfAABgUiEAAQAAAKIfAABkUiEAAQAAAKMfAABoUiEAAQAAAKQfAABsUiEAAQAAAKUfAABwUiEAAQAAAKYfAAB0UiEAAQAAAKcfAAB4UiEAAQAAAKgfAAB8UiEAAQAAAKkfAACAUiEAAQAAAKofAACEUiEAAQAAAKsfAACIUiEAAQAAAKwfAACMUiEAAQAAAK0fAACQUiEAAQAAAK4fAACUUiEAAQAAAK8fAACYUiEAAQAAALAfAACcUiEAAQAAALEfAACgUiEAAQAAALMfAACkUiEAAQAAALgfAACoUiEAAQAAALkfAACsUiEAAQAAALofAACwUiEAAQAAALsfAAC0UiEAAQAAALwfAAC4UiEAAQAAAL4fAAC8UiEAAwAAAMMfAADIUiEAAQAAAMgfAADMUiEAAQAAAMkfAADQUiEAAQAAAMofAADUUiEAAQAAAMsfAADYUiEAAQAAAMwfAADcUiEAAQAAANAfAADgUiEAAQAAANEfAADkUiEAAQAAANMfAADoUiEAAQAAANgfAADsUiEAAQAAANkfAADwUiEAAQAAANofAAD0UiEAAQAAANsfAAD4UiEAAQAAAOAfAAD8UiEAAQAAAOEfAAAAUyEAAQAAAOMfAAAEUyEAAQAAAOUfAAAIUyEAAQAAAOgfAAAMUyEAAQAAAOkfAAAQUyEAAQAAAOofAAAUUyEAAQAAAOsfAAAYUyEAAQAAAOwfAAAcUyEAAQAAAPMfAAAgUyEAAQAAAPgfAAAkUyEAAQAAAPkfAAAoUyEAAQAAAPofAAAsUyEAAQAAAPsfAAAwUyEAAQAAAPwfAAA0UyEAAQAAACYhAAA4UyEAAgAAACohAABAUyEAAgAAACshAABIUyEAAgAAADIhAABQUyEAAQAAAE4hAABUUyEAAQAAAGAhAABYUyEAAQAAAGEhAABcUyEAAQAAAGIhAABgUyEAAQAAAGMhAABkUyEAAQAAAGQhAABoUyEAAQAAAGUhAABsUyEAAQAAAGYhAABwUyEAAQAAAGchAAB0UyEAAQAAAGghAAB4UyEAAQAAAGkhAAB8UyEAAQAAAGohAACAUyEAAQAAAGshAACEUyEAAQAAAGwhAACIUyEAAQAAAG0hAACMUyEAAQAAAG4hAACQUyEAAQAAAG8hAACUUyEAAQAAAHAhAACYUyEAAQAAAHEhAACcUyEAAQAAAHIhAACgUyEAAQAAAHMhAACkUyEAAQAAAHQhAACoUyEAAQAAAHUhAACsUyEAAQAAAHYhAACwUyEAAQAAAHchAAC0UyEAAQAAAHghAAC4UyEAAQAAAHkhAAC8UyEAAQAAAHohAADAUyEAAQAAAHshAADEUyEAAQAAAHwhAADIUyEAAQAAAH0hAADMUyEAAQAAAH4hAADQUyEAAQAAAH8hAADUUyEAAQAAAIMhAADYUyEAAQAAAIQhAADcUyEAAQAAALYkAADgUyEAAQAAALckAADkUyEAAQAAALgkAADoUyEAAQAAALkkAADsUyEAAQAAALokAADwUyEAAQAAALskAAD0UyEAAQAAALwkAAD4UyEAAQAAAL0kAAD8UyEAAQAAAL4kAAAAVCEAAQAAAL8kAAAEVCEAAQAAAMAkAAAIVCEAAQAAAMEkAAAMVCEAAQAAAMIkAAAQVCEAAQAAAMMkAAAUVCEAAQAAAMQkAAAYVCEAAQAAAMUkAAAcVCEAAQAAAMYkAAAgVCEAAQAAAMckAAAkVCEAAQAAAMgkAAAoVCEAAQAAAMkkAAAsVCEAAQAAAMokAAAwVCEAAQAAAMskAAA0VCEAAQAAAMwkAAA4VCEAAQAAAM0kAAA8VCEAAQAAAM4kAABAVCEAAQAAAM8kAABEVCEAAQAAANAkAABIVCEAAQAAANEkAABMVCEAAQAAANIkAABQVCEAAQAAANMkAABUVCEAAQAAANQkAABYVCEAAQAAANUkAABcVCEAAQAAANYkAABgVCEAAQAAANckAABkVCEAAQAAANgkAABoVCEAAQAAANkkAABsVCEAAQAAANokAABwVCEAAQAAANskAAB0VCEAAQAAANwkAAB4VCEAAQAAAN0kAAB8VCEAAQAAAN4kAACAVCEAAQAAAN8kAACEVCEAAQAAAOAkAACIVCEAAQAAAOEkAACMVCEAAQAAAOIkAACQVCEAAQAAAOMkAACUVCEAAQAAAOQkAACYVCEAAQAAAOUkAACcVCEAAQAAAOYkAACgVCEAAQAAAOckAACkVCEAAQAAAOgkAACoVCEAAQAAAOkkAACsVCEAAQAAAAAsAACwVCEAAQAAAAEsAAC0VCEAAQAAAAIsAAC4VCEAAQAAAAMsAAC8VCEAAQAAAAQsAADAVCEAAQAAAAUsAADEVCEAAQAAAAYsAADIVCEAAQAAAAcsAADMVCEAAQAAAAgsAADQVCEAAQAAAAksAADUVCEAAQAAAAosAADYVCEAAQAAAAssAADcVCEAAQAAAAwsAADgVCEAAQAAAA0sAADkVCEAAQAAAA4sAADoVCEAAQAAAA8sAADsVCEAAQAAABAsAADwVCEAAQAAABEsAAD0VCEAAQAAABIsAAD4VCEAAQAAABMsAAD8VCEAAQAAABQsAAAAVSEAAQAAABUsAAAEVSEAAQAAABYsAAAIVSEAAQAAABcsAAAMVSEAAQAAABgsAAAQVSEAAQAAABksAAAUVSEAAQAAABosAAAYVSEAAQAAABssAAAcVSEAAQAAABwsAAAgVSEAAQAAAB0sAAAkVSEAAQAAAB4sAAAoVSEAAQAAAB8sAAAsVSEAAQAAACAsAAAwVSEAAQAAACEsAAA0VSEAAQAAACIsAAA4VSEAAQAAACMsAAA8VSEAAQAAACQsAABAVSEAAQAAACUsAABEVSEAAQAAACYsAABIVSEAAQAAACcsAABMVSEAAQAAACgsAABQVSEAAQAAACksAABUVSEAAQAAACosAABYVSEAAQAAACssAABcVSEAAQAAACwsAABgVSEAAQAAAC0sAABkVSEAAQAAAC4sAABoVSEAAQAAAC8sAABsVSEAAQAAADAsAABwVSEAAQAAADEsAAB0VSEAAQAAADIsAAB4VSEAAQAAADMsAAB8VSEAAQAAADQsAACAVSEAAQAAADUsAACEVSEAAQAAADYsAACIVSEAAQAAADcsAACMVSEAAQAAADgsAACQVSEAAQAAADksAACUVSEAAQAAADosAACYVSEAAQAAADssAACcVSEAAQAAADwsAACgVSEAAQAAAD0sAACkVSEAAQAAAD4sAACoVSEAAQAAAD8sAACsVSEAAQAAAEAsAACwVSEAAQAAAEEsAAC0VSEAAQAAAEIsAAC4VSEAAQAAAEMsAAC8VSEAAQAAAEQsAADAVSEAAQAAAEUsAADEVSEAAQAAAEYsAADIVSEAAQAAAEcsAADMVSEAAQAAAEgsAADQVSEAAQAAAEksAADUVSEAAQAAAEosAADYVSEAAQAAAEssAADcVSEAAQAAAEwsAADgVSEAAQAAAE0sAADkVSEAAQAAAE4sAADoVSEAAQAAAE8sAADsVSEAAQAAAFAsAADwVSEAAQAAAFEsAAD0VSEAAQAAAFIsAAD4VSEAAQAAAFMsAAD8VSEAAQAAAFQsAAAAViEAAQAAAFUsAAAEViEAAQAAAFYsAAAIViEAAQAAAFcsAAAMViEAAQAAAFgsAAAQViEAAQAAAFksAAAUViEAAQAAAFosAAAYViEAAQAAAFssAAAcViEAAQAAAFwsAAAgViEAAQAAAF0sAAAkViEAAQAAAF4sAAAoViEAAQAAAF8sAAAsViEAAQAAAGAsAAAwViEAAQAAAGEsAAA0ViEAAQAAAGIsAAA4ViEAAQAAAGMsAAA8ViEAAQAAAGQsAABAViEAAQAAAGUsAABEViEAAQAAAGYsAABIViEAAQAAAGcsAABMViEAAQAAAGgsAABQViEAAQAAAGksAABUViEAAQAAAGosAABYViEAAQAAAGssAABcViEAAQAAAGwsAABgViEAAQAAAG0sAABkViEAAQAAAG4sAABoViEAAQAAAG8sAABsViEAAQAAAHAsAABwViEAAQAAAHIsAAB0ViEAAQAAAHMsAAB4ViEAAQAAAHUsAAB8ViEAAQAAAHYsAACAViEAAQAAAH4sAACEViEAAQAAAH8sAACIViEAAQAAAIAsAACMViEAAQAAAIEsAACQViEAAQAAAIIsAACUViEAAQAAAIMsAACYViEAAQAAAIQsAACcViEAAQAAAIUsAACgViEAAQAAAIYsAACkViEAAQAAAIcsAACoViEAAQAAAIgsAACsViEAAQAAAIksAACwViEAAQAAAIosAAC0ViEAAQAAAIssAAC4ViEAAQAAAIwsAAC8ViEAAQAAAI0sAADAViEAAQAAAI4sAADEViEAAQAAAI8sAADIViEAAQAAAJAsAADMViEAAQAAAJEsAADQViEAAQAAAJIsAADUViEAAQAAAJMsAADYViEAAQAAAJQsAADcViEAAQAAAJUsAADgViEAAQAAAJYsAADkViEAAQAAAJcsAADoViEAAQAAAJgsAADsViEAAQAAAJksAADwViEAAQAAAJosAAD0ViEAAQAAAJssAAD4ViEAAQAAAJwsAAD8ViEAAQAAAJ0sAAAAVyEAAQAAAJ4sAAAEVyEAAQAAAJ8sAAAIVyEAAQAAAKAsAAAMVyEAAQAAAKEsAAAQVyEAAQAAAKIsAAAUVyEAAQAAAKMsAAAYVyEAAQAAAKQsAAAcVyEAAQAAAKUsAAAgVyEAAQAAAKYsAAAkVyEAAQAAAKcsAAAoVyEAAQAAAKgsAAAsVyEAAQAAAKksAAAwVyEAAQAAAKosAAA0VyEAAQAAAKssAAA4VyEAAQAAAKwsAAA8VyEAAQAAAK0sAABAVyEAAQAAAK4sAABEVyEAAQAAAK8sAABIVyEAAQAAALAsAABMVyEAAQAAALEsAABQVyEAAQAAALIsAABUVyEAAQAAALMsAABYVyEAAQAAALQsAABcVyEAAQAAALUsAABgVyEAAQAAALYsAABkVyEAAQAAALcsAABoVyEAAQAAALgsAABsVyEAAQAAALksAABwVyEAAQAAALosAAB0VyEAAQAAALssAAB4VyEAAQAAALwsAAB8VyEAAQAAAL0sAACAVyEAAQAAAL4sAACEVyEAAQAAAL8sAACIVyEAAQAAAMAsAACMVyEAAQAAAMEsAACQVyEAAQAAAMIsAACUVyEAAQAAAMMsAACYVyEAAQAAAMQsAACcVyEAAQAAAMUsAACgVyEAAQAAAMYsAACkVyEAAQAAAMcsAACoVyEAAQAAAMgsAACsVyEAAQAAAMksAACwVyEAAQAAAMosAAC0VyEAAQAAAMssAAC4VyEAAQAAAMwsAAC8VyEAAQAAAM0sAADAVyEAAQAAAM4sAADEVyEAAQAAAM8sAADIVyEAAQAAANAsAADMVyEAAQAAANEsAADQVyEAAQAAANIsAADUVyEAAQAAANMsAADYVyEAAQAAANQsAADcVyEAAQAAANUsAADgVyEAAQAAANYsAADkVyEAAQAAANcsAADoVyEAAQAAANgsAADsVyEAAQAAANksAADwVyEAAQAAANosAAD0VyEAAQAAANssAAD4VyEAAQAAANwsAAD8VyEAAQAAAN0sAAAAWCEAAQAAAN4sAAAEWCEAAQAAAN8sAAAIWCEAAQAAAOAsAAAMWCEAAQAAAOEsAAAQWCEAAQAAAOIsAAAUWCEAAQAAAOMsAAAYWCEAAQAAAOssAAAcWCEAAQAAAOwsAAAgWCEAAQAAAO0sAAAkWCEAAQAAAO4sAAAoWCEAAQAAAPIsAAAsWCEAAQAAAPMsAAAwWCEAAQAAAAAtAAA0WCEAAQAAAAEtAAA4WCEAAQAAAAItAAA8WCEAAQAAAAMtAABAWCEAAQAAAAQtAABEWCEAAQAAAAUtAABIWCEAAQAAAAYtAABMWCEAAQAAAActAABQWCEAAQAAAAgtAABUWCEAAQAAAAktAABYWCEAAQAAAAotAABcWCEAAQAAAAstAABgWCEAAQAAAAwtAABkWCEAAQAAAA0tAABoWCEAAQAAAA4tAABsWCEAAQAAAA8tAABwWCEAAQAAABAtAAB0WCEAAQAAABEtAAB4WCEAAQAAABItAAB8WCEAAQAAABMtAACAWCEAAQAAABQtAACEWCEAAQAAABUtAACIWCEAAQAAABYtAACMWCEAAQAAABctAACQWCEAAQAAABgtAACUWCEAAQAAABktAACYWCEAAQAAABotAACcWCEAAQAAABstAACgWCEAAQAAABwtAACkWCEAAQAAAB0tAACoWCEAAQAAAB4tAACsWCEAAQAAAB8tAACwWCEAAQAAACAtAAC0WCEAAQAAACEtAAC4WCEAAQAAACItAAC8WCEAAQAAACMtAADAWCEAAQAAACQtAADEWCEAAQAAACUtAADIWCEAAQAAACctAADMWCEAAQAAAC0tAADQWCEAAQAAAECmAADUWCEAAQAAAEGmAADYWCEAAQAAAEKmAADcWCEAAQAAAEOmAADgWCEAAQAAAESmAADkWCEAAQAAAEWmAADoWCEAAQAAAEamAADsWCEAAQAAAEemAADwWCEAAQAAAEimAAD0WCEAAQAAAEmmAAD4WCEAAQAAAEqmAAD8WCEAAgAAAEumAAAEWSEAAgAAAEymAAAMWSEAAQAAAE2mAAAQWSEAAQAAAE6mAAAUWSEAAQAAAE+mAAAYWSEAAQAAAFCmAAAcWSEAAQAAAFGmAAAgWSEAAQAAAFKmAAAkWSEAAQAAAFOmAAAoWSEAAQAAAFSmAAAsWSEAAQAAAFWmAAAwWSEAAQAAAFamAAA0WSEAAQAAAFemAAA4WSEAAQAAAFimAAA8WSEAAQAAAFmmAABAWSEAAQAAAFqmAABEWSEAAQAAAFumAABIWSEAAQAAAFymAABMWSEAAQAAAF2mAABQWSEAAQAAAF6mAABUWSEAAQAAAF+mAABYWSEAAQAAAGCmAABcWSEAAQAAAGGmAABgWSEAAQAAAGKmAABkWSEAAQAAAGOmAABoWSEAAQAAAGSmAABsWSEAAQAAAGWmAABwWSEAAQAAAGamAAB0WSEAAQAAAGemAAB4WSEAAQAAAGimAAB8WSEAAQAAAGmmAACAWSEAAQAAAGqmAACEWSEAAQAAAGumAACIWSEAAQAAAGymAACMWSEAAQAAAG2mAACQWSEAAQAAAICmAACUWSEAAQAAAIGmAACYWSEAAQAAAIKmAACcWSEAAQAAAIOmAACgWSEAAQAAAISmAACkWSEAAQAAAIWmAACoWSEAAQAAAIamAACsWSEAAQAAAIemAACwWSEAAQAAAIimAAC0WSEAAQAAAImmAAC4WSEAAQAAAIqmAAC8WSEAAQAAAIumAADAWSEAAQAAAIymAADEWSEAAQAAAI2mAADIWSEAAQAAAI6mAADMWSEAAQAAAI+mAADQWSEAAQAAAJCmAADUWSEAAQAAAJGmAADYWSEAAQAAAJKmAADcWSEAAQAAAJOmAADgWSEAAQAAAJSmAADkWSEAAQAAAJWmAADoWSEAAQAAAJamAADsWSEAAQAAAJemAADwWSEAAQAAAJimAAD0WSEAAQAAAJmmAAD4WSEAAQAAAJqmAAD8WSEAAQAAAJumAAAAWiEAAQAAACKnAAAEWiEAAQAAACOnAAAIWiEAAQAAACSnAAAMWiEAAQAAACWnAAAQWiEAAQAAACanAAAUWiEAAQAAACenAAAYWiEAAQAAACinAAAcWiEAAQAAACmnAAAgWiEAAQAAACqnAAAkWiEAAQAAACunAAAoWiEAAQAAACynAAAsWiEAAQAAAC2nAAAwWiEAAQAAAC6nAAA0WiEAAQAAAC+nAAA4WiEAAQAAADKnAAA8WiEAAQAAADOnAABAWiEAAQAAADSnAABEWiEAAQAAADWnAABIWiEAAQAAADanAABMWiEAAQAAADenAABQWiEAAQAAADinAABUWiEAAQAAADmnAABYWiEAAQAAADqnAABcWiEAAQAAADunAABgWiEAAQAAADynAABkWiEAAQAAAD2nAABoWiEAAQAAAD6nAABsWiEAAQAAAD+nAABwWiEAAQAAAECnAAB0WiEAAQAAAEGnAAB4WiEAAQAAAEKnAAB8WiEAAQAAAEOnAACAWiEAAQAAAESnAACEWiEAAQAAAEWnAACIWiEAAQAAAEanAACMWiEAAQAAAEenAACQWiEAAQAAAEinAACUWiEAAQAAAEmnAACYWiEAAQAAAEqnAACcWiEAAQAAAEunAACgWiEAAQAAAEynAACkWiEAAQAAAE2nAACoWiEAAQAAAE6nAACsWiEAAQAAAE+nAACwWiEAAQAAAFCnAAC0WiEAAQAAAFGnAAC4WiEAAQAAAFKnAAC8WiEAAQAAAFOnAADAWiEAAQAAAFSnAADEWiEAAQAAAFWnAADIWiEAAQAAAFanAADMWiEAAQAAAFenAADQWiEAAQAAAFinAADUWiEAAQAAAFmnAADYWiEAAQAAAFqnAADcWiEAAQAAAFunAADgWiEAAQAAAFynAADkWiEAAQAA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AEn/AABsXiEAAQAAAEr/AABwXiEAAQAAAEv/AAB0XiEAAQAAAEz/AAB4XiEAAQAAAE3/AAB8XiEAAQAAAE7/AACAXiEAAQAAAE//AACEXiEAAQAAAFD/AACIXiEAAQAAAFH/AACMXiEAAQAAAFL/AACQXiEAAQAAAFP/AACUXiEAAQAAAFT/AACYXiEAAQAAAFX/AACcXiEAAQAAAFb/AACgXiEAAQAAAFf/AACkXiEAAQAAAFj/AACoXiEAAQAAAFn/AACsXiEAAQAAAFr/AACwXiEAAQAAAAAEAQC0XiEAAQAAAAEEAQC4XiEAAQAAAAIEAQC8XiEAAQAAAAMEAQDAXiEAAQAAAAQEAQDEXiEAAQAAAAUEAQDIXiEAAQAAAAYEAQDMXiEAAQAAAAcEAQDQXiEAAQAAAAgEAQDUXiEAAQAAAAkEAQDYXiEAAQAAAAoEAQDcXiEAAQAAAAsEAQDgXiEAAQAAAAwEAQDkXiEAAQAAAA0EAQDoXiEAAQAAAA4EAQDsXiEAAQAAAA8EAQDwXiEAAQAAABAEAQD0XiEAAQAAABEEAQD4XiEAAQAAABIEAQD8XiEAAQAAABMEAQAAXyEAAQAAABQEAQAEXyEAAQAAABUEAQAIXyEAAQAAABYEAQAMXyEAAQAAABcEAQAQXyEAAQAAABgEAQAUXyEAAQAAABkEAQAYXyEAAQAAABoEAQAcXyEAAQAAABsEAQAgXyEAAQAAABwEAQAkXyEAAQAAAB0EAQAoXyEAAQAAAB4EAQAsXyEAAQAAAB8EAQAwXyEAAQAAACAEAQA0XyEAAQAAACEEAQA4XyEAAQAAACIEAQA8XyEAAQAAACMEAQBAXyEAAQAAACQEAQBEXyEAAQAAACUEAQBIXyEAAQAAACYEAQBMXyEAAQAAACcEAQBQXyEAAQAAACgEAQBUXyEAAQAAACkEAQBYXyEAAQAAACoEAQBcXyEAAQAAACsEAQBgXyEAAQAAACwEAQBkXyEAAQAAAC0EAQBoXyEAAQAAAC4EAQBsXyEAAQAAAC8EAQBwXyEAAQAAADAEAQB0XyEAAQAAADEEAQB4XyEAAQAAADIEAQB8XyEAAQAAADMEAQCAXyEAAQAAADQEAQCEXyEAAQAAADUEAQCIXyEAAQAAADYEAQCMXyEAAQAAADcEAQCQXyEAAQAAADgEAQCUXyEAAQAAADkEAQCYXyEAAQAAADoEAQCcXyEAAQAAADsEAQCgXyEAAQAAADwEAQCkXyEAAQAAAD0EAQCoXyEAAQAAAD4EAQCsXyEAAQAAAD8EAQCwXyEAAQAAAEAEAQC0XyEAAQAAAEEEAQC4XyEAAQAAAEIEAQC8XyEAAQAAAEMEAQDAXyEAAQAAAEQEAQDEXyEAAQAAAEUEAQDIXyEAAQAAAEYEAQDMXyEAAQAAAEcEAQDQXyEAAQAAAEgEAQDUXyEAAQAAAEkEAQDYXyEAAQAAAEoEAQDcXyEAAQAAAEsEAQDgXyEAAQAAAEwEAQDkXyEAAQAAAE0EAQDoXyEAAQAAAE4EAQDsXyEAAQAAAE8EAQDwXyEAAQAAALAEAQD0XyEAAQAAALEEAQD4XyEAAQAAALIEAQD8XyEAAQAAALMEAQAAYCEAAQAAALQEAQAEYCEAAQAAALUEAQAIYCEAAQAAALYEAQAMYCEAAQAAALcEAQAQYCEAAQAAALgEAQAUYCEAAQAAALkEAQAYYCEAAQAAALoEAQAcYCEAAQAAALsEAQAgYCEAAQAAALwEAQAkYCEAAQAAAL0EAQAoYCEAAQAAAL4EAQAsYCEAAQAAAL8EAQAwYCEAAQAAAMAEAQA0YCEAAQAAAMEEAQA4YCEAAQAAAMIEAQA8YCEAAQAAAMMEAQBAYCEAAQAAAMQEAQBEYCEAAQAAAMUEAQBIYCEAAQAAAMYEAQBMYCEAAQAAAMcEAQBQYCEAAQAAAMgEAQBUYCEAAQAAAMkEAQBYYCEAAQAAAMoEAQBcYCEAAQAAAMsEAQBgYCEAAQAAAMwEAQBkYCEAAQAAAM0EAQBoYCEAAQAAAM4EAQBsYCEAAQAAAM8EAQBwYCEAAQAAANAEAQB0YCEAAQAAANEEAQB4YCEAAQAAANIEAQB8YCEAAQAAANMEAQCAYCEAAQAAANgEAQCEYCEAAQAAANkEAQCIYCEAAQAAANoEAQCMYCEAAQAAANsEAQCQYCEAAQAAANwEAQCUYCEAAQAAAN0EAQCYYCEAAQAAAN4EAQCcYCEAAQAAAN8EAQCgYCEAAQAAAOAEAQCkYCEAAQAAAOEEAQCoYCEAAQAAAOIEAQCsYCEAAQAAAOMEAQCwYCEAAQAAAOQEAQC0YCEAAQAAAOUEAQC4YCEAAQAAAOYEAQC8YCEAAQAAAOcEAQDAYCEAAQAAAOgEAQDEYCEAAQAAAOkEAQDIYCEAAQAAAOoEAQDMYCEAAQAAAOsEAQDQYCEAAQAAAOwEAQDUYCEAAQAAAO0EAQDYYCEAAQAAAO4EAQDcYCEAAQAAAO8EAQDgYCEAAQAAAPAEAQDkYCEAAQAAAPEEAQDoYCEAAQAAAPIEAQDsYCEAAQAAAPMEAQDwYCEAAQAAAPQEAQD0YCEAAQAAAPUEAQD4YCEAAQAAAPYEAQD8YCEAAQAAAPcEAQAAYSEAAQAAAPgEAQAEYSEAAQAAAPkEAQAIYSEAAQAAAPoEAQAMYSEAAQAAAPsEAQAQYSEAAQAAAHAFAQAUYSEAAQAAAHEFAQAYYSEAAQAAAHIFAQAcYSEAAQAAAHMFAQAgYSEAAQAAAHQFAQAkYSEAAQAAAHUFAQAoYSEAAQAAAHYFAQAsYSEAAQAAAHcFAQAwYSEAAQAAAHgFAQA0YSEAAQAAAHkFAQA4YSEAAQAAAHoFAQA8YSEAAQAAAHwFAQBAYSEAAQAAAH0FAQBEYSEAAQAAAH4FAQBIYSEAAQAAAH8FAQBMYSEAAQAAAIAFAQBQYSEAAQAAAIEFAQBUYSEAAQAAAIIFAQBYYSEAAQAAAIMFAQBcYSEAAQAAAIQFAQBgYSEAAQAAAIUFAQBkYSEAAQAAAIYFAQBoYSEAAQAAAIcFAQBsYSEAAQAAAIgFAQBwYSEAAQAAAIkFAQB0YSEAAQAAAIoFAQB4YSEAAQAAAIwFAQB8YSEAAQAAAI0FAQCAYSEAAQAAAI4FAQCEYSEAAQAAAI8FAQCIYSEAAQAAAJAFAQCMYSEAAQAAAJEFAQCQYSEAAQAAAJIFAQCUYSEAAQAAAJQFAQCYYSEAAQAAAJUFAQCcYSEAAQAAAJcFAQCgYSEAAQAAAJgFAQCkYSEAAQAAAJkFAQCoYSEAAQAAAJoFAQCsYSEAAQAAAJsFAQCwYSEAAQAAAJwFAQC0YSEAAQAAAJ0FAQC4YSEAAQAAAJ4FAQC8YSEAAQAAAJ8FAQDAYSEAAQAAAKAFAQDEYSEAAQAAAKEFAQDIYSEAAQAAAKMFAQDMYSEAAQAAAKQFAQDQYSEAAQAAAKUFAQDUYSEAAQAAAKYFAQDYYSEAAQAAAKcFAQDcYSEAAQAAAKgFAQDgYSEAAQAAAKkFAQDkYSEAAQAAAKoFAQDoYSEAAQAAAKsFAQDsYSEAAQAAAKwFAQDwYSEAAQAAAK0FAQD0YSEAAQAAAK4FAQD4YSEAAQAAAK8FAQD8YSEAAQAAALAFAQAAYiEAAQAAALEFAQAEYiEAAQAAALMFAQAIYiEAAQAAALQFAQAMYiEAAQAAALUFAQAQYiEAAQAAALYFAQAUYiEAAQAAALcFAQAYYiEAAQAAALgFAQAcYiEAAQAAALkFAQAgYiEAAQAAALsFAQAkYiEAAQAAALwFAQAoYiEAAQAAAIAMAQAsYiEAAQAAAIEMAQAwYiEAAQAAAIIMAQA0YiEAAQAAAIMMAQA4YiEAAQAAAIQMAQA8YiEAAQAAAIUMAQBAYiEAAQAAAIYMAQBEYiEAAQAAAIcMAQBIYiEAAQAAAIgMAQBMYiEAAQAAAIkMAQBQYiEAAQAAAIoMAQBUYiEAAQAAAIsMAQBYYiEAAQAAAIwMAQBcYiEAAQAAAI0MAQBgYiEAAQAAAI4MAQBkYiEAAQAAAI8MAQBoYiEAAQAAAJAMAQBsYiEAAQAAAJEMAQBwYiEAAQAAAJIMAQB0YiEAAQAAAJMMAQB4YiEAAQAAAJQMAQB8YiEAAQAAAJUMAQCAYiEAAQAAAJYMAQCEYiEAAQAAAJcMAQCIYiEAAQAAAJgMAQCMYiEAAQAAAJkMAQCQYiEAAQAAAJoMAQCUYiEAAQAAAJsMAQCYYiEAAQAAAJwMAQCcYiEAAQAAAJ0MAQCgYiEAAQAAAJ4MAQCkYiEAAQAAAJ8MAQCoYiEAAQAAAKAMAQCsYiEAAQAAAKEMAQCwYiEAAQAAAKIMAQC0YiEAAQAAAKMMAQC4YiEAAQAAAKQMAQC8YiEAAQAAAKUMAQDAYiEAAQAAAKYMAQDEYiEAAQAAAKcMAQDIYiEAAQAAAKgMAQDMYiEAAQAAAKkMAQDQYiEAAQAAAKoMAQDUYiEAAQAAAKsMAQDYYiEAAQAAAKwMAQDcYiEAAQAAAK0MAQDgYiEAAQAAAK4MAQDkYiEAAQAAAK8MAQDoYiEAAQAAALAMAQDsYiEAAQAAALEMAQDwYiEAAQAAALIMAQD0YiEAAQAAAMAMAQD4YiEAAQAAAMEMAQD8YiEAAQAAAMIMAQAAYyEAAQAAAMMMAQAEYyEAAQAAAMQMAQAIYyEAAQAAAMUMAQAMYyEAAQAAAMYMAQAQYyEAAQAAAMcMAQAUYyEAAQAAAMgMAQAYYyEAAQAAAMkMAQAcYyEAAQAAAMoMAQAgYyEAAQAAAMsMAQAkYyEAAQAAAMwMAQAoYyEAAQAAAM0MAQAsYyEAAQAAAM4MAQAwYyEAAQAAAM8MAQA0YyEAAQAAANAMAQA4YyEAAQAAANEMAQA8YyEAAQAAANIMAQBAYyEAAQAAANMMAQBEYyEAAQAAANQMAQBIYyEAAQAAANUMAQBMYyEAAQAAANYMAQBQYyEAAQAAANcMAQBUYyEAAQAAANgMAQBYYyEAAQAAANkMAQBcYyEAAQAAANoMAQBgYyEAAQAAANsMAQBkYyEAAQAAANwMAQBoYyEAAQAAAN0MAQBsYyEAAQAAAN4MAQBwYyEAAQAAAN8MAQB0YyEAAQAAAOAMAQB4YyEAAQAAAOEMAQB8YyEAAQAAAOIMAQCAYyEAAQAAAOMMAQCEYyEAAQAAAOQMAQCIYyEAAQAAAOUMAQCMYyEAAQAAAOYMAQCQYyEAAQAAAOcMAQCUYyEAAQAAAOgMAQCYYyEAAQAAAOkMAQCcYyEAAQAAAOoMAQCgYyEAAQAAAOsMAQCkYyEAAQAAAOwMAQCoYyEAAQAAAO0MAQCsYyEAAQAAAO4MAQCwYyEAAQAAAO8MAQC0YyEAAQAAAPAMAQC4YyEAAQAAAPEMAQC8YyEAAQAAAPIMAQDAYyEAAQAAAFANAQDEYyEAAQAAAFENAQDIYyEAAQAAAFINAQDMYyEAAQAAAFMNAQDQYyEAAQAAAFQNAQDUYyEAAQAAAFUNAQDYYyEAAQAAAFYNAQDcYyEAAQAAAFcNAQDgYyEAAQAAAFgNAQDkYyEAAQAAAFkNAQDoYyEAAQAAAFoNAQDsYyEAAQAAAFsNAQDwYyEAAQAAAFwNAQD0YyEAAQAAAF0NAQD4YyEAAQAAAF4NAQD8YyEAAQAAAF8NAQAAZCEAAQAAAGANAQAEZCEAAQAAAGENAQAIZCEAAQAAAGINAQAMZCEAAQAAAGMNAQAQZCEAAQAAAGQNAQAUZCEAAQAAAGUNAQAYZCEAAQAAAHANAQAcZCEAAQAAAHENAQAgZCEAAQAAAHINAQAkZCEAAQAAAHMNAQAoZCEAAQAAAHQNAQAsZCEAAQAAAHUNAQAwZCEAAQAAAHYNAQA0ZCEAAQAAAHcNAQA4ZCEAAQAAAHgNAQA8ZCEAAQAAAHkNAQBAZCEAAQAAAHoNAQBEZCEAAQAAAHsNAQBIZCEAAQAAAHwNAQBMZCEAAQAAAH0NAQBQZCEAAQAAAH4NAQBUZCEAAQAAAH8NAQBYZCEAAQAAAIANAQBcZCEAAQAAAIENAQBgZCEAAQAAAIINAQBkZCEAAQAAAIMNAQBoZCEAAQAAAIQNAQBsZCEAAQAAAIUNAQBwZCEAAQAAAKAYAQB0ZCEAAQAAAKEYAQB4ZCEAAQAAAKIYAQB8ZCEAAQAAAKMYAQCAZCEAAQAAAKQYAQCEZCEAAQAAAKUYAQCIZCEAAQAAAKYYAQCMZCEAAQAAAKcYAQCQZCEAAQAAAKgYAQCUZCEAAQAAAKkYAQCYZCEAAQAAAKoYAQCcZCEAAQAAAKsYAQCgZCEAAQAAAKwYAQCkZCEAAQAAAK0YAQCoZCEAAQAAAK4YAQCsZCEAAQAAAK8YAQCwZCEAAQAAALAYAQC0ZCEAAQAAALEYAQC4ZCEAAQAAALIYAQC8ZCEAAQAAALMYAQDAZCEAAQAAALQYAQDEZCEAAQAAALUYAQDIZCEAAQAAALYYAQDMZCEAAQAAALcYAQDQZCEAAQAAALgYAQDUZCEAAQAAALkYAQDYZCEAAQAAALoYAQDcZCEAAQAAALsYAQDgZCEAAQAAALwYAQDkZCEAAQAAAL0YAQDoZCEAAQAAAL4YAQDsZCEAAQAAAL8YAQDwZCEAAQAAAMAYAQD0ZCEAAQAAAMEYAQD4ZCEAAQAAAMIYAQD8ZCEAAQAAAMMYAQAAZSEAAQAAAMQYAQAEZSEAAQAAAMUYAQAIZSEAAQAAAMYYAQAMZSEAAQAAAMcYAQAQZSEAAQAAAMgYAQAUZSEAAQAAAMkYAQAYZSEAAQAAAMoYAQAcZSEAAQAAAMsYAQAgZSEAAQAAAMwYAQAkZSEAAQAAAM0YAQAoZSEAAQAAAM4YAQAsZSEAAQAAAM8YAQAwZSEAAQAAANAYAQA0ZSEAAQAAANEYAQA4ZSEAAQAAANIYAQA8ZSEAAQAAANMYAQBAZSEAAQAAANQYAQBEZSEAAQAAANUYAQBIZSEAAQAAANYYAQBMZSEAAQAAANcYAQBQZSEAAQAAANgYAQBUZSEAAQAAANkYAQBYZSEAAQAAANoYAQBcZSEAAQAAANsYAQBgZSEAAQAAANwYAQBkZSEAAQAAAN0YAQBoZSEAAQAAAN4YAQBsZSEAAQAAAN8YAQBwZSEAAQAA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ACgCAABHAAAALfIhAGsAAAAvAgAAPQAAAC3yIQBrAAAALwIAAEcAAABJbnRlcnZhbFNldHJhbmdlc2ZvbGRlZGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXB0dXJpbmcgZ3JvdXBzICjX9SEAMQAAANyBJwABAAAAaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgZm91bmQgaW4gY2hhcmFjdGVyIGNsYXNzGPYhADAAAABpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZABQ9iEAOwAAAGludmFsaWQgcmFuZ2UgYm91bmRhcnksIG11c3QgYmUgYSBsaXRlcmFsAAAAlPYhACkAAAB1bmNsb3NlZCBjaGFyYWN0ZXIgY2xhc3PI9iEAGAAAAGRlY2ltYWwgbGl0ZXJhbCBlbXB0eQAAAOj2IQAVAAAAZGVjaW1hbCBsaXRlcmFsIGludmFsaWQACPchABcAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGVtcHR5AAAAKPchABkAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGlzIG5vdCBhIFVuaWNvZGUgc2NhbGFyIHZhbHVlAAAATPchADEAAABpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0AAAAiPchABkAAABpbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZSwgcmVhY2hlZCBlbmQgb2YgcGF0dGVybiBwcmVtYXR1cmVseQAArPchAD4AAAB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNl9PchABwAAABkYW5nbGluZyBmbGFnIG5lZ2F0aW9uIG9wZXJhdG9yABj4IQAfAAAAZHVwbGljYXRlIGZsYWcAAED4IQAOAAAAZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZABY+CEAHwAAAGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXgAAID4IQAiAAAAdW5yZWNvZ25pemVkIGZsYWcAAACs+CEAEQAAAGR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWXI+CEAHAAAAGVtcHR5IGNhcHR1cmUgZ3JvdXAgbmFtZez4IQAYAAAAaW52YWxpZCBjYXB0dXJlIGdyb3VwIGNoYXJhY3RlcgAM+SEAHwAAAHVuY2xvc2VkIGNhcHR1cmUgZ3JvdXAgbmFtZQA0+SEAGwAAAHVuY2xvc2VkIGdyb3VwAABY+SEADgAAAHVub3BlbmVkIGdyb3VwAABw+SEADgAAAGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHBhcmVudGhlc2VzL2JyYWNrZXRzICgAAIj5IQA6AAAA3IEnAAEAAABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmTU+SEAPAAAAHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbAAAABj6IQAtAAAAdW5jbG9zZWQgY291bnRlZCByZXBldGl0aW9uAFD6IQAbAAAAcmVwZXRpdGlvbiBvcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb24AAHT6IQAmAAAAc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIApPohAFMAAAB1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGYAAPshAGMAAABmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2UAAABs+yEAgQAAAGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgY2xhc3MA+PshAB8AAABiYWNrcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCD8IQAgAAAAbG9vay1hcm91bmQsIGluY2x1ZGluZyBsb29rLWFoZWFkIGFuZCBsb29rLWJlaGluZCwgaXMgbm90IHN1cHBvcnRlZABI/CEAQwAAAC9ob21lL25vZGUv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cGhlbWVfQ2x1c3Rlcl9CcmVha1NlbnRlbmNlX0JyZWFrV29yZF9CcmVhawAAMAAAADkAAABBAAAAWgAAAF8AAABfAAAAYQAAAHoAAACqAAAAqgAAALUAAAC1AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB6AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAgwQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAAVFwAAHxcAADQXAABAFwAAUxcAAGAXAABsFwAAbhcAAHAXAAByFwAAcxcAAIAXAADTFwAA1xcAANcXAADcFwAA3RcAAOAXAADpFwAACxgAAA0YAAAPGAAAGRgAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOxkAAEYZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAA0BkAANkZAAAAGgAAGxoAACAaAABeGgAAYBoAAHwaAAB/GgAAiRoAAJAaAACZGgAApxoAAKcaAACwGgAAzhoAAAAbAABMGwAAUBsAAFkbAABrGwAAcxsAAIAbAADzGwAAABwAADccAABAHAAASRwAAE0cAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA0BwAANIcAADUHAAA+hwAAAAdAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAADCAAAA0gAAA/IAAAQCAAAFQgAABUIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAvIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAtiQAAOkkAAAALAAA5CwAAOssAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAH8tAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0A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aV9Db250cm9sYmlkaWNsYXNzYmlkaWNvbnRyb2xiaWRpbUJpZGlfTWlycm9yZWRiaWRpbWlycm9yZWRiaWRpbWlycm9yaW5nZ2x5cGhCaWRpX01pcnJvcmluZ19HbHlwaGJpZGlwYWlyZWRicmFja2V0QmlkaV9QYWlyZWRfQnJhY2tldGJpZGlwYWlyZWRicmFja2V0dHlwZUJpZGlfUGFpcmVkX0JyYWNrZXRfVHlwZWJsa2JtZ2JwYmJwdGNhbm9uaWNhbGNvbWJpbmluZ2NsYXNzQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc2Nhc2VkQ2FzZWRjYXNlZm9sZGluZ0Nhc2VfRm9sZGluZ2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2hhbmdlc3doZW5jYXNlZm9sZGVkQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbmNhc2VtYXBwZWRDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZGNoYW5nZXN3aGVubG93ZXJjYXNlZENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkY2hhbmdlc3doZW5uZmtjY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbnRpdGxlY2FzZWRDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZGNoYW5nZXN3aGVudXBwZXJjYXNlZENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkY2ljamthY2NvdW50aW5nbnVtZXJpY2tBY2NvdW50aW5nTnVtZXJpY2Nqa2NvbXBhdGliaWxpdHl2YXJpYW50a0NvbXBhdGliaWxpdHlWYXJpYW50Y2praWljb3Jla0lJQ29yZWNqa2lyZ2dzb3VyY2VrSVJHX0dTb3VyY2Vjamtpcmdoc291cmNla0lSR19IU291cmNlY2praXJnanNvdXJjZWtJUkdfSlNvdXJjZWNqa2lyZ2twc291cmNla0lSR19LUFNvdXJjZWNqa2lyZ2tzb3VyY2VrSVJHX0tTb3VyY2Vjamtpcmdtc291cmNla0lSR19NU291cmNlY2praXJnc3NvdXJjZWtJUkdfU1NvdXJjZWNqa2lyZ3Rzb3VyY2VrSVJHX1RTb3VyY2Vjamtpcmd1a3NvdXJjZWtJUkdfVUtTb3VyY2Vjamtpcmd1c291cmNla0lSR19VU291cmNlY2praXJndnNvdXJjZWtJUkdfVlNvdXJjZWNqa290aGVybnVtZXJpY2tPdGhlck51bWVyaWNjamtwcmltYXJ5bnVtZXJpY2tQcmltYXJ5TnVtZXJpY2Nqa3JzdW5pY29kZWtSU1VuaWNvZGVjb21wZXhGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbmNvbXBvc2l0aW9uZXhjbHVzaW9uY3djZmN3Y21jd2tjZmN3bGN3dGN3dWRhc2hEYXNoZGVjb21wb3NpdGlvbm1hcHBpbmdEZWNvbXBvc2l0aW9uX01hcHBpbmdkZWNvbXBvc2l0aW9udHlwZURlY29tcG9zaXRpb25fVHlwZWRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnREZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50ZGVwRGVwcmVjYXRlZGRlcHJlY2F0ZWRkaWRpYURpYWNyaXRpY2RpYWNyaXRpY2RtZHRlYUVhc3RfQXNpYW5fV2lkdGhlYXN0YXNpYW53aWR0aGViYXNlRW1vamlfTW9kaWZpZXJfQmFzZWVjb21wRW1vamlfQ29tcG9uZW50ZW1vZEVtb2ppX01vZGlmaWVyZW1vamlFbW9qaWVtb2ppY29tcG9uZW50ZW1vamltb2RpZmllcmVtb2ppbW9kaWZpZXJiYXNlZW1vamlwcmVzZW50YXRpb25FbW9qaV9QcmVzZW50YXRpb25lcHJlc2VxdWlkZW9FcXVpdmFsZW50X1VuaWZpZWRfSWRlb2dyYXBoZXF1aXZhbGVudHVuaWZpZWRpZGVvZ3JhcGhleHBhbmRzb25uZmNFeHBhbmRzX09uX05GQ2V4cGFuZHNvbm5mZEV4cGFuZHNfT25fTkZEZXhwYW5kc29ubmZrY0V4cGFuZHNfT25fTkZLQ2V4cGFuZHNvbm5ma2RFeHBhbmRzX09uX05GS0RleHRFeHRlbmRlcmV4dGVuZGVkcGljdG9ncmFwaGljRXh0ZW5kZWRfUGljdG9ncmFwaGljZXh0ZW5kZXJleHRwaWN0ZmNuZmtjRkNfTkZLQ19DbG9zdXJlZmNuZmtjY2xvc3VyZWZ1bGxjb21wb3NpdGlvbmV4Y2x1c2lvbmdjZ2NiZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbXBhdG1hdGhjb250aW51ZUlEX0NvbXBhdF9NYXRoX0NvbnRpbnVlaWRjb21wYXRtYXRoc3RhcnRJRF9Db21wYXRfTWF0aF9TdGFydGlkY29udGludWVpZGVvSWRlb2dyYXBoaWNpZGVvZ3JhcGhpY2lkc0lEX1N0YXJ0aWRzYklEU19CaW5hcnlfT3BlcmF0b3JpZHNiaW5hcnlvcGVyYXRvcmlkc3RJRFNfVHJpbmFyeV9PcGVyYXRvcmlkc3RhcnRpZHN0cmluYXJ5b3BlcmF0b3JpZHN1SURTX1VuYXJ5X09wZXJhdG9yaWRzdW5hcnlvcGVyYXRvcmluY2JJbmRpY19Db25qdW5jdF9CcmVha2luZGljY29uanVuY3RicmVha2luZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtlaGNhdGtFSF9DYXRrZWhkZXNja0VIX0Rlc2NrZWhoZ2tFSF9IR2tlaGlmYW9rRUhfSUZBT2tlaGpzZXNoa0VIX0pTZXNoa2Vobm9taXJyb3JrRUhfTm9NaXJyb3JrZWhub3JvdGF0ZWtFSF9Ob1JvdGF0ZWtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha0xvd2VyY2FzZV9NYXBwaW5nbGluZWJyZWFrbG9lTG9naWNhbF9PcmRlcl9FeGNlcHRpb25sb2dpY2Fsb3JkZXJleGNlcHRpb25sb3dlckxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG1jbU1vZGlmaWVyX0NvbWJpbmluZ19NYXJrbW9kaWZpZXJjb21iaW5pbmdtYXJrbmFOYW1lbmExVW5pY29kZV8xX05hbWVuYW1lYWxpYXNOYW1lX0FsaWFzbmNoYXJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludG5mY3FjTkZDX1F1aWNrX0NoZWNrbmZjcXVpY2tjaGVja25mZHFjTkZEX1F1aWNrX0NoZWNrbmZkcXVpY2tjaGVja25ma2NjYXNlZm9sZE5GS0NfQ2FzZWZvbGRuZmtjY2ZuZmtjcWNORktDX1F1aWNrX0NoZWNrbmZrY3F1aWNrY2hlY2tuZmtjc2NmTkZLQ19TaW1wbGVfQ2FzZWZvbGRuZmtjc2ltcGxlY2FzZWZvbGRuZmtkcWNORktEX1F1aWNrX0NoZWNrbmZrZHF1aWNrY2hlY2tub25jaGFyYWN0ZXJjb2RlcG9pbnRudE51bWVyaWNfVHlwZW51bWVyaWN0eXBlbnVtZXJpY3ZhbHVlTnVtZXJpY19WYWx1ZW52b2FscGhhT3RoZXJfQWxwaGFiZXRpY29jb21tZW50b2RpT3RoZXJfRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludG9ncmV4dE90aGVyX0dyYXBoZW1lX0V4dGVuZG9pZGNPdGhlcl9JRF9Db250aW51ZW9pZHNPdGhlcl9JRF9TdGFydG9sb3dlck90aGVyX0xvd2VyY2FzZW9tYXRoT3RoZXJfTWF0aG90aGVyYWxwaGFiZXRpY290aGVyZGVmYXVsdGlnbm9yYWJsZWNvZGVwb2ludG90aGVyZ3JhcGhlbWVleHRlbmRvdGhlcmlkY29udGludWVvdGhlcmlkc3RhcnRvdGhlcmxvd2VyY2FzZW90aGVybWF0aG90aGVydXBwZXJjYXNlT3RoZXJfVXBwZXJjYXNlb3VwcGVycGF0c3luUGF0dGVybl9TeW50YXhwYXR0ZXJuc3ludGF4cGF0dGVybndoaXRlc3BhY2VQYXR0ZXJuX1doaXRlX1NwYWNlcGF0d3NwY21QcmVwZW5kZWRfQ29uY2F0ZW5hdGlvbl9NYXJrcHJlcGVuZGVkY29uY2F0ZW5hdGlvbm1hcmtxbWFya1F1b3RhdGlvbl9NYXJrcXVvdGF0aW9ubWFya3JhZGljYWxSYWRpY2FscmVnaW9uYWxpbmRpY2F0b3JSZWdpb25hbF9JbmRpY2F0b3JyaXNic2NmU2ltcGxlX0Nhc2VfRm9sZGluZ3NjcmlwdGV4dGVuc2lvbnNzY3hzZFNvZnRfRG90dGVkc2VudGVuY2VicmVha3NlbnRlbmNldGVybWluYWxTZW50ZW5jZV9UZXJtaW5hbHNmY3NpbXBsZWNhc2Vmb2xkaW5nc2ltcGxlbG93ZXJjYXNlbWFwcGluZ1NpbXBsZV9Mb3dlcmNhc2VfTWFwcGluZ3NpbXBsZXRpdGxlY2FzZW1hcHBpbmdTaW1wbGVfVGl0bGVjYXNlX01hcHBpbmdzaW1wbGV1cHBlcmNhc2VtYXBwaW5nU2ltcGxlX1VwcGVyY2FzZV9NYXBwaW5nc2xjc29mdGRvdHRlZHNwYWNlV2hpdGVfU3BhY2VzdGNzdGVybXN1Y3RjVGl0bGVjYXNlX01hcHBpbmd0ZXJtVGVybWluYWxfUHVuY3R1YXRpb250ZXJtaW5hbHB1bmN0dWF0aW9udGl0bGVjYXNlbWFwcGluZ3VjVXBwZXJjYXNlX01hcHBpbmd1aWRlb1VuaWZpZWRfSWRlb2dyYXBodW5pY29kZTFuYW1ldW5pY29kZXJhZGljYWxzdHJva2V1bmlmaWVkaWRlb2dyYXBodXBwZXJVcHBlcmNhc2V1cHBlcmNhc2V1cHBlcmNhc2VtYXBwaW5ndXJzdmFyaWF0aW9uc2VsZWN0b3JWYXJpYXRpb25fU2VsZWN0b3J2ZXJ0aWNhbG9yaWVudGF0aW9u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AAIAAAD+KiIACgAAAI4DIgACAAAACCsiABEAAAAZKyIACQAAAP4qIgAKAAAAIisiAAMAAAAlKyIAFwAAADwrIgAVAAAAJSsiABcAAABRKyIABQAAAFYrIgAJAAAAXysiAAkAAABWKyIACQAAAGgrIgAQAAAACCsiABEAAAB4KyIABAAAAHwrIgAEAAAAgCsiAAMAAACDKyIAFwAAAJorIgAVAAAAgysiABcAAACvKyIAAgAAALErIgAEAAAAtSsiAAMAAAC4KyIADgAAABXOJgAEAAAAsSsiAAQAAADGKyIACQAAAM8rIgAKAAAA2SsiAAUAAADeKyIAFwAAAPUrIgAFAAAA+isiAA8AAAAJLCIADQAAAPorIgAPAAAAFiwiAAUAAAAbLCIADwAAACosIgANAAAAGywiAA8AAAA3LCIADAAAAEMsIgANAAAAUCwiAAYAAABDLCIADQAAAFYsIgAGAAAAXCwiABAAAABsLCIADgAAAFwsIgAQAAAAeiwiAAcAAACBLCIAFAAAAJUsIgASAAAAgSwiABQAAACnLCIABgAAAK0sIgAQAAAAvSwiAA4AAACtLCIAEAAAAMssIgAVAAAA3isiABcAAADgLCIAAgAAAOIsIgAMAAAA7iwiAAsAAADiLCIADAAAAPksIgAMAAAABS0iAA0AAAASLSIAAgAAAAUtIgANAAAAFC0iAAYAAAAaLSIAEAAAACotIgAIAAAAPikiAAsAAAAyLSIAAwAAADUtIgAiAAAAVy0iAAYAAABdLSIAFQAAAHItIgAEAAAAdi0iABEAAACHLSIABAAAAIstIgAOAAAAmS0iAAYAAACfLSIADwAAAK4tIgAFAAAAsy0iAAoAAAC9LSIADwAAABotIgAQAAAAzC0iAB4AAAA1LSIAIgAAAOotIgATAAAAXS0iABUAAAD9LSIADwAAAHYtIgARAAAADC4iAAwAAACLLSIADgAAABguIgAOAAAAny0iAA8AAAAmLiIACQAAALMtIgAKAAAALy4iAA4AAAA9LiIADwAAAEwuIgAGAAAAPS4iAA8AAABSLiIABgAAAFguIgAOAAAAZi4iAA0AAABYLiIADgAAAHMuIgARAAAAhC4iABMAAACXLiIABQAAAIQuIgATAAAAnC4iAAMAAACfLiIAHAAAALsuIgAaAAAAny4iABwAAADVLiIABQAA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ANpDIgAEAAAAJ0MiAAUAAADeQyIAAwAAAC9DIgAEAAAA4UMiAAMAAAA2QyIABAAAAORDIgADAAAAPUMiAAQAAADnQyIAAwAAAERDIgAEAAAA6kMiAAMAAABLQyIABAAAAO1DIgADAAAAUkMiAAQAAADwQyIAAwAAAFlDIgAEAAAA80MiAAMAAABgQyIABAAAAPZDIgADAAAAZ0MiAAQAAAD5QyIAAwAAAG5DIgAEAAAA/EMiAAMAAAB1QyIABAAAAP9DIgADAAAAfEMiAAQAAAACRCIAAwAAAINDIgAEAAAABUQiAAMAAACKQyIABAAAAAhEIgADAAAAkUMiAAQAAAALRCIAAwAAAJhDIgAEAAAADkQiAAMAAACfQyIABAAAAGNhc2VkbGV0dGVyQ2FzZWRfTGV0dGVyY2NDb250cm9sRm9ybWF0Y2xvc2VwdW5jdHVhdGlvbkNsb3NlX1B1bmN0dWF0aW9uY25jbnRybGNvUHJpdmF0ZV9Vc2Vjb21iaW5pbmdtYXJrY29ubmVjdG9ycHVuY3R1YXRpb25Db25uZWN0b3JfUHVuY3R1YXRpb25jb250cm9sY3NTdXJyb2dhdGVjdXJyZW5jeXN5bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJkaWdpdGVuY2xvc2luZ21hcmtFbmNsb3NpbmdfTWFya2ZpbmFscHVuY3R1YXRpb25GaW5hbF9QdW5jdHVhdGlvbmZvcm1hdGluaXRpYWxwdW5jdHVhdGlvbkluaXRpYWxfUHVuY3R1YXRpb25sTGV0dGVybGV0dGVybGV0dGVybnVtYmVyTGV0dGVyX051bWJlcmxpbmVzZXBhcmF0b3JMaW5lX1NlcGFyYXRvcmxsTG93ZXJjYXNlX0xldHRlcmxtTW9kaWZpZXJfTGV0dGVybG9PdGhlcl9MZXR0ZXJsb3dlcmNhc2VsZXR0ZXJUaXRsZWNhc2VfTGV0dGVybHVVcHBlcmNhc2VfTGV0dGVybW1hcmttYXRoc3ltYm9sTWF0aF9TeW1ib2xtY1NwYWNpbmdfTWFya21lbW5Ob25zcGFjaW5nX01hcmttb2RpZmllcmxldHRlcm1vZGlmaWVyc3ltYm9sTW9k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ACVIIgAHAAAArUciAAcAAABcUCIAAgAAAF5QIgACAAAAYFAiAAIAAABiUCIABgAAAA4lIgAFAAAAYlAiAAYAAABoUCIACAAAAHBQIgAKAAAAelAiAAMAAABwUCIACgAAAH1QIgACAAAAf1AiAAoAAACJUCIACQAAAH9QIgAKAAAAklAiAAIAAACUUCIABgAAAJpQIgAGAAAAlFAiAAYAAACgUCIAAwAAAKNQIgAOAAAAsVAiAAwAAACjUCIADgAAAPpIIgABAAAAvVAiAAEAAAC+UCIAAgAAAMBQIgACAAAAwlAiAAIAAADEUCIAAgAAAMZQIgADAAAAyVAiAAMAAABCSiIABQAAAGYuJgAFAAAAzFAiAAIAAADOUCIABwAAANVQIgAHAAAAzlAiAAcAAAADLyIAEQAAABQvIgASAAAAJi8iAAIAAAAULyIAEgAAAAFLIgACAAAA3FAiAAsAAAAiSyIACwAAANxQIgALAAAA51AiAAEAAADoUCIAAQAAAOlQIgABAAAA6lAiAAEAAADrUCIAAgAAAGYuJgAFAAAAmEomAAMAAADtUCIAAwAAAGFkbGFtQWRsYW1hZGxtYWdoYkNhdWNhc2lhbl9BbGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2FyYUdhcmF5Z2FyYXlnZW9yR2VvcmdpYW5nZW9yZ2lhbmdsYWdHbGFnb2xpdGljZ2xhZ29saXRpY2dvbmdHdW5qYWxhX0dvbmRpZ29ubU1hc2FyYW1fR29uZGlnb3RoR290aGljZ290aGljZ3JhbkdyYW50aGFncmFudGhhZ3JlZWtHcmVla2dyZWtndWphcmF0aUd1amFyYXRpZ3Vqcmd1a2hHdXJ1bmdfS2hlbWFndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWd1cnVuZ2toZW1haGFuSGFuaGFuZ0hhbmd1bGhhbmd1bGhhbmloYW5pZmlyb2hpbmd5YUhhbmlmaV9Sb2hpbmd5YWhhbm9IYW51bm9vaGFudW5vb2hhdHJIYXRyYW5oYXRyYW5oZWJySGVicmV3aGVicmV3aGlyYUhpcmFnYW5haGlyYWdhbmFobHV3aG1uZ1BhaGF3aF9IbW9uZ2htbnBOeWlha2VuZ19QdWFjaHVlX0htb25naHJrdEthdGFrYW5hX09yX0hpcmFnYW5haHVuZ09sZF9IdW5nYXJpYW5pbXBlcmlhbGFyYW1haWNpbmhlcml0ZWRJbmhlcml0ZWRpbnNjcmlwdGlvbmFscGFobGF2aUluc2NyaXB0aW9uYWxfUGFobGF2aWluc2NyaXB0aW9uYWxwYXJ0aGlhbkluc2NyaXB0aW9uYWxfUGFydGhpYW5pdGFsT2xkX0l0YWxpY2phdmFKYXZhbmVzZWphdmFuZXNla2FpdGhpS2FpdGhpa2FsaUtheWFoX0xpa2FuYUthdGFrYW5ha2FubmFkYUthbm5hZGFrYXRha2FuYWthdGFrYW5hb3JoaXJhZ2FuYWthd2lLYXdpa2F5YWhsaWtoYXJLaGFyb3NodGhpa2hhcm9zaHRoaWtoaXRhbnNtYWxsc2NyaXB0S2hpdGFuX1NtYWxsX1NjcmlwdGtobWVyS2htZXJraG1ya2hvaktob2praWtob2praWtodWRhd2FkaUtodWRhd2FkaWtpcmF0cmFpS2lyYXRfUmFpa2l0c2tuZGFrcmFpa3RoaWxhbmFUYWlfVGhhbWxhb0xhb2xhb29sYXRpbkxhdGlubGF0bmxlcGNMZXBjaGFsZXBjaGFsaW1iTGltYnVsaW1idWxpbmFMaW5lYXJfQWxpbmJMaW5lYXJfQmxpbmVhcmFsaW5lYXJibGlzdUxpc3VseWNpTHljaWFubHljaWFubHlkaUx5ZGlhbmx5ZGlhbm1haGFqYW5pTWFoYWphbmltYWhqbWFrYU1ha2FzYXJtYWthc2FybWFsYXlhbGFtTWFsYXlhbGFtbWFuZE1hbmRhaWNtYW5kYWljbWFuaU1hbmljaGFlYW5tYW5pY2hhZWFubWFyY01hcmNoZW5tYXJjaGVubWFzYXJhbWdvbmRpbWVkZWZhaWRyaW5NZWRlZmFpZHJpbm1lZGZtZWV0ZWltYXlla01lZXRlaV9NYXlla21lbmRNZW5kZV9LaWtha3VpbWVuZGVraWtha3VpbWVyY01lcm9pdGljX0N1cnNpdmVtZXJvTWVyb2l0aWNfSGllcm9nbHlwaHNtZXJvaXRpY2N1cnNpdmVtZXJvaXRpY2hpZXJvZ2x5cGhzbWlhb01pYW9tbHltbW9kaU1vZGltb25nTW9uZ29saWFubW9uZ29saWFubXJvTXJvbXJvb210ZWltdWx0TXVsdGFuaW11bHRhbmlteWFubWFyTXlhbm1hcm15bXJuYWJhdGFlYW5OYWJhdGFlYW5uYWdtTmFnX011bmRhcmluYWdtdW5kYXJpbmFuZE5hbmRpbmFnYXJpbmFuZGluYWdhcmluYXJiT2xkX05vcnRoX0FyYWJpYW5uYmF0bmV3YU5ld2FuZXd0YWlsdWVOZXdfVGFpX0x1ZW5rb05rb25rb29uc2h1TnVzaHVudXNodW55aWFrZW5ncHVhY2h1ZWhtb25nb2dhbU9naGFtb2doYW1vbGNoaWtpT2xfQ2hpa2lvbGNrb2xkaHVuZ2FyaWFub2xkaXRhbGljb2xkbm9ydGhhcmFiaWFub2xkcGVybWljT2xkX1Blcm1pY29sZHBlcnNpYW5PbGRfUGVyc2lhbm9sZHNvZ2RpYW5PbGRfU29nZGlhbm9sZHNvdXRoYXJhYmlhbk9sZF9Tb3V0aF9BcmFiaWFub2xkdHVya2ljT2xkX1R1cmtpY29sZHV5Z2h1ck9sZF9VeWdodXJvbG9uYWxPbF9PbmFsb25hb29yaXlhT3JpeWFvcmtob3J5YW9zYWdlT3NhZ2Vvc2dlb3NtYU9zbWFueWFvc21hbnlhb3VncnBhaGF3aGhtb25ncGFsbVBhbG15cmVuZXBhbG15cmVuZXBhdWNQYXVfQ2luX0hhdXBhdWNpbmhhdXBlcm1waGFnUGhhZ3NfUGFwaGFnc3BhcGhsaXBobHBQc2FsdGVyX1BhaGxhdmlwaG54UGhvZW5pY2lhbnBob2VuaWNpYW5wbHJkcHJ0aXBzYWx0ZXJwYWhsYXZpcWFhY3FhYWlyZWphbmdSZWphbmdyam5ncm9oZ3J1bmljUnVuaWNydW5yc2FtYXJpdGFuU2FtYXJpdGFuc2FtcnNhcmJzYXVyU2F1cmFzaHRyYXNhdXJhc2h0cmFzZ253U2lnbldyaXRpbmdzaGFyYWRhU2hhcmFkYXNoYXZpYW5TaGF2aWFuc2hhd3NocmRzaWRkU2lkZGhhbXNpZGRoYW1zaWdud3JpdGluZ3NpbmRzaW5oU2luaGFsYXNpbmhhbGFzb2dkU29nZGlhbnNvZ2RpYW5zb2dvc29yYVNvcmFfU29tcGVuZ3NvcmFzb21wZW5nc295b1NveW9tYm9zb3lvbWJvc3VuZFN1bmRhbmVzZXN1bmRhbmVzZXN1bnVTdW51d2Fyc3VudXdhcnN5bG9TeWxvdGlfTmFncmlzeWxvdGluYWdyaXN5cmNTeXJpYWNzeXJpYWN0YWdhbG9nVGFnYWxvZ3RhZ2JUYWdiYW53YXRhZ2JhbndhdGFpbGVUYWlfTGV0YWl0aGFtdGFpdmlldFRhaV9WaWV0dGFrclRha3JpdGFrcml0YWxldGFsdXRhbWls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AG1WIgAIAAAAeVYiAAQAAAB9ViIADAAAAIlWIgAMAAAAF1YiAA0AAACVViIACAAAAJ1WIgAIAAAApVYiAAQAAACdViIACAAAAKlWIgALAAAAfVYiAAwAAAC0ViIAAwAAALdWIgADAAAAulYiAAQAAAC+ViIABgAAAMRWIgAGAAAAvlYiAAYAAADKViIABAAAALdWIgADAAAAzlYiAA4AAADcViIADwAAAOtWIgAEAAAA71YiAAcAAAD2ViIABwAAAO9WIgAHAAAA/VYiAAQAAAABVyIABgAAAAdXIgAGAAAAAVciAAYAAAANVyIABAAAABFXIgAGAAAAF1ciAAYAAAARVyIABgAAAB1XIgAEAAAAIVciAAgAAAApVyIACAAAACFXIgAIAAAAMVciAAQAAADwUiIAFQAAADVXIgAEAAAAOVciAAwAAABFVyIABAAAAElXIgAWAAAAX1ciAAQAAABjVyIAFAAAAHdXIgAEAAAAe1ciAA0AAACIVyIADwAAAClTIgAQAAAAl1ciAAkAAACgVyIACQAAAKlXIgAUAAAAvVciABUAAADSVyIAFQAAAOdXIgAWAAAA/VciAAQAAAABWCIACgAAAAtYIgAEAAAAD1giAAgAAAAXWCIACAAAAA9YIgAIAAAAH1giAAYAAAAlWCIABgAAACtYIgAEAAAAL1giAAgAAAA3WCIABAAAADtYIgAIAAAAQ1giAAcAAABKWCIABwAAAFFYIgAIAAAAO1giAAgAAABZWCIAEgAAAGNXIgAUAAAAa1giAAQAAABvWCIABAAAAHNYIgAHAAAAL1giAAgAAAB6WCIABAAAAH5YIgAKAAAAiFgiAAoAAAB+WCIACgAAAJJYIgARAAAAo1giABMAAAC2WCIABQAAALtYIgAFAAAAwFgiAAQAAAC7WCIABQAAAMRYIgAEAAAAyFgiAAYAAADOWCIABgAAAMhYIgAGAAAA1FgiAAkAAADdWCIACQAAAOZYIgAIAAAA7lgiAAkAAAD3WCIABAAAAKNYIgATAAAA+1giAAQAAABKWCIABwAAAP9YIgAEAAAA7lgiAAkAAAADWSIABAAAACVYIgAGAAAAB1kiAAQAAAALWSIACAAAABNZIgADAAAAFlkiAAMAAAAZWSIABAAAABZZIgADAAAAHVkiAAUAAAAiWSIABQAAACdZIgAEAAAAIlkiAAUAAAArWSIABAAAAC9ZIgAGAAAANVkiAAYAAAAvWSIABgAAADtZIgAEAAAAP1kiAAUAAABEWSIABQAAAD9ZIgAFAAAASVkiAAQAAABNWSIACAAAAFVZIgAEAAAAWVkiAAgAAABhWSIABwAAAE1ZIgAIAAAAaFkiAAcAAABZWSIACAAAAG9ZIgAEAAAAc1kiAAQAAAB3WSIABAAAAHtZIgAGAAAAgVkiAAYAAAB7WSIABgAAAIdZIgAEAAAAi1kiAAYAAACRWSIABgAAAItZIgAGAAAAl1kiAAgAAACfWSIACAAAAKdZIgAEAAAAn1kiAAgAAACrWSIABAAAAK9ZIgAHAAAAtlkiAAcAAACvWSIABwAAAL1ZIgAJAAAAxlkiAAkAAADPWSIABAAAANNZIgAHAAAA2lkiAAcAAADTWSIABwAAAOFZIgAEAAAA5VkiAAoAAADvWSIACgAAAOVZIgAKAAAA+VkiAAQAAAD9WSIABwAAAARaIgAHAAAA/VkiAAcAAAALWiIADAAAAChWIgANAAAAF1oiAAsAAAAiWiIACwAAAC1aIgAEAAAAIloiAAsAAAAxWiIACwAAADxaIgAMAAAASFoiAAQAAABMWiIADQAAAFlaIgAMAAAATFoiAA0AAABlWiIABAAAAGlaIgAQAAAAeVoiAAQAAAB9WiIAFAAAAJFaIgAPAAAAaVoiABAAAACgWiIAEwAAAH1aIgAUAAAAs1oiAAQAAAC3WiIABAAAALtaIgAEAAAAxlkiAAkAAAC/WiIABAAAAMNaIgAEAAAAx1oiAAQAAADLWiIACQAAANRaIgAJAAAAy1oiAAkAAADdWiIAAwAAAOBaIgADAAAA41oiAAQAAADgWiIAAwAAAOdaIgAEAAAAPFoiAAwAAADrWiIABAAAAO9aIgAHAAAA9loiAAcAAADvWiIABwAAAP1aIgAHAAAABFsiAAcAAAALWyIABAAAAARbIgAHAAAAD1siAAkAAAAYWyIACQAAACFbIgAEAAAAJVsiAAsAAAAwWyIACgAAACVbIgALAAAAOlsiAAQAAAA+WyIACwAAAElbIgALAAAAPlsiAAsAAABUWyIABAAAAFhbIgARAAAAaVsiAAQAAAAYWyIACQAAAG1bIgAEAAAAcVsiAAQAAAB1WyIACQAAAH5bIgALAAAAiVsiAAMAAACMWyIAAwAAAI9bIgAEAAAAjFsiAAMAAACTWyIABAAAAJdbIgAFAAAAnFsiAAUAAACXWyIABQAAAKFbIgAUAAAASVciABYAAAC1WyIABAAAALlbIgAFAAAAvlsiAAUAAAC5WyIABQAAAMNbIgAHAAAAylsiAAgAAADSWyIABAAAAMpbIgAIAAAA1lsiAAwAAAB7VyIADQAAAOJbIgAJAAAAAVgiAAoAAADrWyIADwAAAFhbIgARAAAA+lsiAAkAAAADXCIACgAAAA1cIgAKAAAAF1wiAAsAAAAiXCIACgAAACxcIgALAAAAN1wiAA8AAABGXCIAEQAAAFdcIgAJAAAAYFwiAAoAAABqXCIACQAAAHNcIgAKAAAAfVwiAAYAAACDXCIABwAAAIpcIgAEAAAAg1wiAAcAAACOXCIABQAAAJNcIgAFAAAAmFwiAAQAAABgXCIACgAAAJxcIgAEAAAAk1wiAAUAAACgXCIABQAAAKVcIgAFAAAAqlwiAAQAAAClXCIABQAAAK5cIgAEAAAAslwiAAcAAAC5XCIABwAAALJcIgAHAAAAwFwiAAQAAABzXCIACgAAAMRcIgALAAAAOVciAAwAAADPXCIABAAAANNcIgAJAAAA3FwiAAkAAADTXCIACQAAAOVcIgAEAAAA6VwiAAsAAAD0XCIACQAAAOlcIgALAAAA/VwiAAQAAAADXCIACgAAAAFdIgAEAAAABV0iAAgAAAANXSIABwAAAAVdIgAIAAAAFF0iAAQAAAC9VyIAFQAAABhdIgAEAAAAHF0iAA8AAAArXSIABAAAAC9dIgAKAAAAOV0iAAoAAAAvXSIACgAAAENdIgAEAAAAt1oiAAQAAABHXSIABAAAAOdXIgAWAAAAS10iAA4AAAAcXSIADwAAAFldIgAEAAAAslQiAAYAAABdXSIABAAAAKBXIgAJAAAAYV0iAAYAAABnXSIABgAAAG1dIgAEAAAAZ10iAAYAAABxXSIABAAAANxWIgAPAAAAdV0iAAUAAAB6XSIABQAAAH9dIgAEAAAAel0iAAUAAACDXSIACQAAAIxdIgAJAAAAlV0iAAQAAACMXSIACQAAAJldIgAEAAAARlwiABEAAACdXSIABAAAAKFdIgAKAAAAq10iAAoAAAChXSIACgAAALVdIgAEAAAAuV0iAAsAAADEXSIABwAAAMtdIgAHAAAA0l0i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AHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACKBAAALwUAADEFAABWBQAAWQUAAFkFAABgBQAAiAUAANAFAADqBQAA7wUAAPIFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwA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ACggAAAoIAAAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAArwIAAHEDAABxAwAAcwMAAHMDAAB3AwAAdwMAAHsDAAB9AwAAkAMAAJADAACsAwAAzgMAANADAADRAwAA1QMAANcDAADZAwAA2QMAANsDAADbAwAA3QMAAN0DAADfAwAA3wMAAOEDAADhAwAA4wMAAOMDAADlAwAA5QMAAOcDAADnAwAA6QMAAOkDAADrAwAA6wMAAO0DAADtAwAA7wMAAPMDAAD1AwAA9QMAAPgDAAD4AwAA+wMAAPwDAAAwBAAAXwQAAGEEAABhBAAAYwQAAGMEAABlBAAAZQQAAGcEAABnBAAAaQQAAGkEAABrBAAAawQAAG0EAABtBAAAbwQAAG8EAABxBAAAcQQAAHMEAABzBAAAdQQAAHUEAAB3BAAAdwQAAHkEAAB5BAAAewQAAHsEAAB9BAAAfQQAAH8EAAB/BAAAgQQAAIEEAACLBAAAiwQAAI0EAACNBAAAjwQAAI8EAACRBAAAkQQAAJMEAACTBAAAlQQAAJUEAACXBAAAlwQAAJkEAACZBAAAmwQAAJsEAACdBAAAnQQAAJ8EAACfBAAAoQQAAKEEAACjBAAAowQAAKUEAAClBAAApwQAAKcEAACpBAAAqQQAAKsEAACrBAAArQQAAK0EAACvBAAArwQAALEEAACxBAAAswQAALMEAAC1BAAAtQQAALcEAAC3BAAAuQQAALkEAAC7BAAAuwQAAL0EAAC9BAAAvwQAAL8EAADCBAAAwgQAAMQEAADEBAAAxgQAAMYEAADIBAAAyAQAAMoEAADKBAAAzAQAAMwEAADOBAAAzwQAANEEAADRBAAA0wQAANMEAADVBAAA1QQAANcEAADXBAAA2QQAANkEAADbBAAA2wQAAN0EAADdBAAA3wQAAN8EAADhBAAA4QQAAOMEAADjBAAA5QQAAOUEAADnBAAA5wQAAOkEAADpBAAA6wQAAOsEAADtBAAA7QQAAO8EAADvBAAA8QQAAPEEAADzBAAA8wQAAPUEAAD1BAAA9wQAAPcEAAD5BAAA+QQAAPsEAAD7BAAA/QQAAP0EAAD/BAAA/wQAAAEFAAABBQAAAwUAAAMFAAAFBQAABQUAAAcFAAAHBQAACQUAAAkFAAALBQAACwUAAA0FAAANBQAADwUAAA8FAAARBQAAEQUAABMFAAATBQAAFQUAABUFAAAXBQAAFwUAABkFAAAZBQAAGwUAABsFAAAdBQAAHQUAAB8FAAAfBQAAIQUAACEFAAAjBQAAIwUAACUFAAAlBQAAJwUAACcFAAApBQAAKQUAACsFAAArBQAALQUAAC0FAAAvBQAALwUAAGAFAACIBQAA0BAAAPoQAAD9EAAA/xAAAPgTAAD9EwAAgBwAAIgcAACKHAAAihwAAAAdAAArHQAAax0AAHcdAAB5HQAAmh0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAIQhAACEIQAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB7LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHGnAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA9qcAAPanAAD6pwAA+qcAADCrAABaqwAAYKsAAGirAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAMAQDyDAEAcA0BAIUNAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfVAQBS1QEAa9UBAIbVAQCf1QEAutUBANPVAQDu1QEAB9YBACLWAQA71gEAVtYBAG/WAQCK1gEApdYBAMLWAQDa1gEA3NYBAOHWAQD81gEAFNcBABbXAQAb1wEANtcBAE7XAQBQ1wEAVdcBAHDXAQCI1wEAitcBAI/XAQCq1wEAwtcBAMTXAQDJ1wEAy9cBAMvXAQAA3wEACd8BAAvfAQAe3wEAJd8BACrfAQAi6QEAQ+kBAAADAABvAwAAgwQAAIkEAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAAEAYAABoGAABLBgAAXwYAAHAGAABwBgAA1gYAANwGAADfBgAA5AYA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AMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADODAAA1AwAANcMAADcDAAA3wwAAN8MAADkDAAA5QwAAPAMAADwDAAA9AwAAP8MAAANDQAADQ0AABENAAARDQAARQ0AAEUNAABJDQAASQ0AAFANAABTDQAAZA0AAGUNAACADQAAgA0AAIQNAACEDQAAlw0AAJkNAACyDQAAsg0AALwNAAC8DQAAvg0AAL8NAADHDQAAyQ0AAMsNAADODQAA1Q0AANUNAADXDQAA1w0AAOANAADlDQAA8A0AAPENAAD1DQAAAA4AADsOAAA+DgAAXA4AAIAOAACDDgAAgw4AAIUOAACFDgAAiw4AAIsOAACkDgAApA4AAKYOAACmDgAAvg4AAL8OAADFDgAAxQ4AAMcOAADHDgAAzw4AAM8OAADaDgAA2w4AAOAOAAD/DgAASA8AAEgPAABtDwAAcA8AAJgPAACYDwAAvQ8AAL0PAADNDwAAzQ8AANsPAAD/DwAAxhAAAMYQAADIEAAAzBAAAM4QAADPEAAASRIAAEkSAABOEgAATxIAAFcSAABXEgAAWRIAAFkSAABeEgAAXxIAAIkSAACJEgAAjhIAAI8SAACxEgAAsRIAALYSAAC3EgAAvxIAAL8SAADBEgAAwRIAAMYSAADHEgAA1xIAANcSAAAREwAAERMAABYTAAAXEwAAWxMAAFwTAAB9EwAAfxMAAJoTAACfEwAA9hMAAPcTAAD+EwAA/xMAAJ0WAACfFgAA+RYAAP8WAAAWFwAAHhcAADcXAAA/FwAAVBcAAF8XAABtFwAAbRcAAHEXAABxFwAAdBcAAH8XAADeFwAA3xcAAOoXAADvFwAA+hcAAP8XAAAOGAAADhgAABoYAAAfGAAAeRgAAH8YAACrGAAArxgAAPYYAAD/GAAAHxkAAB8ZAAAsGQAALxkAADwZAAA/GQAAQRkAAEMZAABuGQAAbxkAAHUZAAB/GQAArBkAAK8ZAADKGQAAzxkAANsZAADdGQAAHBoAAB0aAABfGgAAXxoAAH0aAAB+GgAAihoAAI8aAACaGgAAnxoAAK4aAACvGgAAzxoAAP8aAABNGwAATRsAAPQbAAD7GwAAOBwAADocAABKHAAATBwAAIscAACPHAAAuxwAALwcAADIHAAAzxwAAPscAAD/HAAAFh8AABcfAAAeHwAAHx8AAEYfAABHHwAATh8AAE8fAABYHwAAWB8AAFofAABaHwAAXB8AAFwfAABeHwAAXh8AAH4fAAB/HwAAtR8AALUfAADFHwAAxR8AANQfAADVHwAA3B8AANwfAADwHwAA8R8AAPUfAAD1HwAA/x8AAP8fAAALIAAADyAAACogAAAuIAAAYCAAAG8gAAByIAAAcyAAAI8gAACPIAAAnSAAAJ8gAADBIAAAzyAAAPEgAAD/IAAAjCEAAI8hAAAqJAAAPyQAAEskAABfJAAAdCsAAHUrAACWKwAAlisAAPQsAAD4LAAAJi0AACYtAAAoLQAALC0AAC4tAAAvLQAAaC0AAG4tAABxLQAAfi0AAJctAACfLQAApy0AAKctAACvLQAAry0AALctAAC3LQAAvy0AAL8tAADHLQAAxy0AAM8tAADPLQAA1y0AANctAADfLQAA3y0AAF4uAAB/LgAAmi4AAJouAAD0LgAA/y4AANYvAADvLwAAQDAAAEAwAACXMAAAmDAAAAAxAAAEMQAAMDEAADAxAACPMQAAjzEAAOYxAADuMQAAHzIAAB8yAACNpAAAj6QAAMekAADPpAAALKYAAD+mAAD4pgAA/6YAAM6nAADPpwAA0qcAANKnAADUpwAA1KcA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AJQCAACUAgAA0AUAAOoFAADvBQAA8gUAACAGAAA/BgAAQQYAAEoGAABuBgAAbwYAAHEGAADTBgAA1QYAANUGAADuBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMoHAADqBwAAAAgAABUIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADICAAABAkAADkJAAA9CQAAPQkAAFAJAABQCQAAWAkAAGEJAAByCQAAgAkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAAL0JAAC9CQAAzgkAAM4JAADcCQAA3QkAAN8JAADhCQAA8AkAAPEJAAD8CQAA/AkAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAWQoAAFwKAABeCgAAXgoAAHIKAAB0CgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAL0KAADQCgAA0AoAAOAKAADhCgAA+QoAAPkKAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA9CwAAPQsAAFwLAABdCwAAXwsAAGELAABxCwAAcQsAAIMLAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAA0AsAANALAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAAA9DAAAWAwAAFoMAABdDAAAXQwAAGAMAABhDAAAgAwAAIAMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL0MAADdDAAA3gwAAOAMAADhDAAA8QwAAPIMAAAEDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAE4NAABODQAAVA0AAFYNAABfDQAAYQ0AAHoNAAB/DQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAAEOAAAwDgAAMg4AADMOAABADgAARQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAsA4AALIOAACzDgAAvQ4AAL0OAADADgAAxA4AANwOAADfDgAAAA8AAAAPAABADwAARw8AAEkPAABsDwAAiA8AAIwPAAAAEAAAKhAAAD8QAAA/EAAAUBAAAFUQAABaEAAAXRAAAGEQAABhEAAAZRAAAGYQAABuEAAAcBAAAHUQAACBEAAAjhAAAI4QAAAAEQAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADxFgAA+BYAAAAXAAARFwAAHxcAADEXAABAFwAAURcAAGAXAABsFwAAbhcAAHAXAACAFwAAsxcAANwXAADcFwAAIBgAAEIYAABEGAAAeBgAAIAYAACEGAAAhxgAAKgYAACqGAAAqhgAALAYAAD1GAAAABkAAB4ZAABQGQAAbRkAAHAZAAB0GQAAgBkAAKsZAACwGQAAyRkAAAAaAAAWGgAAIBoAAFQaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB3HAAA6RwAAOwcAADuHAAA8xwAAPUcAAD2HAAA+hwAAPocAAA1IQAAOCEAADAtAABnLQAAgC0AAJYtAACgLQAApi0AAKgtAACuLQAAsC0AALYtAAC4LQAAvi0AAMAtAADGLQAAyC0AAM4tAADQLQAA1i0AANgtAADeLQAABjAAAAYwAAA8MAAAPDAAAEEwAACWMAAAnzAAAJ8wAAChMAAA+jAAAP8wAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/MQAA8DEAAP8xAAAANAAAv00AAABOAAAUoAAAFqAAAIykAADQpAAA96QAAAClAAALpgAAEKYAAB+mAAAqpgAAK6YAAG6mAABupgAAoKYAAOWmAACPpwAAj6cAAPenAAD3pwAA+6cAAAGoAAADqAAABagAAAeoAAAKqAAADKgAACKoAABAqAAAc6gAAIKoAACzqAAA8qgAAPeoAAD7qAAA+6gAAP2oAAD+qAAACqkAACWpAAAwqQAARqkAAGCpAAB8qQAAhKkAALKpAADgqQAA5KkAAOepAADvqQAA+qkAAP6pAAAAqgAAKKoAAECqAABCqgAARKoAAEuqAABgqgAAb6oAAHGqAAB2qgAAeqoAAHqqAAB+qgAAr6oAALGqAACxqgAAtaoAALaqAAC5qgAAvaoAAMCqAADAqgAAwqoAAMKqAADbqgAA3KoAAOCqAADqqgAA8qoAAPKqAAABqwAABqsAAAmrAAAOqwAAEasAABarAAAgqwAAJqsAACirAAAuqwAAwKsAAOKrAAAArAAAo9cAALDXAADG1wAAy9cAAPvXAAAA+QAAbfoAAHD6AADZ+gAAHfsAAB37AAAf+wAAKPsAACr7AAA2+wAAOPsAADz7AAA++wAAPvsAAED7AABB+wAAQ/sAAET7AABG+wAAsfsAANP7AAA9/QAAUP0AAI/9AACS/QAAx/0AAPD9AAD7/QAAcP4AAHT+AAB2/gAA/P4AAGb/AABv/wAAcf8AAJ3/AACg/wAAvv8AAML/AADH/wAAyv8AAM//AADS/wAA1/8AANr/AADc/wAAAAABAAsAAQANAAEAJgABACgAAQA6AAEAPAABAD0AAQA/AAEATQABAFAAAQBdAAEAgAABAPoAAQCAAgEAnAIBAKACAQDQAgEAAAMBAB8DAQAtAwEAQAMBAEIDAQBJAwEAUAMBAHUDAQCAAwEAnQMBAKADAQDDAwEAyAMBAM8DAQBQBAEAnQQBAAAFAQAnBQEAMAUBAGMFAQDABQEA8wUBAAAGAQA2BwEAQAcBAFUHAQBgBwEAZwcBAAAIAQAFCAEACAgBAAgIAQAKCAEANQgBADcIAQA4CAEAPAgBADwIAQA/CAEAVQgBAGAIAQB2CAEAgAgBAJ4IAQDgCAEA8ggBAPQIAQD1CAEAAAkBABUJAQAgCQEAOQkBAIAJAQC3CQEAvgkBAL8JAQAACgEAAAoBABAKAQATCgEAFQoBABcKAQAZCgEANQoBAGAKAQB8CgEAgAoBAJwKAQDACgEAxwoBAMkKAQDkCgEAAAsBADULAQBACwEAVQsBAGALAQByCwEAgAsBAJELAQAADAEASAwBAAANAQAjDQEASg0BAE0NAQBPDQEATw0BAIAOAQCpDgEAsA4BALEOAQDCDgEAxA4BAAAPAQAcDwEAJw8BACcPAQAwDwEARQ8BAHAPAQCBDwEAsA8BAMQPAQDgDwEA9g8BAAMQAQA3EAEAcRABAHIQAQB1EAEAdRABAIMQAQCvEAEA0BABAOgQAQADEQEAJhEBAEQRAQBEEQEARxEBAEcRAQBQEQEAchEBAHYRAQB2EQEAgxEBALIRAQDBEQEAxBEBANoRAQDaEQEA3BEBANwRAQAAEgEAERIBABMSAQArEgEAPxIBAEASAQCAEgEAhhIBAIgSAQCIEgEAihIBAI0SAQCPEgEAnRIBAJ8SAQCoEgEAsBIBAN4SAQAFEwEADBMBAA8TAQAQEwEAExMBACgTAQAqEwEAMBMBADITAQAzEwEANRMBADkTAQA9EwEAPRMBAFATAQBQEwEAXRMBAGETAQCAEwEAiRMBAIsTAQCLEwEAjhMBAI4TAQCQEwEAtRMBALcTAQC3EwEA0RMBANETAQDTEwEA0xMBAAAUAQA0FAEARxQBAEoUAQBfFAEAYRQBAIAUAQCvFAEAxBQBAMUUAQDHFAEAxxQBAIAVAQCuFQEA2BUBANsVAQAAFgEALxYBAEQWAQBEFgEAgBYBAKoWAQC4FgEAuBYBAAAXAQAaFwEAQBcBAEYXAQAAGAEAKxgBAP8YAQAGGQEACRkBAAkZAQAMGQEAExkBABUZAQAWGQEAGBkBAC8ZAQA/GQEAPxkBAEEZAQBBGQEAoBkBAKcZAQCqGQEA0BkBAOEZAQDhGQEA4xkBAOMZAQAAGgEAABoBAAsaAQAyGgEAOhoBADoaAQBQGgEAUBoBAFwaAQCJGgEAnRoBAJ0aAQCwGgEA+BoBAMAbAQDgGwEAABwBAAgcAQAKHAEALhwBAEAcAQBAHAEAchwBAI8cAQAAHQEABh0BAAgdAQAJHQEACx0BADAdAQBGHQEARh0BAGAdAQBlHQEAZx0BAGgdAQBqHQEAiR0BAJgdAQCYHQEA4B4BAPIeAQACHwEAAh8BAAQfAQAQHwEAEh8BADMfAQCwHwEAsB8BAAAgAQCZIwEAgCQBAEMlAQCQLwEA8C8BAAAwAQAvNAEAQTQBAEY0AQBgNAEA+kMBAABEAQBGRgEAAGEBAB1hAQAAaAEAOGoBAEBqAQBeagEAcGoBAL5qAQDQagEA7WoBAABrAQAvawEAY2sBAHdrAQB9awEAj2sBAENtAQBqbQEAAG8BAEpvAQBQbwEAUG8BAABwAQD3hwEAAIgBANWMAQD/jAEACI0BAACwAQAisQEAMrEBADKxAQBQsQEAUrEBAFWxAQBVsQEAZLEBAGexAQBwsQEA+7IBAAC8AQBqvAEAcLwBAHy8AQCAvAEAiLwBAJC8AQCZvAEACt8BAArfAQAA4QEALOEBAE7hAQBO4QEAkOIBAK3iAQDA4gEA6+IBANDkAQDq5AEA0OUBAO3lAQDw5QEA8OUBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQAA7gEAA+4BAAXuAQAf7gEAIe4BACLuAQAk7gEAJO4BACfuAQAn7gEAKe4BADLuAQA07gEAN+4BADnuAQA57gEAO+4BADvuAQBC7gEAQu4BAEfuAQBH7gEASe4BAEnuAQBL7gEAS+4BAE3uAQBP7gEAUe4BAFLuAQBU7gEAVO4BAFfuAQBX7gEAWe4BAFnuAQBb7gEAW+4BAF3uAQBd7gEAX+4BAF/uAQBh7gEAYu4BAGTuAQBk7gEAZ+4BAGruAQBs7gEAcu4BAHTuAQB37gEAee4BAHzuAQB+7gEAfu4BAIDuAQCJ7gEAi+4BAJvuAQCh7gEAo+4BAKXuAQCp7gEAq+4BALvuAQAAAAIA36YCAACnAgA5twIAQLcCAB24AgAguAIAoc4CALDOAgDg6wIA8OsCAF3uAgAA+AIAHfoCAAAAAwBKEwMAUBMDAK8jAwCyAAAAswAAALkAAAC5AAAAvAAAAL4AAAD0CQAA+QkAAHILAAB3CwAA8AsAAPILAAB4DAAAfgwAAFgNAABeDQAAcA0AAHgNAAAqDwAAMw8AAGkTAAB8EwAA8BcAAPkXAADaGQAA2hkAAHAgAABwIAAAdCAAAHkgAACAIAAAiSAAAFAhAABfIQAAiSEAAIkhAABgJAAAmyQAAOokAAD/JAAAdicAAJMnAAD9LAAA/SwAAJIxAACVMQAAIDIAACkyAABIMgAATzIAAFEyAABfMgAAgDIAAIkyAACxMgAAvzIAADCoAAA1qAAABwEBADMBAQB1AQEAeAEBAIoBAQCLAQEA4QIBAPsCAQAgAwEAIwMBAFgIAQBfCAEAeQgBAH8IAQCnCAEArwgBAPsIAQD/CAEAFgkBABsJAQC8CQEAvQkBAMAJAQDPCQEA0gkBAP8JAQBACgEASAoBAH0KAQB+CgEAnQoBAJ8KAQDrCgEA7woBAFgLAQBfCwEAeAsBAH8LAQCpCwEArwsBAPoMAQD/DAEAYA4BAH4OAQAdDwEAJg8BAFEPAQBUDwEAxQ8BAMsPAQBSEAEAZRABAOERAQD0EQEAOhcBADsXAQDqGAEA8hgBAFocAQBsHAEAwB8BANQfAQBbawEAYWsBAIBuAQCWbgEAwNIBANPSAQDg0gEA89IBAGDTAQB40wEAx+gBAM/oAQBx7AEAq+wBAK3sAQCv7AEAsewBALTsAQAB7QEALe0BAC/tAQA97QEAAPEBAAzxAQAhAAAAIwAAACUAAAAnAAAAKgAAACoAAAAsAAAALAAAAC4AAAAvAAAAOgAAADsAAAA/AAAAQAAAAFwAAABcAAAAoQAAAKEAAACnAAAApwAAALYAAAC3AAAAvwAAAL8AAAB+AwAAfgMAAIcDAACHAwAAWgUAAF8FAACJBQAAiQUAAMAFAADABQAAwwUAAMMFAADGBQAAxgUAAPMFAAD0BQAACQYAAAoGAAAMBgAADQYAABsGAAAbBgAAHQYAAB8GAABqBgAAbQYAANQGAADUBgAAAAcAAA0HAAD3BwAA+QcAADAIAAA+CAAAXggAAF4IAABkCQAAZQkAAHAJAABwCQAA/QkAAP0JAAB2CgAAdgoAAPAKAADwCgAAdwwAAHcMAACEDAAAhAwAAPQNAAD0DQAATw4AAE8OAABaDgAAWw4AAAQPAAASDwAAFA8AABQPAACFDwAAhQ8AANAPAADUDwAA2Q8AANoPAABKEAAATxAAAPsQAAD7EAAAYBMAAGgTAABuFgAAbhYAAOsWAADtFgAANRcAADYXAADUFwAA1hcAANgXAADaFwAAABgAAAUYAAAHGAAAChgAAEQZAABFGQAAHhoAAB8aAACgGgAAphoAAKgaAACtGgAAThsAAE8bAABaGwAAYBsAAH0bAAB/GwAA/BsAAP8bAAA7HAAAPxwAAH4cAAB/HAAAwBwAAMccAADTHAAA0xwAABYgAAAXIAAAICAAACcgAAAwIAAAOCAAADsgAAA+IAAAQSAAAEMgAABHIAAAUSAAAFMgAABTIAAAVSAAAF4gAAD5LAAA/CwAAP4sAAD/LAAAcC0AAHAtAAAALgAAAS4AAAYuAAAILgAACy4AAAsuAAAOLgAAFi4AABguAAAZLgAAGy4AABsuAAAeLgAAHy4AACouAAAuLgAAMC4AADkuAAA8LgAAPy4AAEEuAABBLgAAQy4AAE8uAABSLgAAVC4AAAEwAAADMAAAPTAAAD0wAAD7MAAA+zAAAP6kAAD/pAAADaYAAA+mAABzpgAAc6YAAH6mAAB+pgAA8qYAAPemAAB0qAAAd6gAAM6oAADPqAAA+KgAAPqoAAD8qAAA/KgAAC6pAAAvqQAAX6kAAF+pAADBqQAAzakAAN6pAADfqQAAXKoAAF+qAADeqgAA36oAAPCqAADxqgAA66sAAOurAAAQ/gAAFv4AABn+AAAZ/gAAMP4AADD+AABF/gAARv4AAEn+AABM/gAAUP4AAFL+AABU/gAAV/4AAF/+AABh/gAAaP4AAGj+AABq/gAAa/4AAAH/AAAD/wAABf8AAAf/AAAK/wAACv8AAAz/AAAM/wAADv8AAA//AAAa/wAAG/8AAB//AAAg/wAAPP8AADz/AABh/wAAYf8AAGT/AABl/wAAAAEBAAIBAQCfAwEAnwMBANADAQDQAwEAbwUBAG8FAQBXCAEAVwgBAB8JAQAfCQEAPwkBAD8JAQBQCgEAWAoBAH8KAQB/CgEA8AoBAPYKAQA5CwEAPwsBAJkLAQCcCwEAVQ8BAFkPAQCGDwEAiQ8BAEcQAQBNEAEAuxABALwQAQC+EAEAwRABAEARAQBDEQEAdBEBAHURAQDFEQEAyBEBAM0RAQDNEQEA2xEBANsRAQDdEQEA3xEBADgSAQA9EgEAqRIBAKkSAQDUEwEA1RMBANcTAQDYEwEASxQBAE8UAQBaFAEAWxQBAF0UAQBdFAEAxhQBAMYUAQDBFQEA1xUBAEEWAQBDFgEAYBYBAGwWAQC5FgEAuRYBADwXAQA+FwEAOxgBADsYAQBEGQEARhkBAOIZAQDiGQEAPxoBAEYaAQCaGgEAnBoBAJ4aAQCiGgEAABsBAAkbAQDhGwEA4RsBAEEcAQBFHAEAcBwBAHEcAQD3HgEA+B4BAEMfAQBPHwEA/x8BAP8fAQBwJAEAdCQBAPEvAQDyLwEAbmoBAG9qAQD1agEA9WoBADdrAQA7awEARGsBAERrAQBtbQEAb20BAJduAQCabgEA4m8BAOJvAQCfvAEAn7wBAIfaAQCL2gEA/+UBAP/lAQBe6QEAX+kBAKYAAACmAAAAqQAAAKkAAACuAAAArgAAALAAAACwAAAAggQAAIIEAACNBQAAjgUAAA4GAAAPBgAA3gYAAN4GAADpBgAA6QYAAP0GAAD+BgAA9gcAAPYHAAD6CQAA+gkAAHALAABwCwAA8wsAAPgLAAD6CwAA+gsAAH8MAAB/DAAATw0AAE8NAAB5DQAAeQ0AAAEPAAADDwAAEw8AABMPAAAVDwAAFw8AABoPAAAfDwAANA8AADQPAAA2DwAANg8AADgPAAA4DwAAvg8AAMUPAADHDwAAzA8AAM4PAADPDwAA1Q8AANgPAACeEAAAnxAAAJATAACZEwAAbRYAAG0WAABAGQAAQBkAAN4ZAAD/GQAAYRsAAGobAAB0GwAAfBsAAAAhAAABIQAAAyEAAAYhAAAIIQAACSEAABQhAAAUIQAAFiEAABchAAAeIQAAIyEAACUhAAAlIQAAJyEAACchAAApIQAAKSEAAC4hAAAuIQAAOiEAADshAABKIQAASiEAAEwhAABNIQAATyEAAE8hAACKIQAAiyEAAJUhAACZIQAAnCEAAJ8hAAChIQAAoiEAAKQhAAClIQAApyEAAK0hAACvIQAAzSEAANAhAADRIQAA0yEAANMhAADVIQAA8yEAAAAjAAAHIwAADCMAAB8jAAAiIwAAKCMAACsjAAB7IwAAfSMAAJojAAC0IwAA2yMAAOIjAAApJAAAQCQAAEokAACcJAAA6SQAAAAlAAC2JQAAuCUAAMAlAADCJQAA9yUAAAAmAABuJgAAcCYAAGcnAACUJwAAvycAAAAoAAD/KAAAACsAAC8rAABFKwAARisAAE0rAABzKwAAdisAAJUrAACXKwAA/ysAAOUsAADqLAAAUC4AAFEuAACALgAAmS4AAJsuAADzLgAAAC8AANUvAADwLwAA/y8AAAQwAAAEMAAAEjAAABMwAAAgMAAAIDAAADYwAAA3MAAAPjAAAD8wAACQMQAAkTEAAJYxAACfMQAAwDEAAOUxAADvMQAA7zEAAAAyAAAeMgAAKjIAAEcyAABQMgAAUDIAAGAyAAB/MgAAijIAALAyAADAMgAA/zMAAMBNAAD/TQAAkKQAAMakAAAoqAAAK6gAADaoAAA3qAAAOagAADmoAAB3qgAAeaoAAED9AABP/QAAz/0AAM/9AAD9/QAA//0AAOT/AADk/wAA6P8AAOj/AADt/wAA7v8AAPz/AAD9/wAANwEBAD8BAQB5AQEAiQEBAIwBAQCOAQEAkAEBAJwBAQCgAQEAoAEBANABAQD8AQEAdwgBAHgIAQDICgEAyAoBAD8XAQA/FwEA1R8BANwfAQDhHwEA8R8BADxrAQA/awEARWsBAEVrAQCcvAEAnLwBAADMAQDvzAEAAM0BALPOAQBQzwEAw88BAADQAQD10AEAANEBACbRAQAp0QEAZNEBAGrRAQBs0QEAg9EBAITRAQCM0QEAqdEBAK7RAQDq0QEAANIBAEHSAQBF0gEARdIBAADTAQBW0wEAANgBAP/ZAQA32gEAOtoBAG3aAQB02gEAdtoBAIPaAQCF2gEAhtoBAE/hAQBP4QEArOwBAKzsAQAu7QEALu0BAADwAQAr8AEAMPABAJPwAQCg8AEArvABALHwAQC/8AEAwfABAM/wAQDR8AEA9fABAA3xAQCt8QEA5vEBAALyAQAQ8gEAO/IBAEDyAQBI8gEAUPIBAFHyAQBg8gEAZfIBAADzAQD68wEAAPQBANf2AQDc9gEA7PYBAPD2AQD89gEAAPcBAHb3AQB79wEA2fcBAOD3AQDr9wEA8PcBAPD3AQAA+AEAC/gBABD4AQBH+AEAUPgBAFn4AQBg+AEAh/gBAJD4AQCt+AEAsPgBALv4AQDA+AEAwfgBAAD5AQBT+gEAYPoBAG36AQBw+gEAfPoBAID6AQCJ+gEAj/oBAMb6AQDO+gEA3PoBAN/6AQDp+gEA8PoBAPj6AQAA+wEAkvsBAJT7AQDv+wEAKSAAACkgAAAA4AAA//gAAAAADwD9/w8AAAAQAP3/EAAhAAAAIwAAACUAAAAqAAAALAAAAC8AAAA6AAAAOwAAAD8AAABAAAAAWwAAAF0AAABfAAAAXwAAAHsAAAB7AAAAfQAAAH0AAAChAAAAoQAAAKcAAACnAAAAqwAAAKsAAAC2AAAAtwAAALsAAAC7AAAAvwAAAL8AAAB+AwAAfgMAAIcDAACHAwAAWgUAAF8FAACJBQAAigUAAL4FAAC+BQAAwAUAAMAFAADDBQAAwwUAAMYFAADGBQAA8wUAAPQFAAAJBgAACgYAAAwGAAANBgAAGwYAABsGAAAdBgAAHwYAAGoGAABtBgAA1AYAANQGAAAABwAADQcAAPcHAAD5BwAAMAgAAD4IAABeCAAAXggAAGQJAABlCQAAcAkAAHAJAAD9CQAA/QkAAHYKAAB2CgAA8AoAAPAKAAB3DAAAdwwAAIQMAACEDAAA9A0AAPQNAABPDgAATw4AAFoOAABbDgAABA8AABIPAAAUDwAAFA8AADoPAAA9DwAAhQ8AAIUPAADQDwAA1A8AANkPAADaDwAAShAAAE8QAAD7EAAA+xAAAGATAABoEwAAABQAAAAUAABuFgAAbhYAAJsWAACcFgAA6xYAAO0WAAA1FwAANhcAANQXAADWFwAA2BcAANoXAAAAGAAAChgAAEQZAABFGQAAHhoAAB8aAACgGgAAphoAAKgaAACtGgAAThsAAE8bAABaGwAAYBsAAH0bAAB/GwAA/BsAAP8bAAA7HAAAPxwAAH4cAAB/HAAAwBwAAMccAADTHAAA0xwAABAgAAAnIAAAMCAAAEMgAABFIAAAUSAAAFMgAABeIAAAfSAAAH4gAACNIAAAjiAAAAgjAAALIwAAKSMAACojAABoJwAAdScAAMUnAADGJwAA5icAAO8nAACDKQAAmCkAANgpAADbKQAA/CkAAP0pAAD5LAAA/CwAAP4sAAD/LAAAcC0AAHAtAAAALgAALi4AADAuAABPLgAAUi4AAF0uAAABMAAAAzAAAAgwAAARMAAAFDAAAB8wAAAwMAAAMDAAAD0wAAA9MAAAoDAAAKAwAAD7MAAA+zAAAP6kAAD/pAAADaYAAA+mAABzpgAAc6YAAH6mAAB+pgAA8qYAAPemAAB0qAAAd6gAAM6oAADPqAAA+KgAAPqoAAD8qAAA/KgAAC6pAAAvqQAAX6kAAF+pAADBqQAAzakAAN6pAADfqQAAXKoAAF+qAADeqgAA36oAAPCqAADxqgAA66sAAOurAAA+/QAAP/0AABD+AAAZ/gAAMP4AAFL+AABU/gAAYf4AAGP+AABj/gAAaP4AAGj+AABq/gAAa/4AAAH/AAAD/wAABf8AAAr/AAAM/wAAD/8AABr/AAAb/wAAH/8AACD/AAA7/wAAPf8AAD//AAA//wAAW/8AAFv/AABd/wAAXf8AAF//AABl/wAAAAEBAAIBAQCfAwEAnwMBANADAQDQAwEAbwUBAG8FAQBXCAEAVwgBAB8JAQAfCQEAPwkBAD8JAQBQCgEAWAoBAH8KAQB/CgEA8AoBAPYKAQA5CwEAPwsBAJkLAQCcCwEAbg0BAG4NAQCtDgEArQ4BAFUPAQBZDwEAhg8BAIkPAQBHEAEATRABALsQAQC8EAEAvhABAMEQAQBAEQEAQxEBAHQRAQB1EQEAxREBAMgRAQDNEQEAzREBANsRAQDbEQEA3REBAN8RAQA4EgEAPRIBAKkSAQCpEgEA1BMBANUTAQDXEwEA2BMBAEsUAQBPFAEAWhQBAFsUAQBdFAEAXRQBAMYUAQDGFAEAwRUBANcVAQBBFgEAQxYBAGAWAQBsFgEAuRYBALkWAQA8FwEAPhcBADsYAQA7GAEARBkBAEYZAQDiGQEA4hkBAD8aAQBGGgEAmhoBAJwaAQCeGgEAohoBAAAbAQAJGwEA4RsBAOEbAQBBHAEARRwBAHAcAQBxHAEA9x4BAPgeAQBDHwEATx8BAP8fAQD/HwEAcCQBAHQkAQDxLwEA8i8BAG5qAQBvagEA9WoBAPVqAQA3awEAO2sBAERrAQBEawEAbW0BAG9tAQCXbgEAmm4BAOJvAQDibwEAn7wBAJ+8AQCH2gEAi9oBAP/lAQD/5QEAXukBAF/pAQAgAAAAIAAAAKAAAACgAAAAgBYAAIAWAAAAIAAACiAAACggAAApIAAALyAAAC8gAABfIAAAXyAAAAAwAAAAMAAAIAAAACAAAACgAAAAoAAAAIAWAACAFgAAACAAAAogAAAvIAAALyAAAF8gAABfIAAAADAAAAAwAAADCQAAAwkAADsJAAA7CQAAPgkAAEAJAABJCQAATAkAAE4JAABPCQAAggkAAIMJAAC+CQAAwAkAAMcJAADICQAAywkAAMwJAADXCQAA1wkAAAMKAAADCgAAPgoAAEAKAACDCgAAgwoAAL4KAADACgAAyQoAAMkKAADLCgAAzAoAAAILAAADCwAAPgsAAD4LAABACwAAQAsAAEcLAABICwAASwsAAEwLAABXCwAAVwsAAL4LAAC/CwAAwQsAAMILAADGCwAAyAsAAMoLAADMCwAA1wsAANcLAAABDAAAAwwAAEEMAABEDAAAggwAAIMMAAC+DAAAvgwAAMAMAADEDAAAxwwAAMgMAADKDAAAywwAANUMAADWDAAA8wwAAPMMAAACDQAAAw0AAD4NAABADQAARg0AAEgNAABKDQAATA0AAFcNAABXDQAAgg0AAIMNAADPDQAA0Q0AANgNAADfDQAA8g0AAPMNAAA+DwAAPw8AAH8PAAB/DwAAKxAAACwQAAAxEAAAMRAAADgQAAA4EAAAOxAAADwQAABWEAAAVxAAAGIQAABkEAAAZxAAAG0QAACDEAAAhBAAAIcQAACMEAAAjxAAAI8QAACaEAAAnBAAABUXAAAVFwAANBcAADQXAAC2FwAAthcAAL4XAADFFwAAxxcAAMgXAAAjGQAAJhkAACkZAAArGQAAMBkAADEZAAAzGQAAOBkAABkaAAAaGgAAVRoAAFUaAABXGgAAVxoAAGEaAABhGgAAYxoAAGQaAABtGgAAchoAAAQbAAAEGwAANRsAADUbAAA7GwAAOxsAAD0bAABBGwAAQxsAAEQbAACCGwAAghsAAKEbAAChGwAAphsAAKcbAACqGwAAqhsAAOcbAADnGwAA6hsAAOwbAADuGwAA7hsAAPIbAADzGwAAJBwAACscAAA0HAAANRwAAOEcAADhHAAA9xwAAPccAAAuMAAALzAAACOoAAAkqAAAJ6gAACeoAACAqAAAgagAALSoAADDqAAAUqkAAFOpAACDqQAAg6kAALSpAAC1qQAAuqkAALupAAC+qQAAwKkAAC+qAAAwqgAAM6oAADSqAABNqgAATaoAAHuqAAB7qgAAfaoAAH2qAADrqgAA66oAAO6qAADvqgAA9aoAAPWqAADjqwAA5KsAAOarAADnqwAA6asAAOqrAADsqwAA7KsAAAAQAQAAEAEAAhABAAIQAQCCEAEAghABALAQAQCyEAEAtxABALgQAQAsEQEALBEBAEURAQBGEQEAghEBAIIRAQCzEQEAtREBAL8RAQDAEQEAzhEBAM4RAQAsEgEALhIBADISAQAzEgEANRIBADUSAQDgEgEA4hIBAAITAQADEwEAPhMBAD8TAQBBEwEARBMBAEcTAQBIEwEASxMBAE0TAQBXEwEAVxMBAGITAQBjEwEAuBMBALoTAQDCEwEAwhMBAMUTAQDFEwEAxxMBAMoTAQDMEwEAzRMBAM8TAQDPEwEANRQBADcUAQBAFAEAQRQBAEUUAQBFFAEAsBQBALIUAQC5FAEAuRQBALsUAQC+FAEAwRQBAMEUAQCvFQEAsRUBALgVAQC7FQEAvhUBAL4VAQAwFgEAMhYBADsWAQA8FgEAPhYBAD4WAQCsFgEArBYBAK4WAQCvFgEAthYBALYWAQAeFwEAHhcBACAXAQAhFwEAJhcBACYXAQAsGAEALhgBADgYAQA4GAEAMBkBADUZAQA3GQEAOBkBAD0ZAQA9GQEAQBkBAEAZAQBCGQEAQhkBANEZAQDTGQEA3BkBAN8ZAQDkGQEA5BkBADkaAQA5GgEAVxoBAFgaAQCXGgEAlxoBAC8cAQAvHAEAPhwBAD4cAQCpHAEAqRwBALEcAQCxHAEAtBwBALQcAQCKHQEAjh0BAJMdAQCUHQEAlh0BAJYdAQD1HgEA9h4BAAMfAQADHwEANB8BADUfAQA+HwEAPx8BAEEfAQBBHwEAKmEBACxhAQBRbwEAh28BAPBvAQDxbwEAZdEBAGbRAQBt0QEActEBACQAAAAkAAAAKwAAACsAAAA8AAAAPgAAAF4AAABeAAAAYAAAAGAAAAB8AAAAfAAAAH4AAAB+AAAAogAAAKYAAACoAAAAqQAAAKwAAACsAAAArgAAALEAAAC0AAAAtAAAALgAAAC4AAAA1wAAANcAAAD3AAAA9wAAAMICAADFAgAA0gIAAN8CAADlAgAA6wIAAO0CAADtAgAA7wIAAP8CAAB1AwAAdQMAAIQDAACFAwAA9gMAAPYDAACCBAAAggQAAI0FAACPBQAABgYAAAgGAAALBgAACwYAAA4GAAAPBgAA3gYAAN4GAADpBgAA6QYAAP0GAAD+BgAA9gcAAPYHAAD+BwAA/wcAAIgIAACICAAA8gkAAPMJAAD6CQAA+wkAAPEKAADxCgAAcAsAAHALAADzCwAA+gsAAH8MAAB/DAAATw0AAE8NAAB5DQAAeQ0AAD8OAAA/DgAAAQ8AAAMPAAATDwAAEw8AABUPAAAXDwAAGg8AAB8PAAA0DwAANA8AADYPAAA2DwAAOA8AADgPAAC+DwAAxQ8AAMcPAADMDwAAzg8AAM8PAADVDwAA2A8AAJ4QAACfEAAAkBMAAJkTAABtFgAAbRYAANsXAADbFwAAQBkAAEAZAADeGQAA/xkAAGEbAABqGwAAdBsAAHwbAAC9HwAAvR8AAL8fAADBHwAAzR8AAM8fAADdHwAA3x8AAO0fAADvHwAA/R8AAP4fAABEIAAARCAAAFIgAABSIAAAeiAAAHwgAACKIAAAjCAAAKAgAADAIAAAACEAAAEhAAADIQAABiEAAAghAAAJIQAAFCEAABQhAAAWIQAAGCEAAB4hAAAjIQAAJSEAACUhAAAnIQAAJyEAACkhAAApIQAALiEAAC4hAAA6IQAAOyEAAEAhAABEIQAASiEAAE0hAABPIQAATyEAAIohAACLIQAAkCEAAAcjAAAMIwAAKCMAACsjAAApJAAAQCQAAEokAACcJAAA6SQAAAAlAABnJwAAlCcAAMQnAADHJwAA5ScAAPAnAACCKQAAmSkAANcpAADcKQAA+ykAAP4pAABzKwAAdisAAJUrAACXKwAA/ysAAOUsAADqLAAAUC4AAFEuAACALgAAmS4AAJsuAADzLgAAAC8AANUvAADwLwAA/y8AAAQwAAAEMAAAEjAAABMwAAAgMAAAIDAAADYwAAA3MAAAPjAAAD8wAACbMAAAnDAAAJAxAACRMQAAljEAAJ8xAADAMQAA5TEAAO8xAADvMQAAADIAAB4yAAAqMgAARzIAAFAyAABQMgAAYDIAAH8yAACKMgAAsDIAAMAyAAD/MwAAwE0AAP9NAACQpAAAxqQAAACnAAAWpwAAIKcAACGnAACJpwAAiqcAACioAAArqAAANqgAADmoAAB3qgAAeaoAAFurAABbqwAAaqsAAGurAAAp+wAAKfsAALL7AADC+wAAQP0AAE/9AADP/QAAz/0AAPz9AAD//QAAYv4AAGL+AABk/gAAZv4AAGn+AABp/gAABP8AAAT/AAAL/wAAC/8AABz/AAAe/wAAPv8AAD7/AABA/wAAQP8AAFz/AABc/wAAXv8AAF7/AADg/wAA5v8AAOj/AADu/wAA/P8AAP3/AAA3AQEAPwEBAHkBAQCJAQEAjAEBAI4BAQCQAQEAnAEBAKABAQCgAQEA0AEBAPwBAQB3CAEAeAgBAMgKAQDICgEAjg0BAI8NAQA/FwEAPxcBANUfAQDxHwEAPGsBAD9rAQBFawEARWsBAJy8AQCcvAEAAMwBAO/MAQAAzQEAs84BAFDPAQDDzwEAANABAPXQAQAA0QEAJtEBACnRAQBk0QEAatEBAGzRAQCD0QEAhNEBAIzRAQCp0QEArtEBAOrRAQAA0gEAQdIBAEXSAQBF0gEAANMBAFbTAQDB1gEAwdYBANvWAQDb1gEA+9YBAPvWAQAV1wEAFdcBADXXAQA11wEAT9cBAE/XAQBv1wEAb9cBAInXAQCJ1wEAqdcBAKnXAQDD1wEAw9cBAADYAQD/2QEAN9oBADraAQBt2gEAdNoBAHbaAQCD2gEAhdoBAIbaAQBP4QEAT+EBAP/iAQD/4gEArOwBAKzsAQCw7AEAsOwBAC7tAQAu7QEA8O4BAPHuAQAA8AEAK/ABADDwAQCT8AEAoPABAK7wAQCx8AEAv/ABAMHwAQDP8AEA0fABAPXwAQAN8QEArfEBAObxAQAC8gEAEPIBADvyAQBA8gEASPIBAFDyAQBR8gEAYPIBAGXyAQAA8wEA1/YBANz2AQDs9gEA8PYBAPz2AQAA9wEAdvcBAHv3AQDZ9wEA4PcBAOv3AQDw9wEA8PcBAAD4AQAL+AEAEPgBAEf4AQBQ+AEAWfgBAGD4AQCH+AEAkPgBAK34AQCw+AEAu/gBAMD4AQDB+AEAAPkBAFP6AQBg+gEAbfoBAHD6AQB8+gEAgPoBAIn6AQCP+gEAxvoBAM76AQDc+gEA3/oBAOn6AQDw+gEA+PoBAAD7AQCS+wEAlPsBAO/7AQDFAQAAxQEAAMgBAADIAQAAywEAAMsBAADyAQAA8gEAAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALwfAAC8HwAAzB8AAMwfAAD8HwAA/B8AAHgDAAB5AwAAgAMAAIMDAACLAwAAiwMAAI0DAACNAwAAogMAAKIDAAAwBQAAMAUAAFcFAABYBQAAiwUAAIwFAACQBQAAkAUAAMgFAADPBQAA6wUAAO4FAAD1BQAA/wUAAA4HAAAOBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACPCAAAkggAAJYIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADODAAA1AwAANcMAADcDAAA3wwAAN8MAADkDAAA5QwAAPAMAADwDAAA9AwAAP8MAAANDQAADQ0AABENAAARDQAARQ0AAEUNAABJDQAASQ0AAFANAABTDQAAZA0AAGUNAACADQAAgA0AAIQNAACEDQAAlw0AAJkNAACyDQAAsg0AALwNAAC8DQAAvg0AAL8NAADHDQAAyQ0AAMsNAADODQAA1Q0AANUNAADXDQAA1w0AAOANAADlDQAA8A0AAPENAAD1DQAAAA4AADsOAAA+DgAAXA4AAIAOAACDDgAAgw4AAIUOAACFDgAAiw4AAIsOAACkDgAApA4AAKYOAACmDgAAvg4AAL8OAADFDgAAxQ4AAMcOAADHDgAAzw4AAM8OAADaDgAA2w4AAOAOAAD/DgAASA8AAEgPAABtDwAAcA8AAJgPAACYDwAAvQ8AAL0PAADNDwAAzQ8AANsPAAD/DwAAxhAAAMYQAADIEAAAzBAAAM4QAADPEAAASRIAAEkSAABOEgAATxIAAFcSAABXEgAAWRIAAFkSAABeEgAAXxIAAIkSAACJEgAAjhIAAI8SAACxEgAAsRIAALYSAAC3EgAAvxIAAL8SAADBEgAAwRIAAMYSAADHEgAA1xIAANcSAAAREwAAERMAABYTAAAXEwAAWxMAAFwTAAB9EwAAfxMAAJoTAACfEwAA9hMAAPcTAAD+EwAA/xMAAJ0WAACfFgAA+RYAAP8WAAAWFwAAHhcAADcXAAA/FwAAVBcAAF8XAABtFwAAbRcAAHEXAABxFwAAdBcAAH8XAADeFwAA3xcAAOoXAADvFwAA+hcAAP8XAAAaGAAAHxgAAHkYAAB/GAAAqxgAAK8YAAD2GAAA/xgAAB8ZAAAfGQAALBkAAC8ZAAA8GQAAPxkAAEEZAABDGQAAbhkAAG8ZAAB1GQAAfxkAAKwZAACvGQAAyhkAAM8ZAADbGQAA3RkAABwaAAAdGgAAXxoAAF8aAAB9GgAAfhoAAIoaAACPGgAAmhoAAJ8aAACuGgAArxoAAM8aAAD/GgAATRsAAE0bAAD0GwAA+xsAADgcAAA6HAAAShwAAEwcAACLHAAAjxwAALscAAC8HAAAyBwAAM8cAAD7HAAA/xwAABYfAAAXHwAAHh8AAB8fAABGHwAARx8AAE4fAABPHwAAWB8AAFgfAABaHwAAWh8AAFwfAABcHwAAXh8AAF4fAAB+HwAAfx8AALUfAAC1HwAAxR8AAMUfAADUHwAA1R8AANwfAADcHwAA8B8AAPEfAAD1HwAA9R8AAP8fAAD/HwAAZSAAAGUgAAByIAAAcyAAAI8gAACPIAAAnSAAAJ8gAADBIAAAzyAAAPEgAAD/IAAAjCEAAI8hAAAqJAAAPyQAAEskAABfJAAAdCsAAHUrAACWKwAAlisAAPQsAAD4LAAAJi0AACYtAAAoLQAALC0AAC4tAAAvLQAAaC0AAG4tAABxLQAAfi0AAJctAACfLQAApy0AAKctAACvLQAAry0AALctAAC3LQAAvy0AAL8tAADHLQAAxy0AAM8tAADPLQAA1y0AANctAADfLQAA3y0AAF4uAAB/LgAAmi4AAJouAAD0LgAA/y4AANYvAADvLwAAQDAAAEAwAACXMAAAmDAAAAAxAAAEMQAAMDEAADAxAACPMQAAjzEAAOYxAADuMQAAHzIAAB8yAACNpAAAj6QAAMekAADPpAAALKYAAD+mAAD4pgAA/6YAAM6nAADPpwAA0qcAANKnAADUpwAA1KcAAN2nAADxpwAALagAAC+oAAA6qAAAP6gAAHioAAB/qAAAxqgAAM2oAADaqAAA36gAAFSpAABeqQAAfakAAH+pAADOqQAAzqkAANqpAADdqQAA/6kAAP+pAAA3qgAAP6oAAE6qAABPqgAAWqoAAFuqAADDqgAA2qoAAPeqAAAAqwAAB6sAAAirAAAPqwAAEKsAABerAAAfqwAAJ6sAACerAAAvqwAAL6sAAGyrAABvqwAA7qsAAO+rAAD6qwAA/6sAAKTXAACv1wAAx9cAAMrXAAD81wAA/9cAAG76AABv+gAA2voAAP/6AAAH+wAAEvsAABj7AAAc+wAAN/sAADf7AAA9+wAAPfsAAD/7AAA/+wAAQvsAAEL7AABF+wAARfsAAMP7AADS+wAAkP0AAJH9AADI/QAAzv0AAND9AADv/QAAGv4AAB/+AABT/gAAU/4AAGf+AABn/gAAbP4AAG/+AAB1/gAAdf4AAP3+AAD+/gAAAP8AAAD/AAC//wAAwf8AAMj/AADJ/wAA0P8AANH/AADY/wAA2f8AAN3/AADf/wAA5/8AAOf/AADv/wAA+P8AAP7/AAD//wAADAABAAwAAQAnAAEAJwABADsAAQA7AAEAPgABAD4AAQBOAAEATwABAF4AAQB/AAEA+wABAP8AAQADAQEABgEBADQBAQA2AQEAjwEBAI8BAQCdAQEAnwEBAKEBAQDPAQEA/gEBAH8CAQCdAgEAnwIBANECAQDfAgEA/AIBAP8CAQAkAwEALAMBAEsDAQBPAwEAewMBAH8DAQCeAwEAngMBAMQDAQDHAwEA1gMBAP8DAQCeBAEAnwQBAKoEAQCvBAEA1AQBANcEAQD8BAEA/wQBACgFAQAvBQEAZAUBAG4FAQB7BQEAewUBAIsFAQCLBQEAkwUBAJMFAQCWBQEAlgUBAKIFAQCiBQEAsgUBALIFAQC6BQEAugUBAL0FAQC/BQEA9AUBAP8FAQA3BwEAPwcBAFYHAQBfBwEAaAcBAH8HAQCGBwEAhgcBALEHAQCxBwEAuwcBAP8HAQAGCAEABwgBAAkIAQAJCAEANggBADYIAQA5CAEAOwgBAD0IAQA+CAEAVggBAFYIAQCfCAEApggBALAIAQDfCAEA8wgBAPMIAQD2CAEA+ggBABwJAQAeCQEAOgkBAD4JAQBACQEAfwkBALgJAQC7CQEA0AkBANEJAQAECgEABAoBAAcKAQALCgEAFAoBABQKAQAYCgEAGAoBADYKAQA3CgEAOwoBAD4KAQBJCgEATwoBAFkKAQBfCgEAoAoBAL8KAQDnCgEA6goBAPcKAQD/CgEANgsBADgLAQBWCwEAVwsBAHMLAQB3CwEAkgsBAJgLAQCdCwEAqAsBALALAQD/CwEASQwBAH8MAQCzDAEAvwwBAPMMAQD5DAEAKA0BAC8NAQA6DQEAPw0BAGYNAQBoDQEAhg0BAI0NAQCQDQEAXw4BAH8OAQB/DgEAqg4BAKoOAQCuDgEArw4BALIOAQDBDgEAxQ4BAPsOAQAoDwEALw8BAFoPAQBvDwEAig8BAK8PAQDMDwEA3w8BAPcPAQD/DwEAThABAFEQAQB2EAEAfhABAMMQAQDMEAEAzhABAM8QAQDpEAEA7xABAPoQAQD/EAEANREBADURAQBIEQEATxEBAHcRAQB/EQEA4BEBAOARAQD1EQEA/xEBABISAQASEgEAQhIBAH8SAQCHEgEAhxIBAIkSAQCJEgEAjhIBAI4SAQCeEgEAnhIBAKoSAQCvEgEA6xIBAO8SAQD6EgEA/xIBAAQTAQAEEwEADRMBAA4TAQAREwEAEhMBACkTAQApEwEAMRMBADETAQA0EwEANBMBADoTAQA6EwEARRMBAEYTAQBJEwEAShMBAE4TAQBPEwEAURMBAFYTAQBYEwEAXBMBAGQTAQBlEwEAbRMBAG8TAQB1EwEAfxMBAIoTAQCKEwEAjBMBAI0TAQCPEwEAjxMBALYTAQC2EwEAwRMBAMETAQDDEwEAxBMBAMYTAQDGEwEAyxMBAMsTAQDWEwEA1hMBANkTAQDgEwEA4xMBAP8TAQBcFAEAXBQBAGIUAQB/FAEAyBQBAM8UAQDaFAEAfxUBALYVAQC3FQEA3hUBAP8VAQBFFgEATxYBAFoWAQBfFgEAbRYBAH8WAQC6FgEAvxYBAMoWAQDPFgEA5BYBAP8WAQAbFwEAHBcBACwXAQAvFwEARxcBAP8XAQA8GAEAnxgBAPMYAQD+GAEABxkBAAgZAQAKGQEACxkBABQZAQAUGQEAFxkBABcZAQA2GQEANhkBADkZAQA6GQEARxkBAE8ZAQBaGQEAnxkBAKgZAQCpGQEA2BkBANkZAQDlGQEA/xkBAEgaAQBPGgEAoxoBAK8aAQD5GgEA/xoBAAobAQC/GwEA4hsBAO8bAQD6GwEA/xsBAAkcAQAJHAEANxwBADccAQBGHAEATxwBAG0cAQBvHAEAkBwBAJEcAQCoHAEAqBwBALccAQD/HAEABx0BAAcdAQAKHQEACh0BADcdAQA5HQEAOx0BADsdAQA+HQEAPh0BAEgdAQBPHQEAWh0BAF8dAQBmHQEAZh0BAGkdAQBpHQEAjx0BAI8dAQCSHQEAkh0BAJkdAQCfHQEAqh0BAN8eAQD5HgEA/x4BABEfAQARHwEAOx8BAD0fAQBbHwEArx8BALEfAQC/HwEA8h8BAP4fAQCaIwEA/yMBAG8kAQBvJAEAdSQBAH8kAQBEJQEAjy8BAPMvAQD/LwEAVjQBAF80AQD7QwEA/0MBAEdGAQD/YAEAOmEBAP9nAQA5agEAP2oBAF9qAQBfagEAamoBAG1qAQC/agEAv2oBAMpqAQDPagEA7moBAO9qAQD2agEA/2oBAEZrAQBPawEAWmsBAFprAQBiawEAYmsBAHhrAQB8awEAkGsBAD9tAQB6bQEAP24BAJtuAQD/bgEAS28BAE5vAQCIbwEAjm8BAKBvAQDfbwEA5W8BAO9vAQDybwEA/28BAPiHAQD/hwEA1owBAP6MAQAJjQEA768BAPSvAQD0rwEA/K8BAPyvAQD/rwEA/68BACOxAQAxsQEAM7EBAE+xAQBTsQEAVLEBAFaxAQBjsQEAaLEBAG+xAQD8sgEA/7sBAGu8AQBvvAEAfbwBAH+8AQCJvAEAj7wBAJq8AQCbvAEApLwBAP/LAQD6zAEA/8wBALTOAQD/zgEALs8BAC/PAQBHzwEAT88BAMTPAQD/zwEA9tABAP/QAQAn0QEAKNEBAOvRAQD/0QEARtIBAL/SAQDU0gEA39IBAPTSAQD/0gEAV9MBAF/TAQB50wEA/9MBAFXUAQBV1AEAndQBAJ3UAQCg1AEAodQBAKPUAQCk1AEAp9QBAKjUAQCt1AEArdQBALrUAQC61AEAvNQBALzUAQDE1AEAxNQBAAbVAQAG1QEAC9UBAAzVAQAV1QEAFdUBAB3VAQAd1QEAOtUBADrVAQA/1QEAP9UBAEXVAQBF1QEAR9UBAEnVAQBR1QEAUdUBAKbWAQCn1gEAzNcBAM3XAQCM2gEAmtoBAKDaAQCg2gEAsNoBAP/eAQAf3wEAJN8BACvfAQD/3wEAB+ABAAfgAQAZ4AEAGuABACLgAQAi4AEAJeABACXgAQAr4AEAL+ABAG7gAQCO4AEAkOABAP/gAQAt4QEAL+EBAD7hAQA/4QEASuEBAE3hAQBQ4QEAj+IBAK/iAQC/4gEA+uIBAP7iAQAA4wEAz+QBAPrkAQDP5QEA++UBAP7lAQAA5gEA3+cBAOfnAQDn5wEA7OcBAOznAQDv5wEA7+cBAP/nAQD/5wEAxegBAMboAQDX6AEA/+gBAEzpAQBP6QEAWukBAF3pAQBg6QEAcOwBALXsAQAA7QEAPu0BAP/tAQAE7gEABO4BACDuAQAg7gEAI+4BACPuAQAl7gEAJu4BACjuAQAo7gEAM+4BADPuAQA47gEAOO4BADruAQA67gEAPO4BAEHuAQBD7gEARu4BAEjuAQBI7gEASu4BAEruAQBM7gEATO4BAFDuAQBQ7gEAU+4BAFPuAQBV7gEAVu4BAFjuAQBY7gEAWu4BAFruAQBc7gEAXO4BAF7uAQBe7gEAYO4BAGDuAQBj7gEAY+4BAGXuAQBm7gEAa+4BAGvuAQBz7gEAc+4BAHjuAQB47gEAfe4BAH3uAQB/7gEAf+4BAIruAQCK7gEAnO4BAKDuAQCk7gEApO4BAKruAQCq7gEAvO4BAO/uAQDy7gEA/+8BACzwAQAv8AEAlPABAJ/wAQCv8AEAsPABAMDwAQDA8AEA0PABANDwAQD28AEA//ABAK7xAQDl8QEAA/IBAA/yAQA88gEAP/IBAEnyAQBP8gEAUvIBAF/yAQBm8gEA//IBANj2AQDb9gEA7fYBAO/2AQD99gEA//YBAHf3AQB69wEA2vcBAN/3AQDs9wEA7/cBAPH3AQD/9wEADPgBAA/4AQBI+AEAT/gBAFr4AQBf+AEAiPgBAI/4AQCu+AEAr/gBALz4AQC/+AEAwvgBAP/4AQBU+gEAX/oBAG76AQBv+gEAffoBAH/6AQCK+gEAjvoBAMf6AQDN+gEA3foBAN76AQDq+gEA7/oBAPn6AQD/+gEAk/sBAJP7AQD6+wEA//8BAOCmAgD/pgIAOrcCAD+3AgAeuAIAH7gCAKLOAgCvzgIA4esCAO/rAgBe7gIA//cCAB76AgD//wIASxMDAE8TAwCwIwMAAAAOAAIADgAfAA4AgAAOAP8ADgDwAQ4A//8OAP7/DwD//w8A/v8QAP//EABBAAAAWgAAAMAAAADWAAAA2AAAAN4AAAAAAQAAAAEAAAIBAAACAQAABAEAAAQBAAAGAQAABgEAAAgBAAAIAQAACgEAAAoBAAAMAQAADAEAAA4BAAAOAQAAEAEAABABAAASAQAAEgEAABQBAAAUAQAAFgEAABYBAAAYAQAAGAEAABoBAAAaAQAAHAEAABwBAAAeAQAAHgEAACABAAAgAQAAIgEAACIBAAAkAQAAJAEAACYBAAAmAQAAKAEAACgBAAAqAQAAKgEAACwBAAAsAQAALgEAAC4BAAAwAQAAMAEAADIBAAAyAQAANAEAADQBAAA2AQAANgEAADkBAAA5AQAAOwEAADsBAAA9AQAAPQEAAD8BAAA/AQAAQQEAAEEBAABDAQAAQwEAAEUBAABFAQAARwEAAEcBAABKAQAASgEAAEwBAABMAQAATgEAAE4BAABQAQAAUAEAAFIBAABSAQAAVAEAAFQBAABWAQAAVgEAAFgBAABYAQAAWgEAAFoBAABcAQAAXAEAAF4BAABeAQAAYAEAAGABAABiAQAAYgEAAGQBAABkAQAAZgEAAGYBAABoAQAAaAEAAGoBAABqAQAAbAEAAGwBAABuAQAAbgEAAHABAABwAQAAcgEAAHIBAAB0AQAAdAEAAHYBAAB2AQAAeAEAAHkBAAB7AQAAewEAAH0BAAB9AQAAgQEAAIIBAACEAQAAhAEAAIYBAACHAQAAiQEAAIsBAACOAQAAkQEAAJMBAACUAQAAlgEAAJgBAACcAQAAnQEAAJ8BAACgAQAAogEAAKIBAACkAQAApAEAAKYBAACnAQAAqQEAAKkBAACsAQAArAEAAK4BAACvAQAAsQEAALMBAAC1AQAAtQEAALcBAAC4AQAAvAEAALwBAADEAQAAxAEAAMcBAADHAQAAygEAAMoBAADNAQAAzQEAAM8BAADPAQAA0QEAANEBAADTAQAA0wEAANUBAADVAQAA1wEAANcBAADZAQAA2QEAANsBAADbAQAA3gEAAN4BAADgAQAA4AEAAOIBAADiAQAA5AEAAOQBAADmAQAA5gEAAOgBAADoAQAA6gEAAOoBAADsAQAA7AEAAO4BAADuAQAA8QEAAPEBAAD0AQAA9AEAAPYBAAD4AQAA+gEAAPoBAAD8AQAA/AEAAP4BAAD+AQAAAAIAAAACAAACAgAAAgIAAAQCAAAEAgAABgIAAAYCAAAIAgAACAIAAAoCAAAKAgAADAIAAAwCAAAOAgAADgIAABACAAAQAgAAEgIAABICAAAUAgAAFAIAABYCAAAWAgAAGAIAABgCAAAaAgAAGgIAABwCAAAcAgAAHgIAAB4CAAAgAgAAIAIAACICAAAiAgAAJAIAACQCAAAmAgAAJgIAACgCAAAoAgAAKgIAACoCAAAsAgAALAIAAC4CAAAuAgAAMAIAADACAAAyAgAAMgIAADoCAAA7AgAAPQIAAD4CAABBAgAAQQIAAEMCAABGAgAASAIAAEgCAABKAgAASgIAAEwCAABMAgAATgIAAE4CAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAM8DAADPAwAA0gMAANQDAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAgyEAAIMhAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcA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AJcIAACgCAAAyQgAANQIAADfCAAA4wgAAOkIAADwCAAAOwkAAD0JAABMCQAATgkAAFAJAABVCQAAYwkAAHEJAACDCQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAMQJAADHCQAAyAkAAMsJAADMCQAAzgkAAM4JAADXCQAA1wkAANwJAADdCQAA3wkAAOMJAADwCQAA8QkAAPwJAAD8CQAAAQoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABCCgAARwoAAEgKAABLCgAATAoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAHAKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAxQoAAMcKAADJCgAAywoAAMwKAADQCgAA0AoAAOAKAADjCgAA+QoAAPwKAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAABECwAARwsAAEgLAABLCwAATAsAAFYLAABXCwAAXAsAAF0LAABfCwAAYwsAAHELAABxCwAAggsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC+CwAAwgsAAMYLAADICwAAygsAAMwLAADQCwAA0AsAANcLAADXCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAARAwAAEYMAABIDAAASgwAAEwMAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAIAMAACDDAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAADEDAAAxgwAAMgMAADKDAAAzAwAANUMAADWDAAA3QwAAN4MAADgDAAA4wwAAPEMAADzDAAAAA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAEQNAABGDQAASA0AAEoNAABMDQAATg0AAE4NAABUDQAAVw0AAF8NAABjDQAAeg0AAH8NAACBDQAAgw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAEYOAABNDgAATQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAuQ4AALsOAAC9DgAAwA4AAMQOAADGDgAAxg4AAM0OAADNDgAA3A4AAN8OAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAABxDwAAgw8AAIgPAACXDwAAmQ8AALwPAAAAEAAANhAAADgQAAA4EAAAOxAAAD8QAABQEAAAjxAAAJoQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAoBMAAPUTAAD4EwAA/RMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA7hYAAPgWAAAAFwAAExcAAB8XAAAzFwAAQBcAAFMXAABgFwAAbBcAAG4XAABwFwAAchcAAHMXAACAFwAAsxcAALYXAADIFwAA1xcAANcXAADcFwAA3BcAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOBkAAFAZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAAABoAABsaAAAgGgAAXhoAAGEaAAB0GgAApxoAAKcaAAC/GgAAwBoAAMwaAADOGgAAABsAADMbAAA1GwAAQxsAAEUbAABMGwAAgBsAAKkbAACsGwAArxsAALobAADlGwAA5xsAAPEbAAAAHAAANhwAAE0cAABPHAAAWhwAAH0cAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAAAAdAAC/HQAA0x0AAPQdAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAAC8hAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAC2JAAA6SQAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAADgLQAA/y0AAC8uAAAvLgAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABBMAAAljAAAJ0wAACfMAAAoTAAAPowAAD8MAAA/zAAAAUxAAAvMQAAMTEAAI4xAACgMQAAvzEAAPAxAAD/MQAAADQAAL9NAAAATgAAjKQAANCkAAD9pAAAAKUAAAymAAAQpgAAH6YAACqmAAArpgAAQKYAAG6mAAB0pgAAe6YAAH+mAADvpgAAF6cAAB+nAAAipwAAiKcAAIunAADNpwAA0KcAANGnAADTpwAA06cAANWnAADcpwAA8qcAAAWoAAAHqAAAJ6gAAECoAABzqAAAgKgAAMOoAADFqAAAxagAAPKoAAD3qAAA+6gAAPuoAAD9qAAA/6gAAAqpAAAqqQAAMKkAAFKpAABgqQAAfKkAAICpAACyqQAAtKkAAL+pAADPqQAAz6kAAOCpAADvqQAA+qkAAP6pAAAAqgAANqoAAECqAABNqgAAYKoAAHaqAAB6qgAAvqoAAMCqAADAqgAAwqoAAMKqAADbqgAA3aoAAOCqAADvqgAA8qoAAPWqAAABqwAABqsAAAmrAAAOqwAAEasAABarAAAgqwAAJqsAACirAAAuqwAAMKsAAFqrAABcqwAAaasAAHCrAADqqwAAAKwAAKPXAACw1wAAxtcAAMvXAAD71wAAAPkAAG36AABw+gAA2foAAAD7AAAG+wAAE/sAABf7AAAd+wAAKPsAACr7AAA2+wAAOPsAADz7AAA++wAAPvsAAED7AABB+wAAQ/sAAET7AABG+wAAsfsAANP7AAA9/QAAUP0AAI/9AACS/QAAx/0AAPD9AAD7/QAAcP4AAHT+AAB2/gAA/P4AACH/AAA6/wAAQf8AAFr/AABm/wAAvv8AAML/AADH/wAAyv8AAM//AADS/wAA1/8AANr/AADc/wAAAAABAAsAAQANAAEAJgABACgAAQA6AAEAPAABAD0AAQA/AAEATQABAFAAAQBdAAEAgAABAPoAAQBAAQEAdAEBAIACAQCcAgEAoAIBANACAQAAAwEAHwMBAC0DAQBKAwEAUAMBAHoDAQCAAwEAnQMBAKADAQDDAwEAyAMBAM8DAQDRAwEA1QMBAAAEAQCdBAEAsAQBANMEAQDYBAEA+wQBAAAFAQAnBQEAMAUBAGMFAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAwAUBAPMFAQAABgEANgcBAEAHAQBVBwEAYAcBAGcHAQCABwEAhQcBAIcHAQCwBwEAsgcBALoHAQAACAEABQgBAAgIAQAICAEACggBADUIAQA3CAEAOAgBADwIAQA8CAEAPwgBAFUIAQBgCAEAdggBAIAIAQCeCAEA4AgBAPIIAQD0CAEA9QgBAAAJAQAVCQEAIAkBADkJAQCACQEAtwkBAL4JAQC/CQEAAAoBAAMKAQAFCgEABgoBAAwKAQATCgEAFQoBABcKAQAZCgEANQoBAGAKAQB8CgEAgAoBAJwKAQDACgEAxwoBAMkKAQDkCgEAAAsBADULAQBACwEAVQsBAGALAQByCwEAgAsBAJELAQAADAEASAwBAIAMAQCyDAEAwAwBAPIMAQAADQEAJw0BAEoNAQBlDQEAaQ0BAGkNAQBvDQEAhQ0BAIAOAQCpDgEAqw4BAKwOAQCwDgEAsQ4BAMIOAQDEDgEA/A4BAPwOAQAADwEAHA8BACcPAQAnDwEAMA8BAEUPAQBwDwEAgQ8BALAPAQDEDwEA4A8BAPYPAQAAEAEARRABAHEQAQB1EAEAgBABALgQAQDCEAEAwhABANAQAQDoEAEAABEBADIRAQBEEQEARxEBAFARAQByEQEAdhEBAHYRAQCAEQEAvxEBAMERAQDEEQEAzhEBAM8RAQDaEQEA2hEBANwRAQDcEQEAABIBABESAQATEgEANBIBADcSAQA3EgEAPhIBAEESAQCAEgEAhhIBAIgSAQCIEgEAihIBAI0SAQCPEgEAnRIBAJ8SAQCoEgEAsBIBAOgSAQAAEwEAAxMBAAUTAQAMEwEADxMBABATAQATEwEAKBMBACoTAQAwEwEAMhMBADMTAQA1EwEAORMBAD0TAQBEEwEARxMBAEgTAQBLEwEATBMBAFATAQBQEwEAVxMBAFcTAQBdEwEAYxMBAIATAQCJEwEAixMBAIsTAQCOEwEAjhMBAJATAQC1EwEAtxMBAMATAQDCEwEAwhMBAMUTAQDFEwEAxxMBAMoTAQDMEwEAzRMBANETAQDREwEA0xMBANMTAQAAFAEAQRQBAEMUAQBFFAEARxQBAEoUAQBfFAEAYRQBAIAUAQDBFAEAxBQBAMUUAQDHFAEAxxQBAIAVAQC1FQEAuBUBAL4VAQDYFQEA3RUBAAAWAQA+FgEAQBYBAEAWAQBEFgEARBYBAIAWAQC1FgEAuBYBALgWAQAAFwEAGhcBAB0XAQAqFwEAQBcBAEYXAQAAGAEAOBgBAKAYAQDfGAEA/xgBAAYZAQAJGQEACRkBAAwZAQATGQEAFRkBABYZAQAYGQEANRkBADcZAQA4GQEAOxkBADwZAQA/GQEAQhkBAKAZAQCnGQEAqhkBANcZAQDaGQEA3xkBAOEZAQDhGQEA4xkBAOQZAQAAGgEAMhoBADUaAQA+GgEAUBoBAJcaAQCdGgEAnRoBALAaAQD4GgEAwBsBAOAbAQAAHAEACBwBAAocAQA2HAEAOBwBAD4cAQBAHAEAQBwBAHIcAQCPHAEAkhwBAKccAQCpHAEAthwBAAAdAQAGHQEACB0BAAkdAQALHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEAQR0BAEMdAQBDHQEARh0BAEcdAQBgHQEAZR0BAGcdAQBoHQEAah0BAI4dAQCQHQEAkR0BAJMdAQCWHQEAmB0BAJgdAQDgHgEA9h4BAAAfAQAQHwEAEh8BADofAQA+HwEAQB8BALAfAQCwHwEAACABAJkjAQAAJAEAbiQBAIAkAQBDJQEAkC8BAPAvAQAAMAEALzQBAEE0AQBGNAEAYDQBAPpDAQAARAEARkYBAABhAQAuYQEAAGgBADhqAQBAagEAXmoBAHBqAQC+agEA0GoBAO1qAQAAawEAL2sBAEBrAQBDawEAY2sBAHdrAQB9awEAj2sBAEBtAQBsbQEAQG4BAH9uAQAAbwEASm8BAE9vAQCHbwEAj28BAJ9vAQDgbwEA4W8BAONvAQDjbwEA8G8BAPFvAQAAcAEA94cBAACIAQDVjAEA/4wBAAiNAQDwrwEA868BAPWvAQD7rwEA/a8BAP6vAQAAsAEAIrEBADKxAQAysQEAULEBAFKxAQBVsQEAVbEBAGSxAQBnsQEAcLEBAPuyAQAAvAEAarwBAHC8AQB8vAEAgLwBAIi8AQCQvAEAmbwBAJ68AQCevAEAANQBAFTUAQBW1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQAe1QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAUtUBAKXWAQCo1gEAwNYBAMLWAQDa1gEA3NYBAPrWAQD81gEAFNcBABbXAQA01wEANtcBAE7XAQBQ1wEAbtcBAHDXAQCI1wEAitcBAKjXAQCq1wEAwtcBAMTXAQDL1wEAAN8BAB7fAQAl3wEAKt8BAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQAw4AEAbeABAI/gAQCP4AEAAOEBACzhAQA34QEAPeEBAE7hAQBO4QEAkOIBAK3iAQDA4gEA6+IBANDkAQDr5AEA0OUBAO3lAQDw5QEA8OUBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQAA6QEAQ+kBAEfpAQBH6QEAS+kBAEvpAQAA7gEAA+4BAAXuAQAf7gEAIe4BACLuAQAk7gEAJO4BACfuAQAn7gEAKe4BADLuAQA07gEAN+4BADnuAQA57gEAO+4BADvuAQBC7gEAQu4BAEfuAQBH7gEASe4BAEnuAQBL7gEAS+4BAE3uAQBP7gEAUe4BAFLuAQBU7gEAVO4BAFfuAQBX7gEAWe4BAFnuAQBb7gEAW+4BAF3uAQBd7gEAX+4BAF/uAQBh7gEAYu4BAGTuAQBk7gEAZ+4BAGruAQBs7gEAcu4BAHTuAQB37gEAee4BAHzuAQB+7gEAfu4BAIDuAQCJ7gEAi+4BAJvuAQCh7gEAo+4BAKXuAQCp7gEAq+4BALvuAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQAAAAIA36YCAACnAgA5twIAQLcCAB24AgAguAIAoc4CALDOAgDg6wIA8OsCAF3uAgAA+AIAHfoCAAAAAwBKEwMAUBMDAK8jAwAcBgAAHAYAAA4gAAAPIAAAKiAAAC4gAABmIAAAaSAAACgAAAApAAAAPAAAADwAAAA+AAAAPgAAAFsAAABbAAAAXQAAAF0AAAB7AAAAewAAAH0AAAB9AAAAqwAAAKsAAAC7AAAAuwAAADoPAAA9DwAAmxYAAJwWAAA5IAAAOiAAAEUgAABGIAAAfSAAAH4gAACNIAAAjiAAAEAhAABAIQAAASIAAAQiAAAIIgAADSIAABEiAAARIgAAFSIAABYiAAAaIgAAHSIAAB8iAAAiIgAAJCIAACQiAAAmIgAAJiIAACsiAAAzIgAAOSIAADkiAAA7IgAATCIAAFIiAABVIgAAXyIAAGAiAABiIgAAYiIAAGQiAABrIgAAbSIAAIwiAACPIgAAkiIAAJgiAACYIgAAoiIAAKMiAACmIgAAuCIAAL4iAAC/IgAAySIAAM0iAADQIgAA0SIAANYiAADtIgAA8CIAAP8iAAAIIwAACyMAACAjAAAhIwAAKSMAACojAABoJwAAdScAAMAnAADAJwAAwycAAMYnAADIJwAAyScAAMsnAADNJwAA0ycAANYnAADcJwAA3icAAOInAADvJwAAgykAAJgpAACbKQAAoCkAAKIpAACvKQAAuCkAALgpAADAKQAAxSkAAMkpAADJKQAAzikAANIpAADUKQAA1SkAANgpAADcKQAA4SkAAOEpAADjKQAA5SkAAOgpAADpKQAA9CkAAPkpAAD8KQAA/SkAAAoqAAAcKgAAHioAACEqAAAkKgAAJCoAACYqAAAmKgAAKSoAACkqAAArKgAALioAADQqAAA1KgAAPCoAAD4qAABXKgAAWCoAAGQqAABlKgAAaioAAG0qAABvKgAAcCoAAHMqAAB0KgAAeSoAAKMqAACmKgAArSoAAK8qAADWKgAA3CoAANwqAADeKgAA3ioAAOIqAADmKgAA7CoAAO4qAADzKgAA8yoAAPcqAAD7KgAA/SoAAP0qAAD+KwAA/isAAAIuAAAFLgAACS4AAAouAAAMLgAADS4AABwuAAAdLgAAIC4AACkuAABVLgAAXC4AAAgwAAARMAAAFDAAABswAABZ/gAAXv4AAGT+AABl/gAACP8AAAn/AAAc/wAAHP8AAB7/AAAe/wAAO/8AADv/AAA9/wAAPf8AAFv/AABb/wAAXf8AAF3/AABf/wAAYP8AAGL/AABj/wAA29YBANvWAQAV1wEAFdcBAE/XAQBP1wEAidcBAInXAQDD1wEAw9cBACcAAAAnAAAALgAAAC4AAAA6AAAAOgAAAF4AAABeAAAAYAAAAGAAAACoAAAAqAAAAK0AAACtAAAArwAAAK8AAAC0AAAAtAAAALcAAAC4AAAAsAIAAG8DAAB0AwAAdQMAAHoDAAB6AwAAhAMAAIUDAACHAwAAhwMAAIMEAACJBAAAWQUAAFkFAABfBQAAXwUAAJEFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAD0BQAA9AUAAAAGAAAFBgAAEAYAABoGAAAcBgAAHAYAAEAGAABABgAASwYAAF8GAABwBgAAcAYAANYGAADdBgAA3wYAAOgGAADqBgAA7QYAAA8HAAAPBwAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPUHAAD6BwAA+gcAAP0HAAD9BwAAFggAAC0IAABZCAAAWwgAAIgIAACICAAAkAgAAJEIAACXCAAAnwgAAMkIAAACCQAAOgkAADoJAAA8CQAAPAkAAEEJAABICQAATQkAAE0JAABRCQAAVwkAAGIJAABjCQAAcQkAAHEJAACBCQAAgQkAALwJAAC8CQAAwQkAAMQJAADNCQAAzQkAAOIJAADjCQAA/gkAAP4JAAABCgAAAgoAADwKAAA8CgAAQQoAAEIKAABHCgAASAoAAEsKAABNCgAAUQoAAFEKAABwCgAAcQoAAHUKAAB1CgAAgQoAAIIKAAC8CgAAvAoAAMEKAADFCgAAxwoAAMgKAADNCgAAzQoAAOIKAADjCgAA+goAAP8KAAABCwAAAQsAADwLAAA8CwAAPwsAAD8LAABBCwAARAsAAE0LAABNCwAAVQsAAFYLAABiCwAAYwsAAIILAACCCwAAwAsAAMALAADNCwAAzQsAAAAMAAAADAAABAwAAAQMAAA8DAAAPAwAAD4MAABADAAARgwAAEgMAABKDAAATQwAAFUMAABWDAAAYgwAAGMMAACBDAAAgQwAALwMAAC8DAAAvwwAAL8MAADGDAAAxgwAAMwMAADNDAAA4gwAAOMMAAAADQAAAQ0AADsNAAA8DQAAQQ0AAEQNAABNDQAATQ0AAGINAABjDQAAgQ0AAIENAADKDQAAyg0AANINAADUDQAA1g0AANYNAAAxDgAAMQ4AADQOAAA6DgAARg4AAE4OAACxDgAAsQ4AALQOAAC8DgAAxg4AAMYOAADIDgAAzg4AABgPAAAZDwAANQ8AADUPAAA3DwAANw8AADkPAAA5DwAAcQ8AAH4PAACADwAAhA8AAIYPAACHDwAAjQ8AAJcPAACZDwAAvA8AAMYPAADGDwAALRAAADAQAAAyEAAANxAAADkQAAA6EAAAPRAAAD4QAABYEAAAWRAAAF4QAABgEAAAcRAAAHQQAACCEAAAghAAAIUQAACGEAAAjRAAAI0QAACdEAAAnRAAAPwQAAD8EAAAXRMAAF8TAAASFwAAFBcAADIXAAAzFwAAUhcAAFMXAAByFwAAcxcAALQXAAC1FwAAtxcAAL0XAADGFwAAxhcAAMkXAADTFwAA1xcAANcXAADdFwAA3RcAAAsYAAAPGAAAQxgAAEMYAACFGAAAhhgAAKkYAACpGAAAIBkAACIZAAAnGQAAKBkAADIZAAAyGQAAORkAADsZAAAXGgAAGBoAABsaAAAbGgAAVhoAAFYaAABYGgAAXhoAAGAaAABgGgAAYhoAAGIaAABlGgAAbBoAAHMaAAB8GgAAfxoAAH8aAACnGgAApxoAALAaAADOGgAAABsAAAMbAAA0GwAANBsAADYbAAA6GwAAPBsAADwbAABCGwAAQhsAAGsbAABzGwAAgBsAAIEbAACiGwAApRsAAKgbAACpGwAAqxsAAK0bAADmGwAA5hsAAOgbAADpGwAA7RsAAO0bAADvGwAA8RsAACwcAAAzHAAANhwAADccAAB4HAAAfRwAANAcAADSHAAA1BwAAOAcAADiHAAA6BwAAO0cAADtHAAA9BwAAPQcAAD4HAAA+RwAACwdAABqHQAAeB0AAHgdAACbHQAA/x0AAL0fAAC9HwAAvx8AAMEfAADNHwAAzx8AAN0fAADfHwAA7R8AAO8fAAD9HwAA/h8AAAsgAAAPIAAAGCAAABkgAAAkIAAAJCAAACcgAAAnIAAAKiAAAC4gAABgIAAAZCAAAGYgAABvIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAB8LAAAfSwAAO8sAADxLAAAby0AAG8tAAB/LQAAfy0AAOAtAAD/LQAALy4AAC8uAAAFMAAABTAAACowAAAtMAAAMTAAADUwAAA7MAAAOzAAAJkwAACeMAAA/DAAAP4wAAAVoAAAFaAAAPikAAD9pAAADKYAAAymAABvpgAAcqYAAHSmAAB9pgAAf6YAAH+mAACcpgAAn6YAAPCmAADxpgAAAKcAACGnAABwpwAAcKcAAIinAACKpwAA8qcAAPSnAAD4pwAA+acAAAKoAAACqAAABqgAAAaoAAALqAAAC6gAACWoAAAmqAAALKgAACyoAADEqAAAxagAAOCoAADxqAAA/6gAAP+oAAAmqQAALakAAEepAABRqQAAgKkAAIKpAACzqQAAs6kAALapAAC5qQAAvKkAAL2pAADPqQAAz6kAAOWpAADmqQAAKaoAAC6qAAAxqgAAMqoAADWqAAA2qgAAQ6oAAEOqAABMqgAATKoAAHCqAABwqgAAfKoAAHyqAACwqgAAsKoAALKqAAC0qgAAt6oAALiqAAC+qgAAv6oAAMGqAADBqgAA3aoAAN2qAADsqgAA7aoAAPOqAAD0qgAA9qoAAPaqAABbqwAAX6sAAGmrAABrqwAA5asAAOWrAADoqwAA6KsAAO2rAADtqwAAHvsAAB77AACy+wAAwvsAAAD+AAAP/gAAE/4AABP+AAAg/gAAL/4AAFL+AABS/gAAVf4AAFX+AAD//gAA//4AAAf/AAAH/wAADv8AAA7/AAAa/wAAGv8AAD7/AAA+/wAAQP8AAED/AABw/wAAcP8AAJ7/AACf/wAA4/8AAOP/AAD5/wAA+/8AAP0BAQD9AQEA4AIBAOACAQB2AwEAegMBAIAHAQCFBwEAhwcBALAHAQCyBwEAugcBAAEKAQADCgEABQoBAAYKAQAMCgEADwoBADgKAQA6CgEAPwoBAD8KAQDlCgEA5goBACQNAQAnDQEATg0BAE4NAQBpDQEAbQ0BAG8NAQBvDQEAqw4BAKwOAQD8DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQABEAEAARABADgQAQBGEAEAcBABAHAQAQBzEAEAdBABAH8QAQCBEAEAsxABALYQAQC5EAEAuhABAL0QAQC9EAEAwhABAMIQAQDNEAEAzRABAAARAQACEQEAJxEBACsRAQAtEQEANBEBAHMRAQBzEQEAgBEBAIERAQC2EQEAvhEBAMkRAQDMEQEAzxEBAM8RAQAvEgEAMRIBADQSAQA0EgEANhIBADcSAQA+EgEAPhIBAEESAQBBEgEA3xIBAN8SAQDjEgEA6hIBAAATAQABEwEAOxMBADwTAQBAEwEAQBMBAGYTAQBsEwEAcBMBAHQTAQC7EwEAwBMBAM4TAQDOEwEA0BMBANATAQDSEwEA0hMBAOETAQDiEwEAOBQBAD8UAQBCFAEARBQBAEYUAQBGFAEAXhQBAF4UAQCzFAEAuBQBALoUAQC6FAEAvxQBAMAUAQDCFAEAwxQBALIVAQC1FQEAvBUBAL0VAQC/FQEAwBUBANwVAQDdFQEAMxYBADoWAQA9FgEAPRYBAD8WAQBAFgEAqxYBAKsWAQCtFgEArRYBALAWAQC1FgEAtxYBALcWAQAdFwEAHRcBAB8XAQAfFwEAIhcBACUXAQAnFwEAKxcBAC8YAQA3GAEAORgBADoYAQA7GQEAPBkBAD4ZAQA+GQEAQxkBAEMZAQDUGQEA1xkBANoZAQDbGQEA4BkBAOAZAQABGgEAChoBADMaAQA4GgEAOxoBAD4aAQBHGgEARxoBAFEaAQBWGgEAWRoBAFsaAQCKGgEAlhoBAJgaAQCZGgEAMBwBADYcAQA4HAEAPRwBAD8cAQA/HAEAkhwBAKccAQCqHAEAsBwBALIcAQCzHAEAtRwBALYcAQAxHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARR0BAEcdAQBHHQEAkB0BAJEdAQCVHQEAlR0BAJcdAQCXHQEA8x4BAPQeAQAAHwEAAR8BADYfAQA6HwEAQB8BAEAfAQBCHwEAQh8BAFofAQBaHwEAMDQBAEA0AQBHNAEAVTQBAB5hAQApYQEALWEBAC9hAQDwagEA9GoBADBrAQA2awEAQGsBAENrAQBAbQEAQm0BAGttAQBsbQEAT28BAE9vAQCPbwEAn28BAOBvAQDhbwEA428BAORvAQDwrwEA868BAPWvAQD7rwEA/a8BAP6vAQCdvAEAnrwBAKC8AQCjvAEAAM8BAC3PAQAwzwEARs8BAGfRAQBp0QEAc9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAMOABAG3gAQCP4AEAj+ABADDhAQA94QEAruIBAK7iAQDs4gEA7+IBAOvkAQDv5AEA7uUBAO/lAQDQ6AEA1ugBAETpAQBL6QEA+/MBAP/zAQABAA4AAQAOACAADgB/AA4AAAEOAO8BDgBBAAAAWgAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALoAAAC6AAAAwAAAANYAAADYAAAA9gAAAPgAAAC6AQAAvAEAAL8BAADEAQAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcAMAAHMDAAB2AwAAdwMAAHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACKBAAALwUAADEFAABWBQAAYAUAAIgFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAADQEAAA+hAAAPwQAAD/EAAAoBMAAPUTAAD4EwAA/RMAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAAAAdAAC/HQAAAB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAvIQAANCEAADkhAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAH8hAACDIQAAhCEAALYkAADpJAAAACwAAOQsAADrLAAA7iwAAPIsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQKYAAG2mAACApgAAnaYAACKnAACHpwAAi6cAAI6nAACQpwAAzacAANCnAADRpwAA06cAANOnAADVpwAA3KcAAPKnAAD2pwAA+KcAAPqnAAAwqwAAWqsAAFyrAABpqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AABB/wAAWv8AAAAEAQBPBAEAsAQBANMEAQDYBAEA+wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCABwEAgAcBAIMHAQCFBwEAhwcBALAHAQCyBwEAugcBAIAMAQCyDAEAwAwBAPIMAQBQDQEAZQ0BAHANAQCFDQEAoBgBAN8YAQBAbgEAf24BAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAADfAQAJ3wEAC98BAB7fAQAl3wEAKt8BADDgAQBt4AEAAOkBAEPpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQBBAAAAWgAAALUAAAC1AAAAwAAAANYAAADYAAAA3wAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEkBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAAB/AQAAfwEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAARQMAAEUDAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAMIDAADCAwAAzwMAANEDAADVAwAA1gMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPADAADxAwAA9AMAAPUDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAIcFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA+BMAAP0TAACAHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACaHgAAmx4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAACAHwAArx8AALIfAAC0HwAAtx8AALwfAADCHwAAxB8AAMcfAADMHwAA2B8AANsfAADoHwAA7B8AAPIfAAD0HwAA9x8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAQQAAAFoAAABhAAAAegAAALUAAAC1AAAAwAAAANYAAADYAAAA9gAAAPgAAAA3AQAAOQEAAIwBAACOAQAAqQEAAKwBAAC5AQAAvAEAAL0BAAC/AQAAvwEAAMQBAAAgAgAAIgIAADMCAAA6AgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcAMAAHMDAAB2AwAAdwMAAHsDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAADRAwAA1QMAAPUDAAD3AwAA+wMAAP0DAACBBAAAigQAAC8FAAAxBQAAVgUAAGEFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD9EAAA/xAAAKATAAD1EwAA+BMAAP0TAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAAAHgAAmx4AAJ4eAACeHgAAoB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABOIQAATiEAAGAhAAB/IQAAgyEAAIQhAAC2JAAA6SQAAAAsAABwLAAAciwAAHMsAAB1LAAAdiwAAH4sAADjLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAECmAABtpgAAgKYAAJumAAAipwAAL6cAADKnAABvpwAAeacAAIenAACLpwAAjacAAJCnAACUpwAAlqcAAK6nAACwpwAAzacAANCnAADRpwAA1qcAANynAAD1pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AABB/wAAWv8AAAAEAQBPBAEAsAQBANMEAQDYBAEA+wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCADAEAsgwBAMAMAQDyDAEAUA0BAGUNAQBwDQEAhQ0BAKAYAQDfGAEAQG4BAH9uAQAA6QEAQ+kBAEEAAABaAAAAwAAAANYAAADYAAAA3gAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADFAQAAxwEAAMgBAADKAQAAywEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8gEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAAy6cAAMynAADQpwAA0KcAANanAADWpwAA2KcAANinAADapwAA2qcAANynAADcpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAUA0BAGUNAQCgGAEAvxgBAEBuAQBfbgEAAOkBACHpAQBhAAAAegAAALUAAAC1AAAA3wAAAPYAAAD4AAAA/wAAAAEBAAABAQAAAwEAAAMBAAAFAQAABQEAAAcBAAAHAQAACQEAAAkBAAALAQAACwEAAA0BAAANAQAADwEAAA8BAAARAQAAEQEAABMBAAATAQAAFQEAABUBAAAXAQAAFwEAABkBAAAZAQAAGwEAABsBAAAdAQAAHQEAAB8BAAAfAQAAIQEAACEBAAAjAQAAIwEAACUBAAAlAQAAJwEAACcBAAApAQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA3AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjAEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC5AQAAvQEAAL0BAAC/AQAAvwEAAMQBAADEAQAAxgEAAMcBAADJAQAAygEAAMwBAADMAQAAzgEAAM4BAADQAQAA0AEAANIBAADSAQAA1AEAANQBAADWAQAA1gEAANgBAADYAQAA2gEAANoBAADcAQAA3QEAAN8BAADfAQAA4QEAAOEBAADjAQAA4wEAAOUBAADlAQAA5wEAAOcBAADpAQAA6QEAAOsBAADrAQAA7QEAAO0BAADvAQAA8QEAAPMBAADzAQAA9QEAAPUBAAD5AQAA+QEAAPsBAAD7AQAA/QEAAP0BAAD/AQAA/wEAAAECAAABAgAAAwIAAAMCAAAFAgAABQIAAAcCAAAHAgAACQIAAAkCAAALAgAACwIAAA0CAAANAgAADwIAAA8CAAARAgAAEQIAABMCAAATAgAAFQIAABUCAAAXAgAAFwIAABkCAAAZAgAAGwIAABsCAAAdAgAAHQIAAB8CAAAfAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAAzAgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA+wMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYQUAAIcFAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACRpwAAkacAAJOnAACUpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA26cAANunAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BACLpAQBD6QEAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAANwEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAIwBAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAArQEAAK0BAACwAQAAsAEAALQBAAC0AQAAtgEAALYBAAC5AQAAuQEAAL0BAAC9AQAAvwEAAL8BAADFAQAAxgEAAMgBAADJAQAAywEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8gEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAjAgAAIwIAACUCAAAlAgAAJwIAACcCAAApAgAAKQIAACsCAAArAgAALQIAAC0CAAAvAgAALwIAADECAAAxAgAAMwIAADMCAAA8AgAAPAIAAD8CAABAAgAAQgIAAEICAABHAgAARwIAAEkCAABJAgAASwIAAEsCAABNAgAATQIAAE8CAABUAgAAVgIAAFcCAABZAgAAWQIAAFsCAABcAgAAYAIAAGECAABjAgAAZgIAAGgCAABsAgAAbwIAAG8CAABxAgAAcgIAAHUCAAB1AgAAfQIAAH0CAACAAgAAgAIAAIICAACDAgAAhwIAAIwCAACSAgAAkgIAAJ0CAACeAgAARQMAAEUDAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB7AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD7AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABhBQAAhwUAANAQAAD6EAAA/RAAAP8QAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAAC0HwAAth8AALcfAAC8HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AAMwfAADMHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAPwfAAD8HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACRpwAAkacAAJOnAACUpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA26cAANunAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BACLpAQBD6QEALQAAAC0AAACKBQAAigUAAL4FAAC+BQAAABQAAAAUAAAGGAAABhgAABAgAAAVIAAAUyAAAFMgAAB7IAAAeyAAAIsgAACLIAAAEiIAABIiAAAXLgAAFy4AABouAAAaLgAAOi4AADsuAABALgAAQC4AAF0uAABdLgAAHDAAABwwAAAwMAAAMDAAAKAwAACgMAAAMf4AADL+AABY/gAAWP4AAGP+AABj/gAADf8AAA3/AABuDQEAbg0BAK0OAQCtDgEArQAAAK0AAABPAwAATwMAABwGAAAcBgAAXxEAAGARAAC0FwAAtRcAAAsYAAAPGAAACyAAAA8gAAAqIAAALiAAAGAgAABvIAAAZDEAAGQxAAAA/gAAD/4AAP/+AAD//gAAoP8AAKD/AADw/wAA+P8AAKC8AQCjvAEAc9EBAHrRAQAAAA4A/w8OAEkBAABJAQAAcwYAAHMGAAB3DwAAdw8AAHkPAAB5DwAAoxcAAKQXAABqIAAAbyAAACkjAAAqIwAAAQAOAAEADgBeAAAAXgAAAGAAAABgAAAAqAAAAKgAAACvAAAArwAAALQAAAC0AAAAtwAAALgAAACwAgAATgMAAFADAABXAwAAXQMAAGIDAAB0AwAAdQMAAHoDAAB6AwAAhAMAAIUDAACDBAAAhwQAAFkFAABZBQAAkQUAAKEFAACjBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxAUAAEsGAABSBgAAVwYAAFgGAADfBgAA4AYAAOUGAADmBgAA6gYAAOwGAAAwBwAASgcAAKYHAACwBwAA6wcAAPUHAAAYCAAAGQgAAJgIAACfCAAAyQgAANIIAADjCAAA/ggAADwJAAA8CQAATQkAAE0JAABRCQAAVAkAAHEJAABxCQAAvAkAALwJAADNCQAAzQkAADwKAAA8CgAATQoAAE0KAAC8CgAAvAoAAM0KAADNCgAA/QoAAP8KAAA8CwAAPAsAAE0LAABNCwAAVQsAAFULAADNCwAAzQsAADwMAAA8DAAATQwAAE0MAAC8DAAAvAwAAM0MAADNDAAAOw0AADwNAABNDQAATQ0AAMoNAADKDQAAOg4AADoOAABHDgAATA4AAE4OAABODgAAug4AALoOAADIDgAAzA4AABgPAAAZDwAANQ8AADUPAAA3DwAANw8AADkPAAA5DwAAPg8AAD8PAACCDwAAhA8AAIYPAACHDwAAxg8AAMYPAAA3EAAANxAAADkQAAA6EAAAYxAAAGQQAABpEAAAbRAAAIcQAACNEAAAjxAAAI8QAACaEAAAmxAAAF0TAABfEwAAFBcAABUXAAA0FwAANBcAAMkXAADTFwAA3RcAAN0XAAA5GQAAOxkAAGAaAABgGgAAdRoAAHwaAAB/GgAAfxoAALAaAAC+GgAAwRoAAMsaAAA0GwAANBsAAEQbAABEGwAAaxsAAHMbAACqGwAAqxsAAOYbAADmGwAA8hsAAPMbAAA2HAAANxwAAHgcAAB9HAAA0BwAAOgcAADtHAAA7RwAAPQcAAD0HAAA9xwAAPkcAAAsHQAAah0AAMQdAADPHQAA9R0AAP8dAAC9HwAAvR8AAL8fAADBHwAAzR8AAM8fAADdHwAA3x8AAO0fAADvHwAA/R8AAP4fAADvLAAA8SwAAC8uAAAvLgAAKjAAAC8wAACZMAAAnDAAAPwwAAD8MAAAb6YAAG+mAAB8pgAAfaYAAH+mAAB/pgAAnKYAAJ2mAADwpgAA8aYAAACnAAAhpwAAiKcAAIqnAAD4pwAA+acAAAaoAAAGqAAALKgAACyoAADEqAAAxKgAAOCoAADxqAAAK6kAAC6pAABTqQAAU6kAALOpAACzqQAAwKkAAMCpAADlqQAA5akAAHuqAAB9qgAAv6oAAMKqAAD2qgAA9qoAAFurAABfqwAAaasAAGurAADsqwAA7asAAB77AAAe+wAAIP4AAC/+AAA+/wAAPv8AAED/AABA/wAAcP8AAHD/AACe/wAAn/8AAOP/AADj/wAA4AIBAOACAQCABwEAhQcBAIcHAQCwBwEAsgcBALoHAQA4CgEAOgoBAD8KAQA/CgEA5QoBAOYKAQAiDQEAJw0BAE4NAQBODQEAaQ0BAG0NAQD9DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQBGEAEARhABAHAQAQBwEAEAuRABALoQAQAzEQEANBEBAHMRAQBzEQEAwBEBAMARAQDKEQEAzBEBADUSAQA2EgEA6RIBAOoSAQA7EwEAPBMBAE0TAQBNEwEAZhMBAGwTAQBwEwEAdBMBAM4TAQDQEwEA0hMBANMTAQDhEwEA4hMBAEIUAQBCFAEARhQBAEYUAQDCFAEAwxQBAL8VAQDAFQEAPxYBAD8WAQC2FgEAtxYBACsXAQArFwEAORgBADoYAQA9GQEAPhkBAEMZAQBDGQEA4BkBAOAZAQA0GgEANBoBAEcaAQBHGgEAmRoBAJkaAQA/HAEAPxwBAEIdAQBCHQEARB0BAEUdAQCXHQEAlx0BAEEfAQBCHwEAWh8BAFofAQBHNAEAVTQBAC9hAQAvYQEA8GoBAPRqAQAwawEANmsBAGttAQBsbQEAj28BAJ9vAQDwbwEA8W8BAPCvAQDzrwEA9a8BAPuvAQD9rwEA/q8BAADPAQAtzwEAMM8BAEbPAQBn0QEAadEBAG3RAQBy0QEAe9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAMOABAG3gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDu5QEA7+UBANDoAQDW6AEAROkBAEbpAQBI6QEASukBACMAAAAjAAAAKgAAACoAAAAwAAAAOQAAAKkAAACpAAAArgAAAK4AAAA8IAAAPCAAAEkgAABJIAAAIiEAACIhAAA5IQAAOSEAAJQhAACZIQAAqSEAAKohAAAaIwAAGyMAACgjAAAoIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/8QEAAfIBAALyAQAa8gEAGvIBAC/yAQAv8gEAMvIBADryAQBQ8gEAUfIBAADzAQAh8wEAJPMBAJPzAQCW8wEAl/MBAJnzAQCb8wEAnvMBAPDzAQDz8wEA9fMBAPfzAQD99AEA//QBAD31AQBJ9QEATvUBAFD1AQBn9QEAb/UBAHD1AQBz9QEAevUBAIf1AQCH9QEAivUBAI31AQCQ9QEAkPUBAJX1AQCW9QEApPUBAKX1AQCo9QEAqPUBALH1AQCy9QEAvPUBALz1AQDC9QEAxPUBANH1AQDT9QEA3PUBAN71AQDh9QEA4fUBAOP1AQDj9QEA6PUBAOj1AQDv9QEA7/UBAPP1AQDz9QEA+vUBAE/2AQCA9gEAxfYBAMv2AQDS9gEA1fYBANf2AQDc9gEA5fYBAOn2AQDp9gEA6/YBAOz2AQDw9gEA8PYBAPP2AQD89gEA4PcBAOv3AQDw9wEA8PcBAAz5AQA6+QEAPPkBAEX5AQBH+QEA//kBAHD6AQB8+gEAgPoBAIn6AQCP+gEAxvoBAM76AQDc+gEA3/oBAOn6AQDw+gEA+PoBACMAAAAjAAAAKgAAACoAAAAwAAAAOQAAAA0gAAANIAAA4yAAAOMgAAAP/gAAD/4AAObxAQD/8QEA+/MBAP/zAQCw+QEAs/kBACAADgB/AA4A+/MBAP/zAQAdJgAAHSYAAPkmAAD5JgAACicAAA0nAACF8wEAhfMBAMLzAQDE8wEAx/MBAMfzAQDK8wEAzPMBAEL0AQBD9AEARvQBAFD0AQBm9AEAePQBAHz0AQB89AEAgfQBAIP0AQCF9AEAh/QBAI/0AQCP9AEAkfQBAJH0AQCq9AEAqvQBAHT1AQB19QEAevUBAHr1AQCQ9QEAkPUBAJX1AQCW9QEARfYBAEf2AQBL9gEAT/YBAKP2AQCj9gEAtPYBALb2AQDA9gEAwPYBAMz2AQDM9gEADPkBAAz5AQAP+QEAD/kBABj5AQAf+QEAJvkBACb5AQAw+QEAOfkBADz5AQA++QEAd/kBAHf5AQC1+QEAtvkBALj5AQC5+QEAu/kBALv5AQDN+QEAz/kBANH5AQDd+QEAw/oBAMX6AQDw+gEA+PoBABojAAAbIwAA6SMAAOwjAADwIwAA8CMAAPMjAADzIwAA/SUAAP4lAAAUJgAAFSYAAEgmAABTJgAAfyYAAH8mAACTJgAAkyYAAKEmAAChJgAAqiYAAKsmAAC9JgAAviYAAMQmAADFJgAAziYAAM4mAADUJgAA1CYAAOomAADqJgAA8iYAAPMmAAD1JgAA9SYAAPomAAD6JgAA/SYAAP0mAAAFJwAABScAAAonAAALJwAAKCcAACgnAABMJwAATCcAAE4nAABOJwAAUycAAFUnAABXJwAAVycAAJUnAACXJwAAsCcAALAnAAC/JwAAvycAABsrAAAcKwAAUCsAAFArAABVKwAAVSsAAATwAQAE8AEAz/ABAM/wAQCO8QEAjvEBAJHxAQCa8QEA5vEBAP/xAQAB8gEAAfIBABryAQAa8gEAL/IBAC/yAQAy8gEANvIBADjyAQA68gEAUPIBAFHyAQAA8wEAIPMBAC3zAQA18wEAN/MBAHzzAQB+8wEAk/MBAKDzAQDK8wEAz/MBANPzAQDg8wEA8PMBAPTzAQD08wEA+PMBAD70AQBA9AEAQPQBAEL0AQD89AEA//QBAD31AQBL9QEATvUBAFD1AQBn9QEAevUBAHr1AQCV9QEAlvUBAKT1AQCk9QEA+/UBAE/2AQCA9gEAxfYBAMz2AQDM9gEA0PYBANL2AQDV9gEA1/YBANz2AQDf9gEA6/YBAOz2AQD09gEA/PYBAOD3AQDr9wEA8PcBAPD3AQAM+QEAOvkBADz5AQBF+QEAR/kBAP/5AQBw+gEAfPoBAID6AQCJ+gEAj/oBAMb6AQDO+gEA3PoBAN/6AQDp+gEA8PoBAPj6AQCpAAAAqQAAAK4AAACuAAAAPCAAADwgAABJIAAASSAAACIhAAAiIQAAOSEAADkhAACUIQAAmSEAAKkhAACqIQAAGiMAABsjAAAoIwAAKCMAAIgjAACIIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAFJgAAByYAABImAAAUJgAAhSYAAJAmAAAFJwAACCcAABInAAAUJwAAFCcAABYnAAAWJwAAHScAAB0nAAAhJwAAIScAACgnAAAoJwAAMycAADQnAABEJwAARCcAAEcnAABHJwAATCcAAEwnAABOJwAATicAAFMnAABVJwAAVycAAFcnAABjJwAAZycAAJUnAACXJwAAoScAAKEnAACwJwAAsCcAAL8nAAC/JwAANCkAADUpAAAFKwAABysAABsrAAAcKwAAUCsAAFArAABVKwAAVSsAADAwAAAwMAAAPTAAAD0wAACXMgAAlzIAAJkyAACZMgAAAPABAP/wAQAN8QEAD/EBAC/xAQAv8QEAbPEBAHHxAQB+8QEAf/EBAI7xAQCO8QEAkfEBAJrxAQCt8QEA5fEBAAHyAQAP8gEAGvIBABryAQAv8gEAL/IBADLyAQA68gEAPPIBAD/yAQBJ8gEA+vMBAAD0AQA99QEARvUBAE/2AQCA9gEA//YBAHT3AQB/9wEA1fcBAP/3AQAM+AEAD/gBAEj4AQBP+AEAWvgBAF/4AQCI+AEAj/gBAK74AQD/+AEADPkBADr5AQA8+QEARfkBAEf5AQD/+gEAAPwBAP3/AQC3AAAAtwAAANACAADRAgAAQAYAAEAGAAD6BwAA+gcAAHEKAABxCgAA+woAAPsKAABVCwAAVQsAAEYOAABGDgAAxg4AAMYOAAAKGAAAChgAAEMYAABDGAAApxoAAKcaAAA2HAAANhwAAHscAAB7HAAABTAAAAUwAAAxMAAANTAAAJ0wAACeMAAA/DAAAP4wAAAVoAAAFaAAAAymAAAMpgAAz6kAAM+pAADmqQAA5qkAAHCqAABwqgAA3aoAAN2qAADzqgAA9KoAAHD/AABw/wAAgQcBAIIHAQBODQEATg0BAGoNAQBqDQEAbw0BAG8NAQA3EgEANxIBAF0TAQBdEwEA0hMBANMTAQDGFQEAyBUBAJgaAQCYGgEAQmsBAENrAQDgbwEA4W8BAONvAQDjbwEAPOEBAD3hAQDv5QEA7+UBAETpAQBG6QEAIAAAAH4AAACgAAAArAAAAK4AAAD/AgAAcAMAAHcDAAB6AwAAfwMAAIQDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAACCBAAAigQAAC8FAAAxBQAAVgUAAFkFAACKBQAAjQUAAI8FAAC+BQAAvgUAAMAFAADABQAAwwUAAMMFAADGBQAAxgUAANAFAADqBQAA7wUAAPQFAAAGBgAADwYAABsGAAAbBgAAHQYAAEoGAABgBgAAbwYAAHEGAADVBgAA3gYAAN4GAADlBgAA5gYAAOkGAADpBgAA7gYAAA0HAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMAHAADqBwAA9AcAAPoHAAD+BwAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAADAIAAA+CAAAQAgAAFgIAABeCAAAXggAAGAIAABqCAAAcAgAAI4IAACgCAAAyQgAAAMJAAA5CQAAOwkAADsJAAA9CQAAQAkAAEkJAABMCQAATgkAAFAJAABYCQAAYQkAAGQJAACACQAAggkAAIMJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAL8JAADACQAAxwkAAMgJAADLCQAAzAkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAOYJAAD9CQAAAwoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABACgAAWQoAAFwKAABeCgAAXgoAAGYKAABvCgAAcgoAAHQKAAB2CgAAdgoAAIMKAACDCgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAMAKAADJCgAAyQoAAMsKAADMCgAA0AoAANAKAADgCgAA4QoAAOYKAADxCgAA+QoAAPkKAAACCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAQAsAAEALAABHCwAASAsAAEsLAABMCwAAXAsAAF0LAABfCwAAYQsAAGYLAAB3CwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC/CwAAvwsAAMELAADCCwAAxgsAAMgLAADKCwAAzAsAANALAADQCwAA5gsAAPoLAAABDAAAAwwAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABBDAAARAwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAGYMAABvDAAAdwwAAIAMAACCDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL4MAADBDAAAwQwAAMMMAADEDAAA3QwAAN4MAADgDAAA4QwAAOYMAADvDAAA8QwAAPMMAAACDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAD8NAABADQAARg0AAEgNAABKDQAATA0AAE4NAABPDQAAVA0AAFYNAABYDQAAYQ0AAGYNAAB/DQAAgg0AAIMNAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAA0A0AANENAADYDQAA3g0AAOYNAADvDQAA8g0AAPQNAAABDgAAMA4AADIOAAAzDgAAPw4AAEYOAABPDgAAWw4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAsA4AALIOAACzDgAAvQ4AAL0OAADADgAAxA4AAMYOAADGDgAA0A4AANkOAADcDgAA3w4AAAAPAAAXDwAAGg8AADQPAAA2DwAANg8AADgPAAA4DwAAOg8AAEcPAABJDwAAbA8AAH8PAAB/DwAAhQ8AAIUPAACIDwAAjA8AAL4PAADFDwAAxw8AAMwPAADODwAA2g8AAAAQAAAsEAAAMRAAADEQAAA4EAAAOBAAADsQAAA8EAAAPxAAAFcQAABaEAAAXRAAAGEQAABwEAAAdRAAAIEQAACDEAAAhBAAAIcQAACMEAAAjhAAAJwQAACeEAAAxRAAAMcQAADHEAAAzRAAAM0QAADQEAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAGATAAB8EwAAgBMAAJkTAACgEwAA9RMAAPgTAAD9EwAAABQAAJwWAACgFgAA+BYAAAAXAAARFwAAHxcAADEXAAA1FwAANhcAAEAXAABRFwAAYBcAAGwXAABuFwAAcBcAAIAXAACzFwAAthcAALYXAAC+FwAAxRcAAMcXAADIFwAA1BcAANwXAADgFwAA6RcAAPAXAAD5FwAAABgAAAoYAAAQGAAAGRgAACAYAAB4GAAAgBgAAIQYAACHGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAACMZAAAmGQAAKRkAACsZAAAwGQAAMRkAADMZAAA4GQAAQBkAAEAZAABEGQAAbRkAAHAZAAB0GQAAgBkAAKsZAACwGQAAyRkAANAZAADaGQAA3hkAABYaAAAZGgAAGhoAAB4aAABVGgAAVxoAAFcaAABhGgAAYRoAAGMaAABkGgAAbRoAAHIaAACAGgAAiRoAAJAaAACZGgAAoBoAAK0aAAAEGwAAMxsAAD4bAABBGwAARRsAAEwbAABOGwAAahsAAHQbAAB/GwAAghsAAKEbAACmGwAApxsAAK4bAADlGwAA5xsAAOcbAADqGwAA7BsAAO4bAADuGwAA/BsAACscAAA0HAAANRwAADscAABJHAAATRwAAIocAACQHAAAuhwAAL0cAADHHAAA0xwAANMcAADhHAAA4RwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9xwAAPocAAD6HAAAAB0AAL8dAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAADEHwAAxh8AANMfAADWHwAA2x8AAN0fAADvHwAA8h8AAPQfAAD2HwAA/h8AAAAgAAAKIAAAECAAACcgAAAvIAAAXyAAAHAgAABxIAAAdCAAAI4gAACQIAAAnCAAAKAgAADAIAAAACEAAIshAACQIQAAKSQAAEAkAABKJAAAYCQAAHMrAAB2KwAAlSsAAJcrAADuLAAA8iwAAPMsAAD5LAAAJS0AACctAAAnLQAALS0AAC0tAAAwLQAAZy0AAG8tAABwLQAAgC0AAJYtAACgLQAApi0AAKgtAACuLQAAsC0AALYtAAC4LQAAvi0A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AMcFAAAQBgAAGgYAAEsGAABfBgAAcAYAAHAGAADWBgAA3AYAAN8GAADkBgAA5wYAAOgGAADqBgAA7QYAABEHAAARBwAAMAcAAEoHAACmBwAAsAcAAOsHAADzBwAA/QcAAP0HAAAWCAAAGQgAABsIAAAjCAAAJQgAACcIAAApCAAALQgAAFkIAABbCAAAlwgAAJ8IAADKCAAA4QgAAOMIAAACCQAAOgkAADoJAAA8CQAAPAkAAEEJAABICQAATQkAAE0JAABRCQAAVwkAAGIJAABjCQAAgQkAAIEJAAC8CQAAvAkAAL4JAAC+CQAAwQkAAMQJAADNCQAAzQkAANcJAADXCQAA4gkAAOMJAAD+CQAA/gkAAAEKAAACCgAAPAoAADwKAABBCgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAggoAALwKAAC8CgAAwQoAAMUKAADHCgAAyAoAAM0KAADNCgAA4goAAOMKAAD6CgAA/woAAAELAAABCwAAPAsAADwLAAA+CwAAPwsAAEELAABECwAATQsAAE0LAABVCwAAVwsAAGILAABjCwAAggsAAIILAAC+CwAAvgsAAMALAADACwAAzQsAAM0LAADXCwAA1wsAAAAMAAAADAAABAwAAAQMAAA8DAAAPAwAAD4MAABADAAARgwAAEgMAABKDAAATQwAAFUMAABWDAAAYgwAAGMMAACBDAAAgQwAALwMAAC8DAAAvwwAAMAMAADCDAAAwgwAAMYMAADIDAAAygwAAM0MAADVDAAA1gwAAOIMAADjDAAAAA0AAAENAAA7DQAAPA0AAD4NAAA+DQAAQQ0AAEQNAABNDQAATQ0AAFcNAABXDQAAYg0AAGMNAACBDQAAgQ0AAMoNAADKDQAAzw0AAM8NAADSDQAA1A0AANYNAADWDQAA3w0AAN8NAAAxDgAAMQ4AADQOAAA6DgAARw4AAE4OAACxDgAAsQ4AALQOAAC8DgAAyA4AAM4OAAAYDwAAGQ8AADUPAAA1DwAANw8AADcPAAA5DwAAOQ8AAHEPAAB+DwAAgA8AAIQPAACGDwAAhw8AAI0PAACXDwAAmQ8AALwPAADGDwAAxg8AAC0QAAAwEAAAMhAAADcQAAA5EAAAOhAAAD0QAAA+EAAAWBAAAFkQAABeEAAAYBAA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AFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8A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AAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA7hYAAPgWAAAAFwAAERcAAB8XAAAxFwAAQBcAAFEXAABgFwAAbBcAAG4XAABwFwAAgBcAALMXAADXFwAA1xcAANwXAADcFwAAIBgAAHgYAACAGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAAFAZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAAABoAABYaAAAgGgAAVBoAAKcaAACnGgAABRsAADMbAABFGwAATBsAAIMbAACgGwAArhsAAK8bAAC6GwAA5RsAAAAcAAAjHAAATRwAAE8cAABaHAAAfRwAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAAAB0AAL8dAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGCEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAACwAAOQsAADrLAAA7iwAAPIsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAIAtAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADOLQAA0C0AANYtAADYLQAA3i0AAAUwAAAHMAAAITAAACkwAAAxMAAANTAAADgwAAA8MAAAQTAAAJYwAACbMAAAnzAAAKEwAAD6MAAA/DAAAP8wAAAFMQAALzEAADExAACOMQAAoDEAAL8xAADwMQAA/zEAAAA0AAC/TQAAAE4AAIykAADQpAAA/aQAAAClAAAMpgAAEKYAAB+mAAAqpgAAK6YAAECmAABupgAAf6YA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AO/lAQDQ6AEA1ugBAETpAQBK6QEA+/MBAP/zAQAgAA4AfwAOAAABDgDvAQ4ADCAAAA0gAABADgAARA4AAMAOAADEDgAAtRkAALcZAAC6GQAAuhkAALWqAAC2qgAAuaoAALmqAAC7qgAAvKoAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALoAAAC6AAAA3wAAAPYAAAD4AAAA/wAAAAEBAAABAQAAAwEAAAMBAAAFAQAABQEAAAcBAAAHAQAACQEAAAkBAAALAQAACwEAAA0BAAANAQAADwEAAA8BAAARAQAAEQEAABMBAAATAQAAFQEAABUBAAAXAQAAFwEAABkBAAAZAQAAGwEAABsBAAAdAQAAHQEAAB8BAAAfAQAAIQEAACEBAAAjAQAAIwEAACUBAAAlAQAAJwEAACcBAAApAQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA4AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjQEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACqAQAAqwEAAK0BAACtAQAAsAEAALABAAC0AQAAtAEAALYBAAC2AQAAuQEAALoBAAC9AQAAvwEAAMYBAADGAQAAyQEAAMkBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACECAAAhAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAA5AgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAegMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA/AMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYAUAAIgFAADQEAAA+hAAAPwQAAD/EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYB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ALYhAAC3IQAAvCEAAM0hAADQIQAA0SEAANMhAADTIQAA1SEAANshAADdIQAA3SEAAOQhAADlIQAACCMAAAsjAAC0IwAAtSMAALcjAAC3IwAA0CMAANAjAADiIwAA4iMAAKAlAAChJQAAriUAALYlAAC8JQAAwCUAAMYlAADHJQAAyiUAAMslAADPJQAA0yUAAOIlAADiJQAA5CUAAOQlAADnJQAA7CUAAAUmAAAGJgAAQCYAAEAmAABCJgAAQiYAAGAmAABjJgAAbSYAAG4mAADFJwAAxicAAOYnAADvJwAAgykAAJgpAADYKQAA2ykAAPwpAAD9KQAAYf4AAGH+AABj/gAAY/4AAGj+AABo/gAAPP8AADz/AAA+/wAAPv8AAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAM7XAQD/1wEAAO4BAAPuAQAF7gEAH+4BACHuAQAi7gEAJO4BACTuAQAn7gEAJ+4BACnuAQAy7gEANO4BADfuAQA57gEAOe4BADvuAQA77gEAQu4BAELuAQBH7gEAR+4BAEnuAQBJ7gEAS+4BAEvuAQBN7gEAT+4BAFHuAQBS7gEAVO4BAFTuAQBX7gEAV+4BAFnuAQBZ7gEAW+4BAFvuAQBd7gEAXe4BAF/uAQBf7gEAYe4BAGLuAQBk7gEAZO4BAGfuAQBq7gEAbO4BAHLuAQB07gEAd+4BAHnuAQB87gEAfu4BAH7uAQCA7gEAie4BAIvuAQCb7gEAoe4BAKPuAQCl7gEAqe4BAKvuAQC77gEAYCEAAG8hAAC2JAAAzyQAADDxAQBJ8QEAUPEBAGnxAQBw8QEAifEBACEAAAAvAAAAOgAAAEAAAABbAAAAXgAAAGAAAABgAAAAewAAAH4AAAChAAAApwAAAKkAAACpAAAAqwAA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AD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADEAQAAxwEAAMcBAADKAQAAygEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8QEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAIkcAACJHAAAkBwAALocAAC9HAAAvxwAAAAeAAAAHgAAAh4AAAIeAAAEHgAABB4AAAYeAAAGHgAACB4AAAgeAAAKHgAACh4AAAweAAAMHgAADh4AAA4eAAAQHgAAEB4AABIeAAASHgAAFB4AABQeAAAWHgAAFh4AABgeAAAYHgAAGh4AABoeAAAcHgAAHB4AAB4eAAAeHgAAIB4AACAeAAAiHgAAIh4AACQeAAAkHgAAJh4AACYeAAAoHgAAKB4AACoeAAAqHgAALB4AACweAAAuHgAALh4AADAeAAAwHgAAMh4AADIeAAA0HgAANB4AADYeAAA2HgAAOB4AADgeAAA6HgAAOh4AADweAAA8HgAAPh4AAD4eAABAHgAAQB4AAEIeAABCHgAARB4AAEQeAABGHgAARh4AAEgeAABIHgAASh4AAEoeAABMHgAATB4AAE4eAABOHgAAUB4AAFAeAABSHgAAUh4AAFQeAABUHgAAVh4AAFYeAABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc1AEAntQBAJ/UAQCi1AEAotQBAKXUAQCm1AEAqdQBAKzUAQCu1AEAtdQBANDUAQDp1AEABNUBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQA41QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAbNUBAIXVAQCg1QEAudUBANTVAQDt1QEACNYBACHWAQA81gEAVdYBAHDWAQCJ1gEAqNYBAMDWAQDi1gEA+tYBABzXAQA01wEAVtcBAG7XAQCQ1wEAqNcBAMrXAQDK1wEAAOkBACHpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQALGAAADRgAAA8YAAAPGAAAAP4AAA/+AAAAAQ4A7wEOADAAAAA5AAAAQQAAAFoAAABfAAAAXwAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALcAAAC3AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB7AwAAfQMAAH8DAAB/AwAAhgMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIMEAACHBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0A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AP8GAAAQBwAAEAcAABIHAAAvBwAATQcAAKUHAACxBwAAsQcAAMoHAADqBwAA9AcAAPUHAAD6BwAA+gcAAAAIAAAVCAAAGggAABoIAAAkCAAAJAgAACgIAAAoCAAAQAgAAFgIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACgCAAAyQgAAAQJAAA5CQAAPQkAAD0JAABQCQAAUAkAAFgJAABhCQAAcQkAAIAJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAPAJAADxCQAA/AkAAPwJAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAFkKAABcCgAAXgoAAF4KAAByCgAAdAoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAAC9CgAA0AoAANAKAADgCgAA4QoAAPkKAAD5CgAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABWDQAAXw0AAGENAAB6DQAAfw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAAABDgAAMA4AADIOAAAyDgAAQA4AAEYOAACBDgAAgg4AAIQOAACEDgAAhg4AAIoOAACMDgAAow4A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AAoAAAD0WiQACAAAANgkIgAJAAAANFskANYAAABRJSIABQAAAORhJACWAAAAKyUiAA8AAACUZiQACgAAAD4lIgAOAAAA5GYkAAEAAAATJSIAEwAAAOxmJAAoAAAAkyUiABIAAAAsaCQAUAAAAHImIgAVAAAArGokAE4AAABWJiIACAAAABxtJAApAAAA8CYiAA0AAABkbiQAfgMAAB8nIgAPAAAAVIokAHcBAAA6JyIADQAAAAyWJAA6AAAAgSciAAkAAADclyQABgAAAJsnIgAGAAAADJgkAAoAAAAyKCIAEwAAAFyYJAADAAAAWigiABQAAAB0mCQAAQAAAIsoIgASAAAAfJgkAAEAAADDJyIAFwAAAISYJAASAAAA6yciABQAAAAUmSQADQAAAKQnIgALAAAAfJkkABkDAAAmKCIACAAAAESyJAClAgAADSgiAAsAAABsxyQAFQAAABTIJAAEAAAAGMgkAI4BAAB5KSIADAAAAIjUJAABAAAAJSsiABcAAACQ1CQABwAAAFYrIgAJAAAAyNQkAKMCAAB8KyIABAAAAODpJACLAAAAgysiABcAAAA47iQACQAAAN4rIgAXAAAAgO4kABIAAAAaLSIAEAAAABDvJAD6AAAANS0iACIAAADg9iQACwAAAF0tIgAVAAAAOPckADEAAAB2LSIAEQAAAMD4JAAHAAAAiy0iAA4AAAD4+CQABAAAAJ8tIgAPAAAAGPkkABwAAACzLSIACgAAAPj5JACGAAAAPS4iAA8AAAAo/iQABQAAAFguIgAOAAAAUP4kABwAAACELiIAEwAAADD/JAAFAAAAny4iABwAAABY/yQABwAAANouIgAOAAAAkP8kAA0AAAD8LiIABwAAAPj/JAADAAAAFC8iABIAAAAQACUAAQAAAH0vIgARAAAAGAAlAFgAAABVLyIACwAAANgCJQAiAAAAazAiABQAAADoAyUAdAAAALowIgARAAAAiAclABEAAAAAMSIACQAAABAIJQCQAgAANjEiABIAAACQHCUABAAAAD4wIgALAAAAtBwiAAoAAACSMSIADAAAALAcJQAgAwAArTEiAAkAAACwNSUArAIAAA0AAAANAAAAAAAAAAkAAAALAAAADAAAAA4AAAAfAAAAfwAAAJ8AAACtAAAArQAAABwGAAAcBgAADhgAAA4YAAALIAAACyAAAA4gAAAPIAAAKCAAAC4gAABgIAAAbyAAAP/+AAD//gAA8P8AAPv/AAAwNAEAPzQBAKC8AQCjvAEAc9EBAHrRAQAAAA4AHwAOAIAADgD/AA4A8AEOAP8PDgAAAwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACXCAAAnwgAAMoIAADhCAAA4wgAAAIJAAA6CQAAOgkAADwJAAA8CQAAQQkAAEgJAABNCQAATQkAAFEJAABXCQAAYgkAAGMJAACBCQAAgQkAALwJAAC8CQAAvgkAAL4JAADBCQAAxAkAAM0JAADNCQAA1wkAANcJAADiCQAA4wkAAP4JAAD+CQAAAQoAAAIKAAA8CgAAPAoAAEEKAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAcAoAAHEKAAB1CgAAdQoAAIEKAACCCgAAvAoAALwKAADBCgAAxQoAAMcKAADICgAAzQoAAM0KAADiCgAA4woAAPoKAAD/CgAAAQsAAAELAAA8CwAAPAsAAD4LAAA/CwAAQQsAAEQLAABNCwAATQsAAFULAABXCwAAYgsAAGMLAACCCwAAggsAAL4LAAC+CwAAwAsAAMALAADNCwAAzQsAANcLAADXCwAAAAwAAAAMAAAEDAAABAwAADwMAAA8DAAAPgwAAEAMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABiDAAAYwwAAIEMAACBDAAAvAwAALwMAAC/DAAAwAwAAMIMAADCDAAAxgwAAMgMAADKDAAAzQwAANUMAADWDAAA4gwAAOMMAAAADQAAAQ0AADsNAAA8DQAAPg0AAD4NAABBDQAARA0AAE0NAABNDQAAVw0AAFcNAABiDQAAYw0AAIENAACBDQAAyg0AAMoNAADPDQAAzw0AANINAADUDQAA1g0AANYNAADfDQAA3w0AADEOAAAxDgAANA4AADoOAABHDgAATg4AALEOAACxDgAAtA4A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AEcdAQCQHQEAkR0BAJUdAQCVHQEAlx0BAJcdAQDzHgEA9B4BAAAfAQABHwEANh8BADofAQBAHwEAQh8BAFofAQBaHwEAQDQBAEA0AQBHNAEAVTQBAB5hAQApYQEALWEBAC9hAQDwagEA9GoBADBrAQA2awEAT28BAE9vAQCPbwEAkm8BAORvAQDkbwEA8G8BAPFvAQCdvAEAnrwBAADPAQAtzwEAMM8BAEbPAQBl0QEAadEBAG3RAQBy0QEAe9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBAO7lAQDv5QEA0OgBANboAQBE6QEASukBAPvzAQD/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/QAABR0AAAa9AAAG3QAACH0AAAidAAAKPQAACl0AAAv9AA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AC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAAuAIAAMACAADBAgAA4AIAAOQCAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB6AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD8AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABgBQAAiAUAAPwQAAD8EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacA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AHsBAAB9AQAAfQEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANIDAADUAwAA2AMAANgDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADiAwAA5AMAAOQDAADmAwAA5gMAAOgDAADoAwAA6gMAAOoDAADsAwAA7AMAAO4DAADuAwAA9AMAAPQDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAKATAAD1EwAAiRwAAIkcAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADLpwAAzKcAANCnAADQpwAA1qcAANanAADYpwAA2KcAANqnAADapwAA3KcAANynAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQBQDQEAZQ0BAKAYAQC/GAEAQG4BAF9uAQAA1AEAGdQBADTUAQBN1AEAaNQBAIHUAQCc1AEAnNQB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AID5JgABAAAAb25lIG9mIC4wAAAAegUAAAwAAAAEAAAAewUAAHwFAAB9BQAAAAAAAAAAAAABAAAAzAMAACQEJwBPAAAAOQYAABQAAAAkBCcATwAAADkGAAAhAAAAJAQnAE8AAAAtBgAAFAAAACQEJwBPAAAALQYAACEAAAAzCycASwAAADIIAAAeAAAAJAQnAE8AAAC6BAAAJAAAAEVPRiB3aGlsZSBwYXJzaW5nIGEgbGlzdEVPRiB3aGlsZSBwYXJzaW5nIGFuIG9iamVjdEVPRiB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nRU9GIHdoaWxlIHBhcnNpbmcgYSB2YWx1ZWV4cGVjdGVkIGA6YGV4cGVjdGVkIGAsYCBvciBgXWBleHBlY3RlZCBgLGAgb3IgYH1gZXhwZWN0ZWQgaWRlbnRleHBlY3RlZCB2YWx1ZWV4cGVjdGVkIGAiYGludmFsaWQgZXNjYXBlaW52YWxpZCBudW1iZXJudW1iZXIgb3V0IG9mIHJhbmdlaW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnRjb250cm9sIGNoYXJhY3RlciAoXHUwMDAwLVx1MDAxRikgZm91bmQgd2hpbGUgcGFyc2luZyBhIHN0cmluZ2tleSBtdXN0IGJlIGEgc3RyaW5naW52YWxpZCB2YWx1ZTogZXhwZWN0ZWQga2V5IHRvIGJlIGEgbnVtYmVyIGluIHF1b3Rlc2Zsb2F0IGtleSBtdXN0IGJlIGZpbml0ZSAoZ290IE5hTiBvciArLy1pbmYpbG9uZSBsZWFkaW5nIHN1cnJvZ2F0ZSBpbiBoZXggZXNjYXBldHJhaWxpbmcgY29tbWF0cmFpbGluZyBjaGFyYWN0ZXJzdW5leHBlY3RlZCBlbmQgb2YgaGV4IGVzY2FwZXJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZCBhdCBsaW5lICBjb2x1bW4gAAAAAQAAAAAAAACkISYACQAAAK0hJgAIAAAARXJyb3IoLCBsaW5lOiAsIGNvbHVtbjog0CEmAAYAAADWISYACAAAAN4hJgAKAAAA3IEnAAEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL2Vycm9yLnJzCCImAGQAAAD3AQAAIQAAAAgiJgBkAAAA+wEAAAwAAAAIIiYAZAAAAAICAAAhAAAACCImAGQAAAALAgAAKgAAAAgiJgBkAAAADwIAACwAAAB6BQAADAAAAAQAAAB7BQAAfAUAAH0FAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAA1CImAA4AAADiIiYACwAAAAAAAAAAAAAAAQAAAH4FAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5ycxAjJgBoAAAANQAAAA4AAAAAAAAAAAAAAAEAAABVBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5yc5gjJgBkAAAAKwAAACsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvYm94ZWQucnMADCQmAGMAAABBAAAADgAAAAwkJgBjAAAAdgAAACQAAAA6IAAAAAAAAAQAAAAEAAAAfwUAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjgvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZACkJCYAKQAAAKwEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAApCQmACkAAACyBAAADQAAAHVzZSBvZiBzdGQ6OnRocmVhZDo6Y3VycmVudCgpIGlzIG5vdCBwb3NzaWJsZSBhZnRlciB0aGUgdGhyZWFkJ3MgbG9jYWwgZGF0YSBoYXMgYmVlbiBkZXN0cm95ZWQAAEwlJgBeAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9jdXJyZW50LnJzAAAAtCUmACEAAAABAQAACQAAAEFjY2Vzc0Vycm9yY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbjogAPMlJgBIAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkYSYmADcAAABEJiYAHQAAAKkEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAAsCYmACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnN1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UA5CYmABwAAACKAQAAHQAAAIAFAAAQAAAABAAAAIEFAACCBQAAV291bGRCbG9ja2VudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yT3Njb2RlS2luZEN1c3RvbSAob3MgZXJyb3IgAAABAAAAAAAAAFMqJgALAAAA3IEnAAEAAABsaWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwB4KiYAFwAAANMCAAAhAAAAeComABcAAAD6AgAALAAAAHgqJgAXAAAA/AIAACYAAAB4KiYAFwAAAAkDAAAnAAAAeComABcAAAAVAwAAJwAAAHgqJgAXAAAAfwMAACkAAAB4KiYAFwAAAIADAAArAAAAeComABcAAACVAwAALwAAAHgqJgAXAAAAjQMAAC8AAAB4KiYAFwAAAJsDAAArAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMwKyYALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAbCsmACMAAADWAAAAFAAAADx1bmtub3duPu+/vWxpYnJhcnkvc3RkL3NyYy8uLi8uLi9iYWNrdHJhY2Uvc3JjL3N5bWJvbGl6ZS9tb2QucnOsKyYANAAAAGcBAAAwAAAAAQAAAAAAAACQJCYAAgAAAAIAAAAAAAAAAAAEAAAAAAAAAAAAIAAA6CAtIAABAAAAAAAAABgsJgADAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAgAADoICAgICAgICAgICAgICAgICAgIGF0IAAAQwgnAAEAAABOb3RGb3VuZFBlcm1pc3Npb25EZW5pZWRDb25uZWN0aW9uUmVmdXNlZENvbm5lY3Rpb25SZXNldEhvc3RVbnJlYWNoYWJsZU5ldHdvcmtVbnJlYWNoYWJsZUNvbm5lY3Rpb25BYm9ydGVkTm90Q29ubmVjdGVkQWRkckluVXNlQWRkck5vdEF2YWlsYWJsZU5ldHdvcmtEb3duQnJva2VuUGlwZUFscmVhZHlFeGlzdHNOb3RBRGlyZWN0b3J5SXNBRGlyZWN0b3J5RGlyZWN0b3J5Tm90RW1wdHlSZWFkT25seUZpbGVzeXN0ZW1GaWxlc3lzdGVtTG9vcFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVJbnZhbGlkSW5wdXRJbnZhbGlkRGF0YVRpbWVkT3V0V3JpdGVaZXJvU3RvcmFnZUZ1bGxOb3RTZWVrYWJsZVF1b3RhRXhjZWVkZWRGaWxlVG9vTGFyZ2VSZXNvdXJjZUJ1c3lFeGVjdXRhYmxlRmlsZUJ1c3lEZWFkbG9ja0Nyb3NzZXNEZXZpY2VzVG9vTWFueUxpbmtzSW52YWxpZEZpbGVuYW1lQXJndW1lbnRMaXN0VG9vTG9uZ0ludGVycnVwdGVkVW5zdXBwb3J0ZWRVbmV4cGVjdGVkRW9mT3V0T2ZNZW1vcnlJblByb2dyZXNzT3RoZXJVbmNhdGVnb3JpemVkb3BlcmF0aW9uIHN1Y2Nlc3NmdWxPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAIwuJgAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHnALiYAOAAAAIMFAAAMAAAABAAAAIQFAACFBQAAhgUAAAAAAAAAAAAAAQAAAMwDAAAAAAAABAAAAAQAAACHBQAAAAAAAAAAAAABAAAAiQUAAIoFAACLBQAAuP0mAGgAAAAEAQAAIAAAALj9JgBoAAAAJQEAACcAAAC4/SYAaAAAACoBAAA0AAAAuP0mAGgAAABKAQAAMQAAADogYnBvcyA9IDsgbGluZWJwb3MgPSAAAAEAAAAAAAAAkC8mAAkAAACZLyYADQAAAIwdJwABAAAAuP0mAGgAAABLAQAAEQAAALj9JgBoAAAAYQEAABkAAAC4/SYAaAAAAIMBAABGAAAAuP0mAGgAAADeAwAANQAAALj9JgBoAAAA5QMAADYAAABtYXAuc3RhcnRfcG9zID0gOyB0b3RhbF9leHRyYV9ieXRlcyA9IDsgYnBvcyA9IAAYMCYAEAAAACgwJgAWAAAAPjAmAAkAAAC4/SYAaAAAAOwDAAAJAAAAuP0mAGgAAAAZBAAAEAAAALj9JgBoAAAAygQAADAAAAC4/SYAaAAAALYEAAAwAAAAuP0mAGgAAACnBQAAEAAAAG5vIGVycm9ycyBlbmNvdW50ZXJlZCBldmVuIHRob3VnaCBgZGVsYXlfc3Bhbl9idWdgIGlzc3VlZAAAALAwJgA5AAAAnDomAGgAAACaAQAAEQAAAGVuY291bnRlcmVkIGVycm9yIHdpdGggYC1aIHRyZWF0X2Vycl9hc19idWcABDEmACsAAACcOiYAaAAAAGcCAAANAAAAFgAAAE1lc3NhZ2VTdWJEaWFnbm9zdGljbGV2ZWxyZW5kZXJfc3BhbkJ1Z0ZhdGFsUGhhc2VGYXRhbFdhcm5pbmdOb3RlSGVscENhbmNlbGxlZEZhaWx1cmVOb3RlL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNC4wLjQvc3JjL2Vycm9ycy9kaWFnbm9zdGljX2J1aWxkZXIucnNFcnJvciBjb25zdHJ1Y3RlZCBidXQgbm90IGVtaXR0ZWQAAAClMSYAdwAAAF0BAAANAAAAAAAAAAAAAAABAAAAjAUAAI0FAACOBQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdW5pY29kZS13aWR0aC0wLjEuMTQvc3JjL3RhYmxlcy5ycwBoMiYAZwAAAJEAAAAVAAAAaDImAGcAAACXAAAAGQAAAAAAAAAMAAAABAAAAI8FAACQBQAAAAAAAAwAAAAEAAAAkQUAAJIFAABhc3NlcnRpb24gZmFpbGVkOiBzdGFydCA8PSBlbmQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfY29tbW9uLTE0LjAuNC9zcmMvaW5wdXQucnMAAAA2MyYAYwAAAB8AAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc291cmNlX2ZpbGVfZW5kID49IGxhc3RfbGluZV9zdGFydC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTQuMC40L3NyYy9zeW50YXhfcG9zL2FuYWx5emVfc291cmNlX2ZpbGUucnPgMyYAfAAAACoAAAAJAAAA4DMmAHwAAABqAAAAGAAAAOAzJgB8AAAAagAAAC0AAADgMyYAfAAAAHUAAAAiAAAA4DMmAHwAAAB9AAAAIgAAAOAzJgB8AAAAVQAAAB8AAADgMyYAfAAAAFkAAAAbAAAA4DMmAHwAAABdAAAAGwAAAOAzJgB8AAAAYAAAACYAAADgMyYAfAAAAGMAAAAmAAAAAAAAAAQAAAAEAAAAkwUAAAAAAAAEAAAABAAAAAkBAAABAAAAAAAAAKDoJgACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNC4wLjQvc3JjL3N5bnRheF9wb3MucnMgbWFjcm9zPkT+JgABAAAAlDUmAAgAAAA8cXVvdGUgZXhwYW5zaW9uPgAAAKw1JgARAAAAPGFub24+AADINSYABgAAADxtYWNybyBleHBhbnNpb24+AAAA2DUmABEAAAA8cHJvYy1tYWNybyBzb3VyY2UgY29kZT70NSYAGAAAAET+JgABAAAAQ/4mAAEAAAAsNSYAaAAAAFMCAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9pbmRleCA8IGFuYWx5c2lzLmxpbmVzLmxlbigpIGFzIGlzaXplLDUmAGgAAACpAwAACQAAABUAAABQcmltYXJ5U3BhbkxhYmVsTXVsdGlTcGFucHJpbWFyeV9zcGFuc3NwYW5fbGFiZWxzQnl0ZVBvc01haW5IZWFkZXJNc2dIZWFkZXJNc2dMaW5lQW5kQ29sdW1uTGluZU51bWJlclF1b3RhdGlvblVuZGVybGluZVByaW1hcnlVbmRlcmxpbmVTZWNvbmRhcnlMYWJlbFByaW1hcnlMYWJlbFNlY29uZGFyeU9sZFNjaG9vbE5vdGVUZXh0Tm9TdHlsZUxldmVsSGlnaGxpZ2h0b3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybVQ3JgAoAAAAJAAAAAIAAAB8NyYAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXiQNyYAIAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJzuDcmAFwAAAATAAAACQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9wYXRoLnJzACQ4JgBHAAAAuAwAABsAAAAkOCYARwAAANsMAAAhAAAAJDgmAEcAAADODAAAIgAAAMWVJgBwAAAAaQEAAA0AAAA8/yYAAQAAAE1hcmsAAAAAAAAAAAEAAABzBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNC4wLjQvc3JjL2NvbW1lbnRzLnJzAADIOCYAZgAAAKcBAAAWAAAAyDgmAGYAAACnAQAAOwAAAMg4JgBmAAAArAEAAA4AAADIOCYAZgAAALMBAAAnAAAAyDgmAGYAAAC/AQAAMgAAAMg4JgBmAAAAxwEAABYAAADIOCYAZgAAAMsBAAAWAAAAyDgmAGYAAADPAQAAFwAAAMg4JgBmAAAAzwEAADwAAADIOCYAZgAAANQBAAAOAAAAyDgmAGYAAADbAQAAKAAAAMg4JgBmAAAA5wEAADMAAADIOCYAZgAAAO8BAAAXAAAAyDgmAGYAAADzAQAAFwAAAAAAAADIOCYAZgAAAPkBAAAsAAAAyDgmAGYAAAACAgAAFQAAAGNhbm5vdCBhZGQgcHVyZSBjb21tZW50IHRvIHplcm8gcG9zaXRpb240OiYAKAAAAMg4JgBmAAAA9wEAAAkAAAAjX19AX19fX8g4JgBmAAAAMQIAAC0AAADIOCYAZgAAAGUCAAAuAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNC4wLjQvc3JjL2Vycm9ycy9tb2QucnOcOiYAaAAAAFoDAAAfAAAAxZUmAHAAAACFAAAAEwAAAMWVJgBwAAAAzQAAAB0AAADFlSYAcAAAAHQBAAAhAAAAAAAAAAcAAAAUAAAAGgAAAAEAAAAAAAAAEgAAAAoAAAAAAAAAHgAAAAEAAAAMAAAAAQAAAAoAAAAaAAAACAAAACH/JgAIAAAAGPEmAAMAAADJ/iYABQAAAML7JgAGAAAAxf4mAAQAAAAg9CYABQAAABnyJgAGAAAA5P4mAAcAAACtAycABAAAAL7+JgAHAAAAGf8mAAgAAADV/iYABQAAALL+JgACAAAAtP4mAAQAAAA2+SYAAwAAAIb6JgAGAAAAGPUmAAUAAAC4/iYAAwAAABL/JgAFAAAAsQMnAAQAAACoAycABQAAADv5JgAFAAAADP8mAAYAAABE+yYACAAAAGP5JgAGAAAAFJUmAAcAAADX+SYABAAAAOD+JgAEAAAAshInAAoAAAC7/iYAAwAAALASJwACAAAAQPkmAAQAAABc+SYABwAAANr+JgAGAAAAvBInAAQAAADQ/iYABQAAABf/JgACAAAAAAAAAEQ7JgAIAAAAhDsmACUAAAAnyz3b0YA3swMAAAAEAAAAAgAAAAAAAAAUlSYABwAAABvxJgADAAAACPImAAoAAAClFycABgAAAFL5JgAHAAAAqxcnAAYAAABJ+SYACQAAAJwXJwAJAAAACQInAAUAAADIPCYAAgAAANg8JgAJAAAAJ8s929GAN7MAAAAAAAAAAGT2JgAEAAAA2sgmAAkAAAA4PSYAAQAAAEA9JgACAAAAjX+5rjQzqdYvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9waGZfc2hhcmVkLTAuMTEuMy9zcmMvbGliLnJzAAAAaD0mAGEAAAA7AAAABQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2FzdC0xNS4wLjAvc3JjL2xpc3QucnPcPSYAZAAAAMUAAAASAAAA3D0mAGQAAADPAAAAEgAAAAAAAAAMAAAABAAAAJwFAACdBQAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkAAAAAAAAAAAAAAMAAAAAAAAAAAAEAAADMAwAAngUAAAwAAAAEAAAAnwUAAGZtdDo6RGlzcGxheSBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCEvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jb21wYWN0X3N0ci0wLjcuMS9zcmMvdHJhaXRzLnJzAAAAjT8mAGQAAABoAAAAKQAAAFxcbnxcbgAAkPQmAGcAAACDAAAAWwAAAHhDJgACAAAAn0ImAAIAAACQ9CYAZwAAAPYDAAAxAAAAoUImAAQAAACQ9CYAZwAAAPUDAABBAAAAkPQmAGcAAAAHBAAAMQAAAJD0JgBnAAAA/gMAADsAAACcQyYAAwAAAJD0JgBnAAAA+AMAADgAAABcdTAwMDAAAIxAJgAGAAAAXHUwMJxAJgAEAAAAIlx1AKhAJgADAAAA1kImAAIAAABI5yYAAQAAAEjnJgABAAAASOcmAAEAAABcAFxBdHRlbXB0ZWQgdG8gcmVzZXJ2ZSBtb3JlIHRoYW4gJ3VzaXplJyBieXRlcy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2NvbXBhY3Rfc3RyLTAuNy4xL3NyYy9yZXByL21vZC5ycwAAAANBJgBmAAAA8wAAAA4AAAADQSYAZgAAAEIBAAAlAAAAdmFsaWQgY2FwYWNpdHkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9jb21wYWN0X3N0ci0wLjcuMS9zcmMvcmVwci9oZWFwLnJzAAAAmkEmAGcAAACpAQAAQgAAAIMFAAAMAAAABAAAAKEFAACiBQAAhgUAAAAAAAAAAAAAAQAAAMwDAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobmV3X2xlbikzCycASwAAALUFAAANAAAATGF5b3V0RXJyb3IAkPEmAGcAAAC7AAAAGQAAAC9zY3JpcHRcMFx4MDBcdgB7AAAARAAAAGQAAACQ8SYAZwAAAMcBAAA5AAAAXHUyMDI4XHUyMDI5XHVGRUZGXHXWQiYAAgAAAAIAAAAAAAAAAAAEAAAAAAAAAAAAIAAA6ZDxJgBnAAAACQIAAD0AAADGAycAAwAAAEgIJwABAAAAkPEmAGcAAAAEAgAARQAAANZCJgACAAAA1kImAAIAAAACAAAAAAAAAAAABAAAAAAAAAAAACAAAOkCAAAAAAAAAAAABAAAAAAAAQAAACAAAOmQ8SYAZwAAAAICAABCAAAAXHgAAJDxJgBnAAAA8wEAADcAAACQ8SYAZwAAAO0BAAAzAAAAXHgwAJDxJgBnAAAA6QEAADMAAAACAAAAAAAAAAIAAAAAAAAAAAAAACAAAOACAAAAAAAAAAIAAAAAAAAAAQAAACAAgOAwLgAAQP4mAAEAAACQ8SYAZwAAADcCAAAqAAAAZS0AAAEAAAAAAAAA/EMmAAIAAAAtMC4tLgAAABNEJgACAAAAkPEmAGcAAAA/AgAAKwAAAGr5JgABAAAA/EMmAAIAAAAwMDAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjUvc3JjL2FyY2gvYWxsL3BhY2tlZHBhaXIvbW9kLnJzAENEJgBwAAAAwwAAAAkAAAAjX19QVVJFX18AAAAAAAAADAAAAAQAAACjBQAApAUAAKoFAAAMAAAABAAAAEsCAACrBQAADAAAAAQAAACsBQAArQUAAAQAAAAEAAAAmwEAAAAAAAABAAAAAQAAACAAAACuBQAABAAAAAQAAADnAQAArwUAAAQAAAAEAAAARgEAAAAAAAAEAAAABAAAALAFAACxBQAAGAAAAAgAAABaAQAAsgUAAAwAAAAEAAAAswUAALQFAAAYAAAABAAAALUFAAC2BQAAIAAAAAgAAAAeAgAAAAAAAAQAAAAEAAAAtwUAALgFAAAMAAAABAAAALkFAAAAAAAABAAAAAQAAAC6BQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL29wcy5ycwAAAMRFJgBhAAAAegAAADsAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL2NoYXIvbWV0aG9kcy5yczhGJgBQAAAAEgcAAAkAAAAAAAAAAQAAAAEAAABkBQAAAAAAAAQAAAAEAAAAAgIAALsFAAAMAAAABAAAALwFAAC9BQAABAAAAAQAAAC+BQAAAAAAAAEAAAABAAAAIAAAAK4FAAAEAAAABAAAAOcBAAC/BQAABAAAAAQAAABNAQAAwAUAAAwAAAAEAAAAwQUAAMIFAAAEAAAABAAAAMMFAABmYWlsZWQgdG8gcGFyc2Ugc3RyaW5nIGFzIG51bWJlcoCEJgByAAAAsAMAAC8AAABmYWlsZWQgdG8gcGFyc2UgbnVtYmVyIGFzIGNoYXIAAICEJgByAAAAsgMAAA4AAABtZXNzYWdlcXVvdGFtcGFwb3NsdGd0bmJzcGlleGNsY2VudHBvdW5kY3VycmVueWVuYnJ2YmFyc2VjdHVtbGNvcHlvcmRmbGFxdW9ub3RzaHlyZWdtYWNyZGVncGx1c21uc3VwMnN1cDNhY3V0ZW1pY3JvcGFyYW1pZGRvdGNlZGlsc3VwMW9yZG1yYXF1b2ZyYWMxNGZyYWMxMmZyYWMzNGlxdWVzdEFncmF2ZUFhY3V0ZUFjaXJjQXRpbGRlQXVtbEFyaW5nQUVsaWdDY2VkaWxFZ3JhdmVFYWN1dGVFY2lyY0V1bWxJZ3JhdmVJYWN1dGVJY2lyY0l1bWxFVEhOdGlsZGVPZ3JhdmVPYWN1dGVPY2lyY090aWxkZU91bWx0aW1lc09zbGFzaFVncmF2ZVVhY3V0ZVVjaXJjVXVtbFlhY3V0ZVRIT1JOc3psaWdhZ3JhdmVhYWN1dGVhY2lyY2F0aWxkZWF1bWxhcmluZ2FlbGlnY2NlZGlsZWdyYXZlZWFjdXRlZWNpcmNldW1saWdyYXZlaWFjdXRlaWNpcmNpdW1sZXRobnRpbGRlb2dyYXZlb2FjdXRlb2NpcmNvdGlsZGVvdW1sZGl2aWRlb3NsYXNodWdyYXZldWFjdXRldWNpcmN1dW1seWFjdXRldGhvcm55dW1sT0VsaWdvZWxpZ1NjYXJvbnNjYXJvbll1bWxmbm9mY2lyY3RpbGRlQWxwaGFCZXRhR2FtbWFEZWx0YUVwc2lsb25aZXRhRXRhVGhldGFJb3RhS2FwcGFMYW1iZGFNdU51WGlPbWljcm9uUGlSaG9TaWdtYVRhdVVwc2lsb25QaGlDaGlQc2lPbWVnYWFscGhhYmV0YWdhbW1hZGVsdGFlcHNpbG9uemV0YWV0YXRoZXRhaW90YWthcHBhbGFtYmRhbXVudXhpb21pY3JvbnBpcmhvc2lnbWFmc2lnbWF0YXV1cHNpbG9ucGhpY2hpcHNpb21lZ2F0aGV0YXN5bXVwc2locGl2ZW5zcGVtc3B0aGluc3B6d25qendqbHJtcmxtbmRhc2htZGFzaGxzcXVvcnNxdW9zYnF1b2xkcXVvcmRxdW9iZHF1b2RhZ2dlckRhZ2dlcmJ1bGxoZWxsaXBwZXJtaWxwcmltZVByaW1lbHNhcXVvcnNhcXVvb2xpbmVmcmFzbGV1cm9pbWFnZXdlaWVycHJlYWx0cmFkZWFsZWZzeW1sYXJydWFycnJhcnJkYXJyaGFycmNyYXJybEFycnVBcnJyQXJyZEFycmhBcnJmb3JhbGxwYXJ0ZXhpc3RlbXB0eW5hYmxhaXNpbm5vdGlubmlwcm9kc3VtbWludXNsb3dhc3RyYWRpY2luZmluYW5nYW5kb3JjYXBjdXBpbnR0aGVyZTRzaW1jb25nYXN5bXBuZWVxdWl2bGVnZXN1YnN1cG5zdWJzdWJlc3VwZW9wbHVzb3RpbWVzcGVycHNkb3RsY2VpbHJjZWlsbGZsb29ycmZsb29ybGFuZ3Jhbmdsb3pzcGFkZXNjbHVic2hlYXJ0c2RpYW1zc3RydWN0IFRzU3ludGF4AADEBQAAIAAAAAgAAABIAQAAxQUAAAQAAAAEAAAAmwEAAMYFAAAEAAAABAAAAPYBAAAAAAAAAQAAAAEAAAAgAAAAqgUAAAwAAAAEAAAASwIAAAAAAAABAAAAAQAAAMcFAADIBQAABAAAAAQAAADJBQAAAAAAAAEAAAABAAAAygUAAMsFAAAMAAAABAAAAMwFAADNBQAAGAAAAAQAAAC1BQAAzgUAABAAAAAIAAAAzwUAANAFAAAgAAAACAAAANEFAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yMy4wLjIvc3JjL2NvbW1vbi9wYXJzZXIvdXRpbC5ycwEAAAAAAAAAQP4mAAEAAAABAAAAAAAAAEMIJwABAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogVXNpbmcgaXMgbm90IGEgdmFsaWQgZGVjbGFyYXRpb24gZm9yIGBkZWNsYXJlYCBrZXl3b3JkgE0mAGAAAADsTCYAdAAAAFUAAAAcAAAAAAAAAAEAAAABAAAAZAUAAAAAAAABAAAAAQAAANMFAACqBQAADAAAAAQAAABLAgAAUGFyc2VJbnRFcnJvcgAAANQFAAAEAAAABAAAAIkBAADVBQAADAAAAAQAAAA5AgAAAAAAAAEAAAABAAAAxwUAAAAAAAABAAAAAQAAACAAAAAAAAAABAAAAAQAAADWBQAA1wUAABgAAAAIAAAAWgEAANgFAAAEAAAABAAAANkFAAAAAAAABAAAAAQAAADaBQAAAAAAAAEAAAABAAAA2wUAANwFAAAwAAAACAAAAN0FAAAAAAAABAAAAAQAAABDAQAA3gUAAAQAAAAEAAAA9gEAAAAAAAAEAAAABAAAAE4CAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yMy4wLjIvc3JjL2NvbW1vbi9sZXhlci9udW1iZXIucnMAAAAITyYAdQAAADoAAAAkAAAACE8mAHUAAABGAAAAIwAAAAhPJgB1AAAAUgAAACMAAAAITyYAdQAAAFwAAAAaAAAACE8mAHUAAABaAAAAGgAAAFVuZXhwZWN0ZWQgZW9mL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjMuMC4yL3NyYy9lcnJvci5yc0RlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWRVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBmb3ItaW4gbG9vcFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBlbmFibGVkLiBTZXQganNjLnBhcnNlci5leHBsaWNpdFJlc291cmNlTWFuYWdlbWVudCB0byB0cnVlVXNpbmcgZGVjbGFyYXRpb24gb25seSBhbGxvd3MgaWRlbnRpZmllcnNVc2luZyBkZWNsYXJhdGlvbiByZXF1aXJlcyBpbml0aWFsaXplcnByaXZhdGUgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGludGVyZmFjZUludmFsaWQgYHN1cGVyKClgSW52YWxpZCBhY2Nlc3MgdG8gc3VwZXJJbmRleCBzdXBlciB3aXRoIHByaXZhdGUgbmFtZSBpcyBub3QgYWxsb3dlZCduZXcudGFyZ2V0JyBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgZnVuY3Rpb24gZXhwcmVzc2lvbiwgb3IgY2xhc3MuSW1wb3J0IGlzIG5vdCBhbGxvd2VkIGhlcmVBbiBhcnJvdyBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCBoZXJlYGV4cG9ydGAgaXMgbm90IGFsbG93ZWQgaGVyZUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSByZWFkb25seUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgYGdldGAgYWNjZXNzb3IgY2Fubm90IGhhdmUgcGFyYW1ldGVyc0EgYHNldGAgYWNjZXNzb3IgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlcnRvcCBsZXZlbCBhd2FpdCBpcyBvbmx5IGFsbG93ZWQgaW4gbW9kdWxlTGVnYWN5IGRlY2ltYWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVMZWdhY3kgb2N0YWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVJbnZhbGlkIGNoYXJhY3RlciBpbiBpZGVudGlmaWVyYSBiaW5hcnlhbiBvY3RhbGEgZGVjaW1hbGEgaGV4YWRlY2ltYWxFeHBlY3RlZCAgZGlnaXQAAAAGVCYACQAAAA9UJgAGAAAA3k8mAGcAAABAAQAAGgAAAFNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJSZXN0IHBhdHRlcm4gaXMgbm90IGFsbG93ZWQgaW4gc2V0dGVyVW50ZXJtaW5hdGVkIGJsb2NrIGNvbW1lbnRVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50RXhwZWN0ZWQgdW5pY29kZSBlc2NhcGVVbmV4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZXNlcnZlZCB3b3JkOiAA0lQmAC0AAABVbnRlcm1pbmF0ZWQgcmVnZXhwIGxpdGVyYWxVbnRlcm1pbmF0ZWQgdGVtcGxhdGVJZGVudGlmaWVyIGNhbm5vdCBmb2xsb3cgbnVtYmVyVW5leHBlY3RlZCBjaGFyYWN0ZXIgV1UmABUAAABJbnZhbGlkIHN0cmluZyBlc2NhcGVJbnZhbGlkIHVuaWNvZGUgZXNjYXBlQmFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UsIGV4cGVjdGVkIACfVSYAKAAAAEV4cGVjdGVkICssIC0gb3IgZGVjaW1hbCBkaWdpdCBhZnRlciBlTGVnYWN5IGNvbW1lbnRzIGNhbm5vdCBiZSB1c2VkIGluIG1vZHVsZSBjb2RlYCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlAID5JgABAAAAI1YmADAAAABgYXdhaXRgIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gYW4gYXN5bmMgY29udGV4dCdldmFsJyBhbmQgJ2FyZ3VtZW50cycgY2Fubm90IGJlIHVzZWQgYXMgYSBiaW5kaW5nIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUnYXJndW1lbnRzJyBpcyBvbmx5IGFsbG93ZWQgaW4gZnVuY3Rpb25zIGFuZCBjbGFzcyBtZXRob2RzSWxsZWdhbCAndXNlIHN0cmljdCcgZGlyZWN0aXZlIGluIGZ1bmN0aW9uIHdpdGggbm9uLXNpbXBsZSBwYXJhbWV0ZXIgbGlzdC4nKionIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHVuYXJ5L2F3YWl0IGV4cHJlc3Npb24uVW5leHBlY3RlZCB0b2tlbiAnIydMaW5lQnJlYWsgY2Fubm90IGZvbGxvdyAndGhyb3cnVW5leHBlY3RlZCBsaW5lIGJyZWFrIGJldHdlZW4gYXJyb3cgaGVhZCBhbmQgYXJyb3dVbmV4cGVjdGVkIHRva2VuIGBgLiBFeHBlY3RlZCAABVgmABIAAAAXWCYADAAAACAsIG9yIAAAN1gmAAMAAAAgb3IgVW5leHBlY3RlZCB0b2tlbi4gRGlkIHlvdSBtZWFuIABIWCYAHwAAAEUIJwABAAAAY2Fubm90IGltcG9ydCBhcyByZXNlcnZlZCB3b3JkYXNzaWdubWVudCBwcm9wZXJ0eSBpcyBpbnZhbGlkIHN5bnRheEV4cGVjdGVkICcnLCBnb3QgJycAALtYJgAKAAAAxVgmAAgAAADNWCYAAQAAAEV4cGVjdGVkICc7JywgJ30nIG9yIDxlb2Y+YXdhaXQqIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb25zIHByb3Bvc2FsLiBVc2UgUHJvbWlzZS5hbGwoKSBpbnN0ZWFkLkNhbm5vdCB1c2UgYSByZXNlcnZlZCB3b3JkIGFzIGEgc2hvcnRoYW5kIHByb3BlcnR5TnVsbGlzaCBjb2FsZXNjaW5nIG9wZXJhdG9yKD8/KSByZXF1aXJlcyBwYXJlbnMgd2hlbiBtaXhpbmcgd2l0aCBsb2dpY2FsIG9wZXJhdG9yc0Egc3dpdGNoIGJsb2NrIGNhbm5vdCBoYXZlIG11bHRpcGxlIGRlZmF1bHRzVHJhaWxpbmcgY29tbWEgaXNuJ3QgcGVybWl0dGVkIGFmdGVyIGEgcmVzdCBlbGVtZW50UmVzdCBlbGVtZW50IG11c3QgYmUgZmluYWwgZWxlbWVudFBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBjYW5ub3QgY29udGFpbiBzcHJlYWQgb3BlcmF0b3JQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGJlIGVtcHR5Tm90IGEgcGF0dGVybk5vdCBhbiBleHByZXNzaW9uQ2Fubm90IGFzc2lnbiB0byB0aGlzSW52YWxpZCBhc3NpZ25tZW50IHRhcmdldEV4cGVjdGVkIGlkZW50RXhwZWN0ZWQgJzsnIG9yIGxpbmUgYnJlYWtMYWJlbCAgaXMgYWxyZWFkeSBkZWNsYXJlZAAAAC9bJgAGAAAANVsmABQAAABBbiBhc3luYyBmdW5jdGlvbiBjYW5ub3QgYmUgZ2VuZXJhdG9yJ2ltcG9ydCcsIGFuZCAnZXhwb3J0JyBhcmUgbm90IHBlcm1pdHRlZCBoZXJlJ2ltcG9ydCcsIGFuZCAnZXhwb3J0JyBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIG1vZHVsZSBjb2RlJ2ltcG9ydC5tZXRhJyBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIG1vZHVsZSBjb2RlLkRlc3RydWN0dXJpbmcgYmluZGluZ3MgcmVxdWlyZSBpbml0aWFsaXplcnNXaXRoIHN0YXRlbWVudCBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGVSZXR1cm4gc3RhdGVtZW50IGlzIG5vdCBhbGxvd2VkIGhlcmVFeHBlY3RlZCBvbmUgdmFyaWFibGUgYmluZGluZ1VuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgaW4gZm9yIGluL29mIGxvb3BHZW5lcmF0b3Igb3IgYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGxhYmVsbGVkRnVuY3Rpb24gY2Fubm90IGJlIGxhYmVsbGVkIGluIHN0cmljdCBtb2RlJ3lpZWxkJyBjYW5ub3QgYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB3aXRoaW4gZ2VuZXJhdG9yYGF3YWl0YCBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCBpbiBhIHBhcmFtZXRlciBpbml0aWFsaXplci5mb3IgYXdhaXQgc3ludGF4IGlzIHZhbGlkIG9ubHkgZm9yIGZvci1vZiBzdGF0ZW1lbnRhd2FpdCBpc24ndCBhbGxvd2VkIGluIG5vbi1hc3luYyBmdW5jdGlvblVudGVybWluYXRlZCBKU1ggY29udGVudHNKU1ggYXR0cmlidXRlcyBtdXN0IG9ubHkgYmUgYXNzaWduZWQgYSBub24tZW1wdHkgZXhwcmVzc2lvbkpTWCB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIGFuIGV4cHJlc3Npb24gb3IgYSBxdW90ZWQgSlNYIHRleHRFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPD5FeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPAAAAMVeJgAsAAAAQ/4mAAEAAABMZWFkaW5nIGRlY29yYXRvcnMgbXVzdCBiZSBhdHRhY2hlZCB0byBhIGNsYXNzIGRlY2xhcmF0aW9uVXNpbmcgdGhlIGV4cG9ydCBrZXl3b3JkIGJldHdlZW4gYSBkZWNvcmF0b3IgYW5kIGEgY2xhc3MgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSB1c2UgYGV4cG9ydCBAZGVjIGNsYXNzYCBpbnN0ZWFkLkEgcmVxdWlyZWQgZWxlbWVudCBjYW5ub3QgZm9sbG93IGFuIG9wdGlvbmFsIGVsZW1lbnQuVHlwZXNjcmlwdCBwYXJhbWV0ZXIgcHJvcGVydHkgbXVzdCBiZSBhbiBpZGVudGlmaWVyIG9yIGFzc2lnbm1lbnQgcGF0dGVyblVuZXhwZWN0ZWQgc3BhY2UgYmV0d2VlbiAjIGFuZCBpZGVudGlmaWVyQ29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYXN5bmMgZnVuY3Rpb25DbGFzc2VzIG1heSBub3QgaGF2ZSBhIG5vbi1zdGF0aWMgZmllbGQgbmFtZWQgJ2NvbnN0cnVjdG9yJ0NsYXNzZXMgY2FuJ3QgaGF2ZSBhIHByaXZhdGUgZmllbGQgbmFtZWQgJyNjb25zdHJ1Y3RvcicuJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcHJpdmF0ZSBpZGVudGlmaWVyAAAAzVgmAAEAAADuYCYAMwAAAENsYXNzIGNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFjY2Vzc29yLkEgbWV0aG9kIGNhbm5vdCBiZSByZWFkb25seUEgY29uc3RydWN0b3IgY2Fubm90IGJlIGdlbmVyYXRvckEgY2xhc3MgY2FuIG9ubHkgaGF2ZSBvbmUgY29uc3RydWN0b3JBIGJpbmRpbmcgcGF0dGVybiBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsIGluIGFuIGltcGxlbWVudGF0aW9uIHNpZ25hdHVyZS5TdXBlciBjYWxsIGNhbm5vdCBiZSBvcHRpb25hbENvbnN0cnVjdG9yIGluL2FmdGVyIGFuIG9wdGlvbmFsIGNoYWluaW5nIGlzIG5vdCBhbGxvd2VkLlRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG5vdCBhbGxvd2VkIGluIG9wdGlvbmFsIGNoYWluLlRyYWlsaW5nIGNvbW1hIGlzIGRpc2FsbG93ZWQgaW5zaWRlIGltcG9ydCguLi4pIGFyZ3VtZW50c2V4cG9ydCBkZWZhdWx0IHN0YXRlbWVudHMgcmVxdWlyZWQgZnJvbSAnLi4uJztgIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYGZyb21gIGNsYXVzZQAAgPkmAAEAAAAAYyYAJgAAAGAuLi5gIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBpbiBkZWNsYXJhdGlvbiBjb250ZXh0c0EgbnVtZXJpYyBzZXBhcmF0b3IgaXMgb25seSBhbGxvd2VkIGJldHdlZW4gdHdvIGRpZ2l0c0Egc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gaW1wb3J0ZWQgYmluZGluZy4KLSBEaWQgeW91IG1lYW4gYGltcG9ydCB7ICIiIGFzIGZvbyB9YD8ArWMmAFIAAAD/YyYADAAAAEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gZXhwb3J0ZWQgYmluZGluZyB3aXRob3V0IGBmcm9tYC4nY29uc3QnIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGluaXRpYWxpemVkRHVwbGljYXRlZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZyAnJy6KZCYAJAAAAK5kJgACAAAAVW5rbm93biByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MuRXhwZWN0ZWQgYW4gaWRlbnRpZmllckV4cGVjdGVkIGEgc2VtaWNvbG9uVHJhaWxpbmcgY29tbWEgaXMgbm90IGFsbG93ZWRBIHJlc3QgcGFyYW1ldGVyIG11c3QgYmUgbGFzdCBpbiBhIHBhcmFtZXRlciBsaXN0UGFyYW1ldGVyIGNhbm5vdCBoYXZlIHF1ZXN0aW9uIG1hcmsgYW5kIGluaXRpYWxpemVyJyBtb2RpZmllciBtdXN0IHByZWNlZGUgJycgbW9kaWZpZXIuzVgmAAEAAACMZSYAGQAAAKVlJgALAAAAJyBtb2RpZmllciBhbHJlYWR5IHNlZW4uzVgmAAEAAADIZSYAGAAAAGBkZWNsYXJlYCBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGNsYXNzIGVsZW1lbnRzIG9mIHRoaXMga2luZGBkZWNsYXJlYCBtb2RpZmllciBub3QgYWxsb3dlZCBmb3IgY29kZSBhbHJlYWR5IGluIGFuIGFtYmllbnQgY29udGV4dGBhc3luY2AgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgaGVyZUEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsQSByZXN0IHBhcmFtZXRlciBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplcmpzYy50YXJnZXQgc2hvdWxkIGJlIGVzNSBvciB1cHBlciB0byB1c2UgZ2V0dGVyIC8gc2V0dGVyTGVnYWN5IG9jdGFsIGxpdGVyYWxzIGFyZSBub3QgYXZhaWxhYmxlIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgNSBhbmQgaGlnaGVyJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24AAADNWCYAAQAAAGxnJgA1AAAAVHlwZSBwYXJhbWV0ZXJzIGNhbm5vdCBhcHBlYXIgb24gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbkFuIGluZGV4IHNpZ25hdHVyZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXIgbGlzdCBjYW5ub3QgYmUgZW1wdHlJbnZhbGlkIHVzZSBvZiAnYXJndW1lbnRzJyBpbiBzdHJpY3QgbW9kZSdkZWxldGUnIGNhbm5vdCBiZSBjYWxsZWQgb24gYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZUEgJ2JyZWFrJyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4gYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBvciBzd2l0Y2ggc3RhdGVtZW50VGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgYGZvci4uLm9mYCBzdGF0ZW1lbnQgbWF5IG5vdCBiZSBgYXN5bmNgSnVtcCB0YXJnZXQgY2Fubm90IGNyb3NzIGZ1bmN0aW9uIGJvdW5kYXJ5RXhwcmVzc2lvbiBleHBlY3RlZHR5cGUgZXhwZWN0ZWREdXBsaWNhdGUgbGFiZWxBICdjb250aW51ZScgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3NpbmcgaXRlcmF0aW9uIHN0YXRlbWVudEEgJ2JyZWFrJyBzdGF0ZW1lbnQgY2FuIG9ubHkganVtcCB0byBhIGxhYmVsIG9mIGFuIGVuY2xvc2luZyBzdGF0ZW1lbnRWYXJpYWJsZSBkZWNsYXJhdGlvbiBsaXN0IGNhbm5vdCBiZSBlbXB0eWxpdGVyYWwgaW4gYW4gaW1wb3J0IHR5cGUgc2hvdWxkIGJlIHN0cmluZyBsaXRlcmFsQW4gb2JqZWN0IG1lbWJlciBjYW5ub3QgYmUgZGVjbGFyZWQgb3B0aW9uYWxDb21wdXRlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgaW4gZW51bXNBIGNvbW1hIGV4cHJlc3Npb24gaXMgbm90IGFsbG93ZWQgaW4gYSBjb21wdXRlZCBwcm9wZXJ0eSBuYW1lYGV4dGVuZHNgIGNsYXVzZSBhbHJlYWR5IHNlZW4uJ2V4dGVuZHMnIGNsYXVzZSBtdXN0IHByZWNlZGUgJ2ltcGxlbWVudHMnIGNsYXVzZS5DbGFzc2VzIGNhbiBvbmx5IGV4dGVuZCBhIHNpbmdsZSBjbGFzc2BpbXBsZW1lbnRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuQW4gaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGRlY2xhcmVkIGluIGFtYmllbnQgY29udGV4dHNNb2RpZmllcnMgY2Fubm90IGFwcGVhciBoZXJlTWVyZ2UgY29uZmxpY3QgbWFya2VyIGVuY291bnRlcmVkLlR5cGUgYW5ub3RhdGlvbiBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25DYXRjaCBjbGF1c2UgdmFyaWFibGUgY2Fubm90IGhhdmUgYSB0eXBlIGFubm90YXRpb25gYWJzdHJhY3RgIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIGNsYXNzIG9yIG1ldGhvZCBkZWNsYXJhdGlvbicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCAnAAAAzVgmAAEAAADdbCYAIAAAAKVlJgALAAAAQWJzdHJhY3QgbWV0aG9kcyBjYW4gb25seSBhcHBlYXIgd2l0aGluIGFuIGFic3RyYWN0IGNsYXNzLkFic3RyYWN0IG1ldGhvZCBjYW5ub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbi5BYnN0cmFjdCBwcm9wZXJ0eSBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplci4nIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlcgAAAM1YJgABAAAArW0mACwAAAAnIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgY2xhc3MsIGludGVyZmFjZSBvciB0eXBlIGFsaWFzAADNWCYAAQAAAOxtJgBSAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uLCBtZXRob2Qgb3IgY2xhc3MAAADNWCYAAQAAAFBuJgBNAAAAVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGltcG9ydCB3aGVuICdpbXBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgaW1wb3J0IHN0YXRlbWVudC5UaGUgJ3R5cGUnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIG9uIGEgbmFtZWQgZXhwb3J0IHdoZW4gJ2V4cG9ydCB0eXBlJyBpcyB1c2VkIG9uIGl0cyBleHBvcnQgc3RhdGVtZW50LkEgcGFyYW1ldGVyIHByb3BlcnR5IGlzIG9ubHkgYWxsb3dlZCBpbiBhIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uQSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIgaXMgb25seSBhbGxvd2VkIGluIGEgZnVuY3Rpb24gb3IgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25UaGUgbGVmdC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIG11c3QgYmUgYSB2YXJpYWJsZSBvciBhIHByb3BlcnR5IGFjY2Vzcy5UaGUgJ3dpdGgnIHN0YXRlbWVudCBpcyBub3Qgc3VwcG9ydGVkLiBBbGwgc3ltYm9scyBpbiBhICd3aXRoJyBibG9jayB3aWxsIGhhdmUgdHlwZSAnYW55Jy5JbnZhbGlkIGNsYXNzIG5hbWVpbnRlcmZhY2UgbmFtZSBpcyBpbnZhbGlkQW4gZW51bSBtZW1iZXIgY2Fubm90IGhhdmUgYSBudW1lcmljIG5hbWVUaGUgbGVmdC1oYW5kIHNpZGUgb2YgYSAnZm9yLi4ub2YnIHN0YXRlbWVudCBjYW5ub3QgdXNlIGEgdHlwZSBhbm5vdGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLmluJyBzdGF0ZW1lbnQgY2Fubm90IGJlIGEgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuQW4gaW50ZXJmYWNlIGNhbiBvbmx5IGV4dGVuZCBhbiBpZGVudGlmaWVyL3F1YWxpZmllZC1uYW1lIHdpdGggb3B0aW9uYWwgdHlwZSBhcmd1bWVudHMuVGhlIG9wZXJhbmQgb2YgYSBkZWxldGUgb3BlcmF0b3IgbXVzdCBiZSBhIHByb3BlcnR5IHJlZmVyZW5jZS5UaGlzIG1lbWJlciBjYW5ub3QgaGF2ZSBhbiAnb3ZlcnJpZGUnIG1vZGlmaWVyIGJlY2F1c2UgaXRzIGNvbnRhaW5pbmcgY2xhc3MgZG9lcyBub3QgZXh0ZW5kIGFub3RoZXIgY2xhc3MuRGVjb3JhdG9ycyBtYXkgbm90IGFwcGVhciBhZnRlciBgZXhwb3J0YCBvciBgZXhwb3J0IGRlZmF1bHRgIGlmIHRoZXkgYWxzbyBhcHBlYXIgYmVmb3JlIGBleHBvcnRgLkFuIGFjY2Vzc2liaWxpdHkgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllci5UeXBlIGFubm90YXRpb25zIG11c3QgY29tZSBiZWZvcmUgZGVmYXVsdCBhc3NpZ25tZW50c1R5cGVzY3JpcHQgbm9uLW51bGwgYXNzZXJ0aW9uIG9wZXJhdG9yIGlzIG5vdCBhbGxvd2VkIHdpdGggJwCLcyYAPAAAAM1YJgABAAAAVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gVXNlIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnN0ZWFkLlRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIEFkZCBhIHRyYWlsaW5nIGNvbW1hLCBhcyBpbiBgPFQsPigpID0+IC4uLmAuVGhpcyBpcyB0aGUgZXhwcmVzc2lvbiBwYXJ0IG9mIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50cHJldmlvdXMgZGVmYXVsdCBjYXNlIGlzIGRlY2xhcmVkIGF0IGhlcmVFb2ZEZWNsTm90QWxsb3dlZFVzaW5nRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkRm9yRm9ySW5Mb29wVXNpbmdEZWNsTm90RW5hYmxlZEludmFsaWROYW1lSW5Vc2luZ0RlY2xJbml0UmVxdWlyZWRGb3JVc2luZ0RlY2xQcml2YXRlTmFtZUluSW50ZXJmYWNlSW52YWxpZFN1cGVyQ2FsbEludmFsaWRTdXBlckludmFsaWRTdXBlclByaXZhdGVOYW1lSW52YWxpZE5ld1RhcmdldEludmFsaWRJbXBvcnRBcnJvd05vdEFsbG93ZWRFeHBvcnROb3RBbGxvd2VkR2V0dGVyU2V0dGVyQ2Fubm90QmVSZWFkb25seUdldHRlclNldHRlckNhbm5vdEJlT3B0aW9uYWxHZXR0ZXJQYXJhbVNldHRlclBhcmFtVG9wTGV2ZWxBd2FpdEluU2NyaXB0TGVnYWN5RGVjaW1hbExlZ2FjeU9jdGFsSW52YWxpZElkZW50Q2hhckV4cGVjdGVkRGlnaXRyYWRpeFNldHRlclBhcmFtUmVxdWlyZWRSZXN0UGF0SW5TZXR0ZXJVbnRlcm1pbmF0ZWRCbG9ja0NvbW1lbnRVbnRlcm1pbmF0ZWRTdHJMaXRFeHBlY3RlZFVuaWNvZGVFc2NhcGVFc2NhcGVJblJlc2VydmVkV29yZHdvcmRVbnRlcm1pbmF0ZWRSZWdFeHBVbnRlcm1pbmF0ZWRUcGxJZGVudEFmdGVyTnVtVW5leHBlY3RlZENoYXJjSW52YWxpZFN0ckVzY2FwZUludmFsaWRVbmljb2RlRXNjYXBlQmFkQ2hhcmFjdGVyRXNjYXBlU2VxdWVuY2VleHBlY3RlZE51bUxpdFRlcm1pbmF0ZWRXaXRoRXhwTGVnYWN5Q29tbWVudEluTW9kdWxlSW52YWxpZElkZW50SW5TdHJpY3RJbnZhbGlkSWRlbnRJbkFzeW5jRXZhbEFuZEFyZ3VtZW50c0luU3RyaWN0QXJndW1lbnRzSW5DbGFzc0ZpZWxkSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZVVuYXJ5SW5FeHBsZWZ0X3NwYW5IYXNoTGluZUJyZWFrSW5UaHJvd0xpbmVCcmVha0JlZm9yZUFycm93VW5leHBlY3RlZGdvdFVuZXhwZWN0ZWRUb2tlbldpdGhTdWdnZXN0aW9uc2NhbmRpZGF0ZV9saXN0UmVzZXJ2ZWRXb3JkSW5JbXBvcnRBc3NpZ25Qcm9wZXJ0eUV4cGVjdGVkRXhwZWN0ZWRTZW1pRm9yRXhwclN0bXRBd2FpdFN0YXJSZXNlcnZlZFdvcmRJbk9ialNob3J0aGFuZE9yUGF0TnVsbGlzaENvYWxlc2NpbmdXaXRoTG9naWNhbE9wTXVsdGlwbGVEZWZhdWx0cHJldmlvdXNDb21tYUFmdGVyUmVzdEVsZW1lbnROb25MYXN0UmVzdFBhcmFtU3ByZWFkSW5QYXJlbkV4cHJFbXB0eVBhcmVuRXhwckludmFsaWRQYXRJbnZhbGlkRXhwck5vdFNpbXBsZUFzc2lnbkludmFsaWRBc3NpZ25UYXJnZXRFeHBlY3RlZElkZW50RXhwZWN0ZWRTZW1pRHVwbGljYXRlTGFiZWxBc3luY0dlbmVyYXRvck5vblRvcExldmVsSW1wb3J0RXhwb3J0SW1wb3J0RXhwb3J0SW5TY3JpcHRJbXBvcnRNZXRhSW5TY3JpcHRQYXRWYXJXaXRob3V0SW5pdFdpdGhJblN0cmljdFJldHVybk5vdEFsbG93ZWRUb29NYW55VmFySW5Gb3JJbkhlYWRWYXJJbml0aWFsaXplckluRm9ySW5IZWFkTGFiZWxsZWRHZW5lcmF0b3JPckFzeW5jTGFiZWxsZWRGdW5jdGlvbkluU3RyaWN0WWllbGRQYXJhbUluR2VuQXdhaXRQYXJhbUluQXN5bmNBd2FpdEZvclN0bXRBd2FpdEluRnVuY3Rpb25VbnRlcm1pbmF0ZWRKU1hDb250ZW50c0VtcHR5SlNYQXR0ckludmFsaWRKU1hWYWx1ZUpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0Zvckx0R3RKU1hFeHBlY3RlZENsb3NpbmdUYWdJbnZhbGlkTGVhZGluZ0RlY29yYXRvckRlY29yYXRvck9uRXhwb3J0VHNSZXF1aXJlZEFmdGVyT3B0aW9uYWxUc0ludmFsaWRQYXJhbVByb3BQYXRTcGFjZUJldHdlZW5IYXNoQW5kSWRlbnRBc3luY0NvbnN0cnVjdG9yUHJvcGVydHlOYW1lZENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9yUHJpdmF0ZU5hbWVNb2RpZmllckNvbnN0cnVjdG9yQWNjZXNzb3JSZWFkT25seU1ldGhvZEdlbmVyYXRvckNvbnN0cnVjdG9yRHVwbGljYXRlQ29uc3RydWN0b3JUc0JpbmRpbmdQYXRDYW5ub3RCZU9wdGlvbmFsU3VwZXJDYWxsT3B0aW9uYWxPcHRDaGFpbkNhbm5vdEZvbGxvd0NvbnN0cnVjdG9yQ2FsbFRhZ2dlZFRwbEluT3B0Q2hhaW5UcmFpbGluZ0NvbW1hSW5zaWRlSW1wb3J0RXhwb3J0RGVmYXVsdFdpdGhPdXRGcm9tRXhwb3J0RXhwZWN0RnJvbURvdHNXaXRob3V0SWRlbnRpZmllck51bWVyaWNTZXBhcmF0b3JJc0FsbG93ZWRPbmx5QmV0d2VlblR3b0RpZ2l0c0ltcG9ydEJpbmRpbmdJc1N0cmluZ0V4cG9ydEJpbmRpbmdJc1N0cmluZ0NvbnN0RGVjbGFyYXRpb25zUmVxdWlyZUluaXRpYWxpemF0aW9uRHVwbGljYXRlZFJlZ0V4cEZsYWdzVW5rbm93blJlZ0V4cEZsYWdzVFMxMDAzVFMxMDA1VFMxMDA5VFMxMDE0VFMxMDE1VFMxMDI5VFMxMDMwVFMxMDMxVFMxMDM4VFMxMDQyVFMxMDQ3VFMxMDQ4VFMxMDU2VFMxMDg1VFMxMDg5VFMxMDkyVFMxMDk2VFMxMDk4VFMxMTAwVFMxMTAyVFMxMTA1VFMxMTA2VFMxMTA3VFMxMTA5VFMxMTEwVFMxMTE0VFMxMTE1VFMxMTE2VFMxMTIzVFMxMTQxVFMxMTYyVFMxMTY0VFMxMTcxVFMxMTcyVFMxMTczVFMxMTc0VFMxMTc1VFMxMTgzVFMxMTg0VFMxMTg1VFMxMDkzVFMxMTk2VFMxMjQyVFMxMjQzVFMxMjQ0VFMxMjQ1VFMxMjY3VFMxMjczVFMxMjc0VFMxMjc3VFMyMjA2VFMyMjA3VFMyMzY5VFMyMzcxVFMyNDA2VFMyNDEwVFMyNDE0VFMyNDI3VFMyNDUyVFMyNDgzVFMyNDkxVFMyNDk5VFMyNzAzVFM0MTEyVFM4MDM4VFMxODAxMFRTVHlwZUFubm90YXRpb25BZnRlckFzc2lnblRzTm9uTnVsbEFzc2VydGlvbk5vdEFsbG93ZWRXaXRoTGFiZWxpbm5lcm5vdGVSZXNlcnZlZFR5cGVBc3NlcnRpb25SZXNlcnZlZEFycm93VHlwZVBhcmFtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3wUAAOAFAADfBQAA3wUAAOAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADfBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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cmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjcuMC4wL3NyYy9oZWxwZXJzL21vZC5ycwBIliYAdwAAAPsAAAABAAAAX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yX2FycmF5X2xpa2VfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fYXJyYXlfbGlrZV90b19hcnJheV9hcnJheV93aXRoX2hvbGVzQHN3Yy9oZWxwZXJzL18vX2FycmF5X3dpdGhfaG9sZXNfYXJyYXlfd2l0aG91dF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRob3V0X2hvbGVzX2Fzc2VydF90aGlzX2luaXRpYWxpemVkQHN3Yy9oZWxwZXJzL18vX2Fzc2VydF90aGlzX2luaXRpYWxpemVkX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlQHN3Yy9oZWxwZXJzL18vX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZV9hc3luY19pdGVyYXRvckBzd2MvaGVscGVycy9fL19hc3luY19pdGVyYXRvcl9hc3luY190b19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfdG9fZ2VuZXJhdG9yX2F3YWl0X2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL19hd2FpdF9hc3luY19nZW5lcmF0b3JfYXdhaXRfdmFsdWVAc3djL2hlbHBlcnMvXy9fYXdhaXRfdmFsdWVfY2FsbF9zdXBlckBzd2MvaGVscGVycy9fL19jYWxsX3N1cGVyX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbkBzd2MvaGVscGVycy9fL19jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0X2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlX2NsYXNzX2NhbGxfY2hlY2tAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2FsbF9jaGVja19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcl9jbGFzc19uYW1lX3Rkel9lcnJvckBzd2MvaGVscGVycy9fL19jbGFzc19uYW1lX3Rkel9lcnJvcl9jbGFzc19wcml2YXRlX2ZpZWxkX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2dldF9jbGFzc19wcml2YXRlX2ZpZWxkX2luaXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0X2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXlfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19wcml2YXRlX21ldGhvZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRfY2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldF9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19jb25zdHJ1Y3RfY3JlYXRlX2NsYXNzQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9jbGFzc19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL19kZWNvcmF0ZV9kZWZhdWx0c0Bzd2MvaGVscGVycy9fL19kZWZhdWx0c19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2RlZmluZV9wcm9wZXJ0eV9leHBvcnRfc3RhckBzd2MvaGVscGVycy9fL19leHBvcnRfc3Rhcl9leHRlbmRzQHN3Yy9oZWxwZXJzL18vX2V4dGVuZHNfZ2V0QHN3Yy9oZWxwZXJzL18vX2dldF9nZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX2dldF9wcm90b3R5cGVfb2ZfaW5oZXJpdHNAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfaW5oZXJpdHNfbG9vc2VAc3djL2hlbHBlcnMvXy9faW5oZXJpdHNfbG9vc2VfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5QHN3Yy9oZWxwZXJzL18vX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eV9pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlckBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcl9pbnN0YW5jZW9mQHN3Yy9oZWxwZXJzL18vX2luc3RhbmNlb2ZfaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRAc3djL2hlbHBlcnMvXy9faW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRfaW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkQHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZF9pc19uYXRpdmVfZnVuY3Rpb25Ac3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX2Z1bmN0aW9uX2l0ZXJhYmxlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0QHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlQHN3Yy9oZWxwZXJzL18vX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlX2pzeEBzd2MvaGVscGVycy9fL19qc3hfbmV3X2Fycm93X2NoZWNrQHN3Yy9oZWxwZXJzL18vX25ld19hcnJvd19jaGVja19ub25faXRlcmFibGVfcmVzdEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfcmVzdF9ub25faXRlcmFibGVfc3ByZWFkQHN3Yy9oZWxwZXJzL18vX25vbl9pdGVyYWJsZV9zcHJlYWRfb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlAc3djL2hlbHBlcnMvXy9fb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlfb2JqZWN0X3NwcmVhZEBzd2MvaGVscGVycy9fL19vYmplY3Rfc3ByZWFkX29iamVjdF9zcHJlYWRfcHJvcHNAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9wcm9wc19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzQHN3Yy9oZWxwZXJzL18vX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZUBzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlX292ZXJsb2FkX3lpZWxkQHN3Yy9oZWxwZXJzL18vX292ZXJsb2FkX3lpZWxkX3Bvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybkBzd2MvaGVscGVycy9fL19wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5fcmVhZF9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3JlYWRfb25seV9lcnJvcl9zZXRAc3djL2hlbHBlcnMvXy9fc2V0X3NldF9wcm90b3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fc2V0X3Byb3RvdHlwZV9vZl9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0QHN3Yy9oZWxwZXJzL18vX3NraXBfZmlyc3RfZ2VuZXJhdG9yX25leHRfc2xpY2VkX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9zbGljZWRfdG9fYXJyYXlfbG9vc2VAc3djL2hlbHBlcnMvXy9fc2xpY2VkX3RvX2FycmF5X2xvb3NlX3N1cGVyX3Byb3BfYmFzZUBzd2MvaGVscGVycy9fL19zdXBlcl9wcm9wX2Jhc2VfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VAc3djL2hlbHBlcnMvXy9fdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2VfdGhyb3dAc3djL2hlbHBlcnMvXy9fdGhyb3dfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fYXJyYXlfdG9fY29uc3VtYWJsZV9hcnJheUBzd2MvaGVscGVycy9fL190b19jb25zdW1hYmxlX2FycmF5X3RvX3ByaW1pdGl2ZUBzd2MvaGVscGVycy9fL190b19wcmltaXRpdmVfdG9fcHJvcGVydHlfa2V5QHN3Yy9oZWxwZXJzL18vX3RvX3Byb3BlcnR5X2tleV91cGRhdGVAc3djL2hlbHBlcnMvXy9fdXBkYXRlX3R5cGVfb2ZAc3djL2hlbHBlcnMvXy9fdHlwZV9vZl91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL191bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheV93cmFwX2FzeW5jX2dlbmVyYXRvckBzd2MvaGVscGVycy9fL193cmFwX2FzeW5jX2dlbmVyYXRvcl93cmFwX25hdGl2ZV9zdXBlckBzd2MvaGVscGVycy9fL193cmFwX25hdGl2ZV9zdXBlcl93cml0ZV9vbmx5X2Vycm9yQHN3Yy9oZWxwZXJzL18vX3dyaXRlX29ubHlfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3NAc3djL2hlbHBlcnMvXy9fY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdEBzd2MvaGVscGVycy9fL19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RfY3JlYXRlX3N1cGVyQHN3Yy9oZWxwZXJzL18vX2NyZWF0ZV9zdXBlcl9jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZUBzd2MvaGVscGVycy9fL19jcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZV90c19kZWNvcmF0ZUBzd2MvaGVscGVycy9fL190c19kZWNvcmF0ZV90c19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fdHNfZ2VuZXJhdG9yX3RzX21ldGFkYXRhQHN3Yy9oZWxwZXJzL18vX3RzX21ldGFkYXRhX3RzX3BhcmFtQHN3Yy9oZWxwZXJzL18vX3RzX3BhcmFtX3RzX3ZhbHVlc0Bzd2MvaGVscGVycy9fL190c192YWx1ZXNfdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VAc3djL2hlbHBlcnMvXy9fdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2VfdHNfZGlzcG9zZV9yZXNvdXJjZXNAc3djL2hlbHBlcnMvXy9fdHNfZGlzcG9zZV9yZXNvdXJjZXNfdHNfcmV3cml0ZV9yZWxhdGl2ZV9pbXBvcnRfZXh0ZW5zaW9uQHN3Yy9oZWxwZXJzL18vX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbl9hcHBseV9kZWNzXzIyMDNfckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNzXzIyMDNfcl9pZGVudGl0eUBzd2MvaGVscGVycy9fL19pZGVudGl0eV9kaXNwb3NlQHN3Yy9oZWxwZXJzL18vX2Rpc3Bvc2VfdXNpbmdAc3djL2hlbHBlcnMvXy9fdXNpbmdfdXNpbmdfY3R4QHN3Yy9oZWxwZXJzL18vX3VzaW5nX2N0eGFwcGx5X2RlY29yYXRlZF9kZXNjcmlwdG9yYXJyYXlfbGlrZV90b19hcnJheWFycmF5X3dpdGhfaG9sZXNhcnJheV93aXRob3V0X2hvbGVzYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWRhc3luY19nZW5lcmF0b3Jhc3luY19nZW5lcmF0b3JfZGVsZWdhdGVhc3luY19pdGVyYXRvcmFzeW5jX3RvX2dlbmVyYXRvcmF3YWl0X2FzeW5jX2dlbmVyYXRvcmF3YWl0X3ZhbHVlY2FsbF9zdXBlcmNoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbmNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVjbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3Jfc2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGVjbGFzc19jYWxsX2NoZWNrY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcmNsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcmNsYXNzX25hbWVfdGR6X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRjbGFzc19wcml2YXRlX2ZpZWxkX2luaXRjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VjbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2tleWNsYXNzX3ByaXZhdGVfZmllbGRfc2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF91cGRhdGVjbGFzc19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19wcml2YXRlX21ldGhvZF9pbml0Y2xhc3NfcHJpdmF0ZV9tZXRob2Rfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNvbnN0cnVjdGNyZWF0ZV9jbGFzc2RlY29yYXRlZGVmYXVsdHNkZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzZGVmaW5lX3Byb3BlcnR5ZXhwb3J0X3N0YXJnZXRfcHJvdG90eXBlX29maW5oZXJpdHNpbmhlcml0c19sb29zZWluaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eWluaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyaW50ZXJvcF9yZXF1aXJlX2RlZmF1bHRpbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRpc19uYXRpdmVfZnVuY3Rpb25pdGVyYWJsZV90b19hcnJheWl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0aXRlcmFibGVfdG9fYXJyYXlfbGltaXRfbG9vc2Vqc3huZXdfYXJyb3dfY2hlY2tub25faXRlcmFibGVfcmVzdG5vbl9pdGVyYWJsZV9zcHJlYWRvYmplY3RfZGVzdHJ1Y3R1cmluZ19lbXB0eW9iamVjdF9zcHJlYWRvYmplY3Rfc3ByZWFkX3Byb3Bzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VvdmVybG9hZF95aWVsZHBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbmFwcGx5X2RlY3NfMjIwM19yaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4QHN3Yy9oZWxwZXJzL18vXwAAAJm1JgAQAAAAJQYAAE1hcmtlciBwcm92aWRlZCB0byByZXNvbHZlciBzaG91bGQgbm90IGJlIHRoZSByb290IG1hcmsAuLUmADcAAABsviYAeAAAAIcAAAAFAAAAU3VwZXJGbkV4cHJCaW5FeHByTmV3RXhwcmNhbGxlZWFyZ3NPcHRDYWxsU2VxRXhwckFycmF5TGl0Q2FsbEV4cHJDb25kRXhwclRoaXNFeHByAAAAJgYAAAwAAAAEAAAAJwYAACgGAAAEAAAABAAAACkGAAAAAAAAAQAAAAEAAACrAgAAKgYAAAQAAAAEAAAANwMAAPTNJgAEAAAAaMwmAAQAAABUyyYABgAAAFrLJgAEAAAAvMUmAAgAAACwxSYADAAAAMvEJgALAAAAxMUmAAsAAABBcnJvd0V4cHJBd2FpdEV4cHJDbGFzc0V4cHJQYXJlbkV4cHJ0YWd0cGxVbmFyeUV4cHJZaWVsZEV4cHJkZWxlZ2F0ZUFzc2lnbkV4cHJNZW1iZXJFeHByVHBsRWxlbWVudHRhaWxjb29rZWRVcGRhdGVFeHBycHJlZml4U2ltcGxlRXhwck9yU3ByZWFkc3ByZWFkTWV0YVByb3BFeHByT3B0Q2hhaW5FeHByYmFzZVNwcmVhZFByb3BTdXBlclByb3BFeHByY2FsbGVkIGV4cGVjdCBvbiCjtyYAEQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2FzdC0xNS4wLjAvc3JjL3BhdC5ycwC8tyYAYwAAAA0AAAAUAAAAKwYAAAQAAAAEAAAAhAIAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yNy4wLjAvc3JjL2ZpeGVyLnJzAAAAQLgmAHEAAADEAAAAQAAAAEC4JgBxAAAAawMAACMAAABAuCYAcQAAAHsDAAAxAAAAQLgmAHEAAACHAwAAKQAAAI0dJwBKAAAAqAEAAB8AAACL1SYAZQAAAFwGAAAUAAAALAYAAAQAAAAEAAAAhAIAAFRzQXNFeHByLQYAAAwAAAAEAAAAKgMAAFRzRm5UeXBlbGl0dHlwZV9uYW1lZWxlbV90eXBldHlwZV9wYXJhbVRzRW50aXR5TmFtZVRzRXh0ZXJuYWxNb2R1bGVSZWYAAC4GAAAMAAAABAAAAAoDAAAAAAAAAQAAAAEAAAAvBgAAAAAAAAEAAAABAAAAqwIAAAAAAAAEAAAABAAAADAGAAD0zSYABAAAAI3JJgAKAAAAl8kmAA0AAAC6ySYACwAAAHwUJwAIAAAAnr8mAAUAAABlbGVtX3R5cGVzAAAxBgAAGAAAAAgAAADOAgAAMgYAAAQAAAAEAAAAMwYAAAAAAAAEAAAABAAAADQGAABpc19pbmlzX291dGNvbnN0cmFpbnQAAAD0zSYABAAAABXOJgAEAAAAMLomAAUAAAA1uiYABgAAAH7HJgAIAAAAO7omAAoAAADk/iYABwAAAFRzVHlwZVBhcmFtZXhwcl9uYW1lVHNVbmlvblR5cGV0eXBlc1RzRW51bU1lbWJlcnF1YWxpZmllcmF0dHJpYnV0ZXMAAAAAAAEAAAABAAAANQYAADYGAAAwAAAACAAAADcGAABuYW1lX3R5cGUAAAD0zSYABAAAAHwUJwAIAAAAWbkmAAoAAADkuiYACQAAAGzMJgAIAAAAiMwmAAgAAABUc1RwbExpdFR5cGVQcm90ZWN0ZWRUcnVlUGx1c01pbnVzVHNOb25OdWxsRXhwclRzQ2FsbFNpZ25hdHVyZURlY2xUc0NvbnN0cnVjdFNpZ25hdHVyZURlY2xUc1Byb3BlcnR5U2lnbmF0dXJlVHNHZXR0ZXJTaWduYXR1cmVUc1NldHRlclNpZ25hdHVyZVRzTWV0aG9kU2lnbmF0dXJlVHNUdXBsZUVsZW1lbnR0eW9wVHNJbnRlcmZhY2VCb2R5VHNTYXRpc2ZpZXNFeHBycGFyYW1fbmFtZQAAOAYAAAQAAAAEAAAAKwMAAGNoZWNrX3R5cGVleHRlbmRzX3R5cGV0cnVlX3R5cGVmYWxzZV90eXBlVHNDb25zdHJ1Y3RvclR5cGVjb21wdXRlZFRzQW55S2V5d29yZFRzVW5rbm93bktleXdvcmRUc051bWJlcktleXdvcmRUc09iamVjdEtleXdvcmRUc0Jvb2xlYW5LZXl3b3JkVHNCaWdJbnRLZXl3b3JkVHNTdHJpbmdLZXl3b3JkVHNTeW1ib2xLZXl3b3JkVHNWb2lkS2V5d29yZFRzVW5kZWZpbmVkS2V5d29yZFRzTnVsbEtleXdvcmRUc05ldmVyS2V5d29yZFRzSW50cmluc2ljS2V5d29yZAAAAAAAAAAEAAAABAAAAF4DAAD0zSYABAAAAN3MJgADAAAARrwmAAgAAABszCYACAAAAFTLJgAGAAAAiMwmAAgAAADLxCYACwAAAFRzRXhwcldpdGhUeXBlQXJnc1RzSW50ZXJzZWN0aW9uVHlwZVRzSW1wb3J0Q2FsbE9wdGlvbnNvYmpfdHlwZWluZGV4X3R5cGUAAAD0zSYABAAAAHwUJwAIAAAA3cwmAAMAAABGvCYACAAAAGzMJgAIAAAAiMwmAAgAAABUc05hbWVzcGFjZUV4cG9ydERlY2xGbkRlY2xpZGVudENsYXNzRGVjbEFzc2lnblByb3BHZXR0ZXJQcm9wTWV0aG9kUHJvcFNldHRlclByb3B0aGlzX3BhcmFtS2V5VmFsdWVQcm9wVmFyRGVjbGFyYXRvckNvbXB1dGVkUHJvcE5hbWUUzSYAYwAAADsAAAAjAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI3LjAuMC9zcmMvcmVzb2x2ZXIvbW9kLnJzbL4mAHgAAADGBgAANgAAAElmU3RtdHRlc3Rjb25zYWx0UGF0Rm9yU3RtdGluaXR1cGRhdGVFeHByU3RtdFdpdGhTdG10QnJlYWtTdG10bGFiZWxFbXB0eVN0bXRGb3JJblN0bXRGb3JPZlN0bXRUaHJvd1N0bXRXaGlsZVN0bXRSZXR1cm5TdG10U3dpdGNoQ2FzZVN3aXRjaFN0bXRkaXNjcmltaW5hbnRjYXNlc0NhdGNoQ2xhdXNlcGFyYW1Eb1doaWxlU3RtdExhYmVsZWRTdG10TW9kdWxlRGVjbFN0bXRDb250aW51ZVN0bXREZWJ1Z2dlclN0bXQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjcuMC4wL3NyYy9yZW5hbWUvYW5hbHl6ZXIvcmV2ZXJzZV9tYXAucnMAAN+/JgCHAAAADgAAACwAAABQYXJhbXBhdFRzUGFyYW1Qcm9wL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI3LjAuMC9zcmMvcmVuYW1lL2FuYWx5emVyL21vZC5ycwAAi8AmAH8AAAApAAAAGwAAAIvAJgB/AAAANAAAADcAAACLwCYAfwAAAIQAAAAdAAAAOQYAAAQAAAAEAAAAPAMAAAAAAAABAAAAAQAAAKsCAABFeHBvcnRBbGxzcmN0eXBlX29ubHlFeHBvcnREZWNsZGVjbAA6BgAADAAAAAQAAAA7BgAAPAYAAAQAAAAEAAAAPQYAAAAAAAAEAAAABAAAAHgCAABzcGVjaWZpZXJzcGhhc2UA9M0mAAQAAACwwSYACgAAAGXBJgADAAAAaMEmAAkAAADF/iYABAAAALrBJgAFAAAASW1wb3J0RGVjbEltcG9ydEV4cG9ydE5hbWVkRXhwb3J0RGVmYXVsdERlY2xFeHBvcnREZWZhdWx0RXhwclRzSW1wb3J0RXF1YWxzVHNFeHBvcnRBc3NpZ25tZW50VHNOYW1lc3BhY2VFeHBvcnRFdmFsdWF0aW9uU291cmNlRGVmZXJOYW1lZEV4cG9ydE5hbWVzcGFjZURlZmF1bHROYW1lZEV4cG9ydE5hbWVkU3BlY2lmaWVyb3JpZ2V4cG9ydGVkSW1wb3J0TmFtZWRTcGVjaWZpZXJsb2NhbGltcG9ydGVkSW1wb3J0U3RhckFzU3BlY2lmaWVyRXhwb3J0RGVmYXVsdFNwZWNpZmllckltcG9ydERlZmF1bHRTcGVjaWZpZXJFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXJUcGxleHByc3F1YXNpc1RoaXNVbmFyeVVwZGF0ZUJpbk1lbWJlclN1cGVyUHJvcENvbmRDYWxsTmV3U2VxVGFnZ2VkVHBsQXJyb3dZaWVsZE1ldGFQcm9wQXdhaXRQYXJlbkpTWE1lbWJlckpTWEVtcHR5VHNUeXBlQXNzZXJ0aW9uVHNDb25zdEFzc2VydGlvblRzTm9uTnVsbFRzQXNUc0luc3RhbnRpYXRpb25Uc1NhdGlzZmllc09wdENoYWluU2hvcnRoYW5kQmxvY2tEZWJ1Z2dlcldpdGhSZXR1cm5MYWJlbGVkQnJlYWtDb250aW51ZUlmU3dpdGNoVGhyb3dUcnlXaGlsZURvV2hpbGVGb3JGb3JJbkZvck9mRGVjbAAuBgAADAAAAAQAAAAKAwAAPgYAAAwAAAAEAAAAPwYAAEAGAAAEAAAABAAAALgCAAAAAAAAAQAAAAEAAACrAgAAKgYAAAQAAAAEAAAANwMAAEEGAAAEAAAABAAAALECAAAAAAAABAAAAAQAAABCBgAAc3VwZXJfY2xhc3N0eXBlX3BhcmFtc3N1cGVyX3R5cGVfcGFyYW1zAPTNJgAEAAAAaMwmAAQAAACNySYACgAAAFrLJgAEAAAAwMQmAAsAAACkySYACwAAAMvEJgALAAAA1sQmABEAAAAI8iYACgAAAFZhckRlY2xkZWNsc1RyeVN0bXRibG9ja2hhbmRsZXJmaW5hbGl6ZXJVc2luZ0RlY2xpc19hd2FpdE9iamVjdExpdEJsb2NrU3RtdHN0bXRzQwYAAAwAAAAEAAAARAYAAEUGAAAYAAAABAAAAEYGAAAAAAAABAAAAAQAAADLAgAAaXNfZ2VuZXJhdG9yaXNfYXN5bmNyZXR1cm5fdHlwZQBUyyYABgAAAI3JJgAKAAAA9M0mAAQAAABozCYABAAAAFrLJgAEAAAAsMUmAAwAAAC8xSYACAAAAMvEJgALAAAAxMUmAAsAAABGdW5jdGlvblRzS2V5d29yZFR5cGVUc1RoaXNUeXBlVHNGbk9yQ29uc3RydWN0b3JUeXBlVHNUeXBlUmVmVHNUeXBlUXVlcnlUc1R5cGVMaXRUc0FycmF5VHlwZVRzVHVwbGVUeXBlVHNPcHRpb25hbFR5cGVUc1Jlc3RUeXBlVHNVbmlvbk9ySW50ZXJzZWN0aW9uVHlwZVRzQ29uZGl0aW9uYWxUeXBlVHNJbmZlclR5cGVUc1BhcmVudGhlc2l6ZWRUeXBlVHNUeXBlT3BlcmF0b3JUc0luZGV4ZWRBY2Nlc3NUeXBlVHNNYXBwZWRUeXBlVHNMaXRUeXBlVHNUeXBlUHJlZGljYXRlVHNJbXBvcnRUeXBlVHNUeXBlQW5uSlNYT3BlbmluZ0VsZW1lbnRhdHRyc3NlbGZfY2xvc2luZ3R5cGVfYXJnczEGAAAYAAAACAAAAM4CAABUc0VudW1EZWNsaXNfY29uc3RtZW1iZXJzVHNRdWFsaWZpZWROYW1lRwYAACAAAAAIAAAAAQMAAAAAAAAEAAAABAAAAEgGAAD0zSYABAAAAEkIJwAHAAAAevkmAAYAAABr+SYACQAAAPTMJgACAAAAWssmAAQAAABUc01vZHVsZURlY2xJBgAADAAAAAQAAABKBgAAAAAAAAQAAAAEAAAASwYAAPTNJgAEAAAA9MwmAAIAAABJCCcABwAAAMvEJgALAAAAXPkmAAcAAABayyYABAAAAFRzSW50ZXJmYWNlRGVjbFRzTW9kdWxlQmxvY2tUc05hbWVzcGFjZURlY2xUc1R5cGVBbGlhc0RlY2xUc1R5cGVQYXJhbURlY2xUc0ltcG9ydEVxdWFsc0RlY2xpc19leHBvcnRpc190eXBlX29ubHltb2R1bGVfcmVmVHNUeXBlUGFyYW1JbnN0YW50aWF0aW9uYXJndW1lbnRzABTNJgBjAAAAMwAAAA8AAABQcml2YXRlUHVibGljAAAAAAAAAAgAAAAEAAAACwEAAEwGAAAgAAAACAAAAGEDAABNBgAABAAAAAQAAAC4AgAATgYAAAQAAAAEAAAAKwMAAAAAAAABAAAAAQAAAKsCAAAuBgAADAAAAAQAAAAKAwAAAAAAAAEAAAABAAAALwYAAAAAAAAEAAAABAAAAKcAAABpc19zdGF0aWNkZWNvcmF0b3JzYWNjZXNzaWJpbGl0eWlzX2Fic3RyYWN0aXNfb3B0aW9uYWxpc19vdmVycmlkZWRlZmluaXRlAAAA9M0mAAQAAADdzCYAAwAAAPjNJgAFAAAAiMwmAAgAAACEySYACQAAAI3JJgAKAAAAl8kmAA0AAACkySYACwAAAK/JJgALAAAAuskmAAsAAAB8FCcACAAAAEkIJwAHAAAAxckmAAgAAABDbGFzc1Byb3BEZWNvcmF0b3JNZXRob2RHZXR0ZXJTZXR0ZXJDb25zdHJ1Y3RvclByaXZhdGVNZXRob2RQcml2YXRlUHJvcFRzSW5kZXhTaWduYXR1cmVFbXB0eVN0YXRpY0Jsb2NrQXV0b0FjY2Vzc29yAE8GAAAEAAAABAAAAFAGAAAAAAAAAQAAAAEAAABRBgAAa2luZPTNJgAEAAAA3cwmAAMAAABE+yYACAAAAMzKJgAEAAAAhMkmAAkAAACXySYADQAAAKTJJgALAAAAr8kmAAsAAAC6ySYACwAAAENsYXNzTWV0aG9kAAAAAAAEAAAABAAAAB0BAABSBgAADAAAAAQAAABTBgAARQYAABgAAAAEAAAARgYAAHBhcmFtc2JvZHkAAPTNJgAEAAAAaMwmAAQAAADdzCYAAwAAAFTLJgAGAAAAWssmAAQAAACXySYADQAAAK/JJgALAAAAVAYAABAAAAAIAAAAVQYAAPTNJgAEAAAAaMwmAAQAAADdzCYAAwAAAPjNJgAFAAAAiMwmAAgAAACEySYACQAAAI3JJgAKAAAAl8kmAA0AAACvySYACwAAALrJJgALAAAAfBQnAAgAAADFySYACAAAAFYGAAAgAAAACAAAAFcGAAD0zSYABAAAAN3MJgADAAAA+M0mAAUAAACIzCYACAAAAITJJgAJAAAAjckmAAoAAACXySYADQAAAKTJJgALAAAAuskmAAsAAADFySYACAAAAGN0eHRvcHRpb25hbFJlc3RQYXRkb3QzX3Rva2VuYXJndHlwZV9hbm5BcnJheVBhdGVsZW1zQXNzaWduUGF0bGVmdHJpZ2h0T2JqZWN0UGF0cHJvcHNDb21wdXRlZFByaXZhdGVOYW1lQXNzaWduUGF0UHJvcGtleUtleVZhbHVlQmluZGluZ0lkZW50aWRLZXlWYWx1ZVBhdFByb3BpbmRleCBub3QgZm91bmQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9pbmRleG1hcC0yLjkuMC9zcmMvbWFwL2NvcmUucnMAFM0mAGMAAABLAAAACgAAABTNJgBjAAAAFgIAAA0AAAAUzSYAYwAAAIgCAAAsAAAAFM0mAGMAAABgAgAAIgAAABTNJgBjAAAATwEAABYAAAAUzSYAYwAAAFsBAAA4AAAAU3RyQm9vbE51bUJpZ0ludFJlZ2V4SlNYVGV4dHNwYW52YWx1ZXJhd2V4cGZsYWdzTnVtYmVySlNYQXR0cm5hbWVKU1hFbXB0eUV4cHJKU1hNZW1iZXJFeHBySWRlbnROYW1lc3ltSlNYTmFtZXNwYWNlZE5hbWVKU1hGcmFnbWVudG9wZW5pbmdjaGlsZHJlbmNsb3NpbmdMaXRKU1hFeHByQ29udGFpbmVySlNYRWxlbWVudG9ianByb3BKU1hTcHJlYWRDaGlsZGV4cHJTcHJlYWRFbGVtZW50SlNYQ2xvc2luZ0VsZW1lbnRuc0pTWENsb3NpbmdGcmFnbWVudEpTWE9wZW5pbmdGcmFnbWVudENsYXNzRm5WYXJVc2luZ1RzSW50ZXJmYWNlVHNUeXBlQWxpYXNUc0VudW1Uc01vZHVsZQAAADDWJgB7AAAA7wAAABcAAAAw1iYAewAAAAoBAAASAAAAMNYmAHsAAABQAQAAKAAAADDWJgB7AAAAUQEAAC0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBkZXN0cnVjdHVyaW5nIHBhdHRlcm4gaW5zaWRlIFRzUGFyYW1ldGVyUHJvcGVydHkAAGDPJgBaAAAAMNYmAHsAAABBAQAAIQAAADDWJgB7AAAAbAEAABIAAAAw1iYAewAAAD8CAAAnAAAAMNYmAHsAAAA8AgAAMgAAADDWJgB7AAAARAMAAA0AAAAw1iYAewAAAKIDAAAfAAAAMNYmAHsAAACjAwAAHwAAADDWJgB7AAAAywMAAB8AAABr9SYAKgAAADDWJgB7AAAA0wMAAB0AAAAw1iYAewAAAO8DAAAjAAAAMNYmAHsAAACbAwAAMQAAADDWJgB7AAAAXQQAACMAAAAw1iYAewAAADMEAAArAAAAMNYmAHsAAAA/BAAAUQAAADDWJgB7AAAAQgQAAB8AAAAw1iYAewAAAEwEAABWAAAAMNYmAHsAAABOBAAAHwAAAGV4cG9ydHMAMNYmAHsAAAB+BQAAIwAAADDWJgB7AAAAggUAAB8AAAAw1iYAewAAADkFAAAaAAAAMNYmAHsAAAA7BQAAGgAAAF9jcmVhdGVSZXF1aXJlX19yZXF1aXJlY3JlYXRlUmVxdWlyZVsGAAAoAAAACAAAAFwGAAAw1iYAewAAAK4DAABAAAAAT25seSBhbWJpZW50IG1vZHVsZXMgY2FuIHVzZSBxdW90ZWQgbmFtZXMuAAAw1iYAewAAAOUFAAAOAAAASW1wb3J0IGRlY2xhcmF0aW9ucyBpbiBhIG5hbWVzcGFjZSBjYW5ub3QgcmVmZXJlbmNlIGEgbW9kdWxlLkVTTS1zdHlsZSBtb2R1bGUgZGVjbGFyYXRpb25zIGFyZSBub3QgcGVybWl0dGVkIGluIGEgbmFtZXNwYWNlLkltcG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGltcG9ydCAqIGFzIG5zIGZyb20gIm1vZCJgLCBgaW1wb3J0IHthfSBmcm9tICJtb2QiYCwgYGltcG9ydCBkIGZyb20gIm1vZCJgLCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5FeHBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBleHBvcnQgZGVmYXVsdGAgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTMwLjAuMC9zcmMvdHlwZXNjcmlwdC5ycwAAZtMmAHwAAABCAAAALAAAAGbTJgB8AAAAaAAAABAAAABdBgAABAAAAAQAAACJAQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTMwLjAuMC9zcmMvc3RyaXBfdHlwZS5ycxTUJgB8AAAA1QAAACkAAABeBgAADAAAAAQAAABfBgAAYAYAAIYFAAAAAAAAAAAAAAEAAABhBgAATmFOSW5maW5pdHkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQtMzAuMC4wL3NyYy90c19lbnVtLnJz09QmAHkAAACwAAAAEgAAAAEAAAAAAAAAAQAAAAAAAADT1CYAeQAAANoAAAAaAAAAbm90IGltcGxlbWVudGVkL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdXRpbHMtMjEuMC4wL3NyYy9saWIucnOL1SYAZQAAANUJAAA+AAAAYwYAAAQAAAAEAAAAiQEAAIvVJgBlAAAA4QkAADwAAACL1SYAZQAAAMIJAAAmAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTMwLjAuMC9zcmMvdHJhbnNmb3JtLnJzADDWJgB7AAAAwgIAADgAAABeBgAADAAAAAQAAABfBgAAYAYAAIYFAAAAAAAAAAAAAAEAAABhBgAAU3ltYm9sXwABAAAAAAAAAOrWJgABAAAAc3VwZXJfAAD81iYABgAAAOrWJgABAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAAAU1yYAEQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnMw1yYATAAAAFYKAAAkAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9wdHIvbW9kLnJzAIzXJgBLAAAADAIAAAEAAABjb25zdHJ1Y3RvciBzaG91bGQgaGF2ZSBhIGJvZHkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV91dGlscy0yMS4wLjAvc3JjL2NvbnN0cnVjdG9yLnJzAAbYJgBtAAAADgAAACAAAAAAAAAADAAAAAQAAABkBgAAZQYAACQEJwBPAAAACgIAADcAAADIAwAADAAAAAQAAADJAwAAygMAAMsDAAAAAAAAAAAAAAEAAADMAwAAZwYAACwAAAAEAAAAaAYAAGkGAABqBgAAawYAAGwGAABtBgAAQwQAALj9JgBoAAAAegIAABQAAAC4/SYAaAAAAKICAAA8AAAAuP0mAGgAAACRAgAAPgAAADcTJwBeAAAANAAAAAUAAABuBgAADAAAAAQAAACEBQAAbwYAAIYFAAAAAAAAAAAAAAEAAADMAwAAbgYAAAwAAAAEAAAAhAUAAG8GAACGBQAAAAAAAAAAAAABAAAAzAMAAGh0dHA6aHR0cHM6AAEAAAAAAAAAtQMnAAEAAAAkc2VyZGVfanNvbjo6cHJpdmF0ZTo6UmF3VmFsdWUAAG4GAAAMAAAABAAAAIQFAACiBQAAhgUAAAAAAAAAAAAAAQAAAMwDAABBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvUmF3U2VjdGlvbk9mZnNldGxpbmVjb2x1bW5SYXdTZWN0aW9ub2Zmc2V0dXJsbWFwRmFjZWJvb2tTY29wZU1hcHBpbmduYW1lc21hcHBpbmdzUmF3U291cmNlTWFwdmVyc2lvbmZpbGVzb3VyY2Vzc291cmNlUm9vdHNvdXJjZXNDb250ZW50c2VjdGlvbnNyYW5nZU1hcHBpbmdzaWdub3JlTGlzdHhfZmFjZWJvb2tfb2Zmc2V0c3hfbWV0cm9fbW9kdWxlX3BhdGhzeF9mYWNlYm9va19zb3VyY2VzZGVidWdfaWRkZWJ1Z0lkL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3Vuc3RhYmxlL3F1aWNrc29ydC5ycwAAGdsmAGEAAAA5AAAAGwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19zb3VyY2VtYXAtOS4zLjQvc3JjL2J1aWxkZXIucnMAjNsmAGcAAABpAAAAGgAAAIzbJgBnAAAAagAAACIAAABDYW5ub3Qgc2V0IHNvdXJjZXMgZm9yIHRvbWJzdG9uZSBzb3VyY2UgaWQAAIzbJgBnAAAAgAAAAAkAAACM2yYAZwAAAIQAAAAdAAAAjNsmAGcAAAAHAQAAFQAAAHU4L3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbmF2aWdhdGUucnMAAABy3CYAXwAAAMYAAAAnAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwL2VudHJ5LnJz5NwmAGAAAAChAQAALgAAAGFzc2VydGlvbiBmYWlsZWQ6IGlkeCA8IENBUEFDSVRZL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbm9kZS5ycwB03SYAWwAAAJUCAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5oZWlnaHQgLSAxdN0mAFsAAACtAgAACQAAAHTdJgBbAAAAsQIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBzcmMubGVuKCkgPT0gZHN0LmxlbigpdN0mAFsAAABKBwAABQAAAHTdJgBbAAAAxwQAACMAAAB03SYAWwAAAMsEAAAjAAAAdN0mAFsAAAAKBQAAJAAAAGFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYubm9kZS5oZWlnaHQgLSAxAAAAdN0mAFsAAAD6AwAACQAAAHLcJgBfAAAAWAIAADAAAABy3CYAXwAAABYCAAAvAAAActwmAF8AAAChAAAAJAAAAEluY2x1ZGVkRXhjbHVkZWRVbmJvdW5kZWRpbmRleCAgb3V0IG9mIHJhbmdlOiAAACnfJgAGAAAAL98mAA8AAADM4CYAXgAAADEGAAADAAAAcmFuZ2UgIG91dCBvZiBib3VuZHM6IAAAYN8mAAYAAABm3yYAEAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UvYXBpLnJzAACI3yYAYgAAAI4KAAABAAAAcAYAABQAAAAEAAAAcQYAAAAAAAAIAAAABAAAAHIGAABjYW5ub3QgIGJpdHMgZnJvbSBhIC1iaXQgcmVnaW9uABzgJgAHAAAAHQgnAAEAAAAj4CYADQAAADDgJgALAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYml0dmVjLTEuMC4xL3NyYy9maWVsZC5ycwAAXOAmAF4AAAAOAgAAAgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvc2xpY2UucnMAAMzgJgBeAAAA9wAAAB8AAADM4CYAXgAAAE8BAAAjAAAAbG9hZEJpdFNwYW5FcnJvcjw+OjpQ4SYADQAAAF3hJgADAAAATnVsbE1pc2FsaWduZWRUb29Mb25nVG9vSGlnaC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19zb3VyY2VtYXAtOS4zLjQvc3JjL2VuY29kZXIucnMAjOEmAGcAAAA3AAAADQAAAGludmFsaWQgYnl0ZYzhJgBnAAAAIwAAABIAAABpbnZhbGlkIHV0ZjiM4SYAZwAAAGYAAAAhAAAAjOEmAGcAAABYAAAAEQAAAGJhZCBqc29uOiAAAEziJgAKAAAAbGVmdG92ZXIgY3VyL3NoaWZ0IGluIHZscSBkZWNvZGVg4iYAIAAAAHZscSBkZWNvZGUgZGlkIG5vdCBwcm9kdWNlIGFueSB2YWx1ZXMAAACI4iYAJQAAAHZscSBkZWNvZGUgY2F1c2VkIGFuIG92ZXJmbG93AAAAuOImAB0AAABnb3QgIHNlZ21lbnRzLCBleHBlY3RlZCA0IG9yIDUAAODiJgAEAAAA5OImABoAAABiYWQgcmVmZXJlbmNlIHRvIHNvdXJjZSAjAAAAEOMmABkAAABiYWQgcmVmZXJlbmNlIHRvIG5hbWUgIwA04yYAFwAAAGVuY291bnRlcmVkIGluY29tcGF0aWJsZSBzb3VyY2VtYXAgZm9ybWF0AAAAVOMmACkAAAB0aGUgcHJvdmlkZWQgZGF0YSBVUkwgaXMgaW52YWxpZIjjJgAgAAAAY2Fubm90IGZsYXR0ZW4gdGhlIGluZGV4ZWQgc291cmNlbWFwOiAAALDjJgAmAAAAaW52YWxpZCBtYWdpYyBudW1iZXIgZm9yIHJhbSBidW5kbGUA4OMmACMAAABpbnZhbGlkIG1vZHVsZSBpbmRleCBpbiByYW0gYnVuZGxlAAAM5CYAIgAAAGludmFsaWQgcmFtIGJ1bmRsZSBtb2R1bGUgZW50cnkAOOQmAB8AAABub3QgYSByYW0gYnVuZGxlYOQmABAAAABpbnZhbGlkIHJhbmdlIG1hcHBpbmcgaW5kZXg6IAAAAHjkJgAdAAAAaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyOiAAAKDkJgAaAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcnVzdGMtaGFzaC0yLjEuMS9zcmMvbGliLnJzxOQmAGAAAAAjAQAAHAAAAMTkJgBgAAAAJAEAACgAAADE5CYAYAAAACUBAAAoAAAAxOQmAGAAAAAIAQAAKwAAAMTkJgBgAAAACAEAAEIAAADE5CYAYAAAAAUBAAArAAAAxOQmAGAAAAAFAQAAQgAAAAAAAAAAAAAAAQAAAHMEAABUcnlGcm9tU2xpY2VFcnJvci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3NlcmRlX2pzb24tMS4wLjE0MC9zcmMvc2VyLnJzALXlJgBiAAAADQYAABIAAAC15SYAYgAAAEwIAAAzAAAAdXV1dXV1dXVidG51ZnJ1dXV1dXV1dXV1dXV1dXV1dXUAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALXlJgBiAAAAPwgAAEAAAAAiXCJcXFxiXGZcblxyXHQAteUmAGIAAAB/AgAAKgAAALXlJgBiAAAAlgIAACoAAAC15SYAYgAAAKQCAAAqAAAAteUmAGIAAAD8AQAAKgAAALXlJgBiAAAACgIAACoAAABleHBlY3RlZCBSYXdWYWx1ZS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3d5ei0wLjUuMS9zcmMvY29tdS5ycwC55yYAWgAAACcBAAACAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3Vuc3RhYmxlL2hlYXBzb3J0LnJzJOgmAGAAAAAcAAAAHQAAAE51bGxQdHJFcnJvci4uTWlzYWxpZ25FcnJvcgABAAAAYXR0ZW1wdCB0byBqb2luIGludG8gY29sbGVjdGlvbiB3aXRoIGxlbiA+IHVzaXplOjpNQVgvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHIucnMAAADp6CYASAAAAJoAAAAKAAAA6egmAEgAAACdAAAAFgAAAOnoJgBIAAAAsQAAABYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yMy4wLjIvc3JjL2NvbW1vbi9wYXJzZXIvdHlwZXNjcmlwdC5ycwAAZOkmAHoAAABBAAAAEwAAAGTpJgB6AAAARQAAAA0AAABk6SYAegAAAHQBAAAcAAAApRcnAAYAAABJ+SYACQAAAFL5JgAHAAAAfBQnAAgAAAClFycABgAAAFL5JgAHAAAASfkmAAkAAAB8FCcACAAAALEXJwAIAAAAO/kmAAUAAABsFCcACAAAALASJwACAAAAWfkmAAMAAABk6SYAegAAAA8IAAAzAAAAPCAoanN4IHRhZyBzdGFydCkAAABk6SYAegAAAJgKAAASAAAAZOkmAHoAAADMCAAADgAAAGTpJgB6AAAAUgQAABIAAABhbiBpZGVudGlmaWVyLCB2b2lkLCB5aWVsZCwgbnVsbCwgYXdhaXQsIGJyZWFrLCBhIHN0cmluZyBsaXRlcmFsLCBhIG51bWVyaWMgbGl0ZXJhbCwgdHJ1ZSwgZmFsc2UsIGAsIC0sIGltcG9ydCwgdGhpcywgdHlwZW9mLCB7LCBbLCAobnVtZXJpYyBsaXRlcmFsIG9yIGJpZ2ludCBsaXRlcmFsAABk6SYAegAAALQJAAA0AAAAZOkmAHoAAADGCQAANAAAAGTpJgB6AAAA0AkAABIAAABk6SYAegAAABsJAAAnAAAAZOkmAHoAAAAZCQAAFgAAAGTpJgB6AAAAOQQAAA8AAABk6SYAegAAAD0EAAAQAAAAZOkmAHoAAAB4AAAADQAAAGTpJgB6AAAAVAUAABQAAABk6SYAegAAAGIFAAAOAAAAYW4gaWRlbnRpZmllciwgWyBmb3IgYW4gYXJyYXkgcGF0dGVybiwgeyBmb3IgYW4gb2JqZWN0IHBhdHRlciBvciAuLi4gZm9yIGEgcmVzdCBwYXR0ZXJuAGTpJgB6AAAAKgEAABMAAABnbG9iYWwgb3IgYSBzdHJpbmcgbGl0ZXJhbAAATvsmAHQAAABqAgAAJgAAAE77JgB0AAAAfwIAADYAAAAoIG9yIGAAAE77JgB0AAAAswIAACoAAABO+yYAdAAAAKcCAAAmAAAAZmFpbMgDAAAMAAAABAAAAC8EAABzBgAAywMAAAAAAAAAAAAAAQAAAMwDAABO+yYAdAAAACIBAAAjAAAATvsmAHQAAAAzAQAAHQAAABgWJwB0AAAARAMAACIAAAAYFicAdAAAAF0DAAAqAAAAGBYnAHQAAAA+AwAAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTIzLjAuMi9zcmMvY29tbW9uL3BhcnNlci9tb2QucnMAXO0mAHMAAAC7AQAAFwAAAGlkZW50aWZpZXIsIHN0cmluZyBsaXRlcmFsLCBudW1lcmljIGxpdGVyYWwgb3IgWyBmb3IgdGhlIGNvbXB1dGVkIGtleQAAAFztJgBzAAAAfgEAAB8AAAB0ZW1wbGF0ZSB0b2tlbkFuIGV4cHJlc3Npb24gc2hvdWxkIGZvbGxvdyAnLi4uJy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTIzLjAuMi9zcmMvY29tbW9uL3BhcnNlci9vYmplY3QucnMAAABn7iYAdgAAACQAAAAZAAAAZ+4mAHYAAAAnAAAAEwAAAGfuJgB2AAAApwEAAB4AAAAcAy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNC4wLjEvc3JjL3BhcnNlci9qc3gvbW9kLnJzABLvJgBxAAAAMQEAABkAAAAS7yYAcQAAADsBAAATAAAAPCAoanN4IHRhZyBzdGFydCksIGpzeCB0ZXh0IG9yIHsS7yYAcQAAAN4AAAASAAAAanN4IGlkZW50aWZpZXISEBMAAAAS7yYAcQAAAKEAAAAYAAAAEu8mAHEAAACnAAAAEgAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IEpTWE5hbWVzcGFjZWROYW1lIC0+IEpTWE9iamVjdAjwJgBIAAAAEu8mAHEAAABeAAAAGgAAAGB9YC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNC4wLjEvc3JjL3BhcnNlci90cGwucnNr8CYAbQAAAHgAAAATAAAAa/AmAG0AAAB7AAAAFAAAAGvwJgBtAAAA6AAAABEAAABr8CYAbQAAAOsAAAAUAAAAdmFybGV0PT0hPT09PSE9PTw9Pj08PD4+Pj4+JXxeJnx8JiYqKj8/AJD0JgBnAAAAgwMAABIAAACQ9CYAZwAAAAECAABIAAAAkPQmAGcAAAACAgAAKAAAAJD0JgBnAAAAygAAAEwAAACQ9CYAZwAAAM0AAAAnAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xNy4wLjIvc3JjL2xpdC5ycwCQ8SYAZwAAAPgAAAA0AAAAaW1wbGVtZW50cy8vLyoqL35kZWxldGUrPS09Kj0vPSU9PDw9Pj49Pj4+PXw9Xj0mPSoqPSYmPXx8PT8/PSsrLS0vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9pdGVyLnJzdW5leHBlY3RlZCByZWdleCBmaW5kIGVycm9yOiAKdG8gaGFuZGxlIGZpbmQgZXJyb3JzLCB1c2UgJ3RyeScgb3IgJ3NlYXJjaCcgbWV0aG9kcwAAALPyJgAdAAAA0PImADUAAABJ8iYAagAAAH4BAAAZAAAA9BonAGoAAABeAgAAHAAAAPQaJwBqAAAAawIAADIAAAD0GicAagAAAG8CAAAXAAAAAgAAAPQaJwBqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAA2PMmAA0AAADl8yYAGAAAAGzzJgBsAAAAqgEAAAkAAABjbGFzcy9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAAAl9CYAWAAAANMHAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xNy4wLjIvc3JjL2xpYi5ycwCQ9CYAZwAAAPMHAAAiAAAAkPQmAGcAAAD2BwAAIQAAAHN1cGVyAAAAkPQmAGcAAABnBwAAFwAAAA0KAACQ9CYAZwAAACYIAAAyAAAAkPQmAGcAAAAfCAAAMAAAAG5ldy50YXJnZXRpbXBvcnQubWV0YT8uaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAABr9SYAKgAAAJX1JgAXAAAArPUmABYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjcuMC4wL3NyYy9yZW5hbWUvbW9kLnJzAADc9SYAdgAAABABAAAZAAAAZXZhbEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3do9iYAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2hhc2hicm93bi0wLjE0LjUvc3JjL3Jhdy9tb2QucnOM9iYAZAAAAFYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjMuMC4yL3NyYy9jb21tb24vcGFyc2VyL2NsYXNzX2FuZF9mbi5ycwD3JgB8AAAA3wUAABUAAAAA9yYAfAAAAPcFAAAPAAAAAPcmAHwAAADlBQAAEwAAAAD3JgB8AAAAZQAAABQAAAAA9yYAfAAAAFcGAAARAAAApRcnAAYAAABJ+SYACQAAAFL5JgAHAAAAsBInAAIAAABZ+SYAAwAAALEXJwAIAAAAfBQnAAgAAABsFCcACAAAAKsXJwAGAAAAAPcmAHwAAAD7BAAAEgAAACogZm9yIGdlbmVyYXRvciwgcHJpdmF0ZSBrZXksIGlkZW50aWZpZXIgb3IgYXN5bmNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpc19jb25zdHJ1Y3RvcigpIHJldHVybnMgZmFsc2UgZm9yIFByaXZhdGVOYW1lAAAAVfgmAFgAAAAA9yYAfAAAAEoEAAAaAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xNy4wLjIvc3JjL3R5cGVzY3JpcHQucnNuZXc9PmNvbnN0ZW51bWluZmVycHJvdGVjdGVkcHJpdmF0ZW91dGV4dGVuZHN0eXBlb2YrLW5hbWVzcGFjZW1vZHVsZWdsb2JhbGAAAADI+CYAbgAAAAQCAAAiAAAAJHsAAMj4JgBuAAAABwIAACEAAABhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHZvaWR1bmRlZmluZWRuZXZlcmludHJpbnNpY2tleW9mdW5pcXVlc2F0aXNmaWVzYXNzZXJ0c2lzcmVxdWlyZS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2NvZGVnZW4tMTcuMC4yL3NyYy9tb2R1bGVfZGVjbHMucnNleHBvcnRmcm9tYXNzZXJ0AAAW+iYAcAAAAJkAAAAgAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5zcGVjaWZpZXJzLmxlbigpIDw9IDIW+iYAcAAAAKcAAAAVAAAAFvomAHAAAABZAQAAKAAAAG5vdCBpbXBsZW1lbnRlZDogY29kZWdlbiBvZiBgZXhwb3J0IGRlZmF1bHQgZnJvbSAnZm9vJztg9PomADgAAAAW+iYAcAAAAP0AAAARAAAAZnVuY3Rpb24jIS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTIzLjAuMi9zcmMvY29tbW9uL3BhcnNlci9leHByLnJzaW1wb3J0TvsmAHQAAABKAAAAFQAAAE77JgB0AAAAUwAAAA8AAABO+yYAdAAAAE8AAAATAAAATvsmAHQAAADFAgAAGwAAAGAuYCBvciBgKGAAAE77JgB0AAAA+QIAACcAAABtZXRhVHJpZWQgdG8gcGFyc2UgYW4gYXJndW1lbnQgb2YgeWllbGQATvsmAHQAAADDBwAAEwAAAE77JgB0AAAAvQcAABMAAABO+yYAdAAAAMkHAAAYAAAATvsmAHQAAADdBwAAEwAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgcGF0dGVybjogRXhwciiM/CYAQAAAANyBJwABAAAATvsmAHQAAACkBwAAKAAAAE77JgB0AAAAfQcAABoAAABO+yYAdAAAALYIAAA9AAAATvsmAHQAAADFCAAAGQAAAE77JgB0AAAA1AgAAB8AAABO+yYAdAAAANUIAAAeAAAATvsmAHQAAADMCAAANAAAAHRhcmdldGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHBhcnNlX2xpdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgAFL9JgBNAAAATvsmAHQAAAAQAQAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTQuMC40L3NyYy9zb3VyY2VfbWFwLnJzuP0mAGgAAAA1BQAASgAAALj9JgBoAAAAYgUAACYAAAAuPC8+PDwvPjw+L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xNy4wLjIvc3JjL3N0bXQucnNpZmVsc2Vmb3J0cnlmaW5hbGx5d2l0aGJyZWFrb2Z0aHJvd3doaWxlcmV0dXJuY2FzZWRlZmF1bHQASv4mAGgAAAD/AAAAHQAAAEr+JgBoAAAAAgEAAEEAAABzd2l0Y2hjYXRjaGRvY29udGludWVkZWJ1Z2dlcgAAAAAAAAAEAAAABAAAAIcFAAAjTm9GaWxlRm9yL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50LnJzAAAARv8mAGMAAABsAwAADwAAAAAAAAAEAAAAAAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5yc8j/JgBsAAAA8AEAABYAAABjYW5ub3QgYWNjZXNzIGEgc2NvcGVkIHRocmVhZCBsb2NhbCB2YXJpYWJsZSB3aXRob3V0IGNhbGxpbmcgYHNldGAgZmlyc3QvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zY29wZWQtdGxzLTEuMC4xL3NyYy9saWIucnOMACcAYAAAAKgAAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfcGFyc2VyLTI0LjAuMS9zcmMvcGFyc2VyL2lucHV0LnJzAPwAJwBvAAAAAQEAACgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yMy4wLjIvc3JjL2NvbW1vbi9wYXJzZXIvaWRlbnQucnMAAAB8AScAdQAAANQAAAAJAAAAYXdhaXR5aWVsZGxldCBpcyByZXNlcnZlZCBpbiBjb25zdCwgbGV0LCBjbGFzcyBkZWNsYXJhdGlvbmlkZW50aWZpZXIgb3Igc3RyaW5nL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjMuMC4yL3NyYy9jb21tb24vcGFyc2VyL2J1ZmZlci5yc1ICJwB2AAAAYwAAACAAAAD8ACcAbwAAACoAAAANAAAA/AAnAG8AAABgAAAADQAAAPwAJwBvAAAAUQAAAA0AAAD8ACcAbwAAAEkAAAANAAAA/AAnAG8AAAA5AAAADQAAAPwAJwBvAAAAQQAAAA0AAAD8ACcAbwAAAFkAAAANAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogdG9rZW5fdmFsdWU6IABIAycANwAAAPwAJwBvAAAAMQAAAA0AAAAkGScAbgAAABkDAAAkAAAAZmFsc2V0cnVlbnVsbC91c2Ugc3RyaWN0c2NyaXB0XHV7PCEtLVx4M2MhLS0tLT4tLVx4M2VuLTB4AAAA3gMnAAMAAAAweAAA7AMnAAIAAAAsAAAAyAMAAAwAAAAEAAAAyQMAADMEAADLAwAAAAAAAAAAAAABAAAAzAMAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAJAQnAE8AAADiBQAAFAAAACQEJwBPAAAA4gUAACEAAAAkBCcATwAAANYFAAAhAAAAMwsnAEsAAADoAQAAFwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2JvcnJvdy5ycwC0BCcASwAAABUBAAAlAAAAPGludmFsaWQ+Tm9uZVNvbWUAAAAAAAAABAAAAAQAAAB1BgAAdgYAAHcGAAAkBCcATwAAAGYEAAAkAAAAJAQnAE8AAADOAQAANwAAAHgGAAAIAAAABAAAAHkGAAB6BgAAewYAAHwGAAB9BgAAfgYAAH8GAACABgAAgQYAAIIGAACDBgAAhAYAAIUGAACGBgAAYG1vZHVsZWAga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYG5hbWVzcGFjZWAgaW5zdGVhZC5UeXBlU2NyaXB0IGV4cG9ydCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBpbXBvcnQgZXF1YWxzIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBlbnVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZVRoZSBhbmdsZS1icmFja2V0IHN5bnRheCBmb3IgdHlwZSBhc3NlcnRpb25zLCBgPFQ+ZXhwcmAsIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdHlwZSBzdHJpcCBtb2RlLiBJbnN0ZWFkLCB1c2UgdGhlICdhcycgc3ludGF4OiBgZXhwciBhcyBUYC4vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9jb2RlZ2VuLTE3LjAuMi9zcmMvdGV4dF93cml0ZXIvYmFzaWNfaW1wbC5ycyAAAKMHJwB6AAAAcgAAABoAAACjBycAegAAAIsAAAAYAAAALi4uOl0/PXt9ZGVjbGFyZSEoKmNvbnN0cnVjdG9yYWNjZXNzb3JtaWQgPiBsZW4AZggnAAkAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL21vZC5ycwAAAHgIJwBNAAAA7AMAACsAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL3NvcnQvc3RhYmxlL2RyaWZ0LnJzANgIJwBbAAAA/wAAABkAAADYCCcAWwAAAPIAAAASAAAA2AgnAFsAAADOAAAAJAAAANgIJwBbAAAA0QAAACQAAADYCCcAWwAAAEAAAAAiAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9xdWlja3NvcnQucnMAhAknAF8AAABOAAAAHwAAAIQJJwBfAAAASAAAABcAAABAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogTW9kdWxlIGlzIGhhbmRsZWQgYWJvdmUAAAUKJwBBAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfcGFyc2VyLTI0LjAuMS9zcmMvcGFyc2VyL21vZC5ycwAAAFAKJwBtAAAAKAEAADIAAAAgICAghwYAAAwAAAAEAAAAyQMAAMoDAADLAwAAAAAAAAAAAAABAAAAzAMAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAADMLJwBLAAAA8AoAAA4AAABkZXNjcmlwdGlvbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBEaXNwbGF5iAYAAAgAAAAEAAAAiQYAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAAAAAAAQAAAAEAAAAIQAAAIoGAAAUAAAABAAAAIsGAACKBgAAFAAAAAQAAADBAwAAiwYAAAQMJwBDBAAAjAYAAI0GAABDBAAARgQAAI4GAAAMAAAABAAAAI8GAACOBgAADAAAAAQAAADCAwAAjwYAAEAMJwBDBAAAkAYAAEUEAACRBgAARgQAAEVycm9yVXRmOEVycm9ydmFsaWRfdXBfdG9lcnJvcl9sZW5Gcm9tVXRmOEVycm9yYnl0ZXNlcnJvcklvVXRmOEJhZEpzb25WbHFMZWZ0b3ZlclZscU5vVmFsdWVzVmxxT3ZlcmZsb3dCYWRTZWdtZW50U2l6ZUJhZFNvdXJjZVJlZmVyZW5jZUJhZE5hbWVSZWZlcmVuY2VJbmNvbXBhdGlibGVTb3VyY2VNYXBJbnZhbGlkRGF0YVVybENhbm5vdEZsYXR0ZW5JbnZhbGlkUmFtQnVuZGxlTWFnaWNJbnZhbGlkUmFtQnVuZGxlSW5kZXhJbnZhbGlkUmFtQnVuZGxlRW50cnlOb3RBUmFtQnVuZGxlSW52YWxpZFJhbmdlTWFwcGluZ0luZGV4SW52YWxpZEJhc2U2NGludmFsaWQgdXRmLTg6IGNvcnJ1cHQgY29udGVudHNpbnZhbGlkIHV0Zi04iAYA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L2xleGVyL3N0YXRlLnJzAAAQGCcAbgAAAHsAAAAJAAAAEBgnAG4AAACAAAAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNC4wLjEvc3JjL2xleGVyL2NhcHR1cmluZy5ycwAAoBgnAHIAAAA4AAAACwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNC4wLjEvc3JjL2xleGVyL3Rva2VuLnJzAAAkGScAbgAAANwCAAARAAAASWRlbnRBcnJheVJlc3RPYmplY3RBc3NpZ25JbnZhbGlkRXhwcgAAAK4GAACvBgAAsAYAALEGAACyBgAAswYAALQGAAC1BgAAtgYAALcGAAC4BgAAuQYAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yNy4wLjAvc3JjL3JlbmFtZS9vcHMucnMAAPwZJwB2AAAASAIAABcAAAD8GScAdgAAAE0CAAARAAAA/BknAHYAAAAcAQAAGQAAAPwZJwB2AAAARQEAABkAAAD8GScAdgAAAHkBAAAcAAAA/BknAHYAAAC5AQAAFwAAAPwZJwB2AAAAvgEAABEAAAD8GScAdgAAAHwCAAASAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcG9vbC5ycwAA9BonAGoAAAA9AgAAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTIzLjAuMi9zcmMvY29tbW9uL3BhcnNlci9tb2R1bGVfaXRlbS5ycwBwGycAewAAAHYBAAA4AAAAcBsnAHsAAABhAgAAGAAAAHAbJwB7AAAAegIAABgAAABwGycAewAAAJcCAAAYAAAAcBsnAHsAAAAZAwAAGgAAAHR5cGVzb3VyY2VkZWZlcmludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGUAcBsnAHsAAAA7AwAAGgAAAHAbJwB7AAAAVQMAABgAAABwGycAewAAAGkDAAAcAAAAcBsnAHsAAABiAwAAGAAAAGEgc3RyaW5nIGxpdGVyYWxwGycAewAAAIQDAAASAAAAcBsnAHsAAAAGAwAAFgAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGhhbmRsZV9pbXBvcnRfZXhwb3J0IHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIGN1cnJlbnQgdG9rZW4gaXNuJ3QgaW1wb3J0IG5vciBleHBvcnTkHCcAfAAAAHAbJwB7AAAAMAAAAAkAAABhcwAAcBsnAHsAAABSAAAAEgAAADsvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwCNHScASgAAAL4BAAAdAAAAAAAAAAwAAAAEAAAAugYAALsGAAACAgICAgICAgIDAwEBAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAgIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwAAAAEAAAAAAAAA/////7iFJwBgAAAAHwUAABkAAAAAAAAABAsPExcbHyMnLTE0ODxAAkUAAAAAAEkATQAFBQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVFUWFwFBQUFBQUFBQUFBQUFBQUFBQUFBQUJAAAAAAAAAAAAAAAAAAAAAAFgKGRobHArdHZ6foKGio6SlpqeBTKiAAAAAKQFBaYFBQUFBQVDBawAAAAAAAAAAAAAAACtAAAABbG1uQUFBQUFBQUFBQUFUgUFvQAAAAAAAAAAAAAAAAAAAAC/p8EAAAAAxAAAAAAAAAAAAAAA0NIAAADI2d3hy+UAAOkAAAAAAAAAAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6wUFBQUFBQWq7gUFBQUFBQUFBQXxBQUFBQUFBQUFBQUFBewF9AAAAAAFrgAABQUFBQUFBQUF7wUFBQUFBQXyAAAAAAAACA0RFRkdISUqLzE2Oj5CAkcAAAAAAEsATwAFBQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVFWWl4FBQUFBQUFBQUFBQUFBQUFBQUFBQUJAAAAAAAAAAAAAAAAAAAAAAFiKGZqbnIrdHh8gISIjJCUmJygBTKiAAAAAKQFBakFBQUFBQVDBawAAAAAAAAAAAAAAACvAAAABbO3uwUFBQUFBQUFBQUFUgUFvQAAAAAAAAAAAAAAAAAAAAC/p8EAAAAAxwAAAAAAAADKwsXN0NQA1gDI29/jy+cAAOkAAAAAAM4AAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF6wUFBQUFBQWq7gUFBQUFBQUFBQXxBQUFBQUFBQUFBQUFBewF9AAAAAAFrgAABQUFBQUFBQUF7wUFBQUFBQXyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////////////////////////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//////////////PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIDAwQFBgcICQoLDA0OAwMDAwMDAw8DAwMDAwMDDwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJEAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgICAwICBAIFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdAgIeAgICAgICAh8gISIjAiQlJicoKQIqAgICAissAgICAi0uAgICLzAxMjMCAgICAgI0AgI1NjcCODk6Ozw9Pj85OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlAOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUECAkJDAgJERUZHSEkCSjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUsCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI5OTk5TAICAgICTU5PUAICAlECUlMCAgICAgICAgICAgICVFUCAlYCVwICWFlaW1xdXl9gYQJiYwJkZWZnAmgCaWprbAICbW5vcAJxcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1AgICAgICAnZ3OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTl4OTk5OTk5OTk5eXoCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAns5OXw5OX0CAgICAgICAgICAgICAgICAgICfgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn8CAgKAgYICAgICAgICAgICAgICAgKDhAICAgICAgICAgKFhnUCAocCAgKIAgICAgICAomKAgICAgICAgICAgICAouMAo2OAo+QkZKTlJWWApcCApiZmpsCAgICAgICAgICOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5nB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAnQICAgKenwIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICoKGio6Slpi6nqKmqq6ytMwICAgICAq4CAjU2NwI4OTo7PD0+rzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUwCAgICArBOT7GFhnUCAocCAgKIAgICAgICAomKAgICAgICAgICAgICAouMsrOOAo+QkZKTlJWWApcCApiZmpsCAgICAgICAgICVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVUVAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBAAAAAAAAAAAAABBBEFVVVVVVV1VVVVVVVVVVVVFVVQAAQFT13VVVVVVVVVVVFQAAAAAAVVVVVfxdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFABQAFARQVVVVVVVVVRVRVVVVVVVVVQAAAAAAAEBVVVVVVVVVVVXVV1VVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVVVUVAABVVVFVVVVVVQUQAAABAVBVVVVVVVVVVVVVAVVVVVVV/////39VVVVQVQAAVVVVVVVVVVVVVQUAAAAAAAAAAAAAAAAAQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVQVVVVVVVVVVVVVVVVVVVVAEQVFFVVVVVBVVVVVVVBQBRVVVVVVVVVVVVVVVVVVUEAVRVUVUBVVUFVVVVVVVVVUVVVVVVVVVVVVVVVVVVVUVUVVVRVRVVVVVVVVVVVVVVVFRVVVVVVVVVVVVVVVVVBFQFBFBVQVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVUURAUEUFVBVVUFVVVVVVVVVVBVVVVVVVVVVVVVVVVVFUQBVFVBVRVVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVRRUFRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAEBVVRUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAAFRVVQBAVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVRFRVVVVVVVVVVVVVVVVVQEAAEAABFUBAAABAAAAAAAAAABUVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQQAQUFVVVVVVVVQBVRVVVUBVFVVRUFVUVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVRVVVVVVVUFVVVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAQFVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVVVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUBBQVVVVVVVVVVVVVVVVVUVQEVBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAABVVRUAVVVVVVVVBUBVVVVVVVVVVVVVVVUAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAABUVVVVVVVVVVVV9VVVVWlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf1X11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV9VVVVVVVfVVVVVVVVVVVVVVVV////VVVVVVVVVVVVVdVVVVVV1VVVVV1V9VVVVVV9VV9VdVVXVVVVVXVV9V11XVVd9VVVVVVVVVVXVVVVVVVVVVV31d9VVVVVVVVVVVVVVVVVVVX9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVddVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQVVVVVVVVVVVVVVVVVVVV/f///////////////19V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAKqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVqqqqqqqqqqqqqqqqqqoKAKqqqmqpqqqqqqqqqqqqqqqqqqqqqqqqqqpqgaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqaqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqKqqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVZWqqqqqqqqqqqqqqmqqqqqqqqqqqqqqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVaqqqlaqqqqqqqqqqqqqqqqqalVVVVVVVVVVVVVVVVVfVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUAAAFBVVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVUVFFVVVVVVVVUFVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVAAAAAFBVRRVVVVVVVVVVVVUFAFBVVVVVVRUAAFBVVVWqqqqqqqqqVkBVVVVVVVVVVVVVVRUFUFBVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVQFAQUFVVRVVVVRVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVUEFFQFUVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFFVVVVVqqqqqqqqqqqqVVVVAAAAAABAFQAAAAAAAAAAAAAAAFVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAPCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRWpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpWVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUBVAUFVAFVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVRVVVVVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVQAAAEBVVVVVVVVVVVVVFFRVFVBVVVVVVVVVVVVVVRVAQVVFVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVFQABAFRVVVVVVVVVVVVVVVVVVRVVVVVQVVVVVVVVVVVVVVVVBQBABVUBFFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVAEVUVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVFQBAVVVVVVVQVVVVVVVVVVVVVVVVVRVEVFVVVVUVVVVVBQBUAFRVVVVVVVVVVVVVVVVVVVVVAAAFRFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVFABEEQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUFUFUQVFVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVRUAQBFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVRABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQUQAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUVBBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUABVVUVVVVVVVVVQEAQFVVVVVVVVVVVRUABEBVFVVVAUABVVVVVVVVVVVVVQAAAABAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVUFAAAAAAAFAARBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAUBFEAAAVVVVVVVVVVVVVVVVVVVVVVVVUBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVQFVVVVVVVVVVVVVVVQVAVURVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUAAABQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVRVAVVVVVVVVVVVVVVVVVVVVVVVVVapUVVVaVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVVVVVVaqqVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqpqmmqqqqqqqqqqmpVVVVlVVVVVVVVVWpZVVVVqlVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVUEAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAFAAAAAAAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVURUAUAAAAAQAEAVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAABAFQAAAAAAAAAAAAAAAFRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVdf3/f1VVVVVVVVVVVVVVVVVVVVVVVfX///////9uVVVVqqq6qqqqqur6v79VqqpWVV9VVVWqWlVVVVVVVf//////////V1VV/f/f///////////////////////3//////9VVVX/////////////f9X/VVVV/////1dX//////////////////////9/9//////////////////////////////////////////////////////////////X////////////////////X1VV1X////////9VVVVVdVVVVVVVVX1VVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVXV////////////////////////////VVVVVVVVVVVVVVVV//////////////////////9fVVd//VX/VVXVV1X//1dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VV1VVVVVVVf//////////////f///3/////////////////////////////////////////////////////////////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////V///V1X//////////////9//X1X1////Vf//V1X//1dVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVmWVWGqpVmqVVVVVVWVVVVVVVVVVZVVVQAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAABVVVVVVZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUAlmpaWmqqBUCmWZVlVVVVVVVVVVUAAAAAVVZVValWVVVVVVVVVVVVVlVVVVVVVVVVAAAAAAAAAABUVVVVlVlZVVVlVVVpVVVVVVVVVVVVVVWVVpVqqqqqVaqqWlVVVVlVqqqqVVVVVWVVVVpVVVVVpWVWVVVVlVVVVVVVVaaWmpZZWWWplqqqZlWqVVpZVVpWZVVVVWqqpaVaVVVVpapaVVVZWVVVWVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVZVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVaqqqqqqqqqqqlVVVaqqqqqlWlVVmqpaVaWlVVpapZalWlVVVaVaVZVVVVV9VWlZpVVfVWZVVVVVVVVVVWZV////VVVVmppqmlVVVdVVVVVV1VVVpV1V9VVVVVW9Va+quqqrqqqaVbqq+q66rlVd9VVVVVVVVVVXVVVVVVlVVVV31d9VVVVVVVVVpaqqVVVVVVVV1VdVVVVVVVVVVVVVVVVXrVpVVVVVVVVVVVWqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAMCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFmqqmpVqqqqqqqqqlqqqqqqqqqqqqqqqqqqqlpVqqqqqqqqqrr+/7+qqqqqVlVVVVVVVVVVVVVVVVX1////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAwQFBgcICQoLDA0CAgICAgICDgICAgICAgIOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAgIDAgIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICKywCAgICLS4CAgIvMDEyMwICAgICAjQCAjU2NwI4OTo7PD0+Pzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlAAgJBQgICQ0RFRkdIAkk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlKAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICOTk5OUsCAgICAkxNTk8CAgJQAlFSAgICAgICAgICAgICAlNUAgJVAlYCAldYWVpbXF1eX2BhYmMCZGVmZwJoAmlqa2wCAm1ub3ACcXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQCAgICAgICAgICAgICAgICAgJ1dgICAncCAgJ4eTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ejk5OTk5OTk5OXt8AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ9OTl+OTl/AgICAgICAgICAgICAgICAgICAoACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKBAgICgoOEAoUCAgICAgICAgICAgIChocCAgICAgICAgICiIl2AgKKAgICiwKMAgICAgKNjgICAgICAgICAgICAgKPkAKRkgKTlJWWl5iZmgKbAgKcnZ6fAgICAgICAgICAjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OaAdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKECAgICoqMCBAIFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdAgIeAgICAgICAh8gISIjAiQlJicoKQIqAgICAqSlpqeoqaouqzmsra6vsLECAgICAgKyAgI1NjcCODk6Ozw9PrM5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlLAgICAgK0TU61iIl2AgKKAgICiwKMAgICAgKNjgICAgICAgICAgICAgKPkLa3kgKTlJWWl5iZmgKbAgKcnZ6fAgICAgICAgICAlVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVFQBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQAAAAAAAAAAAAAQQRBVVVVVVVdVVVVVVVVVVVVRVVUAAEBU9d1VVVVVVVVVVRUAAAAAAFVVVVX8XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBQAUABQEUFVVVVVVVVUVUVVVVVVVVVUAAAAAAABAVVVVVVVVVVVV1VdVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVVVVFQAAVVVRVVVVVVUFEAAAAQFQVVVVVVVVVVVVVQFVVVVVVf////9/VVVVUBUAAFVVVVVVVVVVVVUFAAAAAAAAAAAAAAAAAEBVVVVVVVVVVVVVVVVVRVQBAFRRAQBVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVRAFUVVFVFVVVBVVVVVVVVUVBVVVVVVVVVVVVVVVVVVVUQRUUUFFVVVVVVVVVUFFVVUFVVVVVVVVVVVVVVVVVVVQBEFRRVVVVVQVVVVVVVQUAUVVVVVVVVVVVVVVVVVVVBAFUVVFVAVVVBVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVFVFVVUVUVVVVVVVVVVVVVVVRUVVVVVVVVVVVVVVVVVQRUBQRQVUFVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVFEQFBFBVQVVVBVVVVVVVVVVQVVVVVVVVVVVVVVVVVRVEAVRVQVUVVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVUUVBURVFVVVVVVVVVVVVVVVVVVVVVVVVVVVUQBAVVUVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAABUVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVURUVVVVVVVVVVVVVVVVVUBAABAAARVAQAAAQAAAAAAAAAAVFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQEEAEFBVVVVVVVVUAVUVVVVAVRVVUVBVVFVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVVVVVVVQVQVVVVVVVVBVRVVVVVVVUFVVVVVVVVVQVVVVV///33//3XX3fW1ddVEABQVUUBAABVV1FVVVVVVVVVVVVVFQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVFVFVQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVXFRRVVVVVVVVVVVVVVVVVVUUAQEQBAFQVAAAUVVVVVVVVVVVVVVVVAAAAAAAAAEBVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVAABQBVRVVVVVVVVVVRUAAFVVVVBVVVVVVVVVBVAAUFVVVVVVVVVVVVVVVVVFUBEAVVVVVVVVVVVVVVVVVVUAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAEAFRRVVRQVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAAAVVUVAFVVVVVVVQVAVVVVVVVVVVVVVVVVAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAVFVVVVVVVVVVVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX9V9dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVfVVVVVVVX1VVVVVVVaqqVVVVVf///1VVVVVVVVVVVVXVVVWlqtVVVVVdVfVVVVVVfVVfVXVVV1VVVVV1VfVddV1VXfVVVVVVVVVVV1VVVVVVVVVVd9XfVVVVVVVVVVVVVVVVVVVV/VVVVVVVVVdVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVXXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUFVVVVVVVVVVVVVVVVVVVf3///////////////9fVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAACqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVaqqqqqqqqqqqqqqqqqqCgCqqqpqqaqqqqqqqqqqqqqqqqqqqqqqqqqqaoGqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVamqqqqqqqqqqqqqqaqqqqqqqqqqqqqqqqiqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlWVqqqqqqqqqqqqqqpqqqqqqqqqqqqqqlVVqqqqqqqqqqqqqqqqqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAEFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFRVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAAAAAAAAAAAAAAAAVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVDAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVQFQVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAEVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUABVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVRVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUUAEQRUAVAVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAABURVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVRQARBEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVBVBVEFRVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVUVAEARVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUQAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVREFEABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUAAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVFQARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAVVVFVVVVVVVVUBAEBVVVVVVVVVVVUVAARAVRVVVQFAAVVVVVVVVVVVVVUAAAAAQFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEAAEFVVVVVVVVVVVVVVVVVVVVVVVVVVBQAAAAAABQAEQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFARRAAAFVVVVVVVVVVVVVVVVVVVVVVVVARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVRVVUBVVVVVVVVVVVVVVVUFQFVAVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAAAAUFVVVVVVVVVVVVVVVVVVVVVVBQAAUAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVBVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVWVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFQAQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqalVVqqqqqqpqVVUAAAAAAAAAAAAAAAAAQBUAAAAAAAAAAAAAAABUVVFVVVVUVVVVVRUAAQAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVAEAAAAAAFAAQBEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVdf3/f1VVVVVVVVVVVVVVVVVVVVVVVfX///////9uVVVVqqq6qqqqqur6v79VqqpWVV9VVVWqWlVVVVVVVf//////////V1VV/f/f///////////////////////3//////9VVVX/////////////f9X/VVVV/////1dX//////////////////////9/9//////////////////////////////////////////////////////////////X////////////////////X1VV1X////////9VVVVVdVVVVVVVVX1VVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVXV////////////////////////////VVVVVVVVVVVVVVVV//////////////////////9fVVd//VX/VVXVV1X//1dVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9VV1VVVVVVVf//////////////f///3/////////////////////////////////////////////////////////////9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV////V///X9X/////////////////f1X1////1///X1X//1dVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVmWVWGqpVmqVVVVVVWVVVVVVVVVVZVVVQAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAABVVVVVVZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUAlmpaWmqqBUCmWZVlVVVVVVVVVVUAAAAAVVZVValWVVVVVVVVVVVVVlVVVVVVVVVVAAAAAAAAAABUVVVVlVlZVVVlVVVpVVVVVVVVVVVVVVWqqqpqqqqqVaqqWlVVVVlVqqqqVVVVVWVVVVpVVVVVpWVWVVVVlVVVVVVVVaaWmpZZWWWplqqqZlWqVVpZVVpWZVVVVWqqpaVaVVVVpapaVVVZWVVVWVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVZVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWqqqqqqqqqqqpWVVWqqqqqpVpVVZqqWlWlpVVaWqWWpVpVVVWlWlWVVVVVfVVpWaVVr1VmVVVVVaqqVVVmVf///1VVVZqaappVVVXVVVWlqtVVVaVdVfVVVVVVvVWvqrqqq6qqmlW6qvquuq5VXfVVVVVVVVVVV1VVVVVZVVVVd9XfVVVVVVVVVaWqqqqqqqqq/VVVVVVVVVdVVdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1VdVVVVVVVVVVVVVVVVXrVpVVVVVVVVVVVWqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgMAAMCqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFmqqqpWqqqqqqqqqlqqqqqqqqqqqqqqqqqqqlpVqqqqqqqqqrr+/7+qqqqqVlVVVVVVVVVVVVVVVVX1////////vAYAAAwAAAAEAAAAhAUAAG8GAACGBQAAMDEyMzQ1Njc4OWFiY2RlZi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3V1aWQtMS4xNy4wL3NyYy9mbXQucnMAKIEnAFsAAAC7AAAADQAAACiBJwBbAAAAswAAABUAAAAogScAWwAAALYAAAANAAAAKIEnAFsAAAC3AAAADQAAAJSCJwBQAAAALgIAABEAAABKc1ZhbHVlKCkAAADUgScACAAAANyBJwABAAAA///////////wgScAAAAAAAAAAAAAAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwAIgicATwAAABkBAAAZAAAAVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5aIInACQAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5yc5SCJwBQAAAAuQIAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnMvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY2FjaGUvaW50ZXJuLnJzY4MnAG0AAAAaAAAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvcXVldWUucnMAAADggycAbQAAACUAAAAuAAAA4IMnAG0AAAAoAAAAKQAAAOCDJwBtAAAAPgAAABoAAADggycAbQAAAD4AAAAnAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjUwL3NyYy90YXNrL3NpbmdsZXRocmVhZC5ycwAAAJCEJwB5AAAAIgAAABUAAAC/BgAAwAYAAMEGAADCBgAAkIQnAHkAAABnAAAAJQAAAGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9w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AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAALKqIAC6qiAAwqogAMqqIADSqiAA2qogAOKqIADqqiAA8qogAPqqIAACqyAACqsgABKrIAAaqyAAIqsgACqrIAAyqyAAOqsgAEKrIABKqyAAUqsgAFqrIABiqyAAaqsgAHKrIAB6qyAAgqsgAIqrIACSqyAAmqsgAKKrIACqqyAAsqsgALqrIADCqyAAyqsgANKrIADaqyAA4qsgAOqrIADyqyAA+qsgAAKsIAAKrCAAEqwgABqsIAAirCAAKqwgADKsIAA6rCAAQqwgAEqsIABSrCAAWqwgAGKsIABqrCAAcqwgAHqsIACCrCAAiqwgAJKsIACarCAAoqwgAKqsIACyrCAAuqwgAMKsIADKrCAA0qwgANqsIADirCAA6qwgAPKsIAD6rCAAAq0gAAqtIAASrSAAGq0gACKtIAAqrSAAMq0gADqtIABCrSAASq0gAFKtIABarSAAYq0gAGqtIAByrSAAeq0gAIKtIACKrSAAkq0gAJqtIACirSAAqq0gALKtIAC6rSAAwq0gAMqtIADSrSAA2q0gAOKtIADqrSAA8q0gAPqtIAACriAACq4gABKuIAAariAAIq4gACquIAAyriAAOq4gAEKuIABKriAAUq4gAFquIABiriAAaq4gAHKuIAB6riAAgq4gAIquIACSriAAmq4gAKKuIACqriAAIKcgACanIAAspyAAMqcgADinIAA+pyAARKcgAEqnIABQpyAAVqcgAFynIABjpyAAaqcgAHGnIAB4pyAAf6cgAIanIACNpyAAlKcgAJunIACipyAAqacgALCnIAC3pyAAvqcgAMWnIADMpyAA06cgANqnIADhpyAA6KcgAO+nIAD2pyAA/acgAASoIAALqCAAEqggABmoIAAgqCAAJ6ggAC6oIAA1qCAAPKggAEOoIABKqCAAUaggAFioIABfqCAAZqggAG2oIAB0qCAAe6ggAIKoIACJqCAAkKggAJeoIACeqCAApaggAKyoIACzqCAAuqggAMGoIADIqCAAz6ggANaoIADdqCAA5KggAOuoIADyqCAA+aggAACpIAAHqSAADqkgABWpIAAcqSAAI6kgACqpIAAxqSAAOKkgAD+pIABGqSAATakgAFSpIABbqSAAYqkgAGmpIABwqSAAd6kgAH6pIACFqSAAjKkgAJOpIACaqSAAoakgAKipIACvqSAAtqkgAL2pIADEqSAAy6kgANKpIADaqSAA4qkgAOqpIADyqSAA+qkgAAKqIAAKqiAAEqogABqqIAAiqiAAKqogADKqIAA6qiAAQqogAEqqIABSqiAAWqogAGKqIABqqiAAcqogAHqqIACCqiAAiqogAJKqIACaqiAAoqogAKqqIAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAKa2IACotiAAqrYgAKy2IACutiAAsLYgALK2IAC0tiAAtrYgALi2IAC7tiAAvrYgAMG2IADEtiAAx7YgAMq2IADNtiAAEMcgACDHIAAwxyAAQMcgAEDHIABQxyAAYMcgAHDHIACAxyAAkMcgAKDHIACwxyAAwMcgANDHIADgxyAA8McgAADIIAAQyCAAIMggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAvyAAkL8gAKC/IACwvyAAwL8gANC/IADgvyAA8L8gAADAIAAQwCAAIMAgADDAIABAwCAAUMAgAGDAIABwwCAAgMAgAJDAIACgwCAAsMAgAMDAIADQwCAA4MAgAPDAIADwwCAAAMEgABDBIAAgwSAAMMEgAEDBIABQwSAAYMEgAHDBIACAwSAAkMEgAKDBIACgwSAAsMEgAMDBIADQwSAA4MEgAPDBIADwwSAAAMIgABDCIAAgwiAAMMIgAEDCIABQwiAAYMIgAHDCIACAwiAAkMIgAJDCIACgwiAAsMIgAMDCIADQwiAA4MIgAPDCIAAAwyAAEMMgACDDIAAwwyAAQMMgAFDDIABgwyAAcMMgAIDDIACQwyAAoMMgAKDDIACwwyAAwMMgANDDIADgwyAA8MMgAADEIAAAxCAAEMQgACDEIAAwxCAAQMQgAFDEIABAwiAAYMQgAHDEIACAxCAAkMQgAKDEIACwxCAAwMQgANDEIADgxCAA8MQgAADFIAAQxSAAIMUgADDFIABAxSAAUMUgAGDFIABwxSAAgMUgAJDFIACgxSAAsMUgAMDFIADQxSAA4MUgAPDFIAAAxiAAEMYgACDGIAAwxiAAQMYgAFDGIABgxiAAcMYgAIDGIACQxiAAoMYgALDGIADAxiAA0MYgAODGIADwxiAAAMcgAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA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ACy7JgD0yCYADAAAABAAAAAPAAAADwAAABAAAAAPAAAADwAAAA8AAAANAAAAEgAAAA0AAAAOAAAAEgAAAE68JgBavCYAarwmAHm8JgCIvCYAmLwmAKe8JgC2vCYAxbwmANK8JgDkvCYA8bwmAP+8JgAKAAAABgAAAAUAAABewiYAaMImAG7CJgBKyiYAUMomAFbKJgDc////+P///9j////4////0P///9D////g/////P///9z////8////1P///9T///8QAAAAEAAAAAQAAAAIAAAAKAAAABQAAAAUAAAAFAAAABQAAAAIAAAADAAAACwAAAAYAAAAGAAAAAIAAAACAAAAAwAAAAMAAAABAAAAAgAAAAEAAAACAAAAAgAAAAIAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAAKAAAAAgAAAAIAAAAe8SYAIPEmACLxJgAl8SYARP4mACjxJgBD/iYAKvEmACzxJgAu8SYAMPEmAGn5JgBq+SYAUggnALUDJwAz8SYANPEmADXxJgA28SYAN/EmADnxJgCwEicAshInADvxJgA98SYAFAAAABQAAAAIAAAADAAAACwAAAAYAAAAGAAAAAMAAAADAAAABQAAABjxJgAb8SYAO/kmADwAAAAsAAAAHAAAACwAAAAcAAAAGAAAAAgAAAAgAAAALAAAADwAAAAsAAAAHAAAACwAAAAcAAAAGAAAAAgAAAAgAAAALAAAAAEAAAACAAAAAgAAAAIAAAACAAAAAgAAAAMAAAADAAAABAAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAMAAABGCCcAH/ImACHyJgAj8iYAJfImACfyJgAp8iYALPImAC/yJgAz8iYANfImADfyJgA58iYAPPImAD/yJgBC8iYAAQAAAAEAAAABAAAAAQAAAAYAAAAEAAAABgAAAGr5JgBp+SYAUAgnABjyJgBj+SYA1/kmABnyJgAoAAAAEAAAAEAAAAAsAAAAFAAAAEQAAAAQAAAABAAAAAQAAAAIAAAACAAAABgAAAAYAAAADQAAABEAAAAHAAAAWBAnAB8TJwAwEycAIAAAABgAAAAYAAAAGAAAAAAAAAAAAAAAAADwPwAAAAAAAPg/AAAAAAAAAAAG0M9D6/1MPgAAAAAAAAAAAAAAQAO44j8AQaDfngELwAsAAAAAAAAAAHQEAAACAAAAAAAAAHUEAAACAAAAAAAAAHYEAAACAAAAAAAAAHcEAAACAAAAAAAAAHgEAAADAAAAAAAAAAEAAIAAAAAAAAAAAIgFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVBQAAAAAAAAAAAAAAAAAAAAAAAJYFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACaBQAAAAAAAAAAAAAAAAAAAAAAAJsFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACUBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAClBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACmBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACmBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACmBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACoBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACoBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACoBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACpBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACpBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAClBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAClBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADSBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACWBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACXBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACYBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACZBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADjBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADkBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADlBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADmBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADnBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADoBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADpBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADqBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADrBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADtBQAAAAAAAAAAAAAAAAAAAAAAAAAAAADuBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACbBQAAAAAAAAAAAAAAAAAAAAAAAAAAAACbBQAAAAAAAAAAAAAAAAAAAAAAAAAAAABYBgAAAAAAAAAAAAAAAAAAAAAAAAAAAABZBgAAAAAAAAAAAAAAAAAAAAAAAAAAAABaBgAAAAAAAAAAAAAAAAAAAAAAAAAAAABiBgAAAAAAAAAAAAAAAAAAAAAAAGYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAvgYAAABKBG5hbWUBQwI8Hl9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNjgyMtstH19fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIASAlwcm9kdWNlcnMBDHByb2Nlc3NlZC1ieQIGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQ==", "base64"); + var bytes = Buffer2.from("AGFzbQEAAAAB7AROYAAAYAABf2AAAX5gAX8AYAF/AX9gAX8BfmACf38AYAJ/fwF/YAJ/fwF+YAJ/fwF8YAN/f38AYAN/f38Bf2ADf39/AX5gBH9/f38AYAR/f39/AX9gBH9/f38BfmAFf39/f38AYAV/f39/fwF/YAZ/f39/f38AYAZ/f39/f38Bf2AHf39/f39/fwBgB39/f39/f38Bf2AIf39/f39/f38AYAh/f39/f39/fwF/YAt/f39/f39/f39/fwF/YA1/f39/f39/f39/f39/AGAOf39/f39/f39/f39/f38Bf2APf39/f39/f39/f39/f39/AX9gE39/f39/f39/f39/f39/f39/f38Bf2AXf39/f39/f39/f39/f39/f39/f39/f38Bf2AJf39/f39/fn5+AGAFf39/f34AYAZ/f39/fn8AYAR/f39+AGAGf39/fn9/AGADf39+AGADf39+AX9gBH9/fn8AYAR/f35/AX9gBX9/fn9/AGAGf39+f35/AGAFf399f38AYAV/f3x/fwBgAn9+AGACf34Bf2ADf35/AGADf35/AX9gBH9+f38AYAR/fn9+AX5gA39+fgBgA39+fgF/YAR/fn5/AGAFf35+fn4AYAR/fX9/AGACf3wAYAN/fH8Bf2AEf3x/fwBgBH98f38Bf2ABfgBgAX4Bf2ABfgF+YAJ+fwBgAn5/AX9gAn5/AX5gA35/fwBgA35/fwF/YAJ+fgBgAn5+AX5gA35+fwBgBH5+f38BfmAEfn5+fwF+YAd+fn5/f39/AX5gAXwBf2ABfAF8YAJ8fwF/YAJ8fwF8YAJ8fAF8YAN8fHwBfALLGj0YX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX2dldAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMjNhMjY2NWZhYzgzYzYxMQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfMWRjMzYxYmQxMDA1M2JmZQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfZTJkMmE0OTEzMmMxYjI1NgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX3N0cmluZwAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfYjliOTMwNDdmZTNjZjQ1YgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19uZXcABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18fX193YmdfdG9TdHJpbmdfNTI4NTU5Nzk2MDY3NmI3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNDA1ZTIyZjM5MDU3NmNlMgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNzhmZWIxMDhiNjQ3MjcxMwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfM2YxZDBiOTg0ZWQyNzJlZAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfMzc4MzcwMjNmM2Q3NDBlOAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2lzX2JpZ2ludAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIwAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21faTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JpbmRnZW5fYmlnaW50X2Zyb21fdTY0ADsYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfaW5zdGFuY2VvZl9NYXBfZjM0NjljZTIyNDRkMjQzMAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fE19fd2JpbmRnZW5fanN2YWxfZXEABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2lzX3VuZGVmaW5lZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9uZXcASBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF82NTc0ZTFhOGE2MmQxMDU1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2RvbmVfNzY5ZTVlZGU0YjMxYzY3YgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxxfX3diZ192YWx1ZV9jZDFmZmE3YjFhYjc5NGYxAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX2dldF82N2IyYmE2MmZjMzBkZTEyAAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24ABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF8yNWZlYWRmYzA5MTNmZWE5AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfNjcyYTRkMjE2MzRkNGEyNAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyBfX3diZ19uZXdub2FyZ3NfMTA1ZWQ0NzE0NzVhYWY1MAAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzg4YTkwMmQxM2E1NTdkMDcAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18yX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzU2NTc4YmU3ZTlmODMyYjAAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV181ZGUzNzA0M2E5MWE5YzQwAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fK19fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzM3YzVkNDE4ZTRiZjU4MTkAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfaXNBcnJheV9hMWVhYjdlMGQwNjczOTFiAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfN2NjY2RkNjllMDc5MWFlMgALGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfYTQ0NjE5M2RjMjJjMTJmOAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxFfX3diaW5kZ2VuX21lbW9yeQABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfYTEyMDAyYTdmOTFjNzViZQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfNjU1OTViZGQ4NjhiMzAwOQAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfMTcxNTZiY2YxMTgwODZhOQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWYABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18ZX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2UxNDU4NTQzMmUzNzM3ZmMABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfZW50cmllc18zMjY1ZDQxNThiMzNlNWRjAAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEF9fd2JpbmRnZW5fdGhyb3cABhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmluZGdlbl9iaWdpbnRfZ2V0X2FzX2k2NAAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAGGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ190aGVuXzQ0YjczOTQ2ZDJmYjNlN2QABxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfcXVldWVNaWNyb3Rhc2tfOTdkOTJiNGZjYzhhNjFjNQADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza19kMzIxOWRlZjgyNTUyNDg1AAQYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX3Jlc29sdmVfNDg1MTc4NWM5YzVmNTczZAAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxJfX3diaW5kZ2VuX2NiX2Ryb3AABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmluZGdlbl9jbG9zdXJlX3dyYXBwZXI2ODI3AAsDlzCVMA0GEAoLBgYGBgYKEAoKCgYKCg0GBg0GBgYKEgoNEAoNBi8GDQYQBgc5BgYHCg0KCg0GBhIGBg4GBgYSChANChIEBwoNCgYNBgoKEgYDEBIGDQYHBgcDBhINBAYSBgoDCgoNCg0GAwMDBgYGBgYGChISAwMDDQMSAxIGBwMDCgoDEgMDEgYKBhADBgYDAwcGBgYDBg0GCgYDAwMGAwMGAwoGCgYNCgZMAwMGBgsUDQYKBhANAw0KBkoHAwoQBhJKBgYKEAcQEAsDAwMGBxAGDQcUBgcQCwcHBgsSBwoGBgMQBg0LBgYNDQYKDQEQEAYGBwYGBgYKBwoDBAYKCgsKCgYEDQYNBg0GBw0QEA0HBg0SBg0HBwoNEAYDCgtNChAKEgYDEgYGBgYGAwMGBwYGEAoKCgoKCgoGAwcKCgoGBgYGBgQEBwoGAwEUDQcKCg0DCwoGBg0HBgYECgEKBgMGBhADBgYKCwsHBgoGEAMGDQYKAwMDAw0GBgMDBgMaAxIKCgYGAw0GBgQDBwYECgYDDQMDAwMDAwMKAwMDAwMDAwMDAwMDAwMDAwwGBAoDChQOAwMDAw0NBhUOBgoDBgYGFAMGBgYOBgQGDg0OAwMKBgsSBgYKBgYGBAMDAwMOCgYSCyAKCwYHBgYGBgYGBgYDBgYSBxQGBxQNNwYGBg0HAwoNFwYKBgoQBgYLCwMKBgsLBgYNCwsEBgsGCgoNBgoKCgYNBgcDBgYDBgYGCgoNBgoHAwcOBgoDCwsSBwYGAwMDCgYEEDkZEAMNAwoDAwcKCg0HCwMHEAsGBgMDEAcKCgoGDQ0GDQsNDQMDCgYGBgcLBhYDAygGCgoGBwYDBgMGBgYUCwoDEgoNFAYGBgcGAwMDBgcGCwYGDQoDBhASBQYKEwcGCwYGCgYKBhIHCwYGDQ0DEggKAwYGAwcDCgsGCgMHBgYKCg4LBwYKAy0ILgYDAwMDAwMDAwYNBA0GAxAQEhIGBwMDBgYGFQMDAwMDAw0NDQQGBgYSAwMHCgMGBgoGBgYUEgYHKwsUAwoSEgMGCgcHBgMGCgpFRQYLCgoRBwZFBg0NDQYQEhQSBwYGFBIKBEwLBgYKBwYGCgcHAzELCwcHBgYKEBIDBwMGBgoGDQYGBgMGCwoKBgYDBgYKAwAGCgYGPQQGAwYNCg0HBhAeBwMGBgoDBwMDBgoKAwMDBwYGDgYSBwYLCgoKBgYGBgYKBgYGBwMHBwYGQQYLBgYKBgcDBgoKCgoKDQ0NBwYDAwsNAwMKBgYKCgoNAwoGIQYGCwMHBBUEEgYEDQ0KBhMHEgoKCg0NBgoHBgpJChIEDQoKCgoNBgYHBAMHBhUHBgcHCg0ECgYGCwYUDQYEBxAGBwcNBgYKChIHCgQGHwoEBgYSBAYGBwYGBgYDBgYGBiUGCg4GBgMGBgMGEA0NDQ0NDgoGBgcHCgYEEg0NEgoNBhIGEAYGEgoGBgMDBgcQCjANDRIKBwYKDQMGBg0DBgYGBgoGEhIEAwMFBgoGCgQHBwYQBgcKAwYNDQMGAwMSEgsEEBEDBwUHBgYHBgMKAwMGBgYGBwYGBgYGCg4HBgQKCgYKAwsiBgsDBwYKAwYNDQYDBgYQBwcHCgYGBgYKCxItBBISBgYGBwcDBwcHAwcHBwYGBgYDBgYGBgoNEAYGBwcNCgoGDQoKBgQKBgMKFRINDQ0GBwMDBgYHAwYGAw4KDQYKBgcHBgYHBwYKBg0SDQoHAwoGBgoGBgYHCgoHCgcHAwMNDQoHBgoLBgoGAwsDCwcOCgcEBgcGCg0NDQYGCgMDAwMDAwMDBgoNDQYDEgMGBgoEEgoGBgYGBwoKCwsKBwcHBgYtBgMHAwMGBwcGBgYKBgYGBgYGCgYNEgMEBgYDBw0SBgsGBwMLDg4HEAMDAwMDAwoGJQYKEAMLDQcHBw0GBgYGDQsGBhAGCgMNAwYQBAYGBwYGAwoGAworBgYGBgYGBgYREAoDBwYGBwYKBgYSEgoNCgMKBQcQAysKCwsGDQoKBg0NBgMGCgMGChAdBgMQDQYKCgYGLwcHBgQGCgYDCgYGDQoHBgcDAw0KCgYHCgYHBwcDBgQIBwYHBwcmBgcHBwMGAwYGHAoHAz0KCgMNDQYGBgcGDQoGDgMDCgYOFAcKBwYLBgYGBgoHCgoKBgcGCgMHBQcmBAMHBAoGBgYDBgYGBgYGCgoGDRsGDgcHBgYHEAoQEBAQChAQEAoQEBANEBAKEAoKBxQDDQoKBgMDAwMDAwMGAwMDAwMDAwMHBiwDAwcHDQYHBxIGCkEDDQYGBgYKBgcHAwQGChgNCwYNBgMLAwoEAxILCwcEBgMSBw0UBgYGBgQGBgoKBgYHAwYDBgYGBgYGBgYGBgYGBAMKBgMGBwcGAwYDAw0KChUQBgcGBwcDBAcHBwcHBgMGBDYGAw0DBhEKBgMKAwMDEQYGBgYSAwMGCwQKBgYGBwoKBw0HBAcKBwYDBgYDBxAHBwYDBwMDAwcDBgMSBhIDEgYGDQQNCwsGBgYDDQ0GBAYQCgQDAwMDBgMGAwMDBgoKCgoKCgYKBhAGBgYGBgcLAwQHBwkGBwcGBgYGBgYGBgQGBwQHBwYHAwMDBwcHBwcHBwcHBwcHBwcHBwMDBAcHBwcDAwMDAwMDAwMDDg4NBg0OBAYQDQYGCgoGCksKBwoSBgYGBgYKFBAGBg0GBg0NBwYKBgoGBgYDBAcHBwMGCgMDAwoNAwoEBwYGBisGBgkHBwcHBwcHBwcHBy0GBhANAwYGBgYGBAMHCgcEBkxMTBAHBwcHCgYEEg0GBwcHBwcHAwcHAwcHBwcHBwcHBwcHBwcHBwcHEgcHBwcHBwcHBwcHBwMDBwYGBgYGBgoGBgYGCgYODQMGBgYDCwtMTEwSBC0GBAYNBwYDBgMDAwcHAwYHAwMDBwMDAwMDAwMDAwYHBgYHBhIGBgYGAwotAwoGCg0KCgMDBhIHBgQHEisDDSQGEAcNBwYHBwcKBwcDBgYDAwMHBwYGBxAPBgYHBwcHAwcLCwsLAwcDAwcDBgMDAwMDBAYKDwYKCgoNBgcLBgYGBxQHBhAKBAMGDQMDBAcKBgMHBgMDAwMDAwMDBAYNBAUEEgcHAwMDBwcrCg4DBgYKBgYGBgYGBgYGBgoGAwYLNBALCwsGAwcGBwMHAwYGBgYFBgYGBgYLDQoKBgYKBBAHDgMGCgYEBgMKCgoKCgMDDgMDAwckBAMKJA4EJAoKBCQSBgsKCgsHBAMHBgMHBhAGEBAQBAYGBwYHBgcNEgMDCgMGAwMDBgYGCgQQBAYGDQoKEAQKBgYGBwcGBAYKCgQDAwYGBgYDBgYGBg0NDQoGCwYGBgYGCgoGEgcHAwYDBgYKBAoGCgoDAwMDAwMDAwMDAwMGAwoHBhIKBg4GBgQGA0IGBwcHBwYtBwcHBgcGBgYGBgYGBgYGBgYGBgYKBgYKEBAQBgsKCkZGDQMDAwMHBwcHBwcHBwcHBwcHAwcDBwcHAwMHAwcHBwcHBwcDBwMDAwMDAwMDAwMDAwMDAwMKCgoGDQYHBwMKDQ0EDQoKCgYrCgoKCg0KCgMLBgQOBhIHEg4QAwcKCwQLQgYHBwcHBwMEBwsLCwsHBwcHQgcHAwYGCgMGBgcGCwMLAwcGBwYGBgYHAw4GBwcHBwMEBxAHAwMDBwMGBg0GBgMDAwYLAwcEAwQHBwcHBwcHBwcHBwcDCgYGBAYGMzMDDQoGBgYHDQcHDQoDAwMGDQQEBwcHBwYGBwcHBwYGBg0KBwoHBwcGChILDQcHAwYHBwcHBwcHBwcHBwcHBwcHBwcHAwcHBwcHBwcHBwQGBwMHBwcHBwcHBwcDBwcDBwcDBwcHBwcHBwcHBwcDBwcHAwcDBwMDAwYDAwMGBwYGBAcKBwcKAwoKBwcHCgcGCgMHAwoHBAYDBAYGAwcGCgYGCgcDCgcKBxADBwcLBw0GCgoGCgYGBgoHBwcHBwcEBgYHBwcHBwYGBgYKBg0GCgoHBwcHAwcHBwcHBwYHBwoKAwMHBwcHBwcHCgcGBwcHBwcHBwoEDgcOCgYGCg0GBwsHBAYNCgoGBwoKPQYHBwcHAwc9Bz0GBwcHBwcHPQc9PT0HAz09PQM9PT09PT09PQoKBgoKEAMHChAQChAEAwcDAwMDAwcHBwcHBwYGBxADAwcHBwcHBwcHBwcHBwcHBwMGBwcHBgYGBgcHBwcHBwcDBwcDBwcDBwMDBgYGBgYGBgMDAwMDBgMQEAYQBBAGChAQEAoHCgoQCgcHBgYGBwcQEBADPQYGBgYGCgoHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcQBwcHBwcHBwsLCwsHPQcHBwcHBwcHBwcHBwcGBwcHBwcDBwcHBwcHBwcHBwcHBwYHBwcHBwcHBwcHBwcDBwcHAwYQAxAHDRANCgQGChAQCgoDDQcKBwEEAwYSEAMHBAcGAwMDAwYDBgoHBwMGBgMDAwMHBwQGCgMQBwcDBwsHBgYGBgYGBwYGBgZJBgYGBgYGBgYGBgYGBgAKBgYGBgYGBgYGBgYLAwoGAwEDBgoGBxAOBgYLCgoGBgMGBgMEAxAHCwMDCgYKBg0NAwYGCgMhCgYDAyEDAz0DAwMDBgYDAwMDAwMDBAYhCgMKAwYDCgMHBwoGBwoHBgMGBgYGBgcDBgYEBwYDAwcSAwMHBwcEBwcGBwcGBgoGBgMDBwYGBgYDBgoDBwYNBgYGBgYDAwMGAwMGAwMGAwMDBgMDAwMDBwcHAwYGAwcHAwoKBgMDBgMDAwMGAwMHBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcDBwcHBwcHBwcHBwcHBwcHBwcDBwcHBwcGBgMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHDAwHBwcHBwYGBgMGBgMHAwMKEAMDAwYQBgMDEhALBgMGBgYQAwMDBBABAwYGAwYDAwMQAwMDAwYDBgYGAwMDBgYDBgMDAwMGAwYDBgYDBgYDAwMGAwMGBgYEBgMDAwMDBwcHBwcHBwcHCg0GBwcHBwcHBwcMBwMHAwMHEgcGAwMHBwYGAwYDBwMDAwMDAwcHAwMGBgYGBwYHBwYGBgYHAw0KChIGCAYDBwoDBAcGBgQDBgMDBgQDAwoKBgYDCkdHA0AGPwYNBwMKCgoKCgoKCgMKCgYHCgcKBgcKChINBgoNDQ0KCgcHRBIEAwMLCgoLCwYGCgoKCgYDBgMGBwcUBgYNOgsHDgYKCgsKNgMDAzotAwMDAwMGBgYGBgYGAwoGBgoDAwoDAwMKAwMHBwQGCgYGEAcKCgMDBwgHAwQHCgoKCgcCAgICAg4EAwcHAgICAgICAgICAgICAgICAgYGBgYGBgYGBgYGBgYGBgYGAwICAwICAgYGBgYGBgYGAgYGBgQGBgYGBAYGBgMHMjIGCgcKBwcHBAcNEQ4KBwYGBgcHBwcHBgYEDQoHB0MCPAoHAgICAgICAgICAgICAgICAgIHBwcHBwcHBwcCAgIHBwcHBwYHBwcHBwcGAwYGBgYGBgYGBgYGBg4HEBAHEAoIBwcKBgMGDQYKAwoGBgoOAwYHBwcHBwcHBwcHDQcHBw0HBwcGBgQGBwoNBgcMOjoHOgcHBgcHBjoHBAoGCjoGMQEGOgYGAwYLBwADAw0DAAAAAAQAAAQHBwcHBwcHBwsHBwcHBwcHBwoKBgALCwcHAwMDAwMDAwcGAwMDBwZMAwMDAwMEBQoKBgYEBAQEBAQEBAYGBgMOBwcHEBAQDRANBwcEAwMGBwsHBxAQDRAQEAgKEAMDBwcHBwcHBwcHBwcHBAcEDgcHBgMHDgQEBhAQEAcOAwcHBwYGBgYDAwMDAwMDAwMDAwMDBgYGQAMDLQQLDQoDAwMNCgcKCwoGBgYGAwMKAxADCwMDBgYGCgYEBgYGDQQGAwMGBgYGCgMECgcHBgMGAwoKMQoGAwYGEAsDEBADAwMHDgcQEAQEBA0DCwYGQAQGAwMNBAMDAwMDAwMDBgYDCgoHAwcHBgoGBAcHBwcHAwMjBw0DBwYHEAMHBwcHJQsLCwYGBgYDBwYHBwcDAw0GBgYGBwcHAwMGBw0NBwcODQYDAwYDBAMNCwYDAwMDAwMDBxAKBA0DBwcKCgYDCgoDAwMHAwMDBwYGBAcEAxANPj4DAw0GBwcHBwcEBAMHBgYGBgYDBw0GBgYMBgcKBgYHAwYSEAYHBhAGBgMDAwYGBgQGAwYDBgYNBgYGBgcDBgYGBgYGBgMLBgYMAwYGAwMDAwYDAwMDAwYGBgYDAwcIBgYGAw4ODg4DDgsQDgQKBxMODgcDKwMODg4HBA4DBgYGBgMDDgYDBwYOAw0KCgMEDg4QERAQKSonEQsDAwQKBwcGBgYKCg0NDQwLBgMDAwMDBwMMAwYHBgYGAQEDAwcDAwoKBgYGCgoGBgMDCgQDDQ0DBgYKCgEBBw4OBzINBwYDBwQKAQYMDAcEPT0DPT0DBgYGBgYGBgQLCgYDAwMDCgMDBwYEAwMGBwYECgoDBg0GBwsGCgsKCgMHBAQHCgUDAwMDAwMDBgYGAw0DBgcQBwMEBAMDAwMDAwQDBgMDAwYDAwoKAwMHBwMEBwMHBwQHBzsHBwcDAwMDAwMDAwMDAwMDDQ0DBgoKBgoDBgMDAwMDAwMDBgYGCgYDAwMDAwMGBgYGBwMDAwMDBAMDBAMEBgcEBAMDAQMEAwoKAwoHAQQBAQEBAQEBAQEBAQEBAQEHBgMDAwMDAwMDAwMDAwMDAwMGAwYGAwYGAwMDAwMDBgYGBgYDBgYGBgYGAQMDAwMDAwMKCgYDAwMDBgwDAwMDAwYDAwYDAwYGAwMDAwMHBwcHBwcGAwcDAwMDAwcHBwsLBwcMPT09DQcBEAMDAwMDBgYGBgYGAwYGAwMDBgMGCwMDAwMHCgcGAwMKDgsGDQcKBwcHBwcHBwMDBwMDBgoDAwMHBwcHBwcDBwYxBwcHBwcGCgcHBwsLBwMDAwYDBgMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHAwMDAwMDAwMBAQMDBwMDAwMDAwMGCwsLCwMDBwcHAwcHAwMDAwMDAwMDAwcDAwMDAwMDAwMDBwYHAwMHAwMHAwMKEgYLCwcHCgMDAwoHCgYGBgMDAwMDAwMDAwMDAQcDAwYGCgYDAwYGBgYDBwYGBgYGBgMDAwcDAwoDAwsDCwQEBAQHEAMDBwMBCwcEBAQDDgMDAwsLDQMDAwMDOgMDAwMDAwM6AwMDAwMDAwMDAwMDAwMDAwMDAwMDBgYDAwMLCwMDCg0DAwMDAwMDAwMDAwoEAwMDAwYGAwMDAwMDAwMDBgMDAwMDAwMDAwMDAwMDAwMGCgMKBwcGBgcHBwcHBwMGBgYNDQ0NDQ0NCwcHBwYDBwcHAwcKAwMKBwYHBwoKBwMDAwMDAwMDAwMDAwMDAwoGBwcEBwcGBgcDBAMDAwcDBwoDAwoKCgMDBwcDAwMDAwYDAwMKAwMDBgYGBgYGBgYGBgYGAwMDBwYDAwMDAwYGBgYDBgcEBwYGBgYGBgYLBgoKCgYGCwcGBgYHBgYHAwQKBgYGBgYGBgMDBgYGBgYGBgYGAwMGBAYGBwcGBgMLAw4OAwQDBgYGDgYGBgYGBgYGBgYGBgYGAwsDBwMGBgYDAwMDDQ0GBgYDAwYGBgYHBgYGAwYGBgADCwMKAAQGCgoKBgYGAwMDCgMDAwMGCgMDBAQEBAoHCgsKBwcHBwcHBwcEBgMDCgMNCwcEBwcHBwcEBAQEBAQHBwcEBwcHAwMDAwMDBwcHBwcHCgYHBwYH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QQEhCiAFQQFHDQIgARCeEQwCCyAELwDtCiAEQe8Kai0AAEEQdHIhGyAELwDdCiAEQd8Kai0AAEEQdHIhHCAELwDNCiAEQc8Kai0AAEEQdHIhHSAELwC9CiAEQb8Kai0AAEEQdHIhHiAELwCtCiAEQa8Kai0AAEEQdHIhHyAELwCdCiAEQZ8Kai0AAEEQdHIhICAELwCNCiAEQY8Kai0AAEEQdHIhISAELwD9CSAEQf8Jai0AAEEQdHIhIiAELwDtCSAEQe8Jai0AAEEQdHIhIyAELwDdCSAEQd8Jai0AAEEQdHIhJCAELwDNCSAEQc8Jai0AAEEQdHIhJSAELwC9CSAEQb8Jai0AAEEQdHIhJiAELwCtCSAEQa8Jai0AAEEQdHIhJyAELwCdCSAEQZ8Jai0AAEEQdHIhKCAELwCNCSAEQY8Jai0AAEEQdHIhKSAELwD9CCAEQf8Iai0AAEEQdHIhKiAELwDtCCAEQe8Iai0AAEEQdHIhKyAELwDdCCAEQd8Iai0AAEEQdHIhLCAELwDNCCAEQc8Iai0AAEEQdHIhLSAELwC9CCAEQb8Iai0AAEEQdHIhLiAELwCtCCAEQa8Iai0AAEEQdHIhLyAELwCdCCAEQZ8Iai0AAEEQdHIhMCAELwCNCCAEQY8Iai0AAEEQdHIhMSAELwD9ByAEQf8Hai0AAEEQdHIhMiAELwDtByAEQe8Hai0AAEEQdHIhMyAELwDdByAEQd8Hai0AAEEQdHIhNCAELwDNByAEQc8Hai0AAEEQdHIhNSAELwC9ByAEQb8Hai0AAEEQdHIhNiAELwCtByAEQa8Hai0AAEEQdHIhNyAELwCdByAEQZ8Hai0AAEEQdHIhOCAELwCNByAEQY8Hai0AAEEQdHIhOSAELwD9BiAEQf8Gai0AAEEQdHIhOiAELwDtBiAEQe8Gai0AAEEQdHIhOyAELwDdBiAEQd8Gai0AAEEQdHIhPCAELwDNBiAEQc8Gai0AAEEQdHIhPSAELwC9BiAEQb8Gai0AAEEQdHIhPiAELwCtBiAEQa8Gai0AAEEQdHIhPyAELwCdBiAEQZ8Gai0AAEEQdHIhQCAELwCNBiAEQY8Gai0AAEEQdHIhQSAELwD9BSAEQf8Fai0AAEEQdHIhQiAELwDtBSAEQe8Fai0AAEEQdHIhQyAELwDdBSAEQd8Fai0AAEEQdHIhRCAELwDNBSAEQc8Fai0AAEEQdHIhRSAELwC9BSAEQb8Fai0AAEEQdHIhRiAELwCtBSAEQa8Fai0AAEEQdHIhRyAELwCdBSAEQZ8Fai0AAEEQdHIhSCAELwCNBSAEQY8Fai0AAEEQdHIhSSAELwD9BCAEQf8Eai0AAEEQdHIhSiAELwDtBCAEQe8Eai0AAEEQdHIhSyAELwDdBCAEQd8Eai0AAEEQdHIhTCAELwDNBCAEQc8Eai0AAEEQdHIhTSAELwC9BCAEQb8Eai0AAEEQdHIhTiAELwCtBCAEQa8Eai0AAEEQdHIhTyAELwCdBCAEQZ8Eai0AAEEQdHIhUCAELwCNBCAEQY8Eai0AAEEQdHIhUSAELwD9AyAEQf8Dai0AAEEQdHIhUiAELwDtAyAEQe8Dai0AAEEQdHIhUyAELwDdAyAEQd8Dai0AAEEQdHIhVCAELwDNAyAEQc8Dai0AAEEQdHIhVSAELwC9AyAEQb8Dai0AAEEQdHIhViAELwCtAyAEQa8Dai0AAEEQdHIhVyAELwCdAyAEQZ8Dai0AAEEQdHIhWCAELwCNAyAEQY8Dai0AAEEQdHIhWSAELwD9AiAEQf8Cai0AAEEQdHIhWiAELwDtAiAEQe8Cai0AAEEQdHIhWyAELwDdAiAEQd8Cai0AAEEQdHIhXCAELwDNAiAEQc8Cai0AAEEQdHIhXSAELwC9AiAEQb8Cai0AAEEQdHIhXiAELwCtAiAEQa8Cai0AAEEQdHIhXyAELwCdAiAEQZ8Cai0AAEEQdHIhYCAELwCNAiAEQY8Cai0AAEEQdHIhYSAELwD9ASAEQf8Bai0AAEEQdHIhYiAELwDtASAEQe8Bai0AAEEQdHIhYyAELwDdASAEQd8Bai0AAEEQdHIhZCAELwDNASAEQc8Bai0AAEEQdHIhZSAELwC9ASAEQb8Bai0AAEEQdHIhZiAELwCtASAEQa8Bai0AAEEQdHIhGSAELwCdASAEQZ8Bai0AAEEQdHIhBiAELwCNASAEQY8Bai0AAEEQdHIhCCAEQfwAajUCACGWBCAEQewAajUCACGaBCAEKQJ0IZcEIAQpAmQhlQQgBC0A7AohZyAEKALoCiFoIAQoAuQKIWkgBCgC4AohaiAELQDcCiFrIAQoAtgKIWwgBCgC1AohbSAEKALQCiFuIAQtAMwKIW8gBCgCyAohcCAEKALECiFxIAQoAsAKIXIgBC0AvAohcyAEKAK4CiF0IAQoArQKIXUgBCgCsAohdiAELQCsCiF3IAQoAqgKIXggBCgCpAoheSAEKAKgCiF6IAQtAJwKIXsgBCgCmAohfCAEKAKUCiF9IAQoApAKIX4gBC0AjAohfyAEKAKICiGAASAEKAKECiGBASAEKAKACiGCASAELQD8CSGDASAEKAL4CSGEASAEKAL0CSGFASAEKALwCSGGASAELQDsCSGHASAEKALoCSGIASAEKALkCSGJASAEKALgCSGKASAELQDcCSGLASAEKALYCSGMASAEKALUCSGNASAEKALQCSGOASAELQDMCSGPASAEKALICSGQASAEKALECSGRASAEKALACSGSASAELQC8CSGTASAEKAK4CSGUASAEKAK0CSGVASAEKAKwCSGWASAELQCsCSGXASAEKAKoCSGYASAEKAKkCSGZASAEKAKgCSGaASAELQCcCSGbASAEKAKYCSGcASAEKAKUCSGdASAEKAKQCSGeASAELQCMCSGfASAEKAKICSGgASAEKAKECSGhASAEKAKACSGiASAELQD8CCGjASAEKAL4CCGkASAEKAL0CCGlASAEKALwCCGmASAELQDsCCGnASAEKALoCCGoASAEKALkCCGpASAEKALgCCGqASAELQDcCCGrASAEKALYCCGsASAEKALUCCGtASAEKALQCCGuASAELQDMCCGvASAEKALICCGwASAEKALECCGxASAEKALACCGyASAELQC8CCGzASAEKAK4CCG0ASAEKAK0CCG1ASAEKAKwCCG2ASAELQCsCCG3ASAEKAKoCCG4ASAEKAKkCCG5ASAEKAKgCCG6ASAELQCcCCG7ASAEKAKYCCG8ASAEKAKUCCG9ASAEKAKQCCG+ASAELQCMCCG/ASAEKAKICCHAASAEKAKECCHBASAEKAKACCHCASAELQD8ByHDASAEKAL4ByHEASAEKAL0ByHFASAEKALwByHGASAELQDsByHHASAEKALoByHIASAEKALkByHJASAEKALgByHKASAELQDcByHLASAEKALYByHMASAEKALUByHNASAEKALQByHOASAELQDMByHPASAEKALIByHQASAEKALEByHRASAEKALAByHSASAELQC8ByHTASAEKAK4ByHUASAEKAK0ByHVASAEKAKwByHW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ASEFIJIEDQAMBQsLQQAtAKDxngEaQRBBwA0QugciBUUNCCAFIJsDOwCtDSAFIJwDOwCdDSAFIJ0DOwCNDSAFIJ4DOwD9DCAFIJ8DOwDtDCAFIKADOwDdDCAFIKEDOwDNDCAFIKIDOwC9DCAFIKMDOwCtDCAFIKQDOwCdDCAFIKUDOwCNDCAFIKYDOwD9CyAFIKcDOwDtCyAFIKgDOwDdCyAFIKkDOwDNCyAFIKoDOwC9CyAFIKsDOwCtCyAFIKwDOwCdCyAFIK0DOwCNCyAFIK4DOwD9CiAFIK8DOwDtCiAFIJkDOwDdCiAFIJoDOwDNCiAFIBs7AK0KIAUgHDsAnQogBSAdOwCNCiAFIB47AP0JIAUgHzsA7QkgBSAgOwDdCSAFICE7AM0JIAUgIjsAvQkgBSAjOwCtCSAFICQ7AJ0JIAUgJTsAjQkgBSAmOwD9CCAFICc7AO0IIAUgKDsA3QggBSApOwDNCCAFICo7AL0IIAUgKzsArQggBSAsOwCdCCAFIC07AI0IIAUgLjsA/QcgBSAvOwDtByAFIDA7AN0HIAUgMTsAzQcgBSAyOwC9ByAFIDM7AK0HIAUgNDsAnQcgBSA1OwCNByAFIDY7AP0GIAUgNzsA7QYgBSA4OwDdBiAFIDk7AM0GIAUgOjsAvQYgBSA7OwCtBiAFIDw7AJ0GIAUgPTsAjQYgBSA+OwD9BSAFID87AO0FIAUgQDsA3QUgBSBBOwDNBSAFIEI7AL0FIAUgQzsArQUgBSBEOwCdBSAFIEU7AI0FIAUgRjsA/QQgBSBHOwDtBCAFIEg7AN0EIAUgSTsAzQQgBSBKOwC9BCAFIEs7AK0EIAUgTDsAnQQgBSBNOwCNBCAFIE47AP0DIAUgTzsA7QMgBSBQOwDdAyAFIFE7AM0DIAUgUjsAvQMgBSBTOwCtAyAFIFQ7AJ0DIAUgVTsAjQMgBSBWOwD9AiAFIFc7AO0CIAUgWDsA3QIgBSBZOwDNAiAFIFo7AL0CIAUgWzsArQIgBSBcOwCdAiAFIF07AI0CIAUgXjsA/QEgBSBfOwDtASAFIGA7AN0BIAUgYTsAzQEgBSBiOwC9ASAFIGM7AK0BIAUgZDsAnQEgBSBlOwCNASAFIGY7AH0gBSAZOwBtIAUgBjsAXSAFIJcENwI0IAUglQQ3AiQgBSCZBDcDECAFQQA6ALwNIAUgGjYC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INABNgKIByAFINEBNgKEByAFINIBNgKAByAFINMBOgD8BiAFINQBNgL4BiAFINUBNgL0BiAFINYBNgLwBiAFINcBOgDsBiAFINgBNgLoBiAFINkBNgLkBiAFINoBNgLgBiAFINsBOgDcBiAFINwBNgLYBiAFIN0BNgLUBiAFIN4BNgLQBiAFIN8BOgDMBiAFIOABNgLIBiAFIOEBNgLEBiAFIOIBNgLABiAFIOMBOgC8BiAFIOQBNgK4BiAFIOUBNgK0BiAFIOYBNgKwBiAFIOcBOgCsBiAFIOgBNgKoBiAFIOkBNgKkBiAFIOoBNgKgBiAFIOsBOgCcBiAFIOwBNgKYBiAFIO0BNgKUBiAFIO4BNgKQBiAFIO8BOgCMBiAFIPABNgKIBiAFIPEBNgKEBiAFIPIBNgKABiAFIPMBOgD8BSAFIPQBNgL4BSAFIPUBNgL0BSAFIPYBNgLwBSAFIPcBOgDsBSAFIPgBNgLoBSAFIPkBNgLkBSAFIPoBNgLgBSAFIPsBOgDcBSAFIPwBNgLYBSAFIP0BNgLUBSAFIP4BNgLQBSAFIP8BOgDMBSAFIIACNgLIBSAFIIECNgLEBSAFIIICNgLABSAFIIMCOgC8BSAFIIQCNgK4BSAFIIUCNgK0BSAFIIYCNgKwBSAFIIcCOgCsBSAFIIgCNgKoBSAFIIkCNgKkBSAFIIoCNgKgBSAFIIsCOgCcBSAFIIwCNgKYBSAFII0CNgKUBSAFII4CNgKQBSAFII8COgCMBSAFIJACNgKIBSAFIJECNgKEBSAFIJICNgKABSAFIJMCOgD8BCAFIJQCNgL4BCAFIJUCNgL0BCAFIJYCNgLwBCAFIJcCOgDsBCAFIJgCNgLoBCAFIJkCNgLkBCAFIJoCNgLgBCAFIJsCOgDcBCAFIJwCNgLYBCAFIJ0CNgLUBCAFIJ4CNgLQBCAFIJ8COgDMBCAFIKACNgLIBCAFIKECNgLEBCAFIKICNgLABCAFIKMCOgC8BCAFIKQCNgK4BCAFIKUCNgK0BCAFIKYCNgKwBCAFIKcCOgCsBCAFIKgCNgKoBCAFIKkCNgKkBCAFIKoCNgKgBCAFIKsCOgCcBCAFIKwCNgKYBCAFIK0CNgKUBCAFIK4CNgKQBCAFIK8COgCMBCAFILACNgKIBCAFILECNgKEBCAFILICNgKABCAFILMCOgD8AyAFILQCNgL4AyAFILUCNgL0AyAFILYCNgLwAyAFILcCOgDsAyAFILgCNgLoAyAFILkCNgLkAyAFILoCNgLgAyAFILsCOgDcAyAFILwCNgLYAyAFIL0CNgLUAyAFIL4CNgLQAyAFIL8COgDMAyAFIMACNgLIAyAFIMECNgLEAyAFIMICNgLAAyAFIMMCOgC8AyAFIMQCNgK4AyAFIMUCNgK0AyAFIMYCNgKwAyAFIMcCOgCsAyAFIMgCNgKoAyAFIMkCNgKkAyAFIMoCNgKgAyAFIMsCOgCcAyAFIMwCNgKYAyAFIM0CNgKUAyAFIM4CNgKQAyAFIM8COgCMAyAFINACNgKIAyAFINECNgKEAyAFINICNgKAAyAFINMCOgD8AiAFINQCNgL4AiAFINUCNgL0AiAFINYCNgLwAiAFINcCOgDsAiAFINgCNgLoAiAFINkCNgLkAiAFINoCNgLgAiAFINsCOgDcAiAFINwCNgLYAiAFIN0CNgLUAiAFIN4CNgLQAiAFIN8COgDMAiAFIOACNgLIAiAFIOECNgLEAiAFIOICNgLAAiAFIOMCOgC8AiAFIOQCNgK4AiAFIOUCNgK0AiAFIOYCNgKwAiAFIOcCOgCsAiAFIOgCNgKoAiAFIOkCNgKkAiAFIOoCNgKgAiAFIOsCOgCcAiAFIOwCNgKYAiAFIO0CNgKUAiAFIO4CNgKQAiAFIO8COgCMAiAFIPACNgKIAiAFIPECNgKEAiAFIPICNgKAAiAFIPMCOgD8ASAFIPQCNgL4ASAFIPUCNgL0ASAFIPYCNgLwASAFIPcCOgDsASAFIPgCNgLoASAFIPkCNgLkASAFIPoCNgLgASAFIPsCOgDcASAFIPwCNgLYASAFIP0CNgLUASAFIP4CNgLQASAFIP8COgDMASAFIIADNgLIASAFIIEDNgLEASAFIIIDNgLAASAFIIMDOgC8ASAFIIQDNgK4ASAFIIUDNgK0ASAFIIYDNgKwASAFIIcDOgCsASAFIIgDNgKoASAFIIkDNgKkASAFIIoDNgKgASAFIIsDOgCcASAFIIwDNgKYASAFII0DNgKUASAFII4DNgKQASAFII8DOgCMASAFIJADNgKIASAFIJEDNgKEASAFIJIDNgKAASAFIJMDOgB8IAUglAM2AnggBSCVAzYCdCAFIJYDNgJwIAUglwM6AGwgBSCYAzYC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NwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAApFDQAgAyABQbDcmgFBECACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQALRQ0AIAMgAUHA3JoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ADEUNACADIAFB09yaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAA1FDQAgAyABQercmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAORQ0AIAMgAUH53JoBQRggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AD0UNACADIAFBkd2aAUEOIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABBFDQAgAyABQZ/dmgFBEiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQARRQ0AIAMgAUGx3ZoBQRUgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AEkUNACADIAFBxt2aAUELIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABNFDQAgAyABQdHdmgFBCiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAURQ0AIAMgAUHb3ZoBQRsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AFUUNACADIAFB9t2aAUEiIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABZFDQAgAyABQZjemgFBGiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAXRQ0AIAMgAUGy3poBQRogAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AGEUNACADIAFBzN6aAUEdIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABlFDQAgAyABQenemgFBECACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAaRQ0AIAMgAUH53poBQSsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AG0UNACADIAFBpN+aAUEeIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItABxFDQAgAyABQcLfmgFBFCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAdRQ0AIAMgAUHW35oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AHkUNACADIAFB7d+aAUEYIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAB9FDQAgAyABQYXgmgFBHiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAgRQ0AIAMgAUGj4JoBQR0gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AIUUNACADIAFBwOCaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACJFDQAgAyABQdfgmgFBGiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAjRQ0AIAMgAUHx4JoBQRggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJEUNACADIAFBieGaAUEZIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACVFDQAgAyABQaLhmgFBGCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAmRQ0AIAMgAUG64ZoBQSMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AJ0UNACADIAFB3eGaAUEjIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAChFDQAgAyABQYDimgFBISACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQApRQ0AIAMgAUGh4poBQQkgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AKkUNACADIAFBquKaAUEMIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItACtFDQAgAyABQbbimgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAsRQ0AIAMgAUG+4poBQQggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ALUUNACADIAFBxuKaAUEcIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAC5FDQAgAyABQeLimgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAvRQ0AIAMgAUHx4poBQQsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AMEUNACADIAFBvPObAUEHIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADFFDQAgAyABQaC6nAFBAyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQAyRQ0AIAMgAUH84poBQRAgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AM0UNACADIAFBjOOaAUEIIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADRFDQAgAyABQZTjmgFBDiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA1RQ0AIAMgAUGi45oBQRsgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ANkUNACADIAFBveOaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADdFDQAgAyABQZ6WnAFBCiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA4RQ0AIAMgAUHX45oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AOUUNACADIAFB7uOaAUEYIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItADpFDQAgAyABQYbkmgFBEiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA7RQ0AIAMgAUGY5JoBQREgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0APEUNACADIAFBqeSaAUEXIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAD1FDQAgAyABQcDkmgFBHSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQA+RQ0AIAMgAUHd5JoBQQMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AP0UNACADIAFB4OSaAUEPIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEBFDQAgAyABQe/kmgFBESACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBBRQ0AIAMgAUGA5ZoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AQkUNACADIAFBk+WaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAENFDQAgAyABQa3lmgFBDSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBERQ0AIAMgAUG65ZoBQRMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ARUUNACADIAFBzeWaAUEZIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAEZFDQAgAyABQeblmgFBHyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBHRQ0AIAMgAUGF5poBQQ4gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ASEUNACADIAFBk+aaAUEbIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAElFDQAgAyABQa7mmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBKRQ0AIAMgAUGjupwBQQMgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AS0UNACADIAFBveaaAUEQIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAExFDQAgAyABQc3mmgFBGSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBNRQ0AIAMgAUHm5poBQQ8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0ATkUNACADIAFB9eaaAUEVIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAE9FDQAgAyABQYrnmgFBDyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBQRQ0AIAMgAUGZ55oBQRcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AUUUNACADIAFBsOeaAUEdIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFJFDQAgAyABQdSCnAFBBSACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBTRQ0AIAMgAUHN55oBQQggAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AVEUNACADIAFB1eeaAUETIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFVFDQAgAyABQejnmgFBDCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBWRQ0AIAMgAUH055oBQQ8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AV0UNACADIAFB0/6aAUEGIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFhFDQAgAyABQYPomgFBByACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBZRQ0AIAMgAUGK6JoBQR0gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AWkUNACADIAFBp+iaAUEUIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAFtFDQAgAyABQbvomgFBESACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBcRQ0AIAMgAUHM6JoBQRAgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AXUUNACADIAFB3OiaAUEfIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAF5FDQAgAyABQfvomgFBJiACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBfRQ0AIAMgAUGh6ZoBQR8gAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AYEUNACADIAFBwOmaAUEhIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGFFDQAgAyABQeHpmgFBGyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBiRQ0AIAMgAUH86ZoBQQwgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AY0UNACADIAFBiOqaAUEjIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGRFDQAgAyABQavqmgFBCyACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBlRQ0AIAMgAUG26poBQQwgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AZkUNACADIAFBwuqaAUELIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGdFDQAgAyABQc3qmgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBoRQ0AIAMgAUHV6poBQQkgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AaUUNACADIAFB3uqaAUEaIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAGpFDQAgAyABQfjqmgFBFCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBrRQ0AIAMgAUGM65oBQSQgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0AbEUNACADIAFBsOuaAUERIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAG1FDQAgAyABQcHrmgFBCCACKAIAENcFAkAgACgCCCIFIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIAVBMGxqIgQgAykDADcDACAEQShqIANBKGopAwA3AwAgBEEgaiADQSBqKQMANwMAIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAAgBUEBajYCCAsCQCACLQBuRQ0AIAMgAUHJ65oBQQcgAigCABDXBQJAIAAoAggiBSAAKAIARw0AIABBgK6aARD0HQsgACgCBCAFQTBsaiIEIAMpAwA3AwAgBEEoaiADQShqKQMANwMAIARBIGogA0EgaikDADcDACAEQRhqIANBGGopAwA3AwAgBEEQaiADQRBqKQMANwMAIARBCGogA0EIaikDADcDACAAIAVBAWo2AggLAkAgAi0Ab0UNACADIAFBqZ2cAUEFIAIoAgAQ1wUCQCAAKAIIIgUgACgCAEcNACAAQYCumgEQ9B0LIAAoAgQgBUEwbGoiBCADKQMANwMAIARBKGogA0EoaikDADcDACAEQSBqIANBIGopAwA3AwAgBEEYaiADQRhqKQMANwMAIARBEGogA0EQaikDADcDACAEQQhqIANBCGopAwA3AwAgACAFQQFqNgIICwJAIAItAHBFDQAgAyABQdDrmgFBCSACKAIAENcFAkAgACgCCCIEIAAoAgBHDQAgAEGArpoBEPQdCyAAKAIEIARBMGxqIgEgAykDADcDACABQShqIANBKGopAwA3AwAgAUEgaiADQSBqKQMANwMAIAFBGGogA0EYaikDADcDACABQRBqIANBEGopAwA3AwAgAUEIaiADQQhqKQMANwMAIAAgBEEBajYCCAsgAiACKAIEQX9qNgIEIANBMGokAAv+iAECaH8IfiMAQcAHayIDJAAgAUEIaiEEIANB4AFqQR1qIQUgA0GwBGpBCGohBiADQbAFakEMaiEHIANBsARqQQRyIQggA0HVBGohCSADQbAFakEVaiEKIANBsARqQRRqIQsgA0GwBWpBBHIhDCADQaECaiENIANB4AFqQSBqIQ4gA0GwBGpBFWohDyADQbABakEVaiEQIANBsAFqQQRyIREgA0HoBmpBFWohEiADQegGakEEciETIANBsAZqQRVqIRQgA0GwBmpBBHIhFSADQYAGakEVaiEWIANBgAZqQQRyIRcgA0GwBGpBEGohGCADQbAEakEMaiEZIANBqQJqIRogA0GdAmohGyADQYwCaiEcIANB4AFqQQxqIR0gA0HgAWpBFWohHiADQeABakEEciEfIANBoAdqQQRyISAgA0HgAWpBFGohISADQegGakEMaiEiIANBsAVqQR1qISMgA0HgAWpBCGohJCADQegGakEIaiElIANBsAFqQR1qISYgA0GwAWpBCGohJyADQYQBakEEaiEoIAAoAgAhKQJAAkADQAJAAkAgKSgCACIqRQ0AIAMgKjYC6AYCQCABLQDgASIAQaMBRw0AIANBsAVqIAEQ1CYgASgC3AEhACABKALYASECIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2ArQBIAMgA0GwAWo2AugBIAMgA0HoBmo2ArABIANBsARqIANB4AFqEP0aIANBxARqIANBuAVqKAIANgIAIAMgAykCsAU3ArwEIAEgAiAAIANBsARqEN4jDAQLIAAgKi0AAEcNAQwDCyABLQDgASIAQaMBRg0CCyADQQE6AH8gAyABKALYATYCgAECQAJAIABBGEYNAEEEISpBACErQQAhLAwBCyADQeABaiABQQEQ9wEgAygC5AEhKiADKALgASIsQYCAgIB4Rg0DIAMoAugBISsgAS0A4AEhAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQf8BcSIAQdgARiItDQAgAEHfAEcNAQsgAyArNgKQASADICo2AowBIAMgLDYCiAEgAyABNgKEAQJAIAEoAogBIipBgICAgAZxDQAgASgC3AEhACABKALYASEqIANBxoCAgHg2AuABICogACADQeABahDgGiEqDC4LAkACQCAAQd8ARg0AIC0NASADQQE2AuQBIANBoPubATYC4AEgA0IANwLsASADIANBvAdqNgLoASADQeABakGo+5sBEOkjAAsgASgC2AEhLQJAAkACQCABENgJIgBFDQAgAC0AAEEIRg0BCwJAAkAgARDYCSIARQ0AIAAtAABFDQELAkAgASgCiAEiAEECcQ0AIAEgAEEKchCoEgsCQCABLQDgAUHfAEYNACABKALcASEAIAEoAtgBISogA0G8A2ogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgK0ASADQd8AOgCwBiADIANBsAFqNgK4BCADIANB6AZqNgKwASADIANBsAZqNgLoBiADQbAFaiADQbAEahCHGyAHQQhqIANBvANqQQhqKAIANgIAIAcgAykCvAM3AgAgKiAAIANBsAVqEOAaIS4gAS0A4AFBogFHDTEgASABEJosEKcXDDELIAEQoQsCQCABLQDgAUHAAEYNACADQSBqQQRBCEHIAEGk+ZsBELAaIANBADYC0AMgAyADKQMgNwLIAwJAIAEoAogBIAEtAOABIgAQ2g1FDQAgA0GwBGogARCkDSADKAKwBCEuIAMtAMQEIgBBAkYNMCARIAgpAgA3AgAgECAPLwAAOwAAIBFBCGoiLCAIQQhqIispAgA3AgAgEEECaiIvIA9BAmoiMC0AADoAACADIAA6AMQBIAMgLjYCsAFBACExIAEtAJEBQSBxRQ0fIANBsAFqQbKEnAFBBBCEIkUNH0EBITFBACEqIAEtAOABIgBBAkYNICAAQQ9GDSBBACExIAEoAogBIAAQ2g1FDR8CQAJAIABB/gBHDQAgARDYCSIARQ0BIAAtAABB/gBHDQELIANBsARqIAEQpA0gAygCsAQhLiADLQDEBCIAQQJGDSUgA0HYA2pBCGogKykCADcDACADQdQDakECaiAwLQAAOgAAIAMgCCkCADcD2AMgAyAPLwAAOwHUAyADQdQDaiEqIANB2ANqITEMHwsgARDYCSIARQ0fIAAtAABBF0cNHyADQbAFaiABENwOIANBsARqIANBsAVqEPEkIAMoArAEIS4gAy0AxAQiAEECRg0kIANB8ANqQQhqICspAgA3AwAgA0HsA2pBAmogMC0AADoAACADIAgpAgA3A/ADIAMgDy8AADsB7AMgA0HsA2ohKiADQfADaiExDB4LQQAhMEEAITEgAEH/AXFBD0YNJwwpCyADQbAEaiABEP4aQRhBCBCmKiIAQRBqIBgpAwA3AwAgAEEIaiAGKQMANwMAIAAgAykDsAQ3AwBBACErQQAhKgJAIAEtAOEBDQACQCABLQDgASIsQfcARg0AQQAhKiAsQfAARw0BCyABEKELIANBsARqIAEQqyAgAygCtAQhLgJAIAMoArAEIipBMkcNACAAENYnDDILAkBBOEUNACADQbAFaiAGQTj8CgAACyAqQQ5HDQZBFEEEEKYqIiogLjYCACAqIAMpA7AFNwIEICpBDGogA0GwBWpBCGopAwA3AgALIAEQqiAaIAEoAtQBITJBCCEzQQAhNCAtITVBACE2QQAhLkEAISwMLAsgA0EoaiABEP8JIAMoAiwhMSADKAIoQQFxDQEgARCqIBogASgC1AEhNUEJISxBEiEzIDchKyA4ITQgOSEqIDohMiAtIQAgMSE2DCsLIANBMGogARD/CSADKAI0ITEgAygCMEEBcQ0ZIAEQqiAaIAEoAtQBITVBCSEsQRIhMyA3ISsgOCE0IDkhKiA6ITIgLSEAIDEhNgwqCyAxIS4MLQsgA0GgAWpBCGoiLSAoQQhqKAIANgIAIAMgKCkCADcDoAECQCAqQYKAgIACcUGAgICAAkcNACABICpBCnIQqBILIAEoAtgBISogARChCyABLQDgASIAQaMBRg0CIAEvAZABQYDAAHEiLEUNAyAAQfwARw0DIAEoAtgBIQAgARChCyADQbAEaiAoEO0IIANB4AFqIAEgACADQbAEahCODCADKALkASEAAkAgAygC4AEiK0EJRw0AQQkhLCAAITsMFAsgJyAkKQMANwMAICdBGGogJEEYaikDADcDACAnQRBqICRBEGopAwA3AwAgJ0EIaiAkQQhqKQMANwMAIAMgADYCtAEgAyArNgKwAQJAICtBCEYNACADQZoBakECaiAmQQJqLQAAOgAAIAMgAy8BygE7AZ4BIAMgJi8AADsBmgEgAygCvAEiPEEIdiE9IAEoAtQBIT5BASEsIAMpA9ABIWsgAy0AzAEhPyADLQDJASFAIAMtAMgBIUEgAygCxAEhQiADKALAASFDIAMoArgBIUQgKiFFIAAhRiArIUcMBQsgA0GwAWoQuCogAS8BkAFBgMAAcSEsIAEtAOABIQAMAwsgAyArNgK4BCADICo2ArQEIAMgLDYCsAQgASgCiAEhACADIANB/wBqNgLABCADIANBgAFqNgK8BAJAAkAgAEGAgARxRQ0AIAEgAEH//3txNgKIASADQeABaiADQbAEaiABEIITIAEgASgCiAFBgIAEcjYCiAEMAQsgA0HgAWogA0GwBGogARCCEwsCQCADKALgASIAQRNHDQBBCiEsIAMoAuQBISoMLwsgA0HyAGpBAmogBUECai0AADoAACADIAMvAfoBOwF2IAMgBS8AADsBckEJISwgAygCjAIhSCADKAKIAiFJIAMpA4ACIWwgAy0A/AEhSiADLQD5ASFLIAMtAPgBITQgAygC9AEhTCADKALwASEyIAMoAuwBITUgAygC6AEhTSADKALkASE2IAAhMwwuC0GgppwBQShBlPqbARDSHgALQQkhLCABKAKAARDfIyE7DBALAkAgLA0AIAEoAtgBIStBACExDAILAkAgABClFUUNAAJAAkAgAEEAIAQgBCgCAEEJRhsQiAYibUIAUQ0AICUgKBDtCCADIG03A+gGAkAgAS0AkQFBIHENACADQQg2ArAFICUQlCggbRDGIQwCCyABKAKIASErIANBsAJqIAEQ3QEgASABKAKIAUEBchCoEiADQeABaiABIAEoAtgBICUgbUEBEJ0EIAMoAuQBIQACQCADKALgASIsQQlHDQAgAyAANgK0BCADQQk2ArAEIAEgA0GwAmoQxwUgA0EINgKwBSAIEOkHDAILIAYgJCkDADcDACAGQRhqICRBGGopAwA3AwAgBkEQaiAkQRBqKQMANwMAIAZBCGogJEEIaikDADcDACADIAA2ArQEIAMgLDYCsAQCQCAsQQhHDQAgASADQbACahDHBSADQQg2ArAFDAILICtBAXEhAAJAQShFDQAgA0GwBWogA0GwBGpBKPwKAAALIAEgASgCiAFBfnEgAHIQqBIgA0GwAmoQliYgAygCsAUiAEEIRg0BIANBmgFqQQJqICNBAmotAAA6AAAgAyADLwHKBTsBngEgAyAjLwAAOwGaASADKAK8BSI8QQh2IT0gASgC1AEhPkEBISwgAykD0AUhayADLQDMBSE/IAMtAMkFIUAgAy0AyAUhQSADKALEBSFCIAMoAsAFIUMgAygCuAUhRCADKAK0BSFGICohRSAAIUcMAwtB5PibARDSLAALIANBsAVqELgqIAEtAOABIQALAkACQAJAAkACQCAAQf8BcSIsQRdGDQACQAJAICxB3wBGDQAgLEH1AEcNBiABEKELIAEtAOABQYYBRg0BIAEoAtwBIQAgASgC2AEhKiADQZgEaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANBhgE6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEIcbIBlBCGogA0GYBGpBCGooAgA2AgAgGSADKQKYBDcCACAqIAAgA0GwBGoQ4BohO0EJISwgAS0A4AFBogFHDRYgASABEJosEKcXDBYLIAEQoQtBACEAIAEtAOABQZcBRw0EIAEQ2AkiLEUNBCAsLQAAEKUVDQIMBAsgARChCyADQeABaiABQQBBABDLAyADKALgASEAIAMtAPQBIitBAkYNAiADQbAEakECaiIsIB5BAmotAAA6AAAgAyADLwHyATsB6AYgAyAeLwAAOwGwBCADLQDxASEvIAMtAPABITAgAygC7AEhTiADKALoASFPIAMoAuQBIS0CQCABEMoSIjFFDQAgLa1CIIYgAK2EEMYhQQkhLCAxITsMFQsgA0GaAWpBAmogLC0AADoAACADIAMvAegGOwGeASADIAMvAbAEOwGaAUEIISwgLUEIdiE9IAEoAtQBIUYgLSE8ICshPyAvIUAgMCFBIE4hQiBPIUMgACFEICohRwwUCyABEKELIANB6ABqIAEQ/wlBCSEsIAMoAmwhAAJAIAMoAmhBAXENACADIAA2AuABAkAgARDKEiI7RQ0AIANB4AFqENQDDBULIAEoAtQBIUZBByEsICohRwsgACE7DBMLIAEQoQtBASEADAELQQkhLCAAITsMEQsgA0HgAWogARDcDiADKALoASE7IAMpA+ABIm1QDQ8gAygC7AEhLCADQQA2AvABIAMgLDYC7AEgAyA7NgLoASADQQA6APQBIAMgbTcD4AEgA0HgAGogASAqIANB4AFqQQEgABDMAkEJQQYgAygCYEEBcRshLCADKAJkITsMEAsgASgC2AEhKyABLQCRAUEFdiAsQZcBRnEiMUUNASABEKELDAILDA4LIABB/wFxQdQARg0BC0ECIQBBACEsDAELIAEQoQsCQCABLQDgASIAQRhHDQAgASgC2AEhLyADQeABaiABQQAQ9wEgAygC5AEhAAJAIAMoAuABIixBgICAgHhHDQAgACE7DAwLIAMgAygC6AE2ArgEIAMgADYCtAQgAyAsNgKwBAJAIAMoAqgBRQ0AIAEoAtQBIQAgA0G0gYCAeDYC4AEgLyAAIANB4AFqEOAaITsCQCABLQDgAUGiAUcNACABIAEQmiwQpxcLIANBsARqEJQoDAwLIANBoAFqEJQoIC0gBigCADYCACADIAMpArAENwOgASABLQDgASEACwJAAkACQAJAAkACQCABLQCRAUEgcUUNAAJAAkAgAEH/AXFB8wBHDQACQCABENgJIgBFDQAgAC0AAEHQAEcNACABEIsnDQAgASgC2AEhACABEKELAkACQCABLQDgAUGiAUYNACADQeABaiABICogACADQaABakEBELIGIAMoAuABIgBBA0cNAUEJISwgAygC5AEhOwwXC0EJISwgARCaLCE7DBULIANBmgFqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBngEgAyAFLwAAOwGaASADKALsASI8QQh2IT1BAyEsIAMoAowCIT4gAygCiAIhRSADKQOAAiFrIAMtAPwBIT8gAy0A+QEhQCADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALoASFEIAMoAuQBIUYgACFHDBULIAEtAOABIgBB8wBHDQEgARDYCSIARQ0AIAAtAABBggFHDQAgASgC3AEhACABKALYASEsIANBnoGAgHg2AuABIAEgLCAAIANB4AFqEN4jIAEQoQsLIAEtAOABIQALIABB/wFxQYIBRw0AIAEoAtgBIQAgARChCyADQdgAaiABIAAQuwRBCSEsIAMoAlwhACADKAJYQQFxRQ0BIAAhOwwRCwJAIABB/wFxIgBB0ABGDQAgAEH4AEcNBSABENgJIgBFDQUgAC0AAEHdAEcNBSABEIsnDQUgASgC2AEhAAJAIAEtAOABQfgARg0AIAEoAtwBISogA0GwBmogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgKkByADQfgAOgDQBiADIANBoAdqNgK4BCADIANBiAdqNgKgByADIANB0AZqNgKIByADQegGaiADQbAEahCSECAiQQhqIANBsAZqQQhqKAIANgIAICIgAykCsAY3AgAgACAqIANB6AZqEOAaITsgAS0A4AFBogFHDQQgASABEJosEKcXDAQLIAEQoQsgA0HgAWogASAqQQEgACADQaABahDeDiADKALkASEAAkAgAygC4AEiKkEDRw0AIAAhOwwFCyADQZoBakECaiAFQQJqLQAAOgAAIAMgAy8B+gE7AZ4BIAMgBS8AADsBmgEgAygC7AEiPEEIdiE9IAMtAPkBIUAgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC6AEhRCADLQD8ASE/IAMpA4ACIWsgAygCiAIhRSADKAKMAiE+QQMhLCAAIUYgKiFHDBILIANB4AFqIAEgKiABKALYASADQaABakEAELIGIAMoAuQBIQAgAygC4AEiKkEDRg0BIANBmgFqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsBngEgAyAFLwAAOwGaASADKALsASI8QQh2IT0gAy0A+QEhQCADLQD4ASFBIAMoAvQBIUIgAygC8AEhQyADKALoASFEIAMtAPwBIT8gAykDgAIhayADKAKIAiFFIAMoAowCIT5BAyEsIAAhRiAqIUcMEQsgASgC1AEhPkEDISxBAiFHICohRSAAIUYMDwtBCSEsIAAhOwwPCyADQaABahCUKAtBCSEsDA0LIAEtAOABIgBB3QBGDQIgAS0AkAFBEHFFDQECQAJAIABB/gBHDQACQCABENgJIgBFDQAgAC0AAEHAAEYNAgsgAS0A4AEhAAsgAEH/AXFBB0cNAiABENgJIgBFDQIgAC0AACIAQQJGDQAgAEEPRw0CCyABKALUASEvIAEoAtABITBBACEAQQEhLAsgAS0A4AFBGEcNAyABKALYASFQIANB4AFqIAFBABD3ASADKALkASFOIAMoAuABIk9BgICAgHhHDQIgTiE7DAkLAkACQCABKAKIASIAQcAAcQ0AIAEgAEHAAHI2AogBIANBOGogARDCGCADKAI4ISsgASABKAKIAUG/f3E2AogBIAMoAjwhAAwBCyADQcAAaiABEMIYIAMoAkQhACADKAJAISsLQQkhLAJAICtBAXENACADIAA2AuABAkAgARDKEiI7RQ0AIANB4AFqENQDDAsLIAEoAtQBIUZBBCEsICohRwsgACE7DAkLIANB4AFqIAEgKkEAIAMgA0GgAWoQ3g4gAygC5AEhACADKALgASIqQQNGDQYgA0GaAWpBAmogBUECai0AADoAACADIAMvAfoBOwGeASADIAUvAAA7AZoBIAMoAuwBIjxBCHYhPSADLQD5ASFAIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAugBIUQgAy0A/AEhPyADKQOAAiFrIAMoAogCIUUgAygCjAIhPkEDISwgACFGICohRwwJCyADIAMoAugBNgK4BCADIE42ArQEIAMgTzYCsAQCQCADKAKoAUUNACABKALUASEAIANBtIGAgHg2AuABIFAgACADQeABahDgGiE7IAEtAOABQaIBRg0CDAULIANBoAFqEJQoIC0gBigCADYCACADIAMpArAENwOgAQsgMQ0BAkACQCABLQDgASJOQfgARg0AIE5B0ABHDQEgA0HgAWogASAqIAEoAtgBIANBoAFqQQAQjAQgAygC5AEhKwJAIAMoAuABIi1BCEcNACArITsMDAsgA0HUA2pBAmogBUECai0AADoAACADIAMvAfoBOwHeASADIAUvAAA7AdQDIAMtAPkBIVEgAy0A+AEhQSADKAL0ASFCIAMoAvABIUMgAygC7AEhUiADKALoASFEIAMtAPwBIVMgAykDgAIhbkEAISwgLSFHICshRgwECwJAIAEQ2AkiTkUNACBOLQAAQd0ARw0AIAEQiycNACADQeABaiABIANBoAFqENILIAMoAuQBISsCQCADKALgASItQQhHDQAgKyE7DAwLIANB1ANqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsB3gEgAyAFLwAAOwHUAyADLQD5ASFRIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAuwBIVIgAygC6AEhRCADLQD8ASFTIAMpA4ACIW5BACEsIC0hRyArIUYMBAsgAS0A4AEhTgsCQCBOQf8BcSJPQd0ARw0AIAYgLSgCADYCACADIAMpA6ABNwOwBCADQeABaiABIANBsARqEKEsIAMoAuQBISsCQCADKALgASItQQhHDQAgKyE7DAsLIANB1ANqQQJqIAVBAmotAAA6AAAgAyADLwH6ATsB3gEgAyAFLwAAOwHUAyADLQD5ASFRIAMtAPgBIUEgAygC9AEhQiADKALwASFDIAMoAuwBIVIgAygC6AEhRCADLQD8ASFTIAMpA4ACIW5BACEsIC0hRyArIUYMAwsCQCABLQCRAUEgcUUNACBPQdEARw0AAkAgARDYCSItRQ0AIC0tAABB/QBHDQAgASgC2AEhACABEKELIAEQoQsgA0HQAGogASAAQQEQ0AEgAygCVCEAAkAgAygCUEEBcUUNAEEJISwgACE7DAkLIAEoAtQBIT5BASEsQQYhRyAqIUUgACFGDAgLIAEtAOABIU4LAkAgTkH/AXEiLUHRAEYNAAJAIC1B4gBGDQAgLUHtAEYNAQwDCyABENgJIi1FDQICQAJAIC0tAAAiLUF+ag4DAgECAAsgLUG1f2pBAkkNASAtQeIARg0BIC1B8QBGDQELIC1BjX9qQf8BcUEtSw0CCyADQcgAaiABQQAQ2wJBASEsIAMoAkwhKwJAIAMoAkhBAXENACBUIUQgVSFDIFYhQiBXIUFBAiFHICshRgwDC0EJISwgKyE7DAYLIAEgARCaLBCnFwwCCwJAAkACQAJAAkACQAJAICwNACABLQDgASEAAkACQAJAIAEtAJABQRBxRQ0AIAAQpRUNAQsCQCAAQf8BcUEPRw0AIAEQ2AkiAEUNAiAALQAAQfUARw0CIAEtAOABIQALIANBADYCrAQgA0KAgICAgAE3AqQEIABB/wFxQQ9GDQQMBwsgA0HgAWogAUEAQQAQywMgAygC4AEhOyADLQD0ASIAQQJGDQsgA0HsA2pBAmogHkECai0AADoAACADIB4vAAA7AewDIAMoAvABISwgAygC7AEhLyADKALoASEwIAMoAuQBIS0MAgsgARChCyADQeABaiABELgFIAMoAuQBITsgAygC4AEiAEUNCiABKALUASFGQQUhLCAxITwgOyFEICohRyAAITsMCwsgA0HsA2pBAmogA0HbAWpBAmotAAA6AAAgAyADLwDbATsB7ANBACEsQeHqsaMHIS1B8ciVswYhOwsgA0EANgKsBCADQoCAgICAATcCpAQgBSADLwHsAzsAACAFQQJqIANB7ANqQQJqLQAAOgAAIAMgADoA/AEgAyAsNgL4ASADIC82AvQBIAMgMDYC8AEgAyAtNgLsASADIDs2AugBIANCAzcD4AEgA0GkBGogA0HgAWpB9PibARD0HiABLQDgASEAAkAgAygCrARFDQAgAEH/AXFBB0cNAiABENgJIgBFDQIgAC0AAEEPRw0CIAEQoQsMAQsgAEH/AXFBD0cNAgsgARChCwJAIAEtAOABQfUARg0AIAEoAtwBIQAgASgC2AEhKiADQZgFaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANB9QA6AKAHIAMgA0HoBmo2AugBIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsARqIANB4AFqEIcbIBlBCGogA0GYBWpBCGooAgA2AgAgGSADKQKYBTcCACAqIAAgA0GwBGoQ4BohOyABLQDgAUGiAUcNBCABIAEQmiwQpxcMBAsgARChCyADQbAEaiABEIwKIAMoArgEITsgAykDsAQibUICUQ0DICEgGSkCADcCACAhQRBqIBlBEGooAgA2AgAgIUEIaiAZQQhqKQIANwIAIAMgKzYCiAIgAyA7NgLwASADIG03A+gBIANCAjcD4AEgAyABKALUATYCjAIgA0GkBGogA0HgAWpBhPmbARD0HgsgAS0A4AEhAAsCQAJAAkACQCAAQf8BcSIAQf4ARg0AIAEtAJABQRBxDQEgASgC3AEhACABKALYASEqIANBpAVqIAEQ1CYgA0EBNgLkASADQZy/nAE2AuABIANCATcC7AEgA0GzBzYC7AYgA0H+ADoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQhxsgGUEIaiADQaQFakEIaigCADYCACAZIAMpAqQFNwIAICogACADQbAEahDgGiE7IAEtAOABQaIBRw0FIAEgARCaLBCnFwwFCyADQeABaiABELgFIAMoAuQBIQAgAygC4AEiKw0BIAAhOwwECyAAQQdGDQEgASgC3AEhACABKALYASEqIANB2ANqIAEQ1CYgA0EBNgLkASADQZy/nAE2AuABIANCATcC7AEgA0GzBzYC7AYgA0EHOgCgByADIANB6AZqNgLoASADIANBsAZqNgLoBiADIANBoAdqNgKwBiADQbAEaiADQeABahCHGyAZQQhqIANB2ANqQQhqKAIANgIAIBkgAykC2AM3AgAgKiAAIANBsARqEOAaITsgAS0A4AFBogFHDQMgASABEJosEKcXDAMLIAEoAtQBIjxBCHYhPUECISwgAygCrAQhRiADKAKoBCFHIAMoAqQEITsgMSFBIAAhQiArIUMgKiFEDAcLIAEQoQsgAS0A4AEhAAsCQAJAIABB/wFxQQJHDQAgWCErAkACQANAIAEQoQsgAS0A4AFBA0YNASABKALYASFYIANB4AFqIAEQjAogAygC6AEhOyADKQPgASJtQgJRDQQgA0GIB2pBEGoiLCAdQRBqIi8oAgA2AgAgA0GIB2pBCGoiLSAdQQhqIgApAgA3AwAgAyAdKQIANwOIBwJAAkACQCBtp0EBcUUNACAZIAMpA4gHNwIAIBlBCGogLSkDADcCACAZQRBqICwoAgA2AgAgAyA7NgK4BCADIG03A7AEQQAhLAwBCyAgIAMpA4gHNwIAICBBCGoiMCAtKQMANwIAICBBEGoiLSAsKAIANgIAIAMgOzYCoAcCQAJAIAEtAJEBQSBxRQ0AIANBoAdqQbKEnAFBBBCEIkUNACABLQDgARClFUUNACADQegGaiABENwOIANB4AFqIANB6AZqEPEkIAMoAuABITsCQAJAIAMtAPQBIixBAkYNACAVIB8pAgA3AgAgFCAeLwAAOwAAIBVBCGoiTiAfQQhqIk8pAgA3AgAgFEECaiAeQQJqIlAtAAA6AAAgAyAsOgDEBiADIDs2ArAGAkACQAJAAkACQAJAIANBsAZqQbaEnAFBAhCEIg0AIDENAQwFCwJAIAEtAOABEKUVDQAgMUUNBCADKAKsByEsIAMoAqgHISsgA0GngYCAeDYC4AEgASArICwgA0HgAWoQ3iMMBAsgA0HoBWogARDcDiADQeABaiADQegFahDxJCADKALgASE7IAMtAPQBIixBAkYNAiATIB8pAgA3AgAgEiAeLwAAOwAAIBNBCGoiWSBPKQIANwIAIBJBAmoiWiBQLQAAOgAAIAMgLDoA/AYgAyA7NgLoBgJAIANB6AZqQbaEnAFBAhCEIkUNACABLQDgARClFUUNACADQegFaiABENwOIANB4AFqIANB6AVqEPEkIAMoAuABISwCQCADLQD0ASItQQJHDQAgAykD6AYQxiEgAykDsAYQxiFCAiFtICwhOyArIVgMCAsgA0GABmpBCGoiKyBPKQIANwMAIANB+ARqQQJqIjsgUC0AADoAACADIB8pAgA3A4AGIAMgHi8AADsB+AQgMUUNAiADKAKsByFbIAMoAqgHIVwgA0GngYCAeDYC4AEgASBcIFsgA0HgAWoQ3iMMAgsgA0HQBmpBCGogMCkCADcDACADQdAGakEQaiAtKAIANgIAIANBgAVqQQhqIFkpAgA3AwAgA0GEBGpBAmogWi0AADoAACADICApAgA3A9AGIAMgEykCADcDgAUgAyASLwAAOwGEBCADKAKgByE7IAMoAqwHIVsgAygC6AYhXSADLQD8BiFeIAMpA7AGEMYhQgAhb0EAIVwgWCErQgAhbQwKCyADKAKsByEsIAMoAqgHIS0gA0GngYCAeDYC4AEgASAtICwgA0HgAWoQ3iMMAwsgA0HQBmpBCGogTikCADcDACADQdAGakEQaiAVQRBqKAIANgIAIANBgAVqQQhqICspAwA3AwAgA0GEBGpBAmogOy0AADoAACADIAMpA4AGNwOABSADIAMvAfgEOwGEBCADIBUpAgA3A9AGIAMoArAGITsgAygCrAchWyADKQPoBhDGIUEBIVxCACFtQgAhbyAsIV0gLSFeDAQLIAMpA7AGEMYhDAILIANB0AZqQQhqIE4pAgA3AwAgA0HQBmpBEGogFUEQaigCADYCACADIBUpAgA3A9AGIAEoAtQBIVtBASFcQgIhb0IAIW0gAygCsAYhOwwCCyAGIAMpA7AGNwMAIAZBEGogA0GwBmpBEGopAwA3AwAgBkEIaiADQbAGakEIaikDADcDACADQgA3A7AEIAMpA6AHEMYhQQEhLAwDC0ICIW0gKyFYCyADKQOgBxDGISBtQgJRDQkgWCErDAMLIAYgAykDoAc3AwAgBkEQaiADQaAHakEQaikDADcDACAGQQhqIANBoAdqQQhqKQMANwMAIANCADcDsARBACEsC0IAIW0LAkACQCABLQDgAUH1AEYNAEICIW8MAQsgARChCyADQeABaiABEIwKIAMoAugBITsgAykD4AEicEICUQ0EIANBmAZqQQhqIAApAgA3AwAgA0G8A2pBAmogBUECai0AADoAACADIB0pAgA3A5gGIAMgBS8AADsBvAMgAy0A/AEhXyA7IV0gcCFvCyADQdAGakEIaiAZQQhqKQIANwMAIANB0AZqQRBqIBlBEGooAgA2AgAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GEBGpBAmogA0G8A2pBAmotAAA6AAAgAyADKQOYBjcDgAUgAyADLwG8AzsBhAQgAyAZKQIANwPQBiABKALUASFbIAMoArgEITsgLCFcIFghKyBfIV4LIB0gAykD0AY3AgAgHCADKQOABTcCACAbIAMvAYQEOwAAIC8gA0HQBmpBEGooAgA2AgAgACADQdAGakEIaikDADcCACAcQQhqIANBgAVqQQhqKQMANwIAIBtBAmogA0GEBGpBAmotAAA6AAAgAyBdNgKIAiADIG83A4ACIAMgXjoAnAIgGiADKADIAzYAACAaQQNqIANByANqQQNqKAAANgAAIAMgXDoAqAIgAyBbNgKkAiADICs2AqACIAMgOzYC6AEgAyBtNwPgASADQaQEaiADQeABakGU+ZsBEPQeAkAgAS0A4AFBfWoOBQIAAAABAAsLIAEoAtwBIQAgASgC2AEhKiADQYgEaiABENQmIANBATYC5AEgA0Gcv5wBNgLgASADQgE3AuwBIANBswc2AuwGIANBBzoAoAcgAyADQegGajYC6AEgAyADQbAGajYC6AYgAyADQaAHajYCsAYgA0GwBGogA0HgAWoQhxsgGUEIaiADQYgEakEIaigCADYCACAZIAMpAogENwIAICogACADQbAEahDgGiE7IAEtAOABQaIBRw0DIAEgARCaLBCnFwwDCyABEKELAkACQCABLQDgAUH+AEYNACADKAKoBCJHIAMoAqwEIkZB0ABs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A7ABEMYhDAYLIBggA0GwAWpBEGopAwA3AwAgBiAnKQMANwMAIAMgAykDsAE3A7AEIANBCGogASAtIANBsARqQQAgMRDMAkEKQQYgAygCCEEBcRshLCADKAIMIS4MDwtBoKacAUEoQbT5mwEQ0h4ACyABLQDgASIAQQdGDQEgAEH+AEYNAiABKALcASEAIAEoAtgBISogA0GYBGogARDUJiADQQE2ArQEIANBnL+cATYCsAQgA0IBNwK8BCADQbMHNgLsBiADQQc6AKAHIAMgA0HoBmo2ArgEIAMgA0GwBmo2AugGIAMgA0GgB2o2ArAGIANBsAVqIANBsARqEIcbIAdBCGogA0GYBGpBCGooAgA2AgAgByADKQKYBDcCACAqIAAgA0GwBWoQ4BohLiABLQDgAUGiAUcNACABIAEQmiwQpxcLIAMpA7ABEMYhDAsLIAEQoQsLIBggAykDsAE3AwAgGEEIaiAnKQMAIm03AwAgGEEQaiADQbABakEQaikDADcDACADQgM3A7AEIAMgbTcDuAQgA0HIA2ogA0GwBGpBxPmbARD1HgtBASErICpBAUYNBCABLQDgASIAQQ9HDQEgKiEwCyABKALYASEAIAEQoQsgAS0A4AFB9QBGDQIgASgC3AEhACABKALYASEqIANBpARqIAEQ1CYgA0EBNgK0BCADQZy/nAE2ArAEIANCATcCvAQgA0GzBzYCtAEgA0H1ADoAsAYgAyADQbABajYCuAQgAyADQegGajYCsAEgAyADQbAGajYC6AYgA0GwBWogA0GwBGoQhxsgB0EIaiADQaQEakEIaigCADYCACAHIAMpAqQENwIAICogACADQbAFahDgGiEuIAEtAOABQaIBRw0HIAEgARCaLBCnFwwHCyAxITAgKkUNACAqISsMAwtBACErAkAgAEH/AXFBAkcNAAJAA0AgARChCyABLQDgAUEDRg0BIAEoAtgBITEgA0GwBWogARCMCiADKAK4BSEAAkACQAJAAkACQAJAIAMpA7AFIm1CAlINACAAIWAMAQsgAykDyAUhcCADKALEBSEsIAMoAsAFIS4gAygCvAUhKgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIG2nQQFxRQ0AIAEtAOABQfUARg0BIAMgKjYCvAUgAyAANgK4BSADQe+AgIB4NgKwBSAuICwgA0GwBWoQ4BohYCABLQDgAUGiAUcNAiABIAEQmiwQpxcMAgsgAyBwNwP4BSADICw2AvQFIAMgLjYC8AUgAyAqNgLsBSADIAA2AugFQQAhACABLQCRAUEgcUUNCCADQegFakGyhJwBQQQQhCJFDQhBACEAIAEtAOABIioQpRVFDQkgA0GYBmogARDcDiADQbAFaiADQZgGahDxJCADKAKwBSEAAkAgAy0AxAUiKkECRw0AQgUhbSAAIWAMDAsgFyAMKQIANwIAIBYgCi8AADsAACAXQQhqIAxBCGoiLCkCADcCACAWQQJqIApBAmotAAA6AAAgAyAqOgCUBiADIAA2AoAGAkAgA0GABmpBtoScAUECEIQiDQAgMEUNCCADKAL0BSEAIAMoAvAFISogA0GmgYCAeDYCsAUgASAqIAAgA0GwBWoQ3iMMCAsCQCABLQDgARClFQ0AIDBFDQYgAygC9AUhACADKALwBSEqIANBpoGAgHg2ArAFIAEgKiAAIANBsAVqEN4jDAYLIANBsAVqIAFBABCzBSADKAKwBSFgAkACQCADLQDEBSIAQQJGDQAgFSAMKQIANwIAIBQgCikAADcAACAVQQhqICwpAgA3AgAgFEEHaiAKQQdqIiooAAA2AAAgAyAAOgDEBiADIGA2ArAGIANBmAZqIANBsAZqELYZAkAgA0GYBmpBtoScAUECEIQiDQAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GABWpBEGogA0GYBmpBEGopAwA3AwAgAyADKQOYBjcDgAUgAygC8AUhYSADKALsBSFiIAMoAvQFImMhZAwHCwJAIAEtAOABEKUVDQAgA0GABWpBCGogA0GYBmpBCGopAwA3AwAgA0GABWpBEGogA0GYBmpBEGopAwA3AwAgAyADKQOYBjcDgAUgAygC9AUhYyADKALwBSFhIAMoAuwFIWIgAygCpAYhZAwHCyADQbAFaiABQQAQswUgAygCsAUhYCADLQDEBSIAQQJHDQEgAykDmAYQxiELIAMpA4AGEMYhDAsLIBMgDCkCADcCACASIAopAAA3AAAgE0EIaiAsKQIANwIAIBJBB2ogKigAADYAACADIAA6APwGIAMgYDYC6AYgA0HQBmogA0HoBmoQthkgMA0CDAMLIAEQoQsgA0GwBWogAUEAELMFIAMoArAFIWACQCADLQDEBSIvQQJGDQAgCCAMKQIANwIAIA8gCikAADcAACAIQQhqIAxBCGopAgA3AgAgD0EHaiAKQQdqKAAANgAAIAMgLzoAxAQgAyBgNgKwBCADQaAHaiADQbAEahC2GSADQYAFakEIaiADQaAHakEIaikDADcDACADQYAFakEQaiADQaAHakEQaikDADcDACADIAMpA6AHNwOABUEAIWVCASFtIAMoAqwHIWQgMSFmIHAhciAsIWMgLiFhICohYiAAIWAMEAsgKq1CIIYgAK2EEMYhCyBwEPsqDAoLIAMoAvQFIQAgAygC8AUhKiADQaaBgIB4NgKwBSABICogACADQbAFahDeIwsgA0GABWpBCGogA0HQBmpBCGopAwA3AwAgA0GABWpBEGogA0HQBmpBEGopAwA3AwAgAyADKQPQBjcDgAUgAykDkAYhciADKAKMBiFjIAMoAogGIWEgAygChAYhYiADKAKABiFgIAMoAvQFIWQgAykDmAYQxiFCACFtDAILIAMoAugFIWAgAykD+AUhciADKQOABhDGIUEAIWUMCQsgA0GABWpBCGogA0GABmpBCGopAwA3AwAgA0GABWpBEGogA0GABmpBEGopAwA3AwAgAyADKQOABjcDgAUgASgC1AEhZEICIW0LQQEhZSAxIWYMBAsgA0GwBWpBEGoiACADQYAGakEQaikDADcDACADQbAFakEIaiIqIANBgAZqQQhqKQMANwMAIAMgAykDgAY3A7AFIAMpA+gFEMYhIANB6AVqQRBqIAApAwA3AwAgA0HoBWpBCGogKikDADcDACADIAMpA7AFNwPoBUEBIQALIAEtAOABISoLAkAgKkH/AXFB9QBGDQAgA0GABWpBEGogA0HoBWpBEGopAwA3AwAgA0GABWpBCGogA0HoBWpBCGopAwA3AwAgAyADKQPoBTcDgAUgASgC1AEhZEICIW0gACFlDAYLIAEQoQsgA0GwBWogAUEAELMFIAMoArAFIWAgAy0AxAUiKkECRw0DC0IFIW0LIAMpA+gFEMYhIG1CBVINBAtBCiEsIGAhLgwNCyARIAwpAgA3AgAgECAKKQAANwAAIBFBCGogDEEIaikCADcCACAQQQdqIApBB2ooAAA2AAAgAyAqOgDEASADIGA2ArABIANBiAdqIANBsAFqELYZIANBgAVqQQhqIANBiAdqQQhqKQMANwMAIANBgAVqQRBqIANBiAdqQRBqKQMANwMAIAMgAykDiAc3A4AFIAMpA/gFIXIgAygC9AUhYyADKALwBSFhIAMoAuwFIWIgAygC6AUhYCADKAKUByFkIAAhZQtCACFtCyAxIWYLIA4gAykDgAU3AwAgDSADKAD4BDYAACAOQQhqIANBgAVqQQhqKQMANwMAIA5BEGogA0GABWpBEGopAwA3AwAgDUEDaiADQfgEakEDaigAADYAACADIHI3A/gBIAMgYzYC9AEgAyBhNgLwASADIGI2AuwBIAMgZToAoAIgAyBkNgKcAiADIGY2ApgCIAMgYDYC6AEgAyBtNwPgASADQcgDaiADQeABakHU+ZsBEPUeAkAgAS0A4AFBfWoOBQIAAAABAAsLIAEoAtwBIQAgASgC2AEhKiADQZgFaiABENQmIANBATYCtAQgA0Gcv5wBNgKwBCADQgE3ArwEIANBswc2ArQBIANBBzoAsAYgAyADQbABajYCuAQgAyADQegGajYCsAEgAyADQbAGajYC6AYgA0GwBWogA0GwBGoQhxsgB0EIaiADQZgFakEIaigCADYCACAHIAMpApgFNwIAICogACADQbAFahDgGiEuIAEtAOABQaIBRw0HIAEgARCaLBCnFwwHCyABEKELCyAwITEMAQsgARChCyADQbAFaiABEKQNIAMoArAFIS4gAy0AxAUiKkECRg0EIAsgDCkCADcCACAJIAovAAA7AAAgC0EIaiAMQQhqKQIANwIAIAlBAmogCkECai0AADoAACADICo6ANQEIAMgLjYCwAQgAyAANgK4BCADQgQ3A7AEIAMgASgC1AE2ArwEIANByANqIANBsARqQeT5mwEQ9R4gMCErCyABLQDgASEACwJAIABB/wFxQf4ARg0AIAEoAtwBIQAgASgC2AEhKiADQaQFaiABENQmIANBATYCtAQgA0Gcv5wBNgKwBCADQgE3ArwEIANBswc2ArQBIANB/gA6ALAGIAMgA0GwAWo2ArgEIAMgA0HoBmo2ArABIAMgA0GwBmo2AugGIANBsAVqIANBsARqEIcbIAdBCGogA0GkBWpBCGooAgA2AgAgByADKQKkBTcCACAqIAAgA0GwBWoQ4BohLiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgARChCwJAIAEtAOABQcAARg0AIAggARDUJiADQRA2AsQEIANB9PmbATYCwAQgA0GwgICAeDYCsAQgASgC2AEgASgC3AEgA0GwBGoQ4BohLiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgA0GwBGogARD+GkEYQQgQpioiAEEQaiAYKQMANwMAIABBCGogBikDADcDACAAIAMpA7AENwMAQQAhKgJAAkACQCABLQDhAQ0AAkAgAS0A4AEiLEH3AEYNACAsQfAARw0BCyABEKELIANBsARqIAEQqyAgAygCtAQhLiADKAKwBCIqQTJGDQECQEE4RQ0AIANBsAVqIAZBOPwKAAALICpBDkcNBEEUQQQQpioiKiAuNgIAICogAykDsAU3AgQgKkEMaiADQbAFakEIaikDADcCAAsgARDKEiIuRQ0BICoQrywLIAAQ1icMAwsgASgC1AEhMiADKALQAyE2IAMoAswDITMgAygCyAMhLkEAISwgMSE0IC0hNQsgKyE3IDQhOCAqITkgMiE6IDUhZyAAIWggNiFpIDMhagwFC0GgppwBQShBhPqbARDSHgALQQohLAsgA0HIA2oQyyggLEEKRg0AIGohMyBpITYgaCEAIGchNSA6ITIgOSEqIDghNCA3ISsMAgsgLiEqCyAoEJQoQQohLAwBCyADQfIAakECaiADQdsBakECai0AADoAACADIAMvAZoBOwF2IAMgAy8A2wE7AXIgKBCUKCArIUsgKiFMIAAhTSAuISoLICxBCkYNAiADQfgAakECaiItIANB8gBqQQJqLQAAOgAAIAMgAy8BdjsBfCADIAMvAXI7AXgCQCACKAIIIisgAigCAEcNACACQcienAEQ4x0LIAIoAgQgK0E4bGoiACBLOgAhIAAgNDoAICAAIEw2AhwgACAyNgIYIAAgNTYCFCAAIE02AhAgACA2NgIMIAAgMzYCCCAAICo2AgQgACAsNgIAIAAgSjoAJCAAIAMvAXw7ASIgACADLwF4OwAlIABBJ2ogLS0AADoAACAAIEg2ATQgACBJNgEwIAAgbDcBKCACICtBAWo2AggMAAsLQQAhKgsgA0HAB2okACAqC7ppAhZ/An4jAEHgAWsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiA0F0aiIEQQcgBEEmSRsOJgABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlAAsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwuCyABKAIIIQMgASgCFCEFIAEoAhAhBiACQeAAaiABKAIMIgdBBEEQEJUPIAIoAmQhCCACKAJgQQFGDSQgAigCaCEJAkAgCEUNACAHQQR0IQogCSEEIAghCwNAIApFDQECQCADKAIAIgxBAkYNACADQQRqKQIAIRggA0EMaigCACENEPonIQEgAkHgAGogDRBCIAFBOGogAkHgAGpBOGopAwA3AwAgAUEwaiACQeAAakEwaikDADcDACABQShqIAJB4ABqQShqKQMANwMAIAFBIGogAkHgAGpBIGopAwA3AwAgAUEYaiACQeAAakEYaikDADcDACABQRBqIAJB4ABqQRBqKQMANwMAIAFBCGogAkHgAGpBCGopAwA3AwAgASACKQNgNwMACyADQRBqIQMgBCAMNgIAIARBDGogATYCACAEQQRqIBg3AgAgBEEQaiEEIApBcGohCiALQX9qIgsNAAsLIAAgBTYCFCAAIAY2AhAgACAHNgIMIAAgCTYCCCAAIAg2AgQgAEENNgIADC0LIAEoAhAhBCABKAIUIQMgAkHgAGogAUEEahChASAAQRRqIAM2AgAgAEEONgIAIAAgAikCYDcCBCACIAQ2AmwgAEEMaiACQegAaikCADcCAAwsCwJAAkAgAS0AHCINQQJHDQAMAQsgASgCGCEJIAEoAhQhByABKAIQIQggASkDCCIYQgODQgBSDQAgGKciBCAEKAIAIgRBAWo2AgAgBEF/TA0kCyABKAIgIQQQgighASACQRhqIAQQggkgAkHAAWogBEEMahDtCEGAgICAeCEMIAQoAjghBSAEKAI0IQYgBCgCMCEOAkAgBCgCGEGAgICAeEYNACAEKAIsIQMgBCkCJCEZIAJB4ABqIARBGGoQvQogAkEwaiAZNwMAIAJBOGogAzYCACACIAIpAmQ3AyggAigCYCEMCyAELQBFIQ8gBC0ARCEQQQAhCkEAIQMCQCAEKAI8IgtFDQAQgCghAyALKAIMIREgCygCECESIAJB4ABqIAsQ4QYgA0EQaiASNgIAIAMgAikCYDcCACACIBE2AmwgA0EIaiACQeAAakEIaikCADcCAAsCQCAEKAJAIgRFDQAQ+ychCiAEKQIEIRkgBCgCACELEPwnIQQgAkHgAGogCxB2AkBB4ABFDQAgBCACQeAAakHgAPwKAAALIAogGTcCBCAKIAQ2AgALIAJB4ABqQQhqIgQgAkEYakEIaigCADYCACACQfQAaiACQcABakEIaigCADYCACACIAIpAhgiGTcDYCACIAIpAsABNwJsIAFBEGogAkHgAGpBEGopAwA3AgAgAUEIaiAEKQMANwIAIAEgGTcCACABIAw2AhggASAPOgBFIAEgEDoARCABIAo2AkAgASADNgI8IAEgBTYCOCABIAY2AjQgASAONgIwIAEgAikDKDcCHCABQSRqIAJBKGpBCGopAwA3AgAgAUEsaiACQShqQRBqKAIANgIAIAAgATYCICAAIA06ABwgACAJNgIYIAAgBzYCFCAAIAg2AhAgACAYNwMIIABBDzYCAAwrCyABKQMIIRggAS0AECEDEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgAzoAECAAIBg3AwggACAENgIEIABBEDYCAAwqCyABKQIEIRggAS8BECEDEPonIQQgAkHgAGogASgCDBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgAzsBECAAIAQ2AgwgACAYNwIEIABBETYCAAwpCyABKQIMIRggAS0AFCEKEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGoiCykDADcDACAEQTBqIAJB4ABqQTBqIgwpAwA3AwAgBEEoaiACQeAAakEoaiINKQMANwMAIARBIGogAkHgAGpBIGoiCCkDADcDACAEQRhqIAJB4ABqQRhqIgcpAwA3AwAgBEEQaiACQeAAakEQaiIJKQMANwMAIARBCGogAkHgAGpBCGoiBSkDADcDACAEIAIpA2A3AwAQ+ichAyACQeAAaiABKAIIEEIgA0E4aiALKQMANwMAIANBMGogDCkDADcDACADQShqIA0pAwA3AwAgA0EgaiAIKQMANwMAIANBGGogBykDADcDACADQRBqIAkpAwA3AwAgA0EIaiAFKQMANwMAIAMgAikDYDcDACAAIAo6ABQgACAYNwIMIAAgAzYCCCAAIAQ2AgQgAEESNgIADCgLIAEtADwhCyABKAI0IQwgASgCMCENAkAgA0ELRw0AAkACQAJAIAEoAgQiCA4DAAECAAsgASgCGCEHIAEoAhQhCSACQcABaiABQQhqEMUJIAEtACAhBQJAAkAgASgCHCIEDQBBACEKDAELEPsnIQogBCkCBCEYIAQoAgAhBhD8JyEEIAJB4ABqIAYQdgJAQeAARQ0AIAQgAkHgAGpB4AD8CgAACyAKIBg3AgQgCiAENgIACyACKALIASEGIAIpA8ABIRgMKQsgASgCGCEHIAEoAhQhCSACQShqIAFBCGoQ4AIgAS0AICEFAkACQCABKAIcIgQNAEEAIQoMAQsQ+ychCiAEKQIEIRggBCgCACEGEPwnIQQgAkHgAGogBhB2AkBB4ABFDQAgBCACQeAAakHgAPwKAAALIAogGDcCBCAKIAQ2AgALIAIoAjAhBiACKQMoIRgMKAsgAkHeAGogAUEjai0AADoAACACIAEvACE7AVwgAS0AICEFIAEoAhwhCiABKAIYIQcgASgCFCEJIAEoAhAhBiABKQMIIRgMJwsCQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCwABAgMEBQYHCAkKAAsgAkHgAGogAUEIahDMDCACQd4AaiACQfsAai0AADoAACACIAIvAHk7AVwgAi0AeCEFIAIoAnQhCiACKAJwIQcgAigCbCEJIAIoAmghBiACKQNgIRggAigCfCEODDALIAJB4ABqIAFBCGoQwAYgAkHeAGogAkH7AGotAAA6AAAgAiACLwB5OwFcDC4LIAJB4ABqIAFBCGoQ7gggAkHeAGogAkH7AGotAAA6AAAgAiACLwB5OwFcDC0LIAJB4ABqIAFBBGoQrg4MKwsgAkHgAGogAUEEahD1AwwpCyACQeAAaiABQQRqELEMDCgLIAJB4ABqIAFBBGoQsQwMJwsgAkHgAGogAUEEahCuDgwnCyACQeAAaiABQQRqELEMDCULIAJB4ABqIAFBBGoQkQsMJAsgAkHeAGogAUEjai0AADoAACACIAEvACE7AVwgASkDKCEZIAEoAiQhDiABLQAgIQUgASgCHCEKIAEoAhghByABKAIUIQkgASgCECEGIAEpAwghGCABKAIEIQgMJgsgASgCJCEKIAEoAiAhCxD6JyEEIAJB4ABqIAEoAigQQiAEQThqIAJB4ABqQThqIgcpAwA3AwAgBEEwaiACQeAAakEwaiIJKQMANwMAIARBKGogAkHgAGpBKGoiBSkDADcDACAEQSBqIAJB4ABqQSBqIgYpAwA3AwAgBEEYaiACQeAAakEYaiIOKQMANwMAIARBEGogAkHgAGpBEGoiDykDADcDACAEQQhqIAJB4ABqQQhqIhApAwA3AwAgBCACKQNgNwMAAkACQAJAAkAgASgCCCIMDgMAAQIACyABKAIUIQMgASgCECENIAEoAhwhCCABKAIYIQcCQCABKQMQIhhCA4NCAFINACAYpyIBIAEoAgAiAUEBajYCACABQX9MDSILIAIgAzYCYCACQShqIQEMAgsgASgCFCEDIAEoAhAhDSABKAIcIQggASgCGCEHAkAgASkDECIYQgODQgBSDQAgGKciASABKAIAIgFBAWo2AgAgAUF/TA0hCyACIAM2AmAgAkEoaiEBDAELIAEoAhQhCCABKAIQIQ0Q+ichAyACQeAAaiABKAIMEEIgA0E4aiAHKQMANwMAIANBMGogCSkDADcDACADQShqIAUpAwA3AwAgA0EgaiAGKQMANwMAIANBGGogDikDADcDACADQRBqIA8pAwA3AwAgA0EIaiAQKQMANwMAIAMgAikDYDcDACACQeAAaiEBCyABIAg2AgAgACANNgIQIAAgAzYCDCAAIAw2AgggACAHNgIYIAAgBDYCKCAAIAo2AiQgACALNgIgIABBFDYCACAAIAIoAmA2AhQgACACKAIoNgIcDCYLQQEhBCABKAIsIQMgASgCKCEKIAEoAiQhCyABKAIgIQwCQAJAIAEoAghBAUcNACABKQMQIRggAUEMahC6DyEBDAELIAEoAhwhCCABKAIYIQ1BACEEAkAgASkDECIYQgODQgBRDQAMAQsgGKciASABKAIAIgdBAWo2AgAgB0F/TA0eCyAAIAM2AiwgACAKNgIoIAAgCzYCJCAAIAw2AiAgACAINgIcIAAgDTYCGCAAIBg3AxAgACABNgIMIAAgBDYCCCAAQRU2AgAMJQsgASkDECEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGoiCykDADcDACAEQTBqIAJB4ABqQTBqIgwpAwA3AwAgBEEoaiACQeAAakEoaiINKQMANwMAIARBIGogAkHgAGpBIGoiCCkDADcDACAEQRhqIAJB4ABqQRhqIgcpAwA3AwAgBEEQaiACQeAAakEQaiIJKQMANwMAIARBCGogAkHgAGpBCGoiBSkDADcDACAEIAIpA2A3AwAQ+ichAyACQeAAaiABKAIIEEIgA0E4aiALKQMANwMAIANBMGogDCkDADcDACADQShqIA0pAwA3AwAgA0EgaiAIKQMANwMAIANBGGogBykDADcDACADQRBqIAkpAwA3AwAgA0EIaiAFKQMANwMAIAMgAikDYDcDABD6JyEKIAJB4ABqIAEoAgwQQiAKQThqIAspAwA3AwAgCkEwaiAMKQMANwMAIApBKGogDSkDADcDACAKQSBqIAgpAwA3AwAgCkEYaiAHKQMANwMAIApBEGogCSkDADcDACAKQQhqIAUpAwA3AwAgCiACKQNgNwMAIAAgGDcDECAAIAo2AgwgACADNgIIIAAgBDYCBCAAQRY2AgAMJAsgAUEEaiEKIAEoAiQhCyABKAIgIQwgASgCHCENAkACQAJAIAEtABgiA0F9aiIEQQEgBEH/AXFBA0kbQf8BcQ4DAAECAAsgAkEKaiABQRtqLQAAOgAAIAIgAS8AGTsBCAwfCyACQQpqIAFBG2otAAA6AAAgAiABLwAZOwEIDB4LEPonIQQgAkHgAGogASgCEBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAQQUhAwweCyABKAIcIQogASgCGCELIAEoAhQhDBD6JyEEIAJB4ABqIAEoAhAQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDAEGAgICAeCEDAkAgASgCBEGAgICAeEYNACACQeAAaiABQQRqELoIIAIpAmQhGCACKAJgIQMLAkACQCABKAIgIgENAEEAIQEMAQsgARCjFiEBCyAAIAE2AiAgACAKNgIcIAAgCzYCGCAAIAw2AhQgACAENgIQIAAgGDcDCCAAIAM2AgQgAEEYNgIADCILIAEoAhAhBCABKAIUIQMgAkHgAGogAUEEahCVCSAAQRRqIAM2AgAgAEEZNgIAIAAgAikCYDcCBCACIAQ2AmwgAEEMaiACQegAaikCADcCAAwhCyABKAIYIQQgASgCFCEDIAEoAhAhCgJAIAEpAwgiGEIDg0IAUg0AIBinIgsgCygCACILQQFqNgIAIAtBf0wNGQsgACAENgIYIAAgAzYCFCAAIAo2AhAgACAYNwMIIABBGjYCACAAIAEtABw6ABwMIAsCQAJAAkACQAJAAkACQAJAAkAgASgCCCIKDgcAAQIDBAUGAAsgASgCHCEIIAEoAhghBAJAIAEpAxAiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNIAsgASgCJCELIAEoAiAhAwJAIAEpAyAiGVANACAZQgODUEUNACAZpyIBIAEoAgAiAUEBajYCACABQX9MDSALIBhCIIinIQwgGKchDQwGCyABKQMYIhhCIIinIQggASkDECIZQiCIpyEMIAEoAiQhCyABKAIgIQMgASgCDCEBIBinIQQgGachDQwGCyABKQMYIhhCIIinIQggASkDECIZQiCIpyEMIAEoAiQhCyABKAIgIQMgASgCDCEBIBinIQQgGachDQwFCyABKAIkIQsgASgCICEDIAEpAxghGCABKAIUIQwgASgCECENAkAgASkDICIZUA0AIBlCA4NQRQ0AIBmnIgEgASgCACIBQQFqNgIAIAFBf0wNHQsgGEIgiKchCCAYpyEEDAMLIAEoAiAhBCABKAIUIQwgASgCECENEP4nIQMgBC0ADCELIAJB4ABqIARBBGooAgAgBEEIaigCABDgFyADIAIpAmA3AgAgAiALOgBsIANBCGogAkHgAGpBCGopAgA3AgAgASkDGCIYpyEEAkAgGFANACAYQgODUEUNACAEIAQoAgAiAUEBajYCACABQX9MDRwLIBhCIIinIQgMAwsgASgCJCELIAEoAiAhAwJAIAEpAxAiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNGwsgASkDGCIZpyEEAkAgGUIDg0IAUg0AIAQgBCgCACIBQQFqNgIAIAFBf0wNGwsgGUIgiKchCCAYQiCIpyEMIBinIQ0MAQsgASgCJCELIAEoAiAhAwJAIAEpAxAiGEIDg0IAUg0AIBinIgQgBCgCACIEQQFqNgIAIARBf0wNGgsgASkDGCIZpyEEAkAgGUIDg0IAUg0AIAQgBCgCACIBQQFqNgIAIAFBf0wNGgsgGUIgiKchCCAYQiCIpyEMIBinIQ0LCyAAIAs2AiQgACADNgIgIAAgATYCDCAAIAo2AgggAEEbNgIAIAAgCK1CIIYgBK2ENwMYIAAgDK1CIIYgDa2ENwMQDB8LIAEpAhwhGCACQeAAaiABQQRqEJUJIAJB4ABqQQxqIAEoAhQgASgCGBD4CCAAQRxqIBg3AgAgAEEcNgIAIAAgAikCYDcCBCAAQQxqIAJB6ABqKQIANwIAIABBFGogAkHwAGopAgA3AgAMHgsgASgCFCEKIAEoAhAhCyABKAIMIQwQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGoiDSkDADcDACAEQQhqIAJB4ABqQQhqIggpAwA3AwAgBCACKQNgNwMAAkACQCABKAIYIgMNAEEAIQcMAQsgAxCjFiEHCyABKAIIIQMQiCghASADKQIYIRggAkHgAGogAxCVCSACQewAaiADQRBqKAIAIANBFGooAgAQ+AggAUEYaiAYNwIAIAEgAikCYDcCACABQQhqIAgpAgA3AgAgAUEQaiANKQIANwIAIAAgBzYCGCAAIAo2AhQgACALNgIQIAAgDDYCDCAAIAE2AgggACAENgIEIABBHTYCAAwdCyABKAIIIQMgASgCHCEHIAEoAhghCSABKAIUIQUgAkHgAGogASgCDCINQQhBKBCVDyACKAJkIQwgAigCYEEBRg0VIAIoAmghCAJAIAxFDQAgDUEobCEKIAghBCAMIQsDQCAKRQ0BIAJB4ABqIAMQvAIgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgBEEoaiEEIApBWGohCiADQShqIQMgC0F/aiILDQALCxCEKCEEQYCAgIB4IQsCQAJAIAEoAhAiCigCAEGAgICAeEcNABD6JyEDIAJB4ABqIAooAgQQQiADQThqIAJB4ABqQThqKQMANwMAIANBMGogAkHgAGpBMGopAwA3AwAgA0EoaiACQeAAakEoaikDADcDACADQSBqIAJB4ABqQSBqKQMANwMAIANBGGogAkHgAGpBGGopAwA3AwAgA0EQaiACQeAAakEQaikDADcDACADQQhqIAJB4ABqQQhqKQMANwMAIAMgAikDYDcDAAwBCyAKKQIMIRggCigCFCEDIAJB4ABqIAoQvQogAiADNgJ0IAIgGDcCbCACQTBqIAJB8ABqKQIANwMAIAIgAikCaDcDKCACKAJgIQsgAigCZCEDCyAEIAM2AgQgBCALNgIAIAQgAikDKDcCCCAEQRBqIAJBMGopAwA3AgAgAS0AKSELIAEtACghBkEAIQNBACEKAkAgASgCICIORQ0AIA4QpBYhCgsCQCABKAIkIgFFDQAgARDBGiEDCyAAIAs6ACkgACAGOgAoIAAgAzYCJCAAIAo2AiAgACAHNgIcIAAgCTYCGCAAIAU2AhQgACAENgIQIAAgDTYCDCAAIAg2AgggACAMNgIEIABBHjYCAAwcCwJAAkAgAS0AHCINQQJHDQAMAQsgASgCGCEJIAEoAhQhByABKAIQIQggASkDCCIYQgODQgBSDQAgGKciBCAEKAIAIgRBAWo2AgAgBEF/TA0UCxCHKCEEIAEoAiAiASgCLCEFIAEoAighBiABKAIkIQ4gAkHAAWogARDtCCACQShqIAFBDGoQdUEAIQpBACEDAkAgASgCMCILRQ0AEPonIQMgAkHgAGogCxBCIANBOGogAkHgAGpBOGopAwA3AwAgA0EwaiACQeAAakEwaikDADcDACADQShqIAJB4ABqQShqKQMANwMAIANBIGogAkHgAGpBIGopAwA3AwAgA0EYaiACQeAAakEYaikDADcDACADQRBqIAJB4ABqQRBqKQMANwMAIANBCGogAkHgAGpBCGopAwA3AwAgAyACKQNgNwMACyABLQA8IQ8CQCABKAI0IgtFDQAQgCghCiALKAIMIQwgCygCECEQIAJB4ABqIAsQ4QYgCkEQaiAQNgIAIAogAikCYDcCACACIAw2AmwgCkEIaiACQeAAakEIaikCADcCAAsCQAJAIAEoAjgiDA0AQQAhCwwBCxCAKCELIAwoAgwhECAMKAIQIREgAkHgAGogDBDVDCALQRBqIBE2AgAgCyACKQJgNwIAIAIgEDYCbCALQQhqIAJB4ABqQQhqKQIANwIACyACQeAAakEYaiIMIAFBGGoQ0QUgAkHgAGpBCGoiASACQcABakEIaigCADYCACACQfQAaiACQShqQQhqKAIANgIAIAIgAikCwAEiGTcDYCACIAIpAig3AmwgBEEgaiACQeAAakEgaigCADYCACAEQRhqIAwpAwA3AgAgBEEQaiACQeAAakEQaikDADcCACAEQQhqIAEpAwA3AgAgBCAZNwIAIAQgDzoAPCAEIAs2AjggBCAKNgI0IAQgAzYCMCAEIAU2AiwgBCAGNgIoIAQgDjYCJCAAIAQ2AiAgACANOgAcIAAgCTYCGCAAIAc2AhQgACAINgIQIAAgGDcDCCAAQR82AgAMGwsgASgCCCEEIAEoAgQhAwJAAkAgASgCDA0AQQAhCgwBCyABQQxqELoPIQoLIAAgCjYCDCAAIAQ2AgggACADNgIEIABBIDYCACAAIAEtABA6ABAMGgsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwZCyABKQMIIRgQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAYNwMIIAAgBDYCBCAAQSI2AgAMGAsgASkDCCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAAgGDcDCCAAIAQ2AgQgAEEjNgIADBcLIAEoAhwhBCABKAIYIQMgAkHgAGogAUEgahCpCCABKAIUIQogASgCECELAkAgASkDCCIYQgODQgBSDQAgGKciASABKAIAIgFBAWo2AgAgAUF/TA0PCyAAIAIpA2A3AyAgAEEwaiACQfAAaikDADcDACAAQShqIAJB6ABqKQMANwMAIAAgBDYCHCAAIAM2AhggACAKNgIUIAAgCzYCECAAIBg3AwggAEEkNgIADBYLIAEoAhQhBCABKAIQIQMgASgCLCEKIAEoAighCwJAIAEpAwgiGEIDg0IAUg0AIBinIgwgDCgCACIMQQFqNgIAIAxBf0wNDgsgASgCJCEMIAEoAiAhDQJAIAEpAxgiGUIDg0IAUg0AIBmnIgEgASgCACIBQQFqNgIAIAFBf0wNDgsgACAKNgIsIAAgCzYCKCAAIAw2AiQgACANNgIgIAAgGTcDGCAAIAQ2AhQgACADNgIQIAAgGDcDCCAAQSU2AgAMFQsgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwUCyABKAIEIQQQ/ychASAEKAIEIQcgBCgCACEJAkACQAJAAkACQCAELQBsQX1qIgNBASADQf8BcUEDSRtB/wFxDgMAAQIACyAEKAJQIQggBCgCTCEFIAQoAkghBgJAIAQpA0AiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNEAsgBC0AVCENQQAhEkEDIRMMAgsgBCgCVCENIAQoAlAhCCACQeAAaiAEQdgAahCpCCAEKAJMIQUgBCgCSCEGAkAgBCkDQCIYQgODQgBSDQAgGKciAyADKAIAIgNBAWo2AgAgA0F/TA0PCyACQdoAaiACQfcAai0AADoAACACIAIvAHU7AVggDUEIdiESIAItAHQhEyACKAJwIRQgAigCbCEPIAIoAmghDiACKAJkIREgAigCYCEQDAILIAQoAkwhBSAEKAJIIQYgBCgCZCEPIAQoAmAhDgJAIAQpA0AiGEIDg0IAUg0AIBinIgMgAygCACIDQQFqNgIAIANBf0wNDgsgBCgCXCERIAQoAlghECAEKQNQIhmnIQgCQCAZQgODQgBSDQAgCCAIKAIAIgNBAWo2AgAgA0F/TA0OCyAZQiiIpyESIBlCIIinIQ1BBSETCwsgBCgCdCEVIAQoAnAhFiACQcABaiAEQfwAahCqAiAELQCIASEXAkACQCAEKAJ4IgoNAEEAIQMMAQsQgCghAyAKKAIMIQsgCigCECEMIAJB4ABqIAoQ1QwgA0EQaiAMNgIAIAMgAikCYDcCACACIAs2AmwgA0EIaiACQeAAakEIaikCADcCAAsgAkEYaiAEQZABahCYCkEGIQoCQCAELQA8QQZGDQAgBCgCDCEMIAQoAgghCyACQeAAaiAEQRBqEKMGIAJBKGpBKGogAkHgAGpBKGooAgA2AgAgAkEoakEgaiACQeAAakEgaikDADcDACACQShqQRhqIAJB4ABqQRhqKQMANwMAIAJBKGpBEGogAkHgAGpBEGopAwA3AwAgAkEoakEIaiACQeAAakEIaikDADcDACACQSZqIAJBjwFqLQAAOgAAIAIgAikDYDcDKCACIAIvAI0BOwEkIAItAIwBIQoLIAJB7wBqIgQgAkEYakEIaigCADYAACACIAIpAhg3AGcgASAMNgIMIAEgCzYCCCABIAc2AgQgASAJNgIAIAEgAikDKDcDECABQRhqIAJBKGpBCGopAwA3AwAgAUEgaiACQThqKQMANwMAIAFBKGogAkEoakEYaikDADcDACABQTBqIAJBKGpBIGopAwA3AwAgAUE4aiACQShqQShqKAIANgIAIAEgCjoAPCABIBM6AGwgASAUNgJoIAEgDzYCZCABIA42AmAgASARNgJcIAEgEDYCWCABIBJBCHQgDUH/AXFyrUIghiAIrYQ3A1AgASAFNgJMIAEgBjYCSCABIBg3A0AgASACLwEkOwA9IAFBP2ogAkEkakECai0AADoAACABIAIvAVg7AG0gAUHvAGogAkHYAGpBAmotAAA6AAAgASADNgJ4IAEgFTYCdCABIBY2AnAgAUGEAWogAkHAAWpBCGooAgA2AgAgASACKQLAATcCfCABIBc6AIgBIAFBmAFqIAQoAAA2AAAgAUGRAWogAkHgAGpBCGopAAA3AAAgASACKQBgNwCJASAAQSc2AgAgACABNgIEDBMLIAEoAhAhBCABKQIUIRggASgCHCEDIAJB4ABqIAFBBGoQmAogAkH4AGoiCiADNgIAIABBFGogGDcCACAAQSg2AgAgACACKQJgNwIEIABBJGogASgCJDYCACACIAQ2AmwgAEEMaiACQegAaikCADcCACACIAEoAiA2AnwgAEEcaiAKKQIANwIADBILIAEpAgwhGBD6JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACABKAIIIQMQ/CchASACQeAAaiADEHYCQEHgAEUNACABIAJB4ABqQeAA/AoAAAsgACAYNwIMIAAgATYCCCAAIAQ2AgQgAEEpNgIADBELIAEpAwghGBD6JyEEIAJB4ABqIAEoAgQQQiAEQThqIAJB4ABqQThqKQMANwMAIARBMGogAkHgAGpBMGopAwA3AwAgBEEoaiACQeAAakEoaikDADcDACAEQSBqIAJB4ABqQSBqKQMANwMAIARBGGogAkHgAGpBGGopAwA3AwAgBEEQaiACQeAAakEQaikDADcDACAEQQhqIAJB4ABqQQhqKQMANwMAIAQgAikDYDcDACAAIBg3AwggACAENgIEIABBKjYCAAwQCyABKQMIIRgQ+ichBCACQeAAaiABKAIEEEIgBEE4aiACQeAAakE4aikDADcDACAEQTBqIAJB4ABqQTBqKQMANwMAIARBKGogAkHgAGpBKGopAwA3AwAgBEEgaiACQeAAakEgaikDADcDACAEQRhqIAJB4ABqQRhqKQMANwMAIARBEGogAkHgAGpBEGopAwA3AwAgBEEIaiACQeAAakEIaikDADcDACAEIAIpA2A3AwAgACAYNwMIIAAgBDYCBCAAQSs2AgAMDwsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAEoAgghAxD8JyEBIAJB4ABqIAMQdgJAQeAARQ0AIAEgAkHgAGpB4AD8CgAACyAAIBg3AgwgACABNgIIIAAgBDYCBCAAQSw2AgAMDgsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGoiCikDADcDACAEIAIpA2A3AwAgASgCCCEDEIAoIQEgAygCDCELIAMoAhAhDCACQeAAaiADENUMIAFBEGogDDYCACABIAIpAmA3AgAgAiALNgJsIAFBCGogCikCADcCACAAIBg3AgwgACABNgIIIAAgBDYCBCAAQS02AgAMDQsgASkCDCEYEPonIQQgAkHgAGogASgCBBBCIARBOGogAkHgAGpBOGopAwA3AwAgBEEwaiACQeAAakEwaikDADcDACAEQShqIAJB4ABqQShqKQMANwMAIARBIGogAkHgAGpBIGopAwA3AwAgBEEYaiACQeAAakEYaikDADcDACAEQRBqIAJB4ABqQRBqKQMANwMAIARBCGogAkHgAGpBCGopAwA3AwAgBCACKQNgNwMAIAEoAgghAxD8JyEBIAJB4ABqIAMQdgJAQeAARQ0AIAEgAkHgAGpB4AD8CgAACyAAIBg3AgwgACABNgIIIAAgBDYCBCAAQS42AgAMDAsgASgCFCEEIAEoAhAhAwJAIAEpAwgiGEIDg0IAUg0AIBinIgEgASgCACIBQQFqNgIAIAFBf0wNBAsgACAENgIUIAAgAzYCECAAIBg3AwggAEEvNgIADAsLIAEtABAhDCABKAIMIQ0gASgCCCEIEP0nIQRBAyELAkACQCABKAIEIgMoAgBBA0cNACADKAIcIQcgAygCGCEJIAMoAhQhBRD6JyEKIAJB4ABqIAMoAhAQQiAKQThqIAJB4ABqQThqKQMANwMAIApBMGogAkHgAGpBMGopAwA3AwAgCkEoaiACQeAAakEoaikDADcDACAKQSBqIAJB4ABqQSBqKQMANwMAIApBGGogAkHgAGpBGGopAwA3AwAgCkEQaiACQeAAakEQaikDADcDACAKQQhqIAJB4ABqQQhqIgYpAwA3AwAgCiACKQNgNwMAIAJB0AFqIANBBGoQuggCQCADKAIgIgMNAEEAIQEMAgsQgCghASADKAIMIQ4gAygCECEPIAJB4ABqIAMQ1QwgAUEQaiAPNgIAIAEgAikCYDcCACACIA42AmwgAUEIaiAGKQIANwIADAELIAMoAhwhByADKAIYIQkQ+ichASACQeAAaiADKAIgEEIgAUE4aiACQeAAakE4aikDADcDACABQTBqIAJB4ABqQTBqKQMANwMAIAFBKGogAkHgAGpBKGopAwA3AwAgAUEgaiACQeAAakEgaikDADcDACABQRhqIAJB4ABqQRhqKQMANwMAIAFBEGogAkHgAGpBEGopAwA3AwAgAUEIaiACQeAAakEIaikDADcDACABIAIpA2A3AwAgAkHgAGogAxD7ByACQdABakEIaiACQewAaigCADYCACACIAIpAmQ3A9ABIAIoAmAhCyACKAJwIQogAigCdCEFCyAEIAs2AgAgBCACKQPQATcCBCAEIAE2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IAJBADYCoAQgAkIANwKwBCACQgA3ApgEIAJCgICAgMAANwKQBCACQaQDakIANwIAIAJCADcCnAMgAkEXNgKAAyACQZAEahDpHkEAQQQQmy0CQCAqQgBSDQAgFiAWKAIAIgZBAWo2AgAgBkF/TA0DCyACQYADahDUECEFQQAtAKDxngEaQTgQfSIGRQ0CIAZBADoANCAGIAU2AjAgBkIANwMoIAZBADYCICAGQQA6ABwgBiATNgIYIAZCADcCECAGICk3AgggBkEANgIAQQBBCBCjLUEALQCg8Z4BGkEcEH0iAEUNAiAAQgA3AgwgAEEBNgIIIAAgBjYCBCAAQQE2AgAgAEECOgAZIABBEWpCADcAACACQfIBaiACQZAEakEIaikCADcBACACQegBakESaiACQZAEakEQaigCADYBACACQZACakEIaiACQYADakEIaikCADcDACACQZACakEQaiIQIAJBgANqQRBqKQIANwMAIAJBkAJqQRhqIhEgAkGAA2pBGGopAgA3AwAgAiACKQKQBDcB6gEgAiACKQKAAzcDkAIgASgCHCELAkACQCABKAIgIg8NAEEAIQUMAQsgCyAPQThsaiEMQQAhBSALIQYDQCAGKAIAQQlHDQEgBkEIaigCAEESRw0BIAZBDGooAgAiCCgCAEEbRw0BIAgoAggNASAFQQFqIQUgBkE4aiIGIAxHDQALIA8hBQsgAiAFIAUgD0G8r5sBENsfIAJBogNqQgA3AQAgASACKAIAIgU2AiAgAkGyA2ogAkHoAWpBCGopAQA3AQAgAkGAA2pBOGogAkH2AWopAQA3AQAgAiAONgKABCACQgA3ApwDIAIgBDYCmAMgAkEBNgKUAyACIAc2ApADIAJCgICAgBA3A4gDIAJCgICAgCA3A4ADIAIgAigCBCIGNgKEBCACIAIpAegBNwGqAyACIA8gBmsiBzYCiAQgAiALIAZBOGxqNgL8AyACIAsgBUE4bGoiCDYC+AMgAkHgA2ogAkGQAmpBCGopAwA3AwAgAkHoA2ogECkDADcDACACQfADaiARKQMANwMAIAIgADYC1AMgAkECNgLQAyACQRE2AsgDIAJBCTYCwAMgAiACKQOQAjcD2AMCQCAFIAZGDQAgBkE4bCAFQThsayEAIAJBkARqQQhqIREgAkGQBGpBBHIiB0EwaiEMIAdBKGoh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BAwUCyAIIAJB5ANqEKcNIAJB5ANqEI0LGiACQQA6AJAFDBILIAggAkHkA2oQpw0gAkHkA2oQjQsaIAJBAToAkAUMEQsgAkHwBGogAkHkA2oQhAEgAigC9AQhASACKALwBCITQSJGDREgAkGwA2pBCGogBEEIaikCACI+NwMAIAJB0ARqQQhqID43AwAgAiAEKQIAIj43A7ADIAIgPjcD0AQgAigCmAUhCyACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEFIAIoAvwEISIgAigC+AQhHiACKAKsBSEMDAwLAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQ1AUgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQcgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDA4LAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQgQMgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQYgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDA0LAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkHwBGogAkHkA2ogAkHAA2oQ0gYgAikCkAUhPiACKQKIBSE/IAIoAoQFIQcgAigCgAUhBSACKAL8BCEDIAIoAvgEIQYgAigC9AQhASACKALwBCITQSJGDQUgAkHQBGpBCGogBEEIaikCADcDACACIAQpAgA3A9AEDAwLAkBBJEUNACACQcADaiACQdwCakEk/AoAAAsgAkEDNgKwAiACQfAEaiACQeQDaiACQcADaiACQbACahC4BCACKQKQBSE+IAIpAogFIT8gAigChAUhByACKAKABSEFIAIoAvwEIQMgAigC+AQhBiACKAL0BCEBIAIoAvAEIhNBIkYNBCACQdAEakEIaiAEQQhqKQIANwMAIAIgBCkCADcD0AQMCwsCQEEkRQ0AIAJBwANqIAJB3AJqQST8CgAACyACQQQ2ArACIAJB8ARqIAJB5ANqIAJBwANqIAJBsAJq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CyADQWhqIQMgEyEBDAELCyABQX9qIQELIAIgATYC8AIMBgsgCiACKQPAAzcCACAKQRBqIAJBwANqQRBqKAIANgIAIApBCGogAkHAA2pBCGopAwA3AgAgAiA+NwLMASACIAM2AsgBIAIgBTYCxAEgAiABNgLAAQwGCyACIAE2AvACIAIoAuQDIQEgBCEGIAghAwwACwsgBkEIaigCACIBDQUMAgtBACEDQQAhAQwGCyAGQQhqKAIAIgFFDQAgAUF/aiEDIAZBBGooAgAiBkEIaiETQQIhAQwFCyACQfAEaiACQeQDaiAFKAIAIBooAgAQWQJAAkAgAigC8AQiAUGAgICAeEYNAEEkRQ0CDAELIAIoAuACIAIoAuQCIgFBFGxqQWxqIQMCQAJAAkADQAJAAkACQAJAIAENAEEAIQEMAQsCQCADQQRqIhgoAgAiBkEERg0AIAFBf2ohEyADKAIAIQUgByADQQhqKQIANwIAIAdBCGogA0EQaigCADYCACACIAY2AoAEIAJBkARqIAJBgARqENMOIAIoApAEQQRGDQMgAkGgBGpBCGogAkGQBGpBCGoiGikCADcDACACIBM2AuQCIAIgAikCkAQiPjcDoAQgPqdBA0YNAgwHCyABQX9qIQELIAIgATYC5AIgAigC5AMiASgCACIDQf////8HTw0EIAEgA0EBajYCACACIAEoAgwiBTYC0AQCQCAFQQFHDQAgASADNgIAIAJB8ARqIAEQsg8gAigC8ARBEEcNBEGA4IQBENIsAAsgAkEANgLwBEEAIAJB0ARqQfDRmwEgAkHwBGpBkOCEARCVIQALIAIoAuQDIQYgAkEPNgLwBCAGIAJB8ARqENoeDAQLIAJB8ARqIAJB5ANqIAUoAgAgBUEEaigCABBZAkAgAigC8AQiAUGAgICAeEYNACACIBM2AuQCQSQNBQwGCyADQWxqIQMgEyEBDAALCyACQcADakEYaiACQfAEakEYaigCADYCACACQcADakEQaiACQfAEakEQaikCADcDACACQcADakEIaiACQfAEakEIaikCADcDACACIAIpAvAENwPAAyAJIAJBwANqELgMQQEhA0GAgICAeCEBDAQLQfDfhAEQ0xoACyACQaAEahDtISEGIAMgBTYCACAYIAIpApAENwIAIBhBCGogGikCADcCAAwGCyAJICBBJPwKAAALQQAhAwsgAkHcAmoQ9iUgAigCxAEhHgJAIANFDQAgAigC3AEhBSACKALYASEGIAIoAtQBIRMgAigC0AEhGCACKALMASEaIAIoAsgBIQQgAigCyAIgAigCzAIQ/xEgAigCxAIgAigCyAIQ9iwCQCACKAK8ASIDIAIoArQBRw0AIAJBtAFqQfjxgwEQjRwLIAIoArgBIANBHGxqIgEgBTYCGCABIAY2AhQgASATNgIQIAEgGDYCDCABIBo2AgggASAENgIEIAEgHjYCACACIANBAWo2ArwBDAcLIAJBOGpBCGogAkGwAmpBCGopAgA3AwAgAiACKQKwAjcDOCACKALkASELIAIpAtwBIT4gAikC1AEhPyACKALQASEHIAIoAswBIQUgAigCyAEhIiACKALIAiACKALMAhD/ESACKALEAiACKALIAhD2LEEAIQNBIiETDAkLIAFBf2ohAyAGQQRqKAIAIgZBCGohE0EDIQEMAQtBASEBQQAhAwsgAiAGNgL0AyACIAE2AvADIAIgA61CIIYgE62ENwL4AyACQfADahDtISEGAkAgAigC5AIiASACKALcAkcNACACQdwCakGUgIgBEI4cCyACKALgAiABQRRsaiIDIAU2AgAgAyACKQLwAzcCBCADQQxqIAJB8ANqQQhqKQIANwIAIAFBAWohAQsgAiABNgLkAiACKALkAyEBIAYhBQwACwsLIAItAIgBISMgAi0AhwEhJyACLQCGASEoIAIoArwBIQYgAigCuAEhAQJAAkAgAi0AgAEiHUEDRg0AIB1BAkYNACACKAJ0Ih8gHygCACIDQQFqNgIAIANBf0wNAiACKAJ8ISkgAigCeCEqDAELCyACLQCFASErIAItAIQBISwgAi0AjQEhLSACLQCMASEuIAItAIsBIS8gAigCcCEwIAIoAmwhMSACKAJoITIgAigCZCEzIAItAIoBITQgAi0AiQEhNSACKAJQITYgAigCTCE3IAIoAmAhOCACKAJcITkgAigCWCE6IAIoAlQhOyACLQCOASE8QQAhGyACQfAEaiAGQQBBBEEEEKgMIAIoAvQEIT0CQCACKALwBEEBRg0AIAIoAvgEIRECQCAGRQ0AIBEhAyAGIQUDQCADIAE2AgAgA0EEaiEDIAFBHGohASAFQX9qIgUNAAsgBiEbC0EAIQUgAkEANgLsBCAC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5AIgAiADNgLgAiACIAU2AtwCIAIgAkGgBWo2AugCIAJB5AJqIRMgAkGAA2ogAkHcAmoQ2wcCQCAFIAMQzCINACACQQA2AtABIAJBATYCxAEgAkGU/IcBNgLAASACQgQ3AsgBIAJBOGogAkHAAWoQvCkNBCACQcABaiACQdwCahDbByACQcADaiACQcABahC1BCACQcABahDOGCACQQE2AsQBIAJBnL+cATYCwAEgAkIBNwLMASACQQQ2AtQEIAIgAkHQBGo2AsgBIAIgAkHAA2o2AtAEAkAgAkE4aiACQcABahC8KQ0AIAJBATYCxAEgAkGk/IcBNgLAASACQgE3AswBIAJB9QA2AtQEIAIgEzYC0AQgAiACQdAEajYCyAEgAkE4aiACQcABahC8KQ0AIAJBwANqEPgsDAcLIAJBwANqEPgsDAQLIAJBsAJqQf4AQc8AEKAVIAJBADYC0AEgAkEBNgLEASACQZT8hwE2AsABIAJCBDcCyAEgAkE4aiACQcABahC8KUUNAQwCCyACQcABakEIaiIBQQA2AgAgAkKAgICAEDcCwAEgAkHAAWpB0MWDAUHixYMBEMMgIBhBCGogASgCADYCACAYIAIpAsABNwIADAwLIAJBAjYCxAEgAkGQ/YcBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQbACajYCwAMgAkE4aiACQcABahC8KQ0AIAJBgARqIAJBgANqELUEIAJBATYCxAEgAkGcv5wBNgLAASACQgE3AswBIAJBBDYCxAMgAiACQcADajYCyAEgAiACQYAEajYCwAMCQCACQThqIAJBwAFqELwpDQAgAkECNgLEASACQZD9hwE2AsABIAJCATcCzAEgAkEENgLEAyACIAJBwANqNgLIASACIAJBsAJqNgLAAyACQThqIAJBwAFqELwpDQACQCACKAKUAyIBRQ0AIAJBADYCqAQgAkKAgICAwAA3AqAEIAFBGGwhAyACKAKQAyIFQRBqIQECQANAIANFDQEgAkEFNgLEAyACQcD9hwE2AsADIAJCBDcCzAMgAkELNgLMASACQQs2AsQBIAUoAhQhBiACQQs2AtwBIAJBCzYC1AEgAiABNgLQASACIAFBeGo2AsgBIAIgAUF0ajYCwAEgAiAGQX9qNgLkAyADQWhqIQMgBUEYaiEFIAFB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IAJB+YCAgHg2ArACIAEgFSAKIAJBsAJqEN4jQQEhE0EBIQkMCAsQ4iAhJSACQfqAgIB4NgKwAiACICU3A7gCIAEgFSAKIAJBsAJqEN4jQQEhCQwHCwJAIBRBAXENAEEBIRQgCUEBcSEEQQAhCSAERQ0HEOMgISUgAhDkIDcDwAIgAiAlNwO4AiACQfmAgIB4NgKwAiABIBUgCiACQbACahDeI0EBIQlBASEUDAcLEOUgISUgAkH6gICAeDYCsAIgAiAlNwO4AiABIBUgCiACQbACahDeI0EBIRQMBgsgAkGwAmogASADIBNBAEcgD0EBcRDaAiACKAK0AiEEAkAgAigCsAIiEUGBgICAeEcNACAAQQ02AgAgACAENgIEDAkLIAJB4ANqQRBqIhIgAkHIAmooAgA2AgAgAkHoA2oiDSACQbACakEQaikCADcDACACIAIpArgCNwPgAyARQYCAgIB4Rg0HIAAgAikD4AM3AgwgACAENgIIIAAgETYCBCAAQQk2AgAgAEEcaiASKAIANgIAIABBFGogDSkDADcCAAwICwJAIAZBAXFFDQAgAkGagYCAeDYCsAIgASAVIAogAkGwAmoQ3iMLAkAgDkUNACACQZqBgIB4NgKwAiABIAwgECACQbACahDeIwsgARChCwwBCwJAIAhFDQAgAkGagYCAeDYCsAIgASADIAsgAkGwAmoQ3iMLIAdB/wFxQQNGDQAgASgC3AEhBCABKALYASEFIAJBmoGAgHg2ArACIAEgBSAEIAJBsAJqEN4jCyAAIAEgAxD2DQwFCyAAQQ02AgAgACAENgIEDAQLQQEhEwsgAS8BkAEhBEEBIQYMAAsLAkACQAJAAkAgAS0A4AEiBEEPRg0AAkAgE0UNACAEQXdqDgMCAAIACyACQbACaiABEIAKIAIoArQCIQQCQCACKAKwAiIRQQZHDQAgAEENNgIAIAAgBDYCBAwFCyACQZACakEYaiACQbACakEYaikDADcDACACQZACakEQaiACQbACakEQaikDADcDACACIAIpA7gCNwOYAiACIAQ2ApQCIAIgETYCkAIgEUUhEQwDCyABEKELIAJBsAJqIAEQgAogAigCtAIhBCACKAKwAiIFQQZGDQEgAkG4A2pBEGogAkGwAmpBGGopAwAiJTcDACACQcADaiACQbACakEQaikDACImNwMAIAJB4ANqQRBqICY3AwAgAkHgA2pBGGogJTcDACACIAIpA7gCIiU3A7gDIAIgBDYC5AMgAiAFNgLgAyACICU3A+gDAkAgE0UNACABKALUASEGIAJB44CAgHg2ArACIAEgAyAGIAJBsAJqEN4jCwJAIAJB4ANqEOUVRQ0AIAEoAtQBIQYgAkHkgICAeDYCsAIgASADIAYgAkGwAmoQ3iMLIAJB3AJqIAJB+AFqQQhqKAIANgIAIAJBsAJqQRBqIAJBuANqQQhqKQMANwMAIAJByAJqIAJBuANqQRBqKQMANwMAIAIgAikD+AE3AtQCIAIgBzoA7AIgAiADNgLQAiACQQA6AO8CIAIgEDYC6AIgAiAMNgLkAiACIA42AuACIAIgBDYCtAIgAiAFNgKwAiACIAIpA7gDNwO4AiACIBRBAXE6AO4CIAIgCUEBcToA8AIgAkGAAjsA8QIgAkEAOgDtAiAAIAEgAkGwAmoQngQMBQsQ5iAhJSACIBY2AqQCIAIgFzYCoAIgAiAlNwOYAiACQQA2ApACQQEhEQwBCyAAQQ02AgAgACAENgIEDAELAkAgAS0AkQFBBXYgAS0A4AEiBEH/AXFBCkZxIg1FDQAgARChCyABLQDgASEECwJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQf8BcUUNAAJAIAEtAJEBQSBxRQ0AIARB/wFxIhJBEkYNASASQT5GDQELAkACQCARRQ0AIAEtAOEBIRUCQCACQZgCaiIGQaC6nAFBAxCEIg0AIAZBo7qcAUEDEIQiRQ0BC0EAIQogAUEAEMkRIARB/wFxQQ9GIBVxckEBcUUNAQtBACEGQQEhCiABQQEQyRENAgsgAigCkAINBiACQZgCakGmupwBQQUQhCJFDQYgAS0A4QENBiABLQCRAUEgcUUNBUEBIQUgAkGwAmogAUGsuJwBQQFBABDCBCACKAK0AiEEAkAgAigCsAJFDQAgAEENNgIAIAAgBDYCBAwJCyAERQ0FIAEoAtQBIQQgASgC0AEhBRDnICElIAJC0cLNy+ftGDcDwAIgAiAlNwO4AiACQfmAgIB4NgKwAiABIAUgBCACQbACahDeI0EBIQkMBQsCQCAIRQ0AIAJB+4CAgHg2ArACIAEgAyALIAJBsAJqEN4jCwJAIBMNAAJAIAJBkAJqEOUVDQAgAkHcAmogAkH4AWpBCGoiBCgCADYCACACQbACakEIaiACQZACakEIaikDADcDACACQbACakEQaiACQZACakEQaikDADcDACACQbACakEYaiACQZACakEYaikDADcDACACIAIpA/gBNwLUAiACIAIpA5ACNwOwAiACIAc6AOwCIAIgAzYC0AIgAiANOgDvAiACIBA2AugCIAIgDDYC5AIgAiAONgLgAiACIBRBAXEiBjoA7gIgAiAJQQFxIgk6APACIAJBADsA8QIgAkEAOgDtAiACIAM2ArgDIAJB4ANqQQhqIAQoAgA2AgAgAiACKQP4ATcD4AMgAkEAOgDABCACQQA6AIgDIAEoAogBIQQgAiACQYgDajYC9AMgAiACQcAEajYC8AMgAiACQbgDajYC7AMCQAJAIARBgICAEHENACABIARBgICAEHI2AogBIAJBMGogAkHgA2ogARCVDiACKAIwIQMgASABKAKIAUH///9vcTYCiAEgAigCNCEEDAELIAJBOGogAkHgA2ogARCVDiACKAI8IQQgAigCOCEDCwJAIANBAXFFDQAgAEENNgIAIAAgBDYCBCACQbACahCPJwwQCwJAAkAgAigCsAJBBUYNACABKALUASEDIAIoArgDIQogFEEBcQ0BDAcLIAEoAtQBIRQgAkGwAmpBCGohAyACKAK4AyEKIAIoAsQCIRUCQCAHQf8BcUEDRg0AIAJBtYGAgHg2AuADIAEgCiAVIAogFUkbIAogFSAKIBVLGyACQeADahDeIwsgAkHgA2pBDGogA0EIaigCADYCACAAQQY2AgAgACAJOgApIAAgDToAKCAAIAY6ACcgAEEAOgAlIAAgBzoAJCAAIAQ2AiAgACAUNgIcIAAgCjYCGCAAIBU2AhQgACAFQf8BcUGUAUY6ACYgAiADKQIANwLkAyAAIAIpAuADNwIEIABBDGogAkHgA2pBCGopAgA3AgAMEAsgBCgCGEGAgICAeEYNBSACQaGBgIB4NgLgAyABIAogAyACQeADahDeIwwFCyABLwGQAUGAwABxIgVBDXYgCXFFDQMgASgC1AEhBBDoICElIAJBgoGAgHg2ArACIAIgJTcDuAIgASADIAQgAkGwAmoQ3iMgAS8BkAFBgMAAcSEFDAMLIAEoAtQBIQQgAkHjgICAeDYCsAIgAyAEIAJBsAJqEOAaIQQgAS0A4AFBogFHDQEgASABEJosEKcXDAELIAJBsAJqQRhqIAJBkAJqQRhqKQMANwMAIAJBsAJqQRBqIAJBkAJqQRBqKQMANwMAIAJBsAJqQQhqIAJBkAJqQQhqKQMANwMAIAIgAikDkAI3A7ACIAAgASADIAJB+AFqIAcgAkGwAmogD0EBcSACQYQCaiANIBNBAEcgCCAUQQFxIAlBAXEQgQUMDAsgAEENNgIAIAAgBDYCBAwECyABLQDgASEEAkAgBUUNACAEQf8BcUESRw0AIAEoAtgBIQUCQAJAAkACQCABENgJIgRFDQAgBC0AAEESRg0BC0EBIQUgAkEoaiABQQBBARCpGiACKAIsIQkgAigCKEEBcUUNASAAQQ02AgAgACAJNgIEDAgLIAEQoQsgASgC2AEhBCABEKELIAEoAtQBIQkgAkGFgYCAeDYCsAIgASAFIAkgAkGwAmoQ3iMgASgC1AEhBSACQYOBgIB4NgKwAiABIAQgBSACQbACahDeIwwBCyAJRQ0AIAkoAgQiEyAJKAIIQTBsIghqIQUgCSgCACEPQQAhBCACQdsCaiIRQQRqIRIgEyELAkADQAJAIAggBEcNACAFIQQMAgsCQCALLQAqIhZBAkYNAAJAQSpFDQAgAkGwAmogC0Eq/AoAAAsgESALKAArNgAAIBIgC0Evai0AADoAACACIBY6ANoCIAIoArACIRYgAigCtAIhFyACQYOBgIB4NgLgAyABIBYgFyACQeADahDeIyAEQTBqIQQgAkGwAmoQ0ycgC0EwaiELDAELCyATIARqQTBqIQQLIAUgBGtBMG4hBQJAA0AgBUUNASAFQX9qIQUgBBC1JyAEQTBqIQQMAAsLIA8gExCeLSAJEJkvCyABLQDgASEECwJAAkACQCAEQf8BcUUNACABKALcASEEIAEoAtgBIQMgAkG4A2ogARDUJkEBIQUgAkEBNgK0AiACQZy/nAE2ArACIAJCATcCvAIgAkGzBzYCjAMgAkEAOgCgBCACIAJBiANqNgK4AiACIAJBwARqNgKIAyACIAJBoARqNgLABCACQeADaiACQbACahCSECACQfQDaiACQcADaigCADYCACACIAIpArgDNwLsAyADIAQgAkHgA2oQ4BohBCABLQDgAUGiAUYNAQwCCyABEKELIAJBADYCqAMgAkKAgICAgAE3AqADIAJBsAJqQTBqIRggAkGwAmpBHWohGSACQeADakEdaiEXIAJB4ANqQTBqIRYgAkG4A2pBCGohCSACQeADakEIaiETQQAhC0EAIQUCQAJAA0ACQAJAAkACQCABLQDgAUEBRg0AAkAgBUH+/3tLDQAgBSALckUNACACQfeAgIB4NgLgAyABIAUgCyACQeADahDeIwsgASgC2AEhDyACQeADaiABQQAQ9wEgAigC5AMhBCACKALgAyIIQYCAgIB4Rg0FIAIgAigC6AM2ArQDIAIgBDYCsAMgAiAINgKsAwJAIAEtAOABIghBHEYNACACQcAEakEIaiACQawDakEIaiIaKAIANgIAIAIgAikCrAM3A8AEAkACQAJAAkACQAJAAkAgAS0AkQFBIHFFDQAgAkHgA2ogARCeDAJAIAItAOADRQ0AIAIoAuQDIQQMCwsgAi0A4QMhESACQeADaiABQay4nAFBAUEAEMIEIAIoAuQDIRsCQCACKALgA0UNACAbIQQMCwsgAkHgA2ogAUG8uJwBQQFBABDCBCACKALkAyEEIAIoAuADQQFGDQogEUH/AXFBA0cgG0EARyIcIARBAEciEnNyIR0CQCAbDQAgHUUNAQsgAkHgA2ogARDhAiACKALkAyEEIAIoAuADIh5BB0YNCiACIBcpAAA3A+AEIAIgF0EHaigAADYA5wQgAi0A/AMhHyACKAL4AyEgIAIoAvQDISEgAikC7AMhJiACKALoAyEbIB4OBQEFBQUCBQsgAkHgA2ogARDhAiACKALkAyEiIAIoAuADIgRBB0YNBSACQaAEakEIaiAaKAIANgIAIAIgFykAADcDsAQgAiAXQQdqKAAANgC3BCACIAIpAqwDNwOgBCACLQD8AyEfIAIoAvgDISAgAikD8AMhJSACKALsAyEeIAIoAugDIRsgASgC1AEhGiAjIRIgJCERDAMLIAIgAigA5wQ2ANcEIAIgAikD4AQ3A9AEICGtQiCGICZCIIiEISUgJqchHgwBC0ECIR8gGyEeIAQhGyAmISULIBwgHUEBc3IhISACQaAEakEIaiAaKAIANgIAIAIgAikCrAM3A6AEIAIgAikD0AQ3A7AEIAIgAigA1wQ2ALcEIAEoAtQBIRpBByEEIBIhIyARISQLIBkgAikDsAQ3AAAgGUEHaiACKAC3BDYAACAYIAIpA6AENwMAIBhBCGogAkGgBGpBCGooAgA2AgAgAiAfOgDMAiACICA2AsgCIAIgJTcDwAIgAiAeNgK8AiACIBs2ArgCIAIgGjYC3AIgAiAPNgLYAiACIBE6AO4CIAIgEjoA7QIgAiAhOgDsAiACICI2ArQCIAIgBDYCsAIgAkGgA2ogAkGwAmpBxLicARDzHgwGCyAXIAIpA+AENwAAIBdBB2ogAigA5wQ2AAAgAiAfOgD8AyACICA2AvgDIAIgITYC9AMgAiAmNwLsAyACIBs2AugDIAIgBDYC5AMgAiAeNgLgAyACQRhqIAJB4ANqEK4PIAIoAhwhBCACKAIYIQMgAkHcgICAeDYCuAMgAyAEIAJBuANqEOAaIQQgAS0A4AFBogFHDQMgASABEJosEKcXDAMLICIhBAwDCyABKALYASEFIAEQoQsgASgC1AEhEiACQeADaiABQQAQ0QIgAigC5AMhBAJAIAIoAuADIgtBB0YNACAJIBMpAwA3AwAgCUEYaiATQRhqKQMANwMAIAlBEGogE0EQaikDADcDACAJQQhqIBNBCGopAwA3AwAgAiAENgK8AyACIAs2ArgDQQAhBAJAAkAgAS0AkQFBIHFFDQAgAS0A4AFB/wFxQQlHDQAgAkEgaiABQQEgASgC2AEQgRMgAigCJCEEIAIoAiBBAXENAQsgASgC1AEhC0EoELArIRECQEEoRQ0AIBEgAkG4A2pBKPwKAAALIBYgAikCrAM3AgAgFkEIaiACQawDakEIaigCADYCACACIA82AogEIAIgBDYC+AMgAiASNgL0AyACIAU2AvADIAIgCzYC7AMgAiAFNgLoAyACIBE2AuQDIAJBAjYC4AMgAiABKALUATYCjAQgAkGgA2ogAkHgA2pB1LicARDzHgwFCyACQbgDahDpFQsgAkGsA2oQlCgMBQsgAigCpAMhBCACKAKgAyIFQYCAgIB4Rg0FIAIgAigCqAMiCDYCkAMgAiAENgKMAyACIAU2AogDAkACQAJAAkACQCABLQDgAUEBRg0AIAEoAtwBIQQgASgC2AEhAyACQbgDaiABENQmIAJBATYCtAIgAkGcv5wBNgKwAiACQgE3ArwCIAJBswc2AsQEIAJBAToArAMgAiACQcAEajYCuAIgAiACQaAEajYCwAQgAiACQawDajYCoAQgAkHgA2ogAkGwAmoQkhAgAkH0A2ogAkHAA2ooAgA2AgAgAiACKQK4AzcC7AMgAyAEIAJB4ANqEOAaIQQgAS0A4AFBogFGDQEMAwsgARChCyABLQCRAUEgcUUNASABLQDgAUH/AXFBCUcNASACQRBqIAFBASABKALYARCBEyACKAIUIQUCQCACKAIQQQFxRQ0AIABBDTYCACAAIAU2AgQMBAsgAiAFNgLgAyACQQhqIAUoAgAQtxAgAigCDCEFIAIoAgghCSACQZyBgIB4NgKwAiABIAkgBSACQbACahDeIyACQeADahCqKgwBCyABIAEQmiwQpxcMAQsgCEEGdCEFIAQhCQJAA0AgBUUNAQJAIAkoAgAiE0EHRg0AIBMNAgsgBUFAaiEFIAlBwABqIQkMAAsLIAJBsAJqIAFBAEEAIAVFEOMLIAIoArQCIRMCQAJAIAIoArACIg9BgYCAgHhGDQAgAkHoA2ogAkHAAmopAgA3AwAgAiACKQK4AjcD4AMgD0GAgICAeEciCw0BIAhBBnQhBSAEIQkDQCAFRQ0CAkAgCSgCAEEHRw0AIAlBLGooAgAhESAJQShqKAIAIRIgAkGogYCAeDYCsAIgASASIBEgAkGwAmoQ3iMLIAlBwABqIQkgBUFAaiEFDAALCyAAQQ02AgAgACATNgIEDAILAkAgCw0AIAEvAZABQYDAAHFFDQAgCEEGdCEFA0AgBUUNAUEQIQlBDCEIAkACQAJAIAQoAgBBfGoOBAECAgACCyAEQRxqLQAAQQJHDQFBFCEJQRAhCAsgBCAIaigCACEIIAQgCWooAgAhCSACQamBgIB4NgKwAiABIAggCSACQbACahDeIwsgBEHAAGohBCAFQUBqIQUMAAsLAkAgDkUNACACQYKBgIB4NgKwAiACQuHm0YvGrtoxNwO4AiABIAwgECACQbACahDeIwsCQCAGIBRxQQFxRQ0AIAJBnoGAgHg2ArACIAEgFSAKIAJBsAJqEN4jCwJAIAIoApACQQVGDQAgACACKQOQAjcDACAAIAIpAogDNwJAIABBCGogAkGQAmpBCGopAwA3AwAgAEEQaiACQZACakEQaikDADcDACAAQRhqIAJBkAJqQRhqKQMANwMAIABByABqIAJBiANqQQhqKAIANgIAIAEoAtQBIQEgACAHOgBRIAAgDToAUEEAIQUgAEEANgJMIAAgATYCPCAAIAM2AjggACATNgIkIAAgDzYCICACQgA3A8ACIAJCATcDuAIgAkIANwPoAiACQQA2ArACIAJCADcD+AIgAkKAgICAgAE3A/ACIAJBgICAgHg2AtACIAJBgAY7AYADIAAgAikD4AM3AiggAEEwaiACQeADakEIaikDADcCACACQbACahC8HSACQfACahDGKCACQdACahCoKgwPCyACQQE2ArQCIAJBkPKbATYCsAIgAkIANwK8AiACIAJBuANqNgK4AiACQbACakGY8psBEOkjAAsgAEENNgIAIAAgBDYCBAsgAkGIA2oQxigMCwsgAkHgA2oQ6RULIAJBwARqEJQoDAILIAEtAOABIgRBAUYNAAJAIARBB0YNACABKALcASEEIAEoAtgBIQMgAkGIA2ogARDUJiACQQE2AuQDIAJBnL+cATYC4AMgAkIBNwLsAyACQbMHNgLEBCACQQc6AOAEIAIgAkHABGo2AugDIAIgAkGgBGo2AsAEIAIgAkHgBGo2AqAEIAJBuANqIAJB4ANqEJMQIAJBzANqIAJBkANqKAIANgIAIAIgAikCiAM3AsQDIAMgBCACQbgDahDgGiEEIAEtAOABQaIBRw0CIAEgARCaLBCnFwwCCyABEKELIAhBHEcNACABLQDgAUH/AXFBAUcNACABKALUASEEIAEoAtABIQggAkG6gICAeDYC4AMgASAIIAQgAkHgA2oQ3iMMAAsLIAIoAqQDIgEgAigCqAMQmSUgAigCoAMgARCdLQsgAEENNgIAIAAgBDYCBAwFCyABIAEQmiwQpxcLIABBDTYCACAAIAQ2AgQMBAsgAEEFNgIAIAJB/ANqIAJByAJqKQMANwIAIAJB9ANqIAJBwAJqKQMANwIAIAJB7ANqIAJBuAJqKQMANwIAIAIgAikDsAI3AuQDAkBBJEUNACAAQQRqIAJB4ANqQST8CgAACyAAIAc6ADkgAEEAOgA4IAAgCToANyAAIA06ADYgACAGOgA1IAAgBUH/AXFBlAFGOgA0IAAgBDYCMCAAIAM2AiwgACAKNgIoDAkLAkAgAS0A4AEiBkEPRw0AIAEQoQsLIAJBsAJqIAEQgAogAigCtAIhBAJAIAIoArACIgVBBkcNACAAQQ02AgAgACAENgIEQQEhBAwFCyACQeADakEYaiACQbACakEYaikDADcDACACQeADakEQaiACQbACakEQaikDADcDACACIAIpA7gCNwPoAyACIAQ2AuQDIAIgBTYC4AMCQAJAAkACQCACQeADahDlFQ0AIBMNAUEBIQQCQCANDQBBACEEIAEtAJEBQSBxRQ0AIAEtAOABQf8BcUEKRw0AIAEQoQtBASEECyACQbACakEYaiACQeADakEYaikDADcDACACQbACakEQaiACQeADakEQaikDADcDACACQbACakEIaiACQeADakEIaikDADcDACACQdwCaiACQfgBakEIaigCADYCACACIAIpA+ADNwOwAiACIAIpA/gBNwLUAiACIAc6AOwCIAIgAzYC0AIgAiAEOgDvAiACIBA2AugCIAIgDDYC5AIgAiAONgLgAiACIBRBAXE6AO4CIAIgCUEBcToA8AIgAiAGQQ9GOgDyAiACQQE6APECQQAhBCACQQA6AO0CIAAgASACQbACahCeBAwICyACQYABaiACQeADahDWISACKAKEASEEIAIoAoABIQMgAkHegICAeDYCsAIgAyAEIAJBsAJqEOAaIQQgAS0A4AFBogFHDQIMAQsgASgC1AEhBCACQeOAgIB4NgKwAiADIAQgAkGwAmoQ4BohBCABLQDgAUGiAUcNAQsgASABEJosEKcXCyAAQQ02AgAgACAENgIEIAJB4ANqEI8nQQEhBAwECwJAAkACQCAKDQAgAkH4AGogAkGQAmoQ1iEgAiACKAJ8Igg2AsQEIAIgAigCeCIPNgLABCACQbACaiABEIAKIAIoArQCIQoCQCACKAKwAiIVQQZGIgRFDQAgAEENNgIAIAAgCjYCBAwHCyACQYgDakEQaiACQbACakEYaikDACIlNwMAIAJBkANqIAJBsAJqQRBqKQMAIiY3AwAgAkG4A2pBEGogJjcDACACQbgDakEYaiAlNwMAIAIgAikDuAIiJTcDiAMgAiAKNgK8AyACIBU2ArgDIAIgJTcDwAMCQCATRQ0AIAJBj4CAgHg2ArACIAEgDyAIIAJBsAJqEN4jCyACQbgDahDlFQ0BDAULIAJBsAJqQQRyIAEQ1CYgAkExNgLEAiACQYTxmwE2AsACIAJBsICAgHg2ArACIAEoAtgBIAEoAtwBIAJBsAJqEOAaIQQgAS0A4AFBogFHDQEgASABEJosEKcXDAELIAJB4oCAgHg2ArACIAEgDyAIIAJBsAJqEN4jDAMLIABBDTYCACAA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QSRqIANBN2oQrQUCQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0QCyAEKAIAQQdGDQEgA0HAAGogBCABEJEJIAMtAEBBBEYNAyADKQNAIhVC/wGDQgRSDQIMAwsgA0HAAGogASANIAxBkAogECASEI0CIAMtAEBBBEYNDSADKQNAIhVC/wGDQgRSDQ4MDQsgEygCACEQIANBwABqIAEgBEEoaigCACISQQAQiwICQAJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIANBwABqIAEgEiAQIARBNGooAgAgBEE4aigCABDYBQJAIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELAkACQAJAAkACQCAEQT5qLQAADgQAAQIEAAsgA0EANgJAIANBOGogASADQcAAakGRn5wBQQYQsw0gAy0AOEEERg0CIAMpAzgiFUL/AYNCBFENAgwECyADQQA2AkAgA0E4aiABIANBwABqQanzmwFBCRCzDSADLQA4QQRGDQEgAykDOCIVQv8Bg0IEUQ0BDAMLIANBADYCQCADQThqIAEgA0HAAGpBsvObAUEHELMNIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBwABqIAEQkhEgAy0AQEEERg0AIAMpA0AiFUL/AYNCBFINAQsCQCAEQTxqLQAARQ0AIANBADYCQCADQThqIAEgA0HAAGpBpLicAUEIELMNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsgA0HAAGogARCSESADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIARBPWotAABFDQAgA0EANgJAIANBOGogASADQcAAakG0uJwBQQgQsw0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQcAAaiABEJIRIAMtAEBBBEYNACADKQNAIhVC/wGDQgRSDQELIARBCGohEAJAAkAgBEEcai0AAEECRyIUDQAgBEEQaigCACESDAELIANBCGogEBC1GSADKAIIIRILIANBwABqIAEgEkEAEIsCAkACQCADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0BCwJAIBQNACADQcAAaiAQIAEQywYgAy0AQEEERg0EIAMpA0AiFUL/AYNCBFINAQwECyADQcAAaiAQIAEQpAogAy0AQEEERg0DIAMpA0AiFUL/AYNCBFENAwsgFUL/AYNCBFENAgsgFUL/AYNCBFENAQsgFUL/AYNCBFINDAsCQAJAIAMtADcNACADQQE6ADcMAQsgASgCREUNACADQcAAaiABIBMoAgBBABDwAyADLQBAQQRGDQAgAykDQCIVQv8Bg0IEUg0MC0EBIRAgC0EBaiELIARBwABqIQQgAy0AJEUNAAsgASABKAIsQX9qNgIsQQEhEAwACwsgA0EoaiABIAIoAiggAigCLCACKAI0IAIoAjgQ2AUCQAJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBKGogASACLQBIEPcJAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBERQ0AIANBADYCKCADQThqIAEgA0EoakGXn5wBQQYQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBFRQ0AIANBADYCKCADQThqIAEgA0EoakGdn5wBQQgQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCACLQBGRQ0AIANBADYCKCADQThqIAEgA0EoakGkuJwBQQgQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsgA0EANgJAIANBKGogASADQcAAakG9mZwBQQgQtg0CQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQShqIAEQlBECQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAAkACQCACQQhqIgQoAgBBBUYNACADQShqIAQgARCKBSADLQAoQQRGDQIgAykDKCIVQv8Bg0IEUg0BDAILIANBKGogAkEQaiABEIEJIAMtAChBBEYNASADKQMoIhVC/wGDQgRRDQELIBVC/wGDQgRSDQELAkAgAigCQEUNACADIAJBwABqNgI4AkAgAi0AR0UNACADQShqIAEgA0HAAGpBsZmcAUEBELcNIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQILIANBKGogASADQcAA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IAMpAygiFUL/AYNCBFINAQsgA0EoaiABIAJBCGoiEUEQQQggESgCACISQQJJG2ooAgBBABCLAgJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgBEUNACADQShqIAEgBBCSIyADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyACKAIwIhBBFGooAgBBDGwhBCAQQRBqKAIAIQsCQANAIARFDQEgA0EoaiALIAEQtgcCQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0DCyALQQxqIQsgBEF0aiEEDAALCyADQShqIAEgAi0AORD3CQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgAi0ANEUNACADQQA2AiggA0E4aiABIANBKGpBl5+cAUEGELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINAgsCQCACLQA4DQAgEC0ARQ0AAkAgEC0ARA0AQQEgEnRBFXENAQsgAS0ATQ0BIANBKGogARCUESADLQAoQQRGDQEgAykDKCIVQv8Bg0IEUQ0BDAILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADVFDQAgA0EANgIoIANBOGogASADQShqQZ2fnAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADdFDQAgA0EANgIoIANBOGogASADQShqQaS4nAFBCBC2DQJAIAMtADhBBEYNACADKQM4IhVC/wGDQgRSDQILIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAAkACQAJAAkACQAJAAkACQCACLQA4DgMCAAECCyADQQA2AiggA0E4aiABIANBKGpBoLqcAUEDELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINCQtBASASdEEVcQ0CIAEtAE0NAyADQShqIAEQlBEgAy0AKEEERg0DIAMpAygiFUL/AYNCBFENAwwICyADQQA2AiggA0E4aiABIANBKGpBo7qcAUEDELYNAkAgAy0AOEEERg0AIAMpAzgiFUL/AYNCBFINCAtBASASdEEVcQ0DIAEtAE0NBCADQShqIAEQlBEgAy0AKEEERg0EIAMpAygiFUL/AYNCBFENBAwHCyAQLQBFRQ0EIANBADYCKCADQThqIAEgA0EoakGmupwBQQUQtg0CQCADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0HCyADQShqIAEQlBEgAy0AKEEERg0EIAMpAygiFUL/AYNCBFENBAwGCyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINBQsgA0EoaiARIAEQigUgAy0AKEEERg0DIAMpAygiFUL/AYNCBFENAwwECyADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAwsgA0EoaiARIAEQigUgAy0AKEEERg0BIAMpAygiFUL/AYNCBFINAgwBCwJAIBAtAERFDQAgA0EANgIoIANBOGogASADQShqQd6rnAFBARC3DSADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0CCyADQShqIBEgARCKBSADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCwJAIAItADZFDQAgA0EANgIoIANBOGogASADQShqQaeZnAFBARC3DSADLQA4QQRGDQAgAykDOCIVQv8Bg0IEUg0BCwJAIBAoAjwiBEUNACADQShqIAQgARCGBSADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0BCyADQQA2AkAgA0EoaiABIANBwABqQd2rnAFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELIANBKGogASAQKAIwIBAoAjQgECgCBCAQKAIIEOMGAkAgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsgA0EoaiABIANBwABqQdyEngFBARC3DQJAIAMtAChBBEYNACADKQMoIhVC/wGDQgRSDQELAkAgECgCQEUNACADIBBBwABqNgI4IANBKGogASADQcAAakHgq5wBQQEQtw0CQCADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0CCwJAIAEtAE0NACADQShqIAEQlBEgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAgsgA0EoaiADQThqIAEQpiwgAy0AKEEERg0AIAMpAygiFUL/AYNCBFINAQsCQCAQKAIYQYCAgIB4Rg0AAkAgAS0ATQ0AIANBKGogARCUESADLQAoQQRGDQAgAykDKCIVQv8Bg0IEUg0C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LQAwQQRGDQIgAykDMCIPQv8Bg0IEUQ0CCyAPpyIEQf8BcUEERg0BCyAAIA9CgH6DIAStQv8Bg4Q3AgAMAQsgAyABEOEMIANBMGogAiADKAIEQQEQ8AMCQCADLQAwQQRGDQAgAykDMCIPQv8Bg0IEUQ0AIAAgDzcCAAwBCyAAQQQ6AAALIANB8ABqJAALyE8CFX8DfiMAQcABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAA4TAAECAwQFBgcICQoLDA0ODxAREgALIAEoAhghAyABKQMQIRcgAkE4aiABQQRqEL0KIABBADYCACAAIAIpAjg3AgQgAiAXNwJEIABBDGogAkHAAGopAgA3AgAgAiADNgJMIABBFGogAkHIAGopAgA3AgAMGAsgACABKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMFwsgACABKQMANwMAIABBKGogAUEoaikDADcDACAAQSBqIAFBIGopAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwAMFgsgASkCDCEXIAEoAgQhBBD6JyEDIAJBOGogBBBCIANBOGogAkE4akE4aikDADcDACADQTBqIAJBOGpBMGopAwA3AwAgA0EoaiACQThqQShqIgUpAwA3AwAgA0EgaiACQThqQSBqIgYpAwA3AwAgA0EYaiACQThqQRhqIgcpAwA3AwAgA0EQaiACQThqQRBqIggpAwA3AwAgA0EIaiACQThqQQhqIgkpAwA3AwAgAyACKQM4NwMAEIEoIQQgAkE4aiABKAIIEEwgBEEoaiAFKQMANwMAIARBIGogBikDADcDACAEQRhqIAcpAwA3AwAgBEEQaiAIKQMANwMAIARBCGogCSkDADcDACAEIAIpAzg3AwAgACAXNwIMIAAgBDYCCCAAIAM2AgQgAEEDNgIADBULIAEoAgghAyABKAIEIQQCQAJAIAEoAgwiBQ0AQQAhAQwBCxD6JyEBIAJBOGogBRBCIAFBOGogAkE4akE4aikDADcDACABQTBqIAJBOGpBMGopAwA3AwAgAUEoaiACQThqQShqKQMANwMAIAFBIGogAkE4akEgaikDADcDACABQRhqIAJBOGpBGGopAwA3AwAgAUEQaiACQThqQRBqKQMANwMAIAFBCGogAkE4akEIaikDADcDACABIAIpAzg3AwALIAAgATYCDCAAIAM2AgggACAENgIEIABBBDYCAAwUCyABKAIgIQQgASgCHCEFIAEoAhghBiABKAIMIQcgASgCCCEIAkAgASkDECIXQgODQgBSDQAgF6ciAyADKAIAIgNBAWo2AgAgA0F/TA0VCyABLQAkIQkQgSghAyACQThqIAEoAigQTCADQShqIAJBOGpBKGopAwA3AwAgA0EgaiACQThqQSBqKQMANwMAIANBGGogAkE4akEYaikDADcDACADQRBqIAJBOGpBEGopAwA3AwAgA0EIaiACQThqQQhqKQMANwMAIAMgAikDODcDACAAIAM2AiggACAJOgAkIAAgBDYCICAAIAU2AhwgACAGNgIYIAAgFzcDECAAIAc2AgwgACAINgIIIABBBTYCAAwTCyABKAIMIQMgASgCCCEEIAEtACQiBUECRw0MDA0LIAEoAgwhAyABKAIIIQQgAS0AJCIFQQJHDQ0MDgsgASgCECEKIAEoAgwhCyABKAIEIQQQ+ichAyACQThqIAQQQiADQThqIAJBOGpBOGopAwA3AwAgA0EwaiACQThqQTBqKQMANwMAIANBKGogAkE4akEoaiIFKQMANwMAIANBIGogAkE4akEgaiIGKQMANwMAIANBGGogAkE4akEYaiIHKQMANwMAIANBEGogAkE4akEQaiIIKQMANwMAIANBCGogAkE4akEIaiIJKQMANwMAIAMgAikDODcDABCBKCEEIAJBOGogASgCCBBMIARBKGogBSkDADcDACAEQSBqIAYpAwA3AwAgBEEYaiAHKQMANwMAIARBEGogCCkDADcDACAEQQhqIAkpAwA3AwAgBCACKQM4NwMAAkACQCABKAIUIgwNAEEAIQEMAQsQgSghASACQThqIAwQTCABQShqIAUpAwA3AwAgAUEgaiAGKQMANwMAIAFBGGogBykDADcDACABQRBqIAgpAwA3AwAgAUEIaiAJKQMANwMAIAEgAikDODcDAAsgACABNgIUIAAgCjYCECAAIAs2AgwgACAENgIIIAAgAzYCBCAAQQg2AgAMEAsgASgCGCENIAEoAhQhDiABKAIQIQMQ+ichDyACQThqIAMQQiAPQThqIAJBOGpBOGopAwA3AwAgD0EwaiACQThqQTBqKQMANwMAIA9BKGogAkE4akEoaikDADcDACAPQSBqIAJBOGpBIGopAwA3AwAgD0EYaiACQThqQRhqKQMANwMAIA9BEGogAkE4akEQaikDADcDACAPQQhqIAJBOGpBCGopAwA3AwAgDyACKQM4NwMAIAEoAgghBiACQThqIAEoAgwiEEEEQRgQlQ8gAigCPCERIAIoAjhBAUYNDSACKAJAIRICQCARRQ0AIAYgEEEYbGohE0EAIQogESEUA0AgBiATRg0BIAYoAhAhFSAGKAIMIRYCQAJAIAYoAhQiAQ0AQQAhBwwBCxD6JyEHIAJBOGogARBCIAdBOGogAkE4akE4aikDADcDACAHQTBqIAJBOGpBMGopAwA3AwAgB0EoaiACQThqQShqKQMANwMAIAdBIGogAkE4akEgaikDADcDACAHQRhqIAJBOGpBGGopAwA3AwAgB0EQaiACQThqQRBqKQMANwMAIAdBCGogAkE4akEIaikDADcDACAHIAIpAzg3AwALIAYoAgQhAyACQThqIAYoAggiC0EIQTAQlQ8gAigCPCEJIAIoAjhBAUYNECASIApBGGxqIQggAigCQCEMAkAgCUUNACALQTBsIQQgDCEBIAkhBQNAIARFDQEgAkE4aiADEEwgAUEoaiACQThqQShqKQMANwMAIAFBIGogAkE4akEgaikDADcDACABQRhqIAJBOGpBGGopAwA3AwAgAUEQaiACQThqQRBqKQMANwMAIAFBCGogAkE4akEIaikDADcDACABIAIpAzg3AwAgAUEwaiEBIARBUGohBCADQTBqIQMgBUF/aiIFDQALCyAKQQFqIQogBkEYaiEGIAggBzYCFCAIIBU2AhAgCCAWNgIMIAggCzYCCCAIIAw2AgQgCCAJNgIAIBRBf2oiFA0ACwsgACANNgIYIAAgDjYCFCAAIA82AhAgACAQNgIMIAAgEjYCCCAAIBE2AgQgAEEJNgIADA8LIAEpAwghFyABKAIEIQMQ+ichASACQThqIAMQQiABQThqIAJBOGpBOGopAwA3AwAgAUEwaiACQThqQTBqKQMANwMAIAFBKGogAkE4akEoaikDADcDACABQSBqIAJBOGpBIGopAwA3AwAgAUEYaiACQThqQRhqKQMANwMAIAFBEGogAkE4akEQaikDADcDACABQQhqIAJBOGpBCGopAwA3AwAgASACKQM4NwMAIAAgFzcDCCAAIAE2AgQgAEEKNgIADA4LQQAtAKDxngEaIAEoAgQhA0GAARB9IgFFDQ4gAygCfCEIIAMoAnghCSADKQJUIRcgAygCXCEEIAJBCGogA0HIAGoQvQogAiAENgIcIAIgFzcCFEEIIQQCQCADKAIAIgdBCEYNAEEHIQQgAygCRCEGIAMoAkAhBQJAIAdBB0YNACACQThqIAMQvAIgAkGgAWogAkHEAGopAgA3AwAgAkGoAWogAkHMAGopAgA3AwAgAkGwAWogAkHUAGopAgA3AwAgAkG4AWogAkHcAGooAgA2AgAgAiACKQI8NwOYASACKAI4IQQLIAMoAjwhByADKQI0IRcgAkEgaiADQShqEL0KIAJBOGpBCGogAkGYAWpBCGopAwA3AwAgAkE4akEQaiACQZgBakEQaikDADcDACACQThqQRhqIAJBmAFqQRhqKQMANwMAIAJBOGpBIGogAkGYAWpBIGooAgA2AgAgAiAXNwIsIAJB5ABqIAJBIGpBCGopAgA3AgAgAiAHNgI0IAJB7ABqIAJBIGpBEGopAgA3AgAgAiACKQOYATcDOCACIAIpAiA3AlwLQYCAgIB4IQcCQCADKAJgQYCAgIB4Rg0AIAMoAnQhByADKQJsIRcgAkGYAWogA0HgAGoQvQogAkEoaiAXNwMAIAJBMGogBzYCACACIAIpApwBNwMgIAIoApgBIQcLIAEgBDYCACABIAIpAzg3AgQgASAGNgJEIAEgBTYCQCABQQxqIAJBOGpBCGopAwA3AgAgAUEUaiACQThqQRBqKQMANwIAIAFBHGogAkHQAGopAwA3AgAgAUEkaiACQdgAaikDADcCACABQSxqIAJB4ABqKQMANwIAIAFBNGogAkHoAGopAwA3AgAgAUE8aiACQfAAaigCADYCACABIAc2AmAgASAINgJ8IAEgCTYCeCABQdgAaiACQQhqQRBqKQMANwMAIAFB0ABqIAJBCGpBCGopAwA3AwAgASACKQMINwNIIAFB9ABqIAJBIGpBEGooAgA2AgAgAUHsAGogAkEgakEIaikDADcCACABIAIpAyA3AmQgAEELNgIAIAAgATYCBAwNCyABKQIMIRcgASgCBCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiBSkDADcDACADQSBqIAJBOGpBIGoiBikDADcDACADQRhqIAJBOGpBGGoiBykDADcDACADQRBqIAJBOGpBEGoiCCkDADcDACADQQhqIAJBOGpBCGoiCSkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAggQTCAEQShqIAUpAwA3AwAgBEEgaiAGKQMANwMAIARBGGogBykDADcDACAEQRBqIAgpAwA3AwAgBEEIaiAJKQMANwMAIAQgAikDODcDACAAIBc3AgwgACAENgIIIAAgAzYCBCAAQQw2AgAMDAsgASkCDCEXIAEoAgQhBBD6JyEDIAJBOGogBBBCIANBOGogAkE4akE4aikDADcDACADQTBqIAJBOGpBMGopAwA3AwAgA0EoaiACQThqQShqIgUpAwA3AwAgA0EgaiACQThqQSBqIgYpAwA3AwAgA0EYaiACQThqQRhqIgcpAwA3AwAgA0EQaiACQThqQRBqIggpAwA3AwAgA0EIaiACQThqQQhqIgkpAwA3AwAgAyACKQM4NwMAEIEoIQQgAkE4aiABKAIIEEwgBEEoaiAFKQMANwMAIARBIGogBikDADcDACAEQRhqIAcpAwA3AwAgBEEQaiAIKQMANwMAIARBCGogCSkDADcDACAEIAIpAzg3AwAgACAXNwIMIAAgBDYCCCAAIAM2AgQgAEENNgIADAsLQQIhByABKAIUIQggASgCECEJAkAgASgCBCIEQQJGDQBBASEHIAEoAgghAwJAIARBAXFFDQAQ+ichBiACQThqIAMQQiAGQThqIAJBOGpBOGopAwA3AwAgBkEwaiACQThqQTBqKQMANwMAIAZBKGogAkE4akEoaikDADcDACAGQSBqIAJBOGpBIGopAwA3AwAgBkEYaiACQThqQRhqKQMANwMAIAZBEGogAkE4akEQaikDADcDACAGQQhqIAJBOGpBCGopAwA3AwAgBiACKQM4NwMADAELEIMoIQYgAygCFCEEIAMpAgwhFyADLwEYIQUgAkE4aiADEMkFIAJBOGpBGGoiAyAFOwEAIAYgAikCODcCACACIBc3AkQgBkEIaiACQThqQQhqKQIANwIAIAIgBDYCTCAGQRBqIAJBOGpBEGopAgA3AgAgBkEYaiADKAIANgIAQQAhBwtBACEEQQAhBQJAIAEoAhgiA0UNABD6JyEFIAJBOGogAxBCIAVBOGogAkE4akE4aikDADcDACAFQTBqIAJBOGpBMGopAwA3AwAgBUEoaiACQThqQShqKQMANwMAIAVBIGogAkE4akEgaikDADcDACAFQRhqIAJBOGpBGGopAwA3AwAgBUEQaiACQThqQRBqKQMANwMAIAVBCGogAkE4akEIaikDADcDACAFIAIpAzg3AwALAkAgASgCHCIDRQ0AEPonIQQgAkE4aiADEEIgBEE4aiACQThqQThqKQMANwMAIARBMGogAkE4akEwaikDADcDACAEQShqIAJBOGpBKGopAwA3AwAgBEEgaiACQThqQSBqKQMANwMAIARBGGogAkE4akEYaikDADcDACAEQRBqIAJBOGpBEGopAwA3AwAgBEEIaiACQThqQQhqKQMANwMAIAQgAikDODcDAAsQgSghAyACQThqIAEoAgwQTCADQShqIAJBOGpBKGopAwA3AwAgA0EgaiACQThqQSBqKQMANwMAIANBGGogAkE4akEYaikDADcDACADQRBqIAJBOGpBEGopAwA3AwAgA0EIaiACQThqQQhqKQMANwMAIAMgAikDODcDACAAIAQ2AhwgACAFNgIYIAAgCDYCFCAAIAk2AhAgACADNgIMIAAgBjYCCCAAIAc2AgQgAEEONgIADAoLIAEoAgghAyABKAIYIQYgASgCFCEHAkACQAJAAkAgASgCBCIIDgMAAQIACxCDKCEFIAMoAhQhBCADKQIMIRcgAy8BGCEJIAJBOGogAxDJBSACQThqQRhqIgMgCTsBACAFIAIpAjg3AgAgAiAXNwJEIAVBCGogAkE4akEIaikCADcCACACIAQ2AkwgBUEQaiACQThqQRBqKQIANwIAIAVBGGogAygCADYCAAwCCxCEKCEFIAMtABQhBCADKQIMIRcgAkE4aiADEMkFIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDoATCAFQRBqIAJBOGpBEGopAgA3AgAMAQsQ/SchBSACQThqIAMQvAIgBUEgaiACQThqQSBqKQMANwMAIAVBGGogAkE4akEYaikDADcDACAFQRBqIAJBOGpBEGopAwA3AwAgBUEIaiACQThqQQhqKQMANwMAIAUgAikDODcDAAsgASgCDCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiCSkDADcDACADQSBqIAJBOGpBIGoiCikDADcDACADQRhqIAJBOGpBGGoiCykDADcDACADQRBqIAJBOGpBEGoiDCkDADcDACADQQhqIAJBOGpBCGoiFCkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAhAQTCAEQShqIAkpAwA3AwAgBEEgaiAKKQMANwMAIARBGGogCykDADcDACAEQRBqIAwpAwA3AwAgBEEIaiAUKQMANwMAIAQgAikDODcDACAAIAY2AhggACAHNgIUIAAgBDYCECAAIAM2AgwgACAFNgIIIAAgCDYCBCAAQQ82AgAMCQsgASgCCCEDIAEtABwhBiABKAIYIQcgASgCFCEIAkACQAJAAkAgASgCBCIJDgMAAQIACxCDKCEFIAMoAhQhBCADKQIMIRcgAy8BGCEKIAJBOGogAxDJBSACQThqQRhqIgMgCjsBACAFIAIpAjg3AgAgAiAXNwJEIAVBCGogAkE4akEIaikCADcCACACIAQ2AkwgBUEQaiACQThqQRBqKQIANwIAIAVBGGogAygCADYCAAwCCxCEKCEFIAMtABQhBCADKQIMIRcgAkE4aiADEMkFIAUgAikCODcCACACIBc3AkQgBUEIaiACQThqQQhqKQIANwIAIAIgBDoATCAFQRBqIAJBOGpBEGopAgA3AgAMAQsQ/SchBSACQThqIAMQvAIgBUEgaiACQThqQSBqKQMANwMAIAVBGGogAkE4akEYaikDADcDACAFQRBqIAJBOGpBEGopAwA3AwAgBUEIaiACQThqQQhqKQMANwMAIAUgAikDODcDAAsgASgCDCEEEPonIQMgAkE4aiAEEEIgA0E4aiACQThqQThqKQMANwMAIANBMGogAkE4akEwaikDADcDACADQShqIAJBOGpBKGoiCikDADcDACADQSBqIAJBOGpBIGoiCykDADcDACADQRhqIAJBOGpBGGoiDCkDADcDACADQRBqIAJBOGpBEGoiFCkDADcDACADQQhqIAJBOGpBCGoiFSkDADcDACADIAIpAzg3AwAQgSghBCACQThqIAEoAhAQTCAEQShqIAopAwA3AwAgBEEgaiALKQMANwMAIARBGGogDCkDADcDACAEQRBqIBQpAwA3AwAgBEEIaiAVKQMANwMAIAQgAikDODcDACAAIAY6ABwgACAHNgIYIAAgCDYCFCAAIAQ2AhAgACADNgIMIAAgBTYCCCAAIAk2AgQgAEEQNgIADAgLAkACQAJAAkACQAJAAkACQAJAAkAgASgCCCIEDggAAQIDBAUGBwALIAEoAiAhBSABKAIcIQYgASgCGCEHAkAgASkDECIXQgODQgBSDQAgF6ciAyADKAIAIgNBAWo2AgAgA0F/TA0SCyABLQAsIQggAS0AJCEJIAEoAighARCHKCEDIAEoAiwhFSABKAIoIRYgASgCJCESIAJBIGogARDtCCACQZgBaiABQQxqEHVBACELQQAhCgJAIAEoAjAiDEUNABD6JyEKIAJBOGogDBBCIApBOGogAkE4akE4aikDADcDACAKQTBqIAJBOGpBMGopAwA3AwAgCkEoaiACQThqQShqKQMANwMAIApBIGogAkE4akEgaikDADcDACAKQRhqIAJBOGpBGGopAwA3AwAgCkEQaiACQThqQRBqKQMANwMAIApBCGogAkE4akEIaikDADcDACAKIAIpAzg3AwALIAEtADwhEwJAIAEoAjQiDEUNABCAKCELIAwoAgwhFCAMKAIQIQ8gAkE4aiAMEOEGIAtBEGogDzYCACALIAIpAjg3AgAgAiAUNgJEIAtBCGogAkE4akEIaikCADcCAAsCQAJAIAEoAjgiFA0AQQAhDAwBCxCAKCEMIBQoAgwhDyAUKAIQIREgAkE4aiAUENUMIAxBEGogETYCACAMIAIpAjg3AgAgAiAPNgJEIAxBCGogAkE4akEIaikCADcCAAsgAkE4akEYaiIUIAFBGGoQ0QUgAkE4akEoaiIBIBY2AgAgAkE4akEIaiIWIAJBIGpBCGooAgA2AgAgAkHMAGogAkGYAWpBCGooAgA2AgAgAkE4akEwaiIPIAo2AgAgAkE4akE4aiIKIAw2AgAgAiAVNgJkIAIgEjYCXCACIAIpAiAiGDcDOCACIAIpApgBNwJEIAIgEzoAdCACIAs2AmwgA0E4aiAKKQMANwIAIANBMGogDykDADcCACADQShqIAEpAwA3AgAgA0EgaiACQThqQSBqKQMANwIAIANBGGogFCkDADcCACADQRBqIAJBOGpBEGopAwA3AgAgA0EIaiAWKQMANwIAIAMgGDcCAAwICyABKAIgIQUgASgCHCEGIAEoAhghBwJAIAEpAxAiF0IDg0IAUg0AIBenIgMgAygCACIDQQFqNgIAIANBf0wNEQsgAS0ALCEIIAEtACQhCSABKAIoIQEQgighAyACQQhqIAEQggkgAkEgaiABQQxqEO0IQYCAgIB4IRQgASgCOCEVIAEoAjQhFiABKAIwIRICQCABKAIYQYCAgIB4Rg0AIAEoAiwhCiABKQIkIRggAkE4aiABQRhqEL0KIAJBoAFqIBg3AwAgAkGoAWogCjYCACACIAIpAjw3A5gBIAIoAjghFAsgAS0ARSETIAEtAEQhD0EAIQtBACEKAkAgASgCPCIMRQ0AEIAoIQogDCgCDCERIAwoAhAhECACQThqIAwQ4QYgCkEQaiAQNgIAIAogAikCODcCACACIBE2AkQgCkEIaiACQThqQQhqKQIANwIACwJAIAEoAkAiAUUNABD7JyELIAEpAgQhGCABKAIAIQwQ/CchASACQThqIAwQdgJAQeAARQ0AIAEgAkE4akHgAPwKAAALIAsgGDcCBCALIAE2AgALIAJBOGpBCGoiASACQQhqQQhqKAIANgIAIAJBzABqIAJBIGpBCGooAgA2AgAgAiACKQIIIhg3AzggAiACKQIgNwJEIANBEGogAkE4akEQaikDADcCACADQQhqIAEpAwA3AgAgAyAYNwIAIAMgFDYCGCADIBM6AEUgAyAPOgBEIAMgCzYCQCADIAo2AjwgAyAVNgI4IAMgFjYCNCADIBI2AjAgAyACKQOYATcCHCADQSRqIAJBmAFqQQhqKQMANwIAIANBLGogAkGYAWpBEGooAgA2AgAMBwsgASgCDCEDEIMoIQEgAygCFCEFIAMpAgwhFyADLwEYIQYgAkE4aiADEMkFIAJBOGpBGGoiAyAGOwEAIAEgAikCODcCACACIBc3AkQgAUEIaiACQThqQQhqKQIANwIAIAIgBTYCTCABQRBqIAJBOGpBEGopAgA3AgAgAUEYaiADKAIANgIADAULIAEoAgwhAxCEKCEBIAMtABQhBSADKQIMIRcgAkE4aiADEMkFIAEgAikCODcCACACIBc3AkQgAUEIaiACQThqQQhqKQIANwIAIAIgBToATCABQRBqIAJBOGpBEGopAgA3AgAMBAsgASgCDCEDEIUoIQEgAygCGCEHIAMoAhQhCCADKAIQIQkgAygCBCEKIAMoAgAhCwJAIAMpAwgiF0IDg0IAUg0AIBenIgUgBSgCACIFQQFqNgIAIAVBf0wNDgsgAy0ARCEMIAMtABwhFAJAAkAgAygCICIGDQBBACEFDAELEIAoIQUgBigCDCEVIAYoAhAhFiACQThqIAYQ4QYgBUEQaiAWNgIAIAUgAikCODcCACACIBU2AkQgBUEIaiACQThqQQhqKQIANwIACyACQThqQThqIANBOGoQ0QUgAygCMCEGIAMoAjQhFSACQZgBaiADQSRqEJcBIAJB7ABqIBU2AgAgAiAGNgKkASACQeQAaiACQaABaikCADcCACACIAw6AHwgAiAUOgBUIAIgBzYCUCACIAg2AkwgAiAJNgJIIAIgFzcDQCACIAo2AjwgAiALNgI4IAIgBTYCWCACIAIpApgBNwJcQcgARQ0DIAEgAkE4akHIAPwKAAAMAwsgASgCDCEDEIEoIQEgAygCGCEHIAMoAhQhCCADKAIQIQkgAy0AKCEKIAMoAgQhCyADKAIAIQwCQCADKQMIIhdCA4NCAFINACAXpyIFIAUoAgAiBUEBajYCACAFQX9MDQ0LIAMtABwhFAJAAkAgAygCICIGDQBBACEFDAELEIAoIQUgBigCDCEVIAYoAhAhFiACQThqIAYQ4QYgBUEQaiAWNgIAIAUgAikCODcCACACIBU2AkQgBUEIaiACQThqQQhqKQIANwIACyADKAIkIQYQ/CchAyACQThqIAYQdgJAQeAARQ0AIAMgAkE4akHgAPwKAAALIAEgCjoAKCABIAM2AiQgASAFNgIgIAEgFDoAHCABIAc2AhggASAINgIUIAEgCTYCECABIBc3AwggASALNgIEIAEgDDYCAAwCCyABKAIMIQMQgSghASADKAIQIQUgAygCDCEGIAMoAgghByADLQAtIQggAy0ALCEJIAMoAhwhCiADKAIYIQsCQCADKQMAIhdCA4NCAFINACAXpyIMIAwoAgAiDEEBajYCACAMQX9MDQwLIAMtABQhDCACQThqQSBqIhQgA0EgahCcBSACQThqQQhqIgMgBzYCACACQThqQRBqIgcgBTYCACACQThqQRhqIgUgCzYCACABIBc3AwAgAUEgaiAUKQMANwMAIAIgBjYCRCABQQhqIAMpAwA3AwAgAiAMOgBMIAFBEGogBykDADcDACACIAo2AlQgAUEYaiAFKQMANwMAIAIgCDoAZSACIAk6AGQgAUEoaiACQThqQShqKQMANwMADAELIAEoAgwhAxCGKCEBIAMoAhQhByADKAIQIQggAy0AUiEJIAMtAFEhCiADLQBQIQsgAygCTCEMIAMoAkghFAJAAkAgAygCAEEBRw0AAkAgAykDCCIYQgODQgBSDQAgGKciBSAFKAIAIgVBAWo2AgAgBUF/TA0NC0IBIRkgAykDGCIXUA0BIBdCA4NQRQ0BIBenIgUgBSgCACIFQQFqNgIAIAVBf0oNAQwMC0IAIRkgAzUCGCEXAkAgAykDCCIYQgODQgBSDQAgGKciBSAFKAIAIgVBAWo2AgAgBUF/TA0MCyADMQAcQiCGIBeEIRcLQQMhBQJAIAMtAEVBA0YNACACQThqIANBIGoQqQUgAkGYAWpBHWogAkE4akEdaikAADcAACACQZgBakEYaiACQThqQRhqKQMANwMAIAJBmAFqQRBqIAJBOGpBEGopAwA3AwAgAkGYAWpBCGogAkE4akEIaikDADcDACACIAIpAzg3A5gBIAItAF0hBSACLwFeIQYLIAEgFzcDGCABIAc2AhQgASAINgIQIAEgGDcDCCABIBk3AwAgASACKQOYATcDICABIAk6AFIgASAKOgBRIAEgCzoAUCABIAw2AkwgASAUNgJIIAEgBjsBRiABIAU6AEUgAUEoaiACQaABaikDADcDACABQTBqIAJBqAFqKQMANwMAIAFBOGogAkGwAWopAwA3AwAgAUE9aiACQbUBaikAADcAAAsLIAAgCToAJCAAIAU2AiAgACAGNgIcIAAgBzYCGCAAIBc3AxAgACABNgIMIAAgBDYCCCAAIAIvADg7ACUgACAIOgAsIAAgAzYCKCAAIAIvAJgBOwAtIABBETYCACAAQSdqIAJBOGpBAmotAAA6AAAgAEEvaiACQZgBakECai0AADoAAAwHCyABKQMIIRcgASgCBCEDEPonIQEgAkE4aiADEEIgAUE4aiACQThqQThqKQMANwMAIAFBMGogAkE4akEwaikDADcDACABQShqIAJBOGpBKGopAwA3AwAgAUEgaiACQThqQSBqKQMANwMAIAFBGGogAkE4akEYaikDADcDACABQRBqIAJBOGpBEGopAwA3AwAgAUEIaiACQThqQQhqKQMANwMAIAEgAikDODcDACAAIBc3AwggACABNgIEIABBEjYCAAwGCyABKAIgIQggASgCHCEHIAEoAhghBiABKQMQIhdCA4NCAFINACAXpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIAAgBToAJCAAIAg2AiAgACAHNgIcIAAgBjYCGCAAIBc3AxAgACADNgIMIAAgBDYCCCAAQQY2AgAMBAsgASgCICEIIAEoAhwhByABKAIYIQYgASkDECIXQgODQgBSDQAgF6ciASABKAIAIgFBAWo2AgAgAUF/TA0ECyAAIAU6ACQgACAINgIgIAAgBzYCHCAAIAY2AhggACAXNwMQIAAgAzYCDCAAIAQ2AgggAEEHNgIADAILIBEgAigCQEG08poBEI4pAAsgCSACKAJAQbTymgEQjikACyACQcABaiQADwsAC+hRAid/A34jAEHgA2siAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACKAIADggAAQgCAwQFBgALIANBgANqIAEQ3iIgAEEIaiEEIAMoAoQDIQECQAJAIAMoAoADIgJBKkYNAEE4RQ0BIAQgA0GAA2pBCGpBOPwKAAAMAQsgBCABNgIACyAAIAI2AgAgACABNgIEDBILIAIoAgQiBSACKAIIIgJqIQQCQAJAAkACQCABLQALQQFxDQAgAkUNAiAFQQFqIQIMAQsgAkUNASAFIQIgBEF/aiIEIQULIANBKGogASAFLQAAIgUgBRCODyADKAIoIgZBK0YNACADKAIwIQUgAygCLCEHIAZBKkYNAQJAQTRFDQAgAEEMaiADQShqQQxqQTT8CgAACyAAIAU2AgggACAHNgIEIAAgBjYCAAwTCyADQYADaiABEN4iIABBCGohBCADKAKEAyEBAkACQCADKAKAAyICQSpGDQBBOEUNASAEIANBgANqQQhqQTj8CgAADAELIAQgATYCAAsgACACNgIAIAAgATYCBAwSCyADQcwCaiEIA0ACQAJAIAEtAAtBAXENACACIARGDQggAkEBaiEJDAEL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DQAgAUF/NgJgIANBgANqIAFBJGogAUHkAGoQkgcgA0HAAmpBCGoiAiADQYwDaigCADYCACADIAMpAoQDNwPAAgJAIAMoAoADIgVBKkYNAAJAQTBFDQAgAEEQaiADQYADakEQakEw/AoAAAsgAEEMaiADQcgCaigCADYCACAAIAMpA8ACNwIEIAAgBTYCAAwJCyADQShqQQhqIAIoAgA2AgAgAyADKQPAAjcDKCARIARBA3RqIQQDQAJAAkAgESAERg0AIANBwAJqIBEoAgAgESgCBBC1IyARQQhqIREDQCADQfgBaiADQcACahDlAyADLQD4AUEERg0CIANBiAJqQQhqIANB+AFqQQhqLQAAOgAAIAMgAykA+AE3A4gCIANBGGogA0GIAmoQuSYgA0GAA2ogA0EoaiADKAIYIAMoAhwQ7AUgAygCgAMiAkEqRg0ACwJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACACNgIAIAMoAsACIAMoAsQCEIAtDAsLIAAgA0EoahCQCSABIAEoAmBBAWo2AmAgASABKAIgQQFqNgIgDA4LIAMoAsACIAMoAsQCEIAtDAALC0HMnoQBENIaAAtBvJ6EARDSGgALQaCmnAFBKEGMnoQBENIeAAsgBCACQazzgwEQkRUACyAEIAVB3PODARCXFQALIAQgB0G884MBEJEVAAsgA0GAA2ogARDeIiADKAKEAyEJAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAk2AgQgACACNgIADAYLQQAhAiADQYADaiAEQQBBBEEIEKgMIAMoAoQDIQYCQAJAAkAgAygCgANBAUYNACADQQA2AugBIAMgAygCiAMiBTYC5AEgAyAGNgLgASAEQQN0IQYgCa0hKkEAIQQCQANAIAYgAkYNASARNQIAIitCgAJaDQMgETUCBCIsQoACWg0EAkAgBCADKALgAUcNACADQeABakG8n4QBEJUcIAMoAuQBIQULIBFBCGohESAFIAJqICtCIIYgKoQgLEIohoQ3AgAgAyAEQQFqIgQ2AugBIAJBCGohAgwACwsgA0GAA2ogASADQeABahD/ISADKAKEAyEBAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAE2AgQgACACNgIADAkLIAAgCTYCCCAAIAE2AgQgAEEqNgIADAgLIAYgAygCiANBjJ+EARCOKQALQcSInAFBKyADQYADakG0nIQBQZyfhAEQ6hIAC0HEiJwBQSsgA0GAA2pBtJyEAUGsn4QBEOoSAAsCQAJAAkAgAS0ADEEBcQ0AAkAgASgC2AENACABQX82AtgBIAFB3AFqEJUMIANBgANqIAEQkxggAygChAMhDQJAIAMoAoADIgJBKkYNAAJAQThFDQAgAEEIaiADQYADakEIakE4/AoAAAsgACANNgIEIAAgAjYCAAwECyADQYADaiABEN4iIAMoAoQDIQ8CQCADKAKAAyICQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgDzYCBCAAIAI2AgAMBAsgESAEQQN0aiEQIAFB5AFqIQcCQANAIBEgEEYNBCADQcACaiARKAIAIBEoAgQQtSMgEUEIaiERA0AgA0GIAmogA0HAAmoQ5QMCQAJAAkACQAJAIAMtAIgCQQRGDQAgA0EoakEIaiADQYgCakEIai0AADoAACADIAMpAIgCNwMoIANBEGogA0EoahC5JiADKAIQIgIgAygCFEEBdGohDCAPIQQDQCAHKAIAIgVFDQIgBSAErSIrQqXGiKHInKf5S4VCs4OAgIAgfiACLQAAIgmtQv8BgyIshUKzg4CAgCB+IAJBAWotAAAiCq1C/wGDIiqFQrODgICAIH4gBa2CpyIGTQ0DAkACQCABKALgASAGQQR0IghqIgUvAQwgAS8B7AFHDQAgBCAFKAIARw0AIAlB/wFxIAUtAARHDQAgCkH/AXEgBS0ABUcNACAFKAIIIQQMAQsgA0GAA2ogASAJIAoQjg8gAygCiAMhCSADKAKEAyEFAkAgAygCgAMiCkEqRg0AAkBBNEUNACAAQQxqIANBgANqQQxqQTT8CgAACyAAIAk2AgggACAFNgIEIAAgCjYCAAwKCyADQYADaiABIAkgBBC1CAJAIAMoAoADIgRBKkYNAAJAQTxFDQAgAEEEaiADQYADakEEckE8/AoAAAsgACAENgIADAoLIAcoAgAiBCAGTQ0FIAEoAuABIAhqIgQgAS8B7AE7AQwgBCAFNgIIIAQgKkIohiAsQiCGhCArhDcCACAFIQQLIAJBAmoiAiAMRg0FDAALCyADKALAAiADKALEAhCALQwFC0GcyYMBEN0hAAsgBiAFQazJgwEQkRUACyAGIARBvMmDARCRFQALIANBgANqIAEgDSAEELUIIAMoAoADIgJBKkYNAAsLAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgALIAMoAsACIAMoAsQCEIAtDAMLQcyfhAEQ0hoACwJAAkAgASgChAENACABQX82AoQBIAFBiAFqIhIQjwogAUGgAWohEyABQawBaiEUIBEgBEEDdGohFSADQfgBakF/aiEWIANBwAJqQQRqIRcgA0EoakECciEYIANB+AFqQQFqIRkgA0HGAmohGiADQckCaiEbA0AgESAVRg0CIANBiAJqIBEoAgAgESgCBBC1IyARQQhqIREDQCADQe8BaiADQYgCahDlAwJAAkACQCADLQDvAUEERg0AIANB+AFqQQhqIANB7wFqQQhqLQAAOgAAIAMgAykA7wEiKzcD+AFBAiECAkACQCArp0H/AXEOBAQDAAEEC0EDIQIMAgtBBCECDAELIAMoAogCIAMoAowCEIAtDAMLIAJBAXYhBSAWIAJBAXRqIQIgGSEEA0AgBUUNASAELwAAIQYgBCACLwAAOwAAIAIgBjsAACAFQX9qIQUgAkF+aiECIARBAmohBAwACwsgA0EIaiADQfgBahC5JiABKQKsASErIAMoAgwhAiADKAIIIQQgAUKAgICAwAA3AqwBIAFBADYCtAEgA0EANgLIAyADICs3A8ADIANBgANqQQEgBCACEMUTAkACQCArp0UNACArQiCIpyECDAELIANBwANqQZTLgwEQmBwgAygCxAMhAgsgAiADKQKAAzcCACACQQhqIANBgANqQQhqIhwpAgA3AgBBASECA0AgAyACQX9qIgI2AsgDIANBKGpBCGogAygCxAMgAkEEdGoiAkEIaikCACIrNwMAIAMgAikCADcDKAJAAkAgAy0ANCIKQQVPDQACQCAKRQ0AAkAgK6ciHSABKAKQASICTw0AIAMtACkhHiADLQAoIR8CQAJAAkAgASgCjAEgHUEMbCIgaiICKAIIIgYNAEEAISEMAQsgAigCBCEJQQAhISAGIQQDQCAEICFqQQF2IgIgBk8NAiACQQFqICEgH0H/AXEgCSACQQN0ai0ABUsiBRsiISAEIAIgBRsiBEkNAAsLIApBf2ohIgJA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akEw/AoAAAsgAEEMaiADQcgCaigCADYCACAAIAMpA8ACNwIEIAAgBDYCAAwBCyADQShqQQhqIAIoAgA2AgAgAyADKQPAAjcDKCADQYADaiASIANBKGoQ9wUgAygCgAMiAkEqRg0DAkBBPEUNACAAQQRqIANBgANqQQRyQTz8CgAACyAAIAI2AgALIAEgASgCYEEBajYCYCABIAEoAiBBAWo2AiAgASABKAKEAUEBajYChAEMCQtB7J6EARDSGgALQfyehAEQ0hoACyAAIANBKGoQkAkgASABKAJgQQFqNgJgIAEgASgCIEEBajYCICABIAEoAoQBQQFqNgKEAQwGCyAAIA82AgggACANNgIEIABBKjYCAAsgASABKALYAUEBajYC2AEMBAsgASABKAJgQQFqNgJgIAEgASgCIEEBajYCIAwDCyADQYADaiABEN4iIAMoAoQDIQoCQCADKAKAAyIEQSpGDQACQEE4RQ0AIABBCGogA0GAA2pBCGpBOPwKAAALIAAgCjYCBCAAIAQ2AgAMAwtBACEFIANBgANqIAIoAhAiBkEAQQRBCBCoDCADKAKEAyEEAkAgAygCgANBAUYNACADQQA2AtwBIAMgAygCiAMiCTYC2AEgAyAENgLUASAGQQF0IQQgCq0hKiACKAIMIQJBACEGAkADQCAERQ0BIAIxAAEhKyACMQAAISwCQCAGIAMoAtQBRw0AIANB1AFqQayehAEQlRwgAygC2AEhCQsgAkECaiECIAkgBWogLEIghiAqhCArQiiGhDcCACADIAZBAWoiBjYC3AEgBEF+aiEEIAVBCGohBQwACwsgA0GAA2ogASADQdQBahD/ISADKAKEAyEBAkAgAygCgAMiAkEqRg0AAkBBOEUNACAAQQhqIANBgANqQQhqQTj8CgAACyAAIAE2AgQgACACNgIADAQLIAAgCjYCCCAAIAE2AgQgAEEqNgIADAMLIAQgAygCiANBnJ6EARCOKQALAkAgASgCIA0AIAFBfzYCICAAIAMoAoQDIgIgAygCiAMiBCABQSRqEMACIAIgBBCuGyADKAKAAyACEIUtIAEgASgCIEEBajYCIAwCC0H8nYQBENIaAAsCQCABKAIgRQ0AQbyghAEQ0hoACyABQX82AiAgAyACNgLIAiADQgM3AsACIANBgANqIAFBJGogA0HAAmoQwAwgASABKAIgQQFqNgIgIABBCGohBCADKAKEAyEBAkACQCADKAKAAyICQSpGDQBBOEUNASAEIANBgANqQQhqQTj8CgAADAELIAQgATYCAAsgACACNgIAIAAgATYCBAsgA0HgA2okAAvxTgIJfwF+IwBBMGsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASgCAA4UAAECAwQFBgcICQoLDA0ODxAREhMACyABKAIIIQQgA0EgaiACIAEoAgQiBUEAEIsCAkACQCADLQAgQQRGDQAgAykDICIMQv8Bg0IEUg0BCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAAwODQABAgMEBQYHCAkKCwwACyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGI9JsBQQMQsw0gAy0ACEEERg0yIAMpAwgiDEL/AYNCBFINDAwyCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGL9JsBQQcQsw0gAy0ACEEERg0xIAMpAwgiDEL/AYNCBFINCwwxCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGS9JsBQQYQsw0gAy0ACEEERg0wIAMpAwgiDEL/AYNCBFINCgwwCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGY9JsBQQYQsw0gAy0ACEEERg0vIAMpAwgiDEL/AYNCBFINCQwvCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGe9JsBQQcQsw0gAy0ACEEERg0uIAMpAwgiDEL/AYNCBFINCAwuCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGl9JsBQQYQsw0gAy0ACEEERg0tIAMpAwgiDEL/AYNCBFINBwwtCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGr9JsBQQYQsw0gAy0ACEEERg0sIAMpAwgiDEL/AYNCBFINBgwsCyADIAQ2AiggAyAFNgIkIANBATYCICADQQhqIAIgA0EgakGx9JsBQQYQsw0gAy0ACEEERg0rIAMpAwgiDEL/AYNC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QCACKAKwAUEBcUUNACACIAIoArQBIgUgAigCuAEiC2sgCyAFayAFIAtLGyACKAJwajYCcAsgAiAINgK4ASACIAg2ArQBIAJBATYCsAECQCAIIAZPDQAgAUHgAGohEyABQeAEaiEUIAZBAWohFSABQeACaiELIAxBBmxBDGohFiABKAKEBSEXIAEtAFlBAXEhGANAAkACQAJAAkACQAJAIAlB////P0sNACAIIAZPDQQgAigCfCEZIAIoAnghCgJAAkADQCAKIAkgCyAQIAhqIhEtAABqLQAAakECdGooAgAhBSAIQQNqIgMgBk8NBCAFQYCAgMAATw0EIAogBSALIBFBAWotAABqLQAAakECdGooAgAiCUH///8/Sw0BIAogCSALIBFBAmotAABqLQAAakECdGooAgAiBUH///8/Sw0CAkAgCiAFIAsgEUEDai0AAGotAABqQQJ0aigCACIJQf///z9LDQAgCEEEaiIIIAZJDQEMCAsLIAUhESAJIQUMBAsgCEEBaiEDIAUhESAJIQUMAwsgCEECaiEDIAkhEQwCCwJAAkAgAigCsAFFDQAgAiAINgK4AQJAIAggEkkNACAIIBJBuOODARCRFQALIAlB////P3EgCyAQIAhqLQAAIhFqLQAAaiIFIAIoAnwiCk8NAQJAAkAgAigCeCAFQQJ0aigCACIKQQBIDQBBACEFDAELIAQgAjYCyAEgBCABNgLEASAEQfgAaiAEQcQBaiAJIBFBCHQQgAEgBCgCfCEKIAQoAnghBQsCQCAFQQFxRQ0AIAgQtCMhBSAAQQI2AgAgACAFNgIEDC0LIAghAyAKIQkMBAtB2OGDAUEfQfjhgwEQshcACyAFIApB1OCDARCRFQALIAkhESAIIQMLAkAgBUEASA0AIAUhCQwBCwJAAkAgAigCsAFFDQAgAiADNgK4ASARIAsgECADai0AACIIai0AAGoiBSAZTw0BAkACQCAKIAVBAnRqKAIAIglBAEgNAEEAIQUMAQsgBCACNgLIASAEIAE2AsQBIARBgAFqIARBxAFqIBEgCEEIdBCAASAEKAKEASEJIAQoAoABIQULIAVBAXFFDQIgAxC0IyEFIABBAjYCACAAIAU2AgQMKgtB2OGDAUEfQfjhgwEQshcACyAFIBlB1OCDARCRFQALAkACQAJAAkACQAJAAkACQAJAAkAC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AkACQCALDgMCAAECCyAFQQZqIQUMAQsCQCABLQBZQQFxDQAgBCARrUIghkIChDcD4AEMBAsCQCARIA4oAtwCTw0AIBFBBmwgBWpBDGohBQwBCyABKAKEBRDXGiEFDAELAkAgBSACKAKIASIDSQ0AIAUgA0G44oMBEJEVAAsgAigChAEgBUECdGooAgAiBUEASA0BCyAEQQU2AuABIAQgBTYC5AEMAQsgBCACNgK8ASAEIAE2ArgBIARB4AFqIARBuAFqIAsgESAKEIoBCyAEQbABaiAEQeABaiAJEJ0QIAQoArQBIREgBCgCsAFBAXFFDQEgACARNgIEQQIhCAsgACAINgIADBULAkAgAigCsAFBAXFFDQAgAiACKAK0ASIFIAIoArgBIglrIAkgBWsgBSAJSxsgAigCcGo2AnALIAIgCDYCuAEgAiAINgK0ASACQQE2ArABAkACQAJAAkACQCAIIAZJDQBBACEXDAELIAFB4ABqIRMgAUHgBGohFCAGQQFqIRUgAUHgAmohCSAMQQZsQQxqIRogASgChAUhGyABLQBZQQFxIRxBACEXA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCARQf///z9LDQAgCCAGSQ0BDAsLIAIoArABRQ0CIAIgCDYCuAEgCCASSQ0BIAggEkG444MBEJEVAAsgAigCfCEZIAIoAnghCwNAIAsgESAJIBAgCGoiCi0AAGotAABqQQJ0aigCACEFIAhBA2oiAyAGTw0HIAVBgICAwABPDQcgCyAFIAkgCkEBai0AAGotAABqQQJ0aigCACIRQf///z9LDQUgCyARIAkgCkECai0AAGotAABqQQJ0aigCACIFQf///z9LDQYgCyAFIAkgCkEDai0AAGotAABqQQJ0aigCACIRQf///z9LDQQgCEEEaiIIIAZPDQoMAAsLIBFB////P3EgCSAQIAhqLQAAIgpqLQAAaiIFIAIoAnwiC08NAQJAAkAgAigCeCAFQQJ0aigCACILQQBIDQBBACEFDAELIAQgAjYCyAEgBCABNgLEASAEQaABaiAEQcQBaiARIApBCHQQgAEgBCgCpAEhCyAEKAKgASEFCwJAIAVBAXFFDQAgCBC0IyEFIABBAjYCACAAIAU2AgQMJAsgCCEDIAshEQwHC0HY4YMBQR9B+OGDARCyFwALIAUgC0HU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bCAIakEMaiEIDAELIAEoAoQFENcaIQgMAgsCQCAIIAIoAogBIhFJDQAgCCARQbjigwEQkRUACyACKAKEASAIQQJ0aigCACIIQQBODQEgBCACNgLsASAEIAE2AugBIARBuAFqIARB6AFqIAkgCiALEIoBAkAgBCgCuAFBBUcNACAEKAK8ASEIDAILIAQpA7gBIR0LIB1CIIinIQICQAJAAkACQCAdpyIIQX1qIgZBAiAGQQJJGw4DAAECAAsgBRC0IyEFDAILIAVFDQMgAiAFQX9qELEhIQUMAQsgCCACEK4hIQULIABBAjYCACAAIAU2AgQMAwsCQCACKAKwAUEBcUUNACACIAIoArQBIgkgAigCuAEiC2sgCyAJayAJIAtLGyACKAJwajYCcAsgAiAFNgK4ASACIAU2ArQBIAJBATYCsAECQCAFIAZJDQAgAygCDCEQQQAhDAwCCyABQeACaiEJIAEoAoQFIRUgASgCgAUhDiADKAIMIRAgAygCCCENQQAhDANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCEH///8/Sw0AIAUgBkkNAQwLCyACKAKwAUUNAiACIAU2ArgBIAUgEEkNASAFIBBBuOODARCRFQALIAIoAnwhGSACKAJ4IQsDQCALIAggCSANIAVqIgotAABqLQAAakECdGooAgAhESAFQQNqIgcgBk8NByARQYCAgMAATw0HIAsgESAJIApBAWotAABqLQAAakECdGooAgAiCEH///8/Sw0FIAsgCCAJIApBAmotAABqLQAAakECdGooAgAiEUH///8/Sw0GIAsgESAJIApBA2otAABqLQAAakECdGooAgAiCEH///8/Sw0EIAVBBGoiBSAGTw0KDAALCyAIQf///z9xIAkgDSAFai0AACIRai0AAGoiCyACKAJ8IgpPDQECQAJAIAIoAnggC0ECdGooAgAiCkEASA0AQQAhCAwBCyAEIAI2AsgBIAQgATYCxAEgBEHAAGogBEHEAWogCCARQQh0EIABIAQoAkQhCiAEKAJAIQgLAkAgCEEBcUUNACAFELQjIQUgAEECNgIAIAAgBTYCBAwOCyAFIQcMBwtB2OGDAUEfQfjhgwEQshcACyALIApB1OCDARCRFQALIAghCiARIQgMAwsgBUEBaiEHIAghCiARIQgMAgsgBUECaiEHIBEhCgwBCyARIQogBSEHCyAKQQBODQACQAJAIAIoArABRQ0AIAIgBzYCuAEgCCAJIA0gB2otAAAiEWotAABqIgUgGU8NAQJAAkAgCyAFQQJ0aigCACIKQQBIDQBBACEFDAELIAQgAjYCyAEgBCABNgLEASAEQcgAaiAEQcQBaiAIIBFBCHQQgAEgBCgCTCEKIAQoAkghBQsgBUEBcUUNAiAHELQjIQUgAEECNgIAIAAgBTYCBAwIC0HY4YMBQR9B+OGDARCyFwALIAUgGUHU4IMBEJEVAAsCQCAKQYCAgMAASQ0AIApBgICAgAFxDQACQAJAAkACQCAKQYCAgMAAcQ0AIApBgICAgARxDQEgCkGAgICAAnENAiAEQQE2AsgBIARBjOSDATYCxAEgBEIANwLQASAEIARB/AFqNgLMASAEQcQBakGU5IMBEOkjAAtBASEMQQAhEiAOKALcAkEBRg0CIBUgAiAKEPYhIgUoAgAgBSgCBEEAEK8TIRIMAgsgAiAHEOMbIAAgDzYCCCAAIBI2AgQgACAMNgIADAgLIAIgBxDjGwJAIAcgEE8NACANIAdqLQAAIAcQsSEhBSAAQQI2AgAgACAFNgIEDAgLIAcgEEGk5IMBEJEVAAsgCiEIIAchDwwCCyAKIQgMAQsgBSEHCyAHQQFqIgUgBk8NAgwACwtB9OCDAUEkQZjhgwEQshcACwJAAkACQAJAAkACQAJAAkACQCAGIBBPDQAgCEH///8/cSABIAMoAgggBmotAAAiC2otAOACaiIFIAIoAnwiCU8NBUEAIQkCQCACKAJ4IAVBAnRqKAIAIgVBAE4NACAEIAI2AsgBIAQgATYCxAEgBEEwaiAEQcQBaiAIIAtBCHQQgAEgBCgCNCEFIAQoAjAhCQsgCUEBcUUNASAGELQjIQUMCAsgAS0A3wRBAWoiCyAIQf///z9xaiIFIAIoAnwiCU8NBUEAIQkCQCACKAJ4IAVBAnRqKAIAIgVBAE4NACAEIAI2AsgBIAQgATYCxAEgBEE4aiAEQcQBaiAIIAtBEHRBAXIQgAEgBCgCPCEFIAQoAjghCQsgCUEBcUUNASAQELQjIQUMBwsgBiEQIAVBgICAwABxDQEgBUGAgICAAnFFDQIgCyAGELEhIQUMBgsgBUGAgIDAAHFFDQELQQEhDCABKAKABSABKAKEBSACIAUQzSMhEiAQIQ8LIAIoArABIQUgAkEANgKwASAFQQFxRQ0CIAIoArQBIQUgACAPNgIIIAAgEjYCBCAAIAw2AgAgAiACKAJwIAUgBmsgBiAFayAFIAZLG2o2AnAMBAsgBSAJQdTggwEQkRUACyAFIAlB5OCDARCRFQALQYjigwFBH0Go4oMBELIXAAsgAEECNgIAIAAgBTYCBAsgBEGAAmokAAvNWAMZfwN+AXwjAEGwB2siAiQAIAEoAtgBIQMCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAS0A4AEiBEGNf2pB/wFxQS5JDQACQAJAAkACQAJAAkACQAJAAkACQAJAIARBnH9qDg4MAQEBEQECAQUBDAEBDAALIARBQGpBA0kNASAEQbV/akEDSQ0LAkAgBA4FFwEGAQcACyAEQbt/akECSQ0CIARBDkYNDyAEQRpGDQEgBEHaAEYNASAEQd8ARg0DCyACQfgDakEEciABENQmIAJBhQE2AowEIAJBrNabATYCiAQgAkGwgICAeDYC+AMgASgC2AEgASgC3AEgAkH4A2oQ4BohBCABLQDgAUGiAUYNBgwuCwJAAkACQAJAAkACQAJAIARBGkYNACACQfgDaiABEMoGIAIoAvwDIQUgAigC+AMiBEEHRg0yIAJBqANqQRhqIAJB+ANqQRhqKQMANwMAIAJBqANqQRBqIAJB+ANqQRBqKQMANwMAIAIgAikDgAQ3A7ADIAIgBTYCrAMgAiAENgKoAyAEDgUCBQEDBAELIAEQoQsgAkEANgK8BSACQoCAgIDAADcCtAUgAkH4A2ogARDtCyACKAL4AyEFIAItAJAEIgZBAkYNMCACQcAFakEQaiIHIAJB+ANqQRRqKAIANgIAIAJBwAVqQQhqIgggAkH4A2pBDGopAgA3AwAgAiACKQL8AzcDwAUgAiACKACRBDYCkAUgAiACQfgDakEcaigAADYAkwVBIEEIEJoqIgQgBTYCACAEIAY6ABggBCACKQPABTcCBCAEQQxqIAgpAwA3AgAgBEEUaiAHKAIANgIAIAQgAigCkAU2ABkgBEEcaiACKACTBTYAACACQQE2AvQGIAIgBDYC8AYgAkEBNgLsBiACQZEEaiEJIAJB+ANqQQRyIQcCQANAIAZBAXENAQJAIAEtAOABQT1GDQAgASgC3AEhBCABKALYASEDIAJB+AZqIAEQ1CYgAkEBNgL8AyACQZy/nAE2AvgDIAJCATcChAQgAkGzBzYCrAcgAkE9OgCfBSACIAJBqAdqNgKABCACIAJBmAVqNgKoByACIAJBnwVqNgKYBSACQagDaiACQfgDahD9GiACQbwDaiACQYAHaigCADYCACACIAIpAvgGNwK0AyADIAQgAkGoA2oQ4BohBSABLQDgAUGiAUcNMiABIAEQmiwQpxcMMgsgARChCyACQSBqIAEQxhIgAigCJCEFIAIoAiBBAXENMSACQbQFaiAFQaTYmwEQ0iECQCABLQDgAUEDRg0AIAEoAtwBIQQgASgC2AEhAyACQZAHaiABENQmIAJBATYC/AMgAkGcv5wBNgL4AyACQgE3AoQEIAJBswc2AqwHIAJBAzoAnwUgAiACQagHajYCgAQgAiACQZgFajYCqAcgAiACQZ8FajYCmAUgAkGoA2ogAkH4A2oQ/RogAkG8A2ogAkGYB2ooAgA2AgAgAiACKQKQBzcCtAMgAyAEIAJBqANqEOAaIQUgAS0A4AFBogFHDTIgASABEJosEKcXDDILIAEQoQsgAkH4A2ogARDtCyACKAL4AyEFIAItAJAEIgZBAkYNMSACQeABakEQaiIKIAdBEGooAgA2AgAgAkHgAWpBCGoiCyAHQQhqKQIANwMAIAIgBykCADcD4AEgAiAJKAAANgKgBSACIAlBA2ooAAA2AKMFAkAgAigC9AYiCCACKALsBkcNACACQewGakG02JsBEOkdCyACKALwBiAIQQV0aiIEIAU2AgAgBCACKQPgATcCBCAEIAY6ABggBCACKAKgBTYAGSAEQQxqIAspAwA3AgAgBEEUaiAKKAIANgIAIARBHGogAigAowU2AAAgAiAIQQFqNgL0BgwACwsgAkGABWpBCGoiBiACQewGakEIaigCADYCACACIAIpAuwGNwOABSACKAK4BSEFIAIoArQFIgRBgICAgHhGDTEgAigCvAUhByACQeABakEIaiAGKAIANgIAIAIgAikDgAU3A+ABIAIgBzYCyAUgAiAFNgLEBSACIAQ2AsAFIAEtAOABQRpGDQUgASgC3AEhBCABKALYASEDIAJBqAVqIAEQ1CYgAkEBNgL8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QZQCakEBEJYlIAgoAgAhCyAIQQE2AgAgCyACKAKYAmpB3wA6AAAgAkGUAmogHiAeIBpqENcgIAIoArABIAIoArQBENgsIAJBsAFqQQhqIAgoAgA2AgAgAiACKQKUAjcDsAEMAQsgCyACKALIAkGIr5wBEI4pAAsgAikCtAEhISACKAKkAiEIIAIoArABIgtBgICAgHhGDQAgAigCoAIgCBDYLCACIAs2AqACIAIgITcCpAIgIachCAsgAigCqAIhCyACQd8ANgLAAgJAIAggCyACQcACakEBEOolDQAgAkEBNgLEAiACQcyumwE2AsACIAJCATcCzAIgAiAjNwOIAiACIAJBiAJqNgLIAiACQbABaiACQcACahDtCSACKAKgAiACKAKkAhDYLCACQaACakEIaiACQbABakEIaigCADYCACACIAIpArABNwOgAgsgAkHAAmpBCGogAkGgAmpBCGooAgA2AgAgAiACKQOgAjcDwAICQCACQcACahD4JiIhQgODIiJCAFINACAhpyIIIAgoAgAiCEEBajYCACAIQX9MDQYLAkAgASgCcCIIIAEoAmhHDQAgIEHMoZsBEPcdCyABKAJsIAhBBHRqIgsgEzYCCCALICE3AwAgASAIQQFqNgJwQQAtAKDxngEaQcAAEH0iCEUNBSAIQQA2AgggCEIxNwMAIAQoAgwhCyAEIAg2AgwCQCAiQgBSDQAgIaciCCAIKAIAIghBAWo2AgAgCEEASA0GIAQoAgwhCAsgCBC0ASAEKAIMIghBADoAPCAIIAs2AjggCEIANwMwIAhBADYCICAIQQA6ABwgCCATNgIYIAggEjYCFCAIIBg2AhAgCCAhNwMIIAhBADYCAEEALQCg8Z4BGiAEKAIUIQsgBCgCECEIQcAAEH0iEUUNBSARQQA6ABwgESATNgIYIBEgEjYCFCARIBg2AhAgESAhNwIIIBFBGjYCAEEDIRMLIAIgDjYCzAEgAiAWNgLIASACIBE2ArQBIAIgEzYCsAEgAiAKrUIghiAXrYQ3A8ABIAIgC61CIIYgCK2ENwO4ASAEKAI8IQggBEEANgI8AkAgCEUNACACQcACakE4aiAIQThqKQMANwMAIAJBwAJqQTBqIAhBMGopAwA3AwAgAkHAAmpBKGogCEEoaikDADcDACACQcACakEgaiAIQSBqKQMANwMAIAJBwAJqQRhqIAhBGGopAwA3AwAgAkHAAmpBEGogCEEQaikDADcDACACQcACakEIaiAIQQhqKQMANwMAIAIgCCkDADcDwAIgAkGwAWogAkHAAmoQoQQhCyAIQcAAQQgQsxYgCyAEKAIoIAQoAiwQ4goCQCACKAJUIgQgAigCTEcNACACQcwAakHsoZsBEPUdCyACKAJQIARBAnRqIAs2AgAgAiAEQQFqNgJUDAILQdyhmwEQ0iwACwJAIAIoAlhBBUYNACACQdgAahDIDiACKAKcASIIIAIoAqABEJklIAIoApgBIAgQnS0gAigCeCIIQYCAgIB4Rg0AIAIoAnwiCyACKAKAARCeJSAIIAsQni0LIAIgBDYCWAJAQdQARQ0AIAkgAkGwAWpB1AD8CgAACyATIRQLIAZBAWohCyADQQBB2AAgAyAVRhtqIQggBiAQRg0EDAALCyACQQE2AsQCIAJB/J+bATYCwAIgAkIANwLMAiACIAJBsAFqNgLIAiACQcACakGEoJsBEOkjAAsACwJAIAAoAhQiA0UNACAAKAIQIQQgA0HYAGwhAwNAAkAgBCgCAEEFTw0AIAIgCzYCyAIgAiAGNgLEAiACIAg2AsACIAQgAkHAAmoQoAQgAkGwAWogDBDXEyACQcACakEQaiACQbABakEQaigCADYCACACQcACakEIaiACQbABakEIaikCADcDACACIAUgD0EEdGo2AuACIAIgBzYC3AIgAiAFNgLYAiACIAU2AtQCIAIgAikCsAE3A8ACIAJBwAJqELAHIAJBwAJqEK0DIAJB1AJqELUTDAYLIARB2ABqIQQgA0Gof2oiAw0ACwsgAkGwAWogDBDXEyACQcACakEQaiACQbABakEQaigCADYCACACQcACakEIaiACQbABakEIaikCADcDACACIAUgD0EEdGo2AuACIAIgBzYC3AIgAiAFNgLYAiACIAU2AtQCIAIgAikCsAE3A8ACIAJBwAJqELAHIAJBwAJqEK0DIAJB1AJqELUTIAYgCxDwIiAIIAYQny0MAwsgAigCWEEFRg0AAkBB2ABFDQAgAkGwAWogAkHYAGpB2AD8CgAACyACQbABaiACQcwAahCgBCAAKAIQIQMCQCAUIAAoAhQiBE8NACADIBRB2ABsaiIGKAIAQQpHDQAgBigCBCACKALoAUcNACAGKAIIIAIo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mAEgAiACKQNANwKQASAOIApBGGxqIQ8gAkGAAmpBDGohECACQdACakEMaiEJIAAoArQBIREgDiEBAkACQAJAA0ACQAJAIAEgD0YNAEGAgICAeCEEAkAgASgCAEGAgICAeEYNACACQYgDaiABQQRqKAIAIAFBCGooAgAQrxcgAigCiAMhBAsgBEGBgICAeEYNACABQRBqKAIAIQggAUEMaigCACEHIAIpAowDITcgAiABQRRqLQAAOgDkAiACIAg2AuACIAIgBzYC3AIgAiA3NwLUAiACIAQ2AtACIAJBsANqIAYgCSARIBEQeSACKAKwA0UNASACIAIpArQDNwPwAiACQZwBakEMaiAAQYABai8BADsBACACQdjCgAE2ApwBIAIgACkCeDcCoAEgAkGsAWpBDGogAEGoAWoiAS8BADsBACACQQYgAigC2AIgAigC0AJBgICAgHhGIgQbNgKAAyACQeDCgAEgAigC1AIgBBs2AvwCIAIgACkCoAE3ArABIAIgAkH8Amo2AqwBIAJBvAFqQQxqIAEvAQA7AQAgAiACKALcAjYC8AEgAiAAKQKgATcCwAEgAiACQfABajYCvAEgAkHMAWpBDGogAS8BADsBACACIAIoAuACNgKkAiACIAApAqABNwLQASACIAJBpAJqNgLMASACQbACakEMaiAAQYoBai8BADsBACACIAApAYIBNwK0AiACIAJB8AJqNgKwAiACQQE2AqwDIAJBAjYCpAMgAkECNgKcAyACQQM2ApQDIAJBAzYCjAMgAiACQbACajYCqAMgAiACQcwBajYCoAMgAiACQbwBajYCmAMgAiACQawBajYCkAMgAiACQZwBajYCiAMgAkEANgKQAiACQQY2AoQCIAJBhMOAATYCgAIgAkEFNgKMAiACIAJBiANqNgKIAiACQfwAaiACQYACahCPKSELIAItAPACIAIoAvQCEMoaIAJB0AJqEIspIAIoApgBIQQgAigClAEiDCEBA0AgBEUNBCABKAIAIAFBBGooAgAQkCkgAUEYaigCACEHAkAgAUEcaigCACIIKAIAIgVFDQAgByAFEQMACwJAIAgoAgQiBUUNACAHIAUgCCgCCBCzFgsgBEF/aiEEIAFBIGohAQwACwsgAigCmAEhBCACKAKUASEBIAIgAigCkAE2AsQBIAIgATYCwAEgAiABNgK8ASACIAEgBEEFdGo2AsgBIABBEGohEiAAQcAAaiETIABBxABqIRQgAEEYaiEVIABBFGohFiAAQSRqIRcgAEE4aiEYIABBBGohGSAAKAJwIhogACgCdEEKbGohGyACQYACakEEaiEcIAJB0AJqQQRqIR0gAkGIA2pBBGohHiACQYgDakEUaiEfIAJBzAFqQQxqISAgACgCuAEhISACQcwBakEEaiIiQQhqISMCQANAIAIoAsABIgEgAigCyAFGDQEgAiABQSBqNgLAASABKAIAIgRBgYCAgHhGDQEgASgCHCEkIAEoAhghJSAiIAEpAgQ3AgAgIyABQQxqKQIANwIAICJBEGogAUEUaigCADYCACACIAQ2AswBIAJBiANqIAYgICARIBEQeQJAIAIoAogDQQFHDQAgAigCjAMgAigCkAMQyhoMBgsgAkEwaiACKAKMAyImIAIoApADIicoAgwRBgAgAkGsAWogAigCMCACKAI0ENsFICYgJygCHBEEACEEICYgJygCEBEEACgCACEJIAJBKGogAigCtAEiAUEBQQFBiK+cARChGUEAIQwgAkEANgK4AiACIAIpAyg3ArACIAJBIGpBAUEEQRRBmMaAARChGSACQQA2AtgCIAIgAigCJCIoNgLUAiACIAIoAiA2AtACIAIgASACKAKwASIIajYCiAIgAiAINgKEAkGBgMQAIQEgCSEHA0AgAkGBgMQANgKAAgJAIAFBgYDEAEcNACAcEJMNIQELAkACQAJAAkACQAJAIAFBgIDEAEYNAAJAAkAgAUGAAU8NAEEBIQgMAQsCQCABQYAQTw0AQQIhCAwBC0EDQQQgAUGAgARJGyEICyAIIAdqIQdBACEFIAFBdmoOBAUCAgECCyACKQLUAiE3IAIoAtACIQEgAkGwAmoQzSwCQCACKAKsAUGAgICAeEYNACACQawBahDNLAsgJiAnEMMjIAFBgICAgHhHDQIMCwsgAigCgAIhCCACQYGAxAA2AoACAkACQAJAIAhBgYDEAEcNAAJAIAIoAoQCIgsgAigCiAJHDQBBgIDEACELDAMLIAIgC0EBajYChAIgCy0AACIIwEF/Sg0BIAIgC0ECajYChAIgCy0AAUE/cSEpIAhBH3EhEAJAIAhB3wFLDQAgEEEGdCApciEIDAILIAIgC0EDajYChAIgKUEGdCALLQACQT9x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AiAMQQFqIgw2AtgCIAJBADYCuAIgAigCgAIhASAFIQQgByEJDAALCwsgAkG8AWoQyRBBACELDAQLIAIoArgDIQQgAigCtAMhCAJAAkACQAJAIAIoApgBIgVFDQACQCACKAKUASIpIAVBBXRqIgdBYGoiKEUNACAHQXhqIgsoAgAgB0F8aiIMKAIAKAIYEQQAIAsoAgAgDCgCACgCIBEEAGogCCAEKAIYEQQASQ0DIAJBOGogKBDiJSACKALgAiACKALcAmoiCyAHQXBqKAIAIAdBbGoiKCgCACIHaiIMIAsgDEsbIQsCQAJAIAIoAjgiDEUNACACQYgDaiAMIAIoAjwQiRggKCgCACEHDAELIAJBgICAgHg2AogDCyACQYACakEIaiIoIAJBiANqQQhqIgwoAgA2AgAgAiACKQKIAzcDgAIgAkEAOgCUAiACIAc2AowCIAIgCyAHazYCkAIgAkGwAmogBiAQIBEgERB5AkAgAigCsAIiBw0AIAIgBUF/aiIHNgKYASACKAK4AiEFIAIoArQCIQsgDCApIAdBBXRqIgdBCGopAgA3AwAgAkGIA2pBEGoiKSAHQRBqKQIANwMAIAJBiANqQRhqIAdBGGopAgA3AwAgAiAHKQIAIjc3A4gDAkAgN6dBgYCAgHhGDQAgAkGIA2oQiykgAigCoAMgAigCpAMQwyMLICkgAkGAAmpBEGopAwA3AwAgDCAoKQMANwMAIAIgAikDgAI3A4gDIAIgBTYCpAMgAiALNgKgAyACQZABaiACQYgDakGEwoABEMYUIAggBBDDIyACQdACahCLKQwFCyACQYACahCLKSACKAK4AiEFIAcNAiACKAK0AiAFEMMjDAMLQfTBgAEQ0iwACyACQYgDakEQaiACQdACakEQaikCADcDACACQYgDakEIaiACQdACakEIaikCADcDACACIAIpAtACNwOIAyACIAQ2AqQDIAIgCDYCoAMgAkGQAWogAkGIA2pBpMKAARDGFAwCCyACLQC0AiAFEMoaCyACQYgDakEQaiACQdACakEQaikCADcDACACQYgDakEIaiACQdACakEIaikCADcDACACIAIpAtACNwOIAyACIAQ2AqQDIAIgCDYCoAMgAkGQAWogAkGIA2pBlMKAARDGFAsgAUEYaiEBDAALCyACKAKQASAMENMsDAELIAJBzAFqEIspICUgJBDDIyACQbwBahDJEEEBIQsLIA4hAQJAA0AgCkUNASABKAIAIAFBBGooAgAQkCkgCkF/aiEKIAFBGGohAQwACwsgDSAOQQRBGBCSFSALDQEgAigCfCEFCyACKQKAASE3DAELIAJB/ABqEM0sQYCAgIB4IQULIABBwAFqIQQLIAMoAjghByACQQhqIAMoAjwiAUEEQShB4OmbARCiGSACQQA2AogCIAIgAigCDDYChAIgAiACKAIIIgg2AoACAkACQCABIAhNDQAgAkGAAmpBACABQQRBKBD9CAwBCyABDQAgAkHQAGpBCGogAkGAAmpBCGooAgA2AgAgAiACKQKAAjcDUAJAAkAgAygCAEECRw0AQQAhAQwBCyADKAIMIQggAygCCCEBCwJAAkACQCADQSRqKAIARQ0AIAJBiANqIAQoAgBBCGogA0EgaigCACgCABCXAwJAAkAgAigCiANFDQAgAkHQAmpBCGogAkGIA2pBCGopAgA3AwAgAiACKQKIAzcD0AIMAQsgAkEANgLQAgsgA0EkaigCAEUNASACQYgDaiAEKAIAQQhqIANBIGooAgAoAgQQlwMCQCACKAKIA0UNACACQYACakEIaiACQYgDakEIaikCADcDACACIAIpAogDNwOAAgwDCyACQQA2AoACDAILIAJBADYC0AILIAJBADYCgAILAkACQAJAAkAgAigC0AIiBw0AQYCAgIB4IQsMAQsgAkEANgK4AiACQoCAgIAQNwKwAiACQYCAgAE2AowDIAJCoICAgA43ApADIAIgAkGwAmo2AogDIAdB6ABqIAJBiANqENcoDQEgAikCtAIhOCACKAKwAiELCwJAAkAgAUUNACACQYgDaiABIAgQ/xMMAQsgAkGAgICAeDYCiAMLIAMoAhhFDQEgAkHwAGogAygCFCIBQQRqKAIAIAFBCGooAgAQrxcgAkHgAGpBCGoiDCACQYgDakEIaigCADYCACACIAIpAogDNwNgIAIoAowCIQkgAigChAIhCiACKAKAAiEoIAIoAtwCISkgAigC1AIhECAAKAK8ASIEQQhqEJEXIQACQCAEKAIUIgggBCgCDEcNACAEQQxqEMMdCyAEKAIQIAhB3ABsaiIBIAk2AhwgASAoQQBHIgk2AhggASAKNgIUIAEgCTYCECABICk2AgwgASAHQQBHIgc2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GC8BADsBACAIIAMpA+AINwGWASAIQZ4BaiALLwEAOwEAIAggEDYCtAEgCCAFNgK4ASAIIBE2ArwBIAggEjYCwAEgCEGoAWogGi8BADsBACAIIAMpA9AINwKgASAIIAMpA8AINwGqASAIQbIBaiAVLwEAOwEAIANBxwVqIhFBACkDgIWeASIcNwAAIANBACkD+ISeASIbNwC/BSADQakEaiADQbwFakEIaiIJKQAANwAAIANBsARqIANBywVqIhIoAAA2AAAgA0EAOgCgBCADIAMpALwFNwChBCARIBw3AAAgAyAbNwC/BSADQQA6ALQEIANBxARqIBIoAAA2AAAgA0G9BGogCSkAADcAACADIAMpALwFNwC1BCARIBw3AAAgAyAbNwC/BSADQQE6AN4EIANBADYA3wQgA0EAOgCEBCADQQA2AoAEIANBgAI7AdwEIANBuICAATYCjAQgAyAINgKIBCADQQA6AMgEIANBADYCnAQgA0KAgICAwAA3ApQEIANBADoAkAQgA0HYBGogEigAADYAACADQdEEaiAJKQAANwAAIAMgAykAvAU3AMkEAkBBKEUNACADQbwFaiADQZACakEo/AoAAAsgAyADQYAEajYC6AUgAyADQYwCajYC5AVBFiADQYAEahD6JCERIANB8AhqIAMoAowCIANBgARqIANBvAVqIANBvAVqQQxqED8CQAJAIAMoAvAIQYCAgIB4Rw0AIANB8AZqEOcnIANBkAlqIgkgA0HwBmpBDGopAgA3AwAgA0GICWpBEGoiEiADQYQHaigCADYCACADIAMpAvQGNwOICSADKALwBiEGQSwQ6CciCCAGNgIEIAhBoNeAATYCACAIIAMpA4gJNwIIIAhBEGogCSkDADcCACAIQRhqIBIoAgA2AgAgCCADKQL0CDcCHCAIQSRqIANB8AhqQQxqKQIANwIAIAMgCDYC9AYgA0GAgICAeDYC8AYMAQsgA0HwBmpBEGogA0HwCGpBEGopAgA3AwAgA0HwBmpBCGogA0HwCGpBCGopAgA3AwAgAyADKQLwCDcD8AYLQbDimAEgERCtJgJAAkAgAygCgAQNACADKAL0BiENIAMoAvAGIgxBgICAgHhGDQYgAykDgAchHCADKAL8BiEOIAMoAvgGIQoMAQsgAygC9AMiCEEIahCRF0EAOgAAIAgoAhQhDiAI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IQEMAgsgAyADKQOIATcD0AEgAyADKQOYATcDkAIgA0ECNgLcAiADQZyrmwE2AtgCIANCAjcC5AIgA0HMBK1CIIYiEiADQZACaq2ENwOAAiADIBIgA0HQAWqthDcD+AEgAyADQfgBajYC4AIgA0HIAmogA0HYAmoQoA4gA0HIAmoQ+CYhEiAAQQA2AgAgACASNwMIIAMpA5ACEMUhIAMpA9ABEMUhC0EBIQELIAcQvwEgB0HAAEEIELMWIAYQvwEgBkHAAEEIELMWIAUNBAwXCyADQShqQSBqIAJBKGopAwA3AwAgA0EoakEYaiACQSBqKQMANwMAIANBKGpBEGogAkEYaikDADcDACADQShqQQhqIAJBEGopAwA3AwAgAyACKQMIIhI3AygCQCASpyIEQQFHDQAgA0HYAmpBJGogAkEIaiIBQSBqKQIANwIAIANB2AJqQRxqIAFBGGopAgA3AgAgA0HYAmpBFGogAUEQaikCADcCACADQdgCakEMaiABQQhqKQIANwIAQQAtAKDxngEaIAMgASkCADcC3AJBwAAQfSIBRQ0aIAFBFDYCACABIAMpAtgCNwIEIAFBDGogA0HgAmopAgA3AgAgAUEUaiADQegCaikCADcCACABQRxqIANB8AJqKQIANwIAIAFBJGogA0H4AmopAgA3AgAgAUEsaiADQYADaigCADYCACAAQQI2AgAgACABNgIEDBYLIAEoAgQhECADKAJEIQsgAygCQCEMIAMoAkghBRD6JyEHIANB2AJqIAUQQiAHQThqIANB2AJqQThqIgopAwA3AwAgB0EwaiADQdgCakEwaiIOKQMANwMAIAdBKGogA0HYAmpBKGopAwA3AwAgB0EgaiADQdgCakEgaikDADcDACAHQRhqIANB2AJqQRhqKQMANwMAIAdBEGogA0HYAmpBEGopAwA3AwAgB0EIaiADQdgCakEIaikDADcDACAHIAMpA9gCNwMAAkACQCAEDQAgAygCNCEGIAMoAjAhDSADKAI8IQEgAygCOCEOAkAgAykDMCISQgODQgBSDQAgEqciCiAKKAIAIgpBAWo2AgAgCkF/TA0cCyADIAY2AtgCIANBgAFqIQoMAQsgAygCNCEBIAMoAjAhDSADKAIsIQ8Q+ichBiADQdgCaiAPEEIgBkE4aiAKKQMANwMAIAZBMGogDikDADcDACAGQShqIANB2AJqQShqKQMANwMAIAZBIGogA0HYAmpBIGopAwA3AwAgBkEYaiADQdgCakEYaikDADcDACAGQRBqIANB2AJqQRBqKQMANwMAIAZBCGogA0HYAmpBCGopAwA3AwAgBiADKQPYAjcDACADQdgCaiEKCyAKIAE2AgBBAC0AoPGeARogAygCgAEhCiADKALYAiEPQcAAEH0iAUUNGSABIAc2AiggASALNgIkIAEgDDYCICABIAo2AhwgASAONgIYIAEgDzYCFCABIA02AhAgASAGNgIMIAEgBDYCCCABQRQ2AgACQAJAAkAgBA4DAAIBAAtBASEHQQAhBiADKQMwIRIMFQsCQAJAIAMoAiwiBygCAEEbRw0AIAcoAghFDQELIAAgATYCBCAAQQI2AgAgBxC/ASAHQcAAQQgQsxZBACEHQQEhBgwWCyAHKQMQIRIgBykDICITUA0TIBNCA4NCAFINEyATpyIGIAYoAgAiCkF/ajYCAAJAIApBAUcNACAGIAYoAhAQxiQLIAcoAgBBG0cNAyAHQQhqIgYoAgBFDRMgBhCFCQwTCyAAIAE2AgQgAEECNgIAQQEhBkEBIQcMFAsgAigCCA4EBQMDBAMLIANB6ABqIAJBHGopAgAiEjcDACADQdAAakEQaiIHIAJBFGopAgA3AwAgA0HQAGpBCGogAkEMaikCADcDACADIAIpAgQ3A1AgAygCbCEFIANBuAFqIANB0ABqEJUJIANBuAFqQQxqIAcoAgAiBiADKAJkIgQQ+AhBAC0AoPGeARpBwAAQfSIHRQ0XIAdBHDYCACAHIAMpArgBNwIEIAcgBTYCICAHIBKnNgIcIAdBDGogA0G4AWpBCGopAgA3AgAgB0EUaiADQbgBakEQaikCADcCACADIAc2AqwBIANBAjYCqAEgAygCUCEFIAMoAlQhByADKAJYIQogAyADKAJcNgLYASADIAY2AtABIAMgBiAEQQV0ajYC3AEgAyAGNgLUASAERQ0MIAMgBkEgajYC1AEgBi0AGCIEQQJGDQwgA0HYAmpBEGogBkEQaikDADcDACADQdgCakEIaiAGQQhqKQMANwMAIAYpAwAhEiADQdgCakEcaiAGQRxqKAAANgAAIAMgEjcD2AIgAyAGKAAZNgDxAiADIAQ6APACIANBADYCgAIgA0KAgICAEDcC+AEgA0HgqZsBNgKEASADQqCAgIAONwKIASADIANB+AFqNgKAAQJAIANB2AJqIANBgAFqEOsiDQAgAygC+AEhBiADKQL8ASESIANB2AJqEM4TIAZBgICAgHhGDQ0gAyASNwLoASADIAY2AuQBIANB2AJqQQhqIANB0AFqQQhqKQIANwMAIAMgAykC0AE3A9gCIANBADYCgAMgA0IANwP4AiADIAcgCkECdGo2AvQCIAMgBTYC8AIgAyAHNgLsAiADIAc2AugCIANB2AJqQRBqIQ8gAygC3AIiByADKALkAkYNDyADQYABakEZaiIFQQNqIQoDQCADIAdBIGo2AtwCIActABgiBkECRg0QIAUgBygAGTYAACADQYABakEQaiILIAdBEGoiDCkDADcDACADQYABakEIaiINIAdBCGoiDikDADcDACAKIAdBHGooAAA2AAAgAyAGOgCYASADIAcpAwA3A4ABAkAgAygC7AIiBCADKAL0AkcNACADQYABahDOEwwRCyADQfgBakEIaiAOKQMAIhI3AwAgA0H4AWpBEGogDCkDACITNwMAIAMgBEEEajYC7AIgAyAHKQMAIhQ3A/gBIAMgB0EZaiIHKAAANgLwASADIAdBA2ooAAA2APMBIAQoAgAhByALIBM3AwAgDSASNwMAIAUgAygC8AE2AAAgCiADKADzATYAACADIBQ3A4ABIAMgBjoAmAEgA0GQAmogASAHEFgCQAJAAkACQAJAIAMoApACDgIBABQLIANBoAJqIAMrA5gCEMsODAELIAMgAykDmAI3A7ACIANBADYCxAIgA0KAgICAEDcCvAIgA0HgqZsBNgLMAiADQqCAgIAONwLQAiADIANBvAJqNgLIAiADQbACaiADQcgCahDrIg0BIANBoAJqQQhqIANBvAJqQQhqKAIANgIAIAMgAykCvAI3A6ACIAMpA7ACIhJCA4NCAFINACASpyIHIAcoAgAiBkF/ajYCACAGQQFHDQAgByAHKAIQEMYkCyADQeQBaiADKAKkAiIHIAcgAygCqAJqENcgIANBGGogA0GAAWoQ8RUgA0HkAWogAygCGCIHIAcgAygCHGoQ1yAgAygCoAIgAygCpAIQ2CwgAygCkAJFDQEgA0GQAmoQtxgMAQtBjKycAUE3IANBnwNqQfipmwFBkK2cARDqEgALIANBgAFqEM4TIAMo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AgBBcGoiAEETSw0IQQEgAHRBlaggcQ0KIABBC0YNBwwICyABDQUMBAsgA0HYAmogA0GAAWoQnwVBAC0AoPGeARpBwAAQfSIBRQ0BIAEgAykD2AI3AwAgAUE4aiADQdgCakE4aikDADcDACABQTBqIANB2AJqQTBqKQMANwMAIAFBKGogA0HYAmpBKGopAwA3AwAgAUEgaiADQdgCakEgaikDADcDACABQRhqIANB2AJqQRhqKQMANwMAIAFBEGogA0HYAmpBEGopAwA3AwAgAUEIaiADQdgCakEIaikDADcDACAHEL8BIAdBwABBCBCzFiAFQQFLIQwgASEHCwJAAkAgCkEBTQ0AIAYhBQwBCyADQdgCaiALEJ8FQQAtAKDxngEaQcAAEH0iBUUNASAFIAMpA9gCNwMAIAVBOGogA0HYAmpBOGopAwA3AwAgBUEwaiADQdgCakEwaikDADcDACAFQShqIANB2AJqQShqKQMANwMAIAVBIGogA0HYAmpBIGopAwA3AwAgBUEYaiADQdgCakEYaikDADcDACAFQRBqIANB2AJqQRBqKQMANwMAIAVBCGogA0HYAmpBCGopAwA3AwAgBhC/ASAGQcAAQQgQsxYLQQAtAKDxngEaQcAAEH0iAUUNACABIAQ6ABQgASAINgIQIAEgCTYCDCABIAU2AgggASAHNgIEIAFBEjYCACAAIAE2AgQgAEECNgIAIApBAU0NASALELcYDAELAAsgA0GAAWohCyAMRQ0BCyALELcYCyACKAIAQXBqIgBBE0sNAUEBIAB0QZWoIHENAyAAQQtHDQELIAIoAggOBAIBAQIBCyACEL8BDAELIAJBCGoQhQkLIAJBwABBCBCzFgsgA0GgA2okAAvlPQISfwR+IwBBgANrIgQkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAg4MBwAIAQILAwQFBg8QBwsgBEGwAWogASgCACIBIANBBGooAgAgA0EIaigCABCtCCAEELkaNgLIASAEQQA2ArABIAEgBEGwAWoQ2h4MIwsgBEHYAGpBEGogA0EQaikCADcDACAEQdgAakEIaiADQQhqKQIANwMAIAQgAykCADcDWCABKAIAIgMsABYh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IARBsAFqENoeDBYLIARBsAFqIAIQsg8gBCgCsAFBEEYNCSAEQeACakEYaiAEQbABakEYaigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiAEQbABakEIaikCADcDACAEIAQpArABNwPgAiAEQbACaiAEQeACahCmFCAEQbABaiACIAMtAHAgBEGwAmoQpiQCQCAEKAKwASIBQYCAgIB4Rg0AAkBBJEUNACAAQQRqIARBsAFqQQRqQST8CgAACyAAIAE2AgAgBCgCsAIgBCgCtAIQ9ywMFwsgBEHsAmogBEGwAmpBCGopAgA3AgAgBCAEKQKwAjcC5AIgBEEANgLgAiAEQbABaiAEQeACahDpCyACIARBsAFqENoeDBULIARBADYCrAIgBEKAgICAwAA3AqQCIAEoAgAhBSAEQeACakEEaiEDIARBsAFqQQRqIQIDQCAEQbABaiAFELIPAkAgBCgCsAEiAUEQRw0AIARBCDYCsAIMDwsgAyACKQIANwIAIANBEGogAkEQaikCADcCACADQQhqIgYgAkEIaikCADcCACAEIAE2AuACAkACQAJAAkACQAJAAkACQAJAAkBBACABQXlqIgcgByABSxsOCQgAAQIDBAUGBwgLIARB2ABqQQhqIAYoAgA2AgAgBCADKQIANwNYIARBsAJqIARB2ABqEN8VDAgLIARBATYCtAEgBEG46oQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQcDqhAEQ6SMACyAEQQE2ArQBIARBoOuEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakGo64QBEOkjAAsgBEEBNgK0ASAEQYjshAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBkOyEARDpIwALIARBATYCtAEgBEHs7IQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQfTshAEQ6SMACyAEQQE2ArQBIARB2O2EATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakHg7YQBEOkjAAsgBEEINgKwAgwCCyAEQQE2ArQBIARByO6EATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakHQ7oQBEOkjAAsgBEGwAmpBGGogBEHgAmpBGGooAgA2AgAgBEGwAmpBEGogBEHgAmpBEGopAgA3AwAgBEGwAmpBCGogBEHgAmpBCGopAgA3AwAgBCAEKQLgAjcDsAILAkAgAUEJSQ0AIARB4AJqEL8aCyAEKAKwAkEIRg0OIARBsAFqIAUQsg8gBCgCsAFBEEYNCyAEQeACakEYaiAEQbABakEYaigCADYCACAEQeACakEQaiAEQbABakEQaikCADcDACAEQeACakEIaiAEQbABakEIaikCADcDACAEIAQpArABIhY3A+ACIBanQQ9HDQwgBEHgAmoQvxogBEGkAmogBEGwAmpBkOGEARDPFAwACwsgBEEANgKgAiAEQoCAgIDAADcCmAIgASgCACEGIARB4AJqQQRqIQMgBEGwAWpBBGohAgNAIARBsAFqIAYQsg8CQCAEKAKwASIBQRBHDQAgBEEINgKwAgwNCyADIAIpAgA3AgAgA0EQaiACQRBqKQIANwIAIANBCGoiByACQQhqKQIANwIAIAQgATYC4AICQAJAAkACQAJAAkACQAJAAkACQEEAIAFBeWoiBSAFIAFLGw4JCAABAgMEBQYHCAsgBEHYAGpBCGogBygCADYCACAEIAMpAgA3A1ggBEGwAmogBEHYAGoQ3xUMCAsgBEEBNgK0ASAEQbTlhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpBvOWEARDpIwALIARBATYCtAEgBEGg5oQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQajmhAEQ6SMACyAEQQE2ArQBIARBjOeEATYCsAEgBEIANwK8ASAEIARBzAJqNgK4ASAEQbABakGU54QBEOkjAAsgBEEBNgK0ASAEQfDnhAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB+OeEARDpIwALIARBCDYCsAIMAwsgBEEBNgK0ASAEQdzohAE2ArABIARCADcCvAEgBCAEQcwCajYCuAEgBEGwAWpB5OiEARDpIwALIARBATYCtAEgBEHM6YQBNgKwASAEQgA3ArwBIAQgBEHMAmo2ArgBIARBsAFqQdTphAEQ6SMACyAEQbACakEYaiAEQeACakEYaigCADYCACAEQbACakEQaiAEQeACakEQaikCADcDACAEQbACakEIaiAEQeACakEIaikCADcDACAEIAQpAuACNwOwAgsCQCAB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CUGcuIABEL4lLQABRw0SIBQoAgAgEygCACAJQQJqQbS9gwEQviUhAgwFCyAJIAtB5LyDARDhLAALIBQoAgAgEygCACAKQQJ0IBVqQaS9gwEQviUhAgwDCyAUKAIAIBMoAgAgFSAKQQJ0akEBakGUvYMBEL4lIQIMAgsgFCgCACATKAIAIBUgCkECdGpBAmpBhL2DARC+JSECDAELIBAgD0Gsn4ABEJEVAAsgAigCACEJCwJAIAkgASgCtAJLDQAgCUUNDCAJIAEoArgCSw0AIAEoAighCiADQQhqIBQoAgAgEygCACAJQfS9gwEQsSICQAJAIAMoAgwiC0UNAAJAAkAgAygCCCIMLQAAIgJB/wFGDQAgAiACQQJ2aiACQQNxQQBHakECaiECDAELIApBAmohAgsgAiALTw0BAkACQCAMIAJBAnRqKAIAIgpBf0wNAAJAIAJBAWoiAiALTw0AIAwgAkECdGooAgAhAgwCCyACIAtBrLWDARCRFQALIApB/////wdxIQILIANBkAFqIAIgB0EBaiILIAFBEGooAgAgCCgCACACQeS9gwEQviUoAgBrIAsQ3RcgAygCkAEgBEsNAiADQYABakEIaiADQZABakEIaigCADYCACADIAMpApABNwOAAUEBIQ0gBkEBcUUNAiADQZABaiEODA4LQQBBAEHMtYMBEJEVAAsgAiALQZy1gwEQkRUACyAHQQFqIQcMAAsLQQBBAEHMtYMBEJEVAAsgByALQZy1gwEQkRUAC0EAQQBBzLWDARCRFQALIABBADYCAAwHCwJAIAZBAXENAEEAIRUCQAJAAkAgASgCvAIiCUUNAEEAIRUgCSABKAK4AksNACABKAIoIQogA0HIAGogAUEEaigCACABQQhqKAIAIAlB9L2DARCxIiADKAJMIgtFDQICQAJAIAMoAkgiDC0AACIHQf8BRg0AIAcgB0ECdmogB0EDcUEAR2pBAmohBwwBCyAKQQJqIQcLIAcgC08NAQJAAkAgDCAHQQJ0aigCACIKQX9MDQACQCAHQQFqIgcgC08NACAMIAdBAnRqKAIAIQcMAgsgByALQay1gwEQkRUACyAKQf////8HcSEHCyADQZABaiAHIAQgAUEQaigCACABQRRqKAIAIAdB5L2DARC+JSgCAGsgBBDdF0EBIRULIAIoAgwiDyAEIA8gBEsb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JSECDAILIBQoAgAgEygCACAOIBFqIApBAnRqQQJqQYS9gwEQviUhAgwBCyASIAhBrJ+AARCRFQALIAIoAgAhCQsCQAJAIAkgASgCtAJLDQAgCUUNByAJIAEoArgCSw0AIAEoAighCyADQSBqIAFBBGooAgAgAUEIaigCACAJQfS9gwEQsSIgAygCJCIJRQ0BAkACQCADKAIgIgctAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgC0ECaiECCyACIAlPDQMCQAJAIAcgAkECdGooAgAiC0F/TA0AAkAgAkEBaiICIAlPDQAgByACQQJ0aigCACECDAILIAIgCUGstYMBEJEVAAsgC0H/////B3EhAgsgA0GQAWogAiAEQQFqIgkgAUEQaigCACABQRRqKAIAIAJB5L2DARC+JSgCAGsgCRDdFwwGCyAEQQFqIQQMAQsLQQBBAEHMtYMBEJEVAAsgAiAJQZy1gwEQkRUACyACIAlBnLWDARCRFQALQQBBAEHMtYMBEJEVAAsgACADKQKQATcCBCAAQQxqIANBmAFqKAIANgIAQQEhFQsgACAVNgIADAYLAkACQAJAAkACQCABKAK8AiIJRQ0AIAkgASgCuAJLDQAgASgCKCELIANB4ABqIAFBBGooAgAgAUEIaigCACAJQfS9gwEQsSIgAygCZCIJRQ0CAkACQCADKAJgIgctAAAiAkH/AUYNACACIAJBAnZqIAJBA3FBAEdqQQJqIQIMAQsgC0ECaiECCyACIAlPDQECQAJAIAcgAkECdGooAgAiC0F/TA0AAkAgAkEBaiICIAlPDQAgByACQQJ0aigCACECDAILIAIgCUGstYMBEJEVAAsgC0H/////B3EhAgsgA0GAAWogAiAEIAFBEGooAgAgAUEUaigCACACQeS9gwEQviUoAgBrIAQQ3RcgAEEBNgIAIABBDGogA0GIAWooAgA2AgAgACADKQKAATcCBAwKCyADQZABaiAHIAFBIGoiFSgCACILKAIIQX9qQXhxakEIaiACKAIIIgYgAigCDCISIAQgBSALKAIQERIAAkAgAygCkAEiAg4DBAMABAsgAUEsaiENIAMoApQBIQIgAUEIaiETIAFBBGohFAJAAkACQAJAAkADQAJAIAIiBCAFSQ0AIABBADYCAAwQCwJAAkACQCAEIBJP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CwsgFCgCACATKAIAIApBAnQgDiAGampBpL2DARC+JSECDAQLIAAgAykCgAE3AgQgACAINgIAIABBDGogA0GIAWooAgA2AgAMDQsgDiAJQeS8gwEQ4SwACyAUKAIAIBMoAgAgDiAGaiAKQQJ0akEBakGUvYMBEL4lIQIMAQsgFCgCACATKAIAIA4gBmogCkECdGpBAmpBhL2DARC+JSECCyACKAIAIQkLIAkgASgCtAJLDQEgCUUNAwJAAkACQCAJIAEoArgCSw0AIAEoAighDCADQegAaiAUKAIAIBMoAgAgCUH0vYMBELEiIAMoAmwiB0UNBwJAAkAgAygCaCILLQAAIgJB/wFGDQAgAiACQQJ2aiACQQNxQQBHakECaiECDAELIAxBAmohAgsgAiAHTw0IIAsgAkECdGooAgAiDEF/TA0BAkAgAkEBaiICIAdPDQAgCyACQQJ0aigCACEHDAMLIAIgB0GstYMBEJEVAAsgA0GQAWogASgCHCANKAIAIgIoAghBf2pBeHFqQQhqIBIgESAEIAUgAigCEBESAAJAIAMoApABRQ0AIAMoApQBIgIgBE0NBAwFCyAAQQA2AgAMCgsgDEH/////B3EhBwsgA0GAAWogByAEQQFqIgIgAUEQaigCACAPKAIAIAdB5L2DARC+JSgCAGsgAhDdF0EBIQgMAgsgBCARQayfgAEQkRUACyAEQQFqIQIMAAsLIAAgAykCgAE3AgQgACAINgIAIABBDGogA0GIAWooAgA2AgAMBAtBAEEAQcy1gwEQkRUACyACIAdBnLWDARCRFQALIAcgC0GctYMBEJEVAAsgACANNgIAIAAgDikCADcCBCAAQQxqIA5BCGooAgA2AgALIANBoAFqJAALhDYCFX8EfiMAQZADayIEJAACQAJAAkACQAJAAkACQAJAAkACQCACKAIADggCAgAAAAABAwALIABBFDYCACAAIAIpAwA3AwggAEEoaiACQSBqKQMANwMAIABBIGogAkEYaikDADcDACAAQRhqIAJBEGopAwA3AwAgAEEQaiACQQhqKQMANwMADAcLIAQgAigCBCIFKQMAIAVBEGoiBigCABC5HyABQSBqIAQpAwAgBCgCCBCJBiEHIARB2ABqQRBqIgggBikDADcDACAEQdgAakEIaiAFQQhqKQMAIhk3AwAgBCAFKQMAIho3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ACAEQbACakEIaiARQQhqKQIANwMAIAQgESkCADcDsAILAkAgDSAEKAL0AUcNACAEQfQBakECQQEgBCgCAEETSRsQrCUgBCgC+AEhEAsgECAPaiIGQXxqIAg2AgAgBiAEKQOwAjcCACAGQQhqIARBsAJqQQhqKQMANwIAIAZBEGogBEGwAmpBEGopAwA3AgAgBkEYaiAEQbACakEYaikDADcCACAGQSBqIARBsAJqQSBqKQMANwIAIAZBKGogBEGwAmpBKGooAgA2AgAgBCANQQFqIg02AvwBIA9BMGohDwwACwsgBiAEKAIIQeDpmwEQjikAC0EAIRBBACERDAELIARBqAFqIARBkAFqEOMCAkACQCAEKAKoAUETRg0AIARBBEEIQTAQlQ8gBCgCBCEGIAQoAgBBAUYNAyAEKAIIIgggBCkDqAE3AwAgCEEoaiAEQagBakEoaikDADcDACAIQSBqIARBqAFqQSBqKQMANwMAIAhBGGogBEGoAWpBGGopAwA3AwAgCEEQaiAEQagBakEQaikDADcDACAIQQhqIARBqAFqQQhqKQMANwMAIARBATYCuAIgBCAINgK0AiAEIAY2ArACIARB4AJqQRBqIARBkAFqQRBqKQIANwMAIARB4AJqQQhqIARBkAFqQQhqKQIANwMAIAQgBCkCkAE3A+ACQTAhDEEBIQ0CQANAIAQgBEHgAmoQ4wIgBCgCAEETRg0BAkAgDSAEKAKwAkcNACAEQbACakEBEKwlIAQoArQCIQgLIAggDGoiBiAEKQMANwMAIAZBKGogBEEoaikDADcDACAGQSBqIARBIGopAwA3AwAgBkEYaiAEQRhqKQMANwMAIAZBEGogBEEQaikDADcDACAGQQhqIARBCGopAwA3AwAgBCANQQFqIg02ArgCIAxBMGohDAwACwsgBEHgAmoQvhsgBCgCsAIhDAwBCyAEQZABahC+G0EIIQhBACEMQQAhDQtBASEQC0EAQQgQni1BAEEAIAFBEGogASkDEFAiBhtBACADGyAGGyEGIAQoAoABIg8gASgCZEchEgJAIAdFDQACQAJAIAZFDQACQCAGKQMAIhtCA4NCAFINACAbpyIBIAEoAgAiAUEBajYCACABQX9MDQoLIAYoAgghBiAEKAJ8IRYgBCgCeCEPAkAgBCkDcCIaQgODQgBSDQAgGqciASAB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DQELIAVFDQogAS0AkQFBIHFFDQIgARDYCSIERQ0CIAQtAABBEkcNAiABLQCRAUEgcQ0BIAJBgICAgHg2AvACDAILIAEoAtgBIQQgAS0A4AFB+ABGDQIgASgC3AEhCiACQZgDaiABENQmQQEhBiACQQE2AqwBIAJBnL+cATYCqAEgAkIBNwK0ASACQbMHNgLUBCACQfgAOgDIBCACIAJB0ARqNgKwASACIAJB2ARqNgLQBCACIAJByARqNgLYBCACQagDaiACQagBahCSECACQbwDaiACQaADaigCADYCACACIAIpApgDNwK0AyAEIAogAkGoA2oQ4BohBCABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgASgCiAEhBiACQcADaiABEN0BIAEgASgCiAFBAXIQqBIgASgC2AEhBCABEKELIAJBqAFqIAEgBBC7AgJAAkACQCACKAKoAUGAgICAeGoOAgACAQsgASACQcADahDHBSACQYCAgIB4NgLwAgwCCwJAQShFDQAgAkHwAmogAkGoAWpBKPwKAAALIAEgASgCiAFBfnEgBkEBcXIQqBIgAkHAA2oQliYgAigC8AJBgICAgHhGDQFBACEGIAJB8AJqEKYiIQQMCwsgASACQcADahDHBSACQYCAgIB4NgLwAiACQawBahDpBwsgARDYCSIERQ0HIAQtAAANByABEIsnDQcgAkH4ADoAyAQgAS0A4AEhBCACIAJByARqNgLYBAJAIARB+ABGDQAgASgC3AEhBCABKALYASEFIAJBmANqIAEQ1CZBASEGIAJBATYCrAEgAkGcv5wBNgKoASACQgE3ArQBIAJBswc2AtQEIAIgAkHQBGo2ArABIAIgAkHYBGo2AtAEIAJBqANqIAJBqAFqEJYQIAJBvANqIAJBoANqKAIANgIAIAIgAikCmAM3ArQDIAUgBCACQagDahDgGiEEIAEtAOABQaIBRw0KIAEgARCaLBCnFwwKCyABEKELIAEpA9ABIREgAkEBNgKoASACIBE3AqwBIAJB0ABqIAFBASACQagBahB6IAIoAlQhBCACKAJQIQYMAQsgARChCyACQQA2ArABIAJCgICAgMAANwKoASACQdgAaiABQQEgBCACQagBahDTCyACKAJcIQQgAigCWCEGCyAGQQJGDQUMBwsgARChCyABKALUASEFQQhBwAAQ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IQUgBEECOwG8DQJAIANB//8DcQ0AQQEhBSAEQQE2AsQNIARB4eCXATYCwA0gBEG8DWohAgwCCyAEIAk2AswNIARBADsByA0gBEECNgLEDSAEQZSImQE2AsANIARBvA1qIQIMAQtBASEFIARBATYCxA0gBEHh4JcBNgLADSAEQbwNaiECCyAEIAU2AqQMIAQgAjYCoAwgBCALNgKcDCAEIAo2ApgMIAAgBEGYDGoQyAUhBSAEQeAOaiQAIAUL6yUCHn8HfiMAQdAAayICJAACQAJAIAEoAgAiA0EJRw0AIABBCGogAUEIahBMIABBCTYCAAwBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMOCQABAgMEBQYHCAALIAEoAgghBCABKAIYIQUgASgCFCEGIAJBCGogASgCDCIHQQhByAAQlQ8gAigCDCEIIAIoAghBAUYNCCACKAIQIQkCQCAIRQ0AIAdByABsIQpBACELIAghDANAIAogC0YNAQJAAkACQAJAIAQgC2oiDSkDACIgQn18IiGnQQFqQQAgIUICVBsOAwABAgALIA1BMGooAgAhDiANQSxqKAIAIQ8gDUEoaigCACEQIA1BPGooAgAhESANQThqKAIAIRICQCANQSBqKQMAIiFCA4NCAFINACAhpyITIBMoAgAiE0EBajYCACATQX9MDRALQgIhIiANQTRqLQAAIRQCQAJAICBCAlINACAVIRMMAQsgDUEUaigCACETIA1BEGooAgAhFgJAAkAgDSgCAEEBRw0AAkAgDUEIaikDACIgQgODQgBSDQAgIKciFyAXKAIAIhdBAWo2AgAgF0F/TA0TCwJAIA1BGGopAwAiI1ANACAjQgODUEUNACAjpyIXIBcoAgAiF0EBajYCACAXQX9MDRMLIBOtQiCGIBathCEkQgEhIgwBCyANQRhqNQIAISICQCANQQhqKQMAIiBCA4NCAFINACAgpyIXIBcoAgAiF0EBajYCACAXQX9MDRILICNCgICAgIBggyAihCANQRxqMQAAQiCGhCEjIBOtQiCGIBathCEkQgAhIgsgIEIgiKchGCAjpyEZICCnIRogI0IgiKciEyEVCyAhQiiIpyEbICFCIIinIRwgDUHAAGotAAAhHSAhpyEWIBkhFyAkISEgGCEeIBohHwwCCyANQSBqKAIAIRYg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AGoQ4BohAwJAIAEtAOABQaIBRw0AIAEQmxIhByABEKELIAEgBxCnFwsgAEEFNgIAIAAgAzYCBAwJCyABKALYASEFIAEQoQsCQAJAIAEtAOABQQNGDQAgAkEIaiABEP8JQQEhAyACKAIMIQcgAigCCEEBcQ0JIAIgBzYClAMgAkEBNgKQAyABLQDgAUEDRg0BIAEoAtwBIQMgASgC2AEhByACQZwDaiABENQmIAJBATYCXCACQZy/nAE2AlggAkIBNwJkIAJBswc2AsQDIAJBAzoAzwMgAiACQcADajYCYCACIAJByANqNgLAAyACIAJBzwNqNgLIAyACQagDaiACQdgAahCTECACQbwDaiACQaQDaigCADYCACACIAIpApwDNwK0AyAHIAMgAkGoA2oQ4BohByABLQDgAUGiAUYNAwwICyADKAIAIQdBACEDCyABEKELIAIgBTYCUCACIAc2AkwgAiAHNgJIIAIgAzYCRCACIAEoAtQBIgc2AlQCQCADDQAgAkHVgICAeDYCWCAFIAcgAkHYAGoQ4BohAwJAIAEtAOABQaIBRw0AIAEgARCaLBCnFwsgAkHEAGoQ+CggAEEFNgIAIAAgAzYCBAwJCyAAIAM2AgQgAEEBNgIAIAAgAkHIAGoiASkCADcCCCAAQRBqIAFBCGopAgA3AgAMCAsgAkHYAGogAUEBEPkbIAIoAlghASACKALoASIDQYGAgIB4Rg0EAkBBjAFFDQAgAkGEAmogAkHYAGpBBHJBjAH8CgAACyACQfgBakEIaiACQfQBaigCADYCACACIAIpAuwBNwP4ASADQYCAgIB4Rg0CQQhBoAEQoCwiB0UNAyAHIAE2AgACQEGMAUUNACAHQQRqIAJBhAJqQYwB/AoAAAsgByADNgKQASAAIAc2AgQgAEECNgIAIAcgAikD+AE3ApQBIAdBnAFqIAJBgAJqKAIANgIADAcLIAEgARCaLBCnFwwECyACQRBqIAEQ/hogAkE0aiACQRBqQQhqKQMANwIAIAJBKGpBFGogAkEQakEQaikDADcCACAAQQA2AgggAEEANgIAIAIgAikDEDcCLCAAIAIpAig3AgwgAEEUaiACQShqQQhqKQIANwIAIABBHGogAkEoakEQaikCADcCACAAQSRqIAJBwABqKAIANgIADAULIAAgAikChAI3AgggACABNgIE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1AFqIAEQnyEMCQsgA0EBNgL0ASADQaCFmQE2AvABIANBATYC5AEgA0GYhZkBNgLgASADQQE2AuwBIANBnAI2ArgBIAMgATsBoAEgAyADQbQBajYC6AEgAyADQaABajYCtAEgA0HUAWogA0HgAWoQwhNFDQhBxIicAUErIANB4AFqQZSEmQFB8IaZARDqEgALAkACQCANDQAgCUEBcQ0BIANB1AFqIAEQnyEMCQsgAyABQYCAfGpBCnZBgLADajYCsAEgAyABQf8HcUGAuANyNgKgASADQQI2AvQBIANB2IWZATYC8AEgA0ECNgLkASADQciFmQE2AuABIANBAjYC7AEgA0HkADYCwAEgA0HkADYCuAEgAyADQbQBajYC6AEgAyADQaABajYCvAEgAyADQbABajYCtAEgA0HUAWogA0HgAWoQwhNFDQhBxIicAUErIANB4AFqQZSEmQFBoIeZARDqEgALIANBATYC9AEgA0GghZkBNgLwASADQQI2AuQBIANBgIeZATYC4AEgA0EBNgLsASADQeQANgK4ASADIAE2AqABIAMgA0G0AWo2AugBIAMgA0GgAWo2ArQBIANB1AFqIANB4AFqEMITRQ0HQcSInAFBKyADQeABakGUhJkBQZCHmQEQ6hIACyAODQIgA0HUAWogARCfIQwGCyADQeABakH7ABCRCgwCCyADQdQBakHcABCfISADQdQBaiAEEJ8hDAQLIANB1AFqQZiGmQFBAhDwBSADQQE2AuQBIANBnL+cATYC4AEgA0IBNwLsASADQecBNgK4ASADIAE6AKABIAMgA0G0AWo2AugBIAMgA0GgAWo2ArQBIANB1AFqIANB4AFqEMITRQ0DQcSInAFBKyADQeABakGUhJkBQbCHmQEQ6hIACyADQeABaiABKAIAEJEKIANBtAFqEOYkGkEDIQUCQAJAAkACQAJAAkACQAJAA0AgBUUNASADQbQBahDmJCIBQYCAxABGDQICQCABQVBqQQpJDQAgAUGff2pBBkkNACABQb9/akEFSw0DCyADQeABaiABEJEKIAVBf2ohBQwACwsgBw0BQQYhCkECIQUgAygC6AEhBiADKALkASEMDAQLIAdFDQELIANB4AFqQf0AEJEKIAVFDQELIANB1AFqQYvPmwFBAhDwBQwDC0EDIQUgAygC5AEhDCADKALoASIGQX9qIgpBA0kNAQsCQAJAIAUgBkkNACAFIAZGDQEMAgsgDCAFaiwAAEFASA0BCwJAAkAgCiAGSQ0AIAogBkcNAgwBCyAMIApqLAAAQb9/TA0BCyAMIAVqIQECQAJAAkACQAJAAkAgCiAFayIKDgIEAAELQQEhBSABLQAAQVVqDgMDAQMBCwJAIAEtAABBK0cNACAKQX9qIQUgAUEBaiEBIApBCkkNAQwCCyAKIQUgCkEJTw0BC0EAIQoDQCAFRQ0DIANBwABqIAEtAAAQ8SIgAygCQEEBcUUNAiABQQFqIQEgBUF/aiEFIAMoAkQgCkEEdGohCgwACwtBACEKA0AgBUUNAiAKQf////8ASw0BIANByABqIAEtAAAQ8SIgAygCSEEBcUUNASABQQFqIQEgBUF/aiEFIAMoAkwgCkEEdCILaiIKIAtPDQALCyADQdQBakGLz5sBQQIQ8AUMAgsCQCAKQf//A0sNAAJAIApBgPADcUGAsANGDQAgA0HUAWpBi8+bAUECEPAFDAMLIANB1AFqQdwAEJ8hDAILIANB1AFqIAwgBhDwBUEHQQUgBxshAQNAIAFFDQIgAUF/aiEBIANBiAJqEOYkGgwACwsgDCAGIAUgCkHYhpkBEOMqAAsgA0HgAWoQpy0MAgsCQCADQYgCahDSIyIBRQ0AIAEoAgBBUGpBCkkNAQsgA0HUAWpBxIaZAUECEPAFDAELIANB1AFqQcaGmQFBBBDwBQwACwsgBEEBaiEEDAALCyADQaoBaiADLQDiAToAACADIAo2AqQBIAMgCDYCoAEgAyADLwHgATsBqAEgAyABOgCrAQJAIAItAFBFDQAgA0E4aiADQaABahCcGCADKAI4IQUgAygCPCEBIANBCDYCsAEgAyABNgLQASADIAU2AswBQQAhByADQQA2AsQBIAMgBSABajYCwAEgAyAFNgK8ASADQQI2ArQBIAMgA0GwAWo2AsgBIANBMGogA0G0AWpBCGoQsAggAyADKAI0NgK4ASADIAMoAjAiCDYCtAECQAJAAkAgCEEBcUUNAAJAAkAgAQ0AQYCAgIB8IQhBACEBDAELAkAgAUENSQ0AIANB4AFqIAEQwxogAygC4AEhCCADKALkASEHIAFFDQEgByAFIAH8CgAADAELIANBADYA5wEgA0IANwPgASADIAFBwAFyOgDrAQJAIAFFDQAgA0HgAWogBSAB/AoAAAsgAygC6AEhCCADKALkASEBIAMoAuABIQcLIAMgCDYC3AEgAyABNgLYASADIAc2AtQBIANB4AFqQRhqIANBtAFqQRhqKQIANwMAIANB4AFqQRBqIANBtAFqQRBqKQIANwMAIANB4AFqQQhqIgYgA0G0AWpBCGopAgA3AwAgAyADKQK0ATcD4AEgA0EANgKAAgNAIAMoAuABIQEgA0ECNgLgAQJAAkAgAUECRg0AIAMoAuQBIQUMAQsgA0EoaiAGELAIIAMoAiwhBSADKAIoIQELAkAgAUEBcUUNACADIAMoAoACQQFqIgE2AoACIANBEGogA0HUAWoQ1x4CQCABIAVqIgFFDQACQCABIAMoAhQiBUkNACABIAVGDQEMBgsgAygCECABaiwAAEG/f0wNBQsgAy0A3wEhBSADKALYASEHIANB1AFqQQEQlwcgA0EIaiADQdQBahCLGyADKAIIIAFqIQgCQCAHIAVBwABqQf8BcSIKQQwgCkEMSRsgBUH+AUYbIgUgAWsiAUUNACAIQQFqIAggAfwKAAALIAhB3AA6AAAgBUEBaiEBAkAgAy0A3wFB/gFGDQAgAUELSw0CIAMgAUHAAXI6AN8BDAILIAMgATYC2AEMAQsLIANBiAJqQQhqIANB1AFqQQhqKAIANgIAIAMgAykC1AE3A4gCDAELIANB/wE6AJMCIAMgATYCjAIgAyAFNgKIAgsgA0EgaiADQYgCahCcGCADQeABaiADKAIgIAMoAiRBraucAUEEQbGrnAFBBxD7DCADQbQBaiADKALkASADKALoAUG4q5wBQQNBu6ucAUEGEPsMAkACQAJAIAMoArQBIgFB/v//B0sNAAJAAkAgAQ0AIANBqAJqQQAoAqz+mAE2AgAgA0EAKQKk/pgBNwOgAiADKAK4ASEIDAELIAMoArgBIQggAygCvAEiBUEMSw0CIANBADYApwIgA0IANwOgAiADIAVBwAFyOgCrAiAFRQ0AIANBoAJqIAggBfwKAAALIAEgCBCXFgwCCyADQaACaiADKAK4ASIFIAMoArwBEOcNIAEgBRCXFgwBCyADIAFB////ByABQf///wdJG0GAgIBwcjYCqAIgAyAFNgKkAiADIAg2AqACCyADQaABahDNJyADQaABakEIaiADQaACakEIaigCADYCACAD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DQJAAkAgBy0AACIIQf8BRg0AIAggCEECdmogCEEDcUEAR2pBAmohCAwBCyALQQJqIQgLIAggAU8NDgJAAkAgByAIQQJ0aigCACILQX9MDQACQCAKIAhqIgggAU8NACAHIAhBAnRqKAIAIQEMAgsgCCABQay1gwEQkRUACyAMDRAgC0H/////B3EhAQsgA0HoAGogASAEIABBEGooAgAgAEEUaigCACABQeS9gwEQviUoAgBrIAQQ3RcgAkEBNgIAIAYgAykCaDcCACAGQQhqIANB6ABqQQhqKAIANgIADBkLIAAoAighDSACKAIcIQwgA0HIAGogAEEEaigCACAAQQhqKAIAIAhBhL6DARCxIiADKAJMIgtFDQ8CQAJAIAMoAkgiCS0AACIKQf8BRg0AIAogCkECdmogCkEDcUEAR2pBAmoiCiALSQ0BIAogC0HctYMBEJEVAAsgDUECaiIKIAtPDRELAkAgDCAJIApBAnRqKAIAIgpBASAKQX9KG0kNACACQQA2AhggAkEANgIAIAIgAigCIEEBaiIENgIgDBYLIAJBATYCGCACIAxBAWoiCzYCHCAAKAIoIQkgAigCICEKIANBMGogAEEEaigCACAAQQhqKAIAIAhB9L2DARCxIiADKAI0IQEgAygCMCEHIAMgDDYCZCABRQ0RAkACQCAHLQAAIghB/wFGDQAgCCAIQQJ2aiAIQQNxQQBHakECaiEIDAELIAlBAmohCAsgCCABTw0SAkACQCAHIAhBAnRqKAIAIglBf0wNAAJAIAsgCGoiCCABTw0AIAcgCEECdGooAgAhAQwCCyAIIAFBrLWDARCRFQALIAwNFCAJQf////8HcSEBCyADQegAaiABIApBAWoiCCAAQRBqKAIAIABBFGooAgAgAUHkvYMBEL4lKAIAayAIEN0XIAJBATYCACAGIAMpAmg3AgAgBkEIaiADQegAakEIaigCADYCAAwYC0EAQQBBzLWDARCRFQALIAkgDEHstYMBEJEVAAtBAEEAQcy1gwEQkRUACyAIIAFBnLWDARCRFQALIANBADYCaEEAQfjzmAEgA0HkAGogA0HoAGpBvLWDARCVIQALQQBBAEHMtYMBEJEVAAsgDCAKQey1gwEQkRUAC0EAQQBBzLWDARCRFQALIAggAUGctYMBEJEVAAsgA0EANgJoQQBB+POYASAD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ARCAHgwKCyADIAEQ+hMMCQsgAEEIaiABELolDAgLIABBCGogARDOJwwHCyAAQQRqIAEQky8MBgsgAEEEaiABEJMjDAULIABBBGogARCTLwwECyAAQQRqIAEQky8MAwsgAEEEaiABEJMvDAILIABBBGogARCTLwwBCyAAQQRqIAEQky8LIAQgARCTLwwZCyAAQQhqIAEQuiUMGAsgAEEIaiABEM4nDBcLIABBBGogARCTLyAAQQhqIAEQky8gAEEMaiABEJMvDBYLIABBBGohBAJAIAAtABhBBUcNACAAQRBqIAEQky8LIAQgARDIHwwVCyAAQRBqIAEQky8gACgCBEGAgICAeEYNFCAAQQRqIAEQyB8MFAsgAEEEaiABEIchDBMLIABBBGogARCHIQwSCyAAQQRqIAEQky8gACgCCCABEIchDBELIABBBGohBAJAAkACQCABLQBFDQAgAkGAAjsAxAEgBCACQcQBahDRFyACLQDEAQ0BCyACQfAAakEAIAEoAkBBABCbDCACQfABaiEDAkBB1ABFDQAgAyACQfAAakHUAPwKAAALIAJBzAJqQQApA4CFngEiCjcCACACQdQBaiIGIAo3AgAgAkHkAWogCjcCACACQQA6ANQCIAJBADYCxAEgAkEAOgDsASACQQApA/iEngEiCzcCxAIgAiALNwLMASACIAs3AtwBIAJBxAFqIAQQsgwgAkHYAmpBCGogBikCADcDACACIAIpAswBNwPYAiACQegCaiACQcQCahDVECACQaADaiIEIAJB3AFqENUQIAIgAkHYAmo2ApgDIAJB0ANqQQhqIAo3AwAgAiALNwPQAyACQSBqIAJB6AJqEOUSIAJB0ANqIAIoAiAQiigCQCACKAKIA0GBgICAeEYNAAJAQTBFDQAgAkEgaiACQegCakEw/AoAAAsCQANAIAJB4ANqIAJBIGoQ0Q0gAikD4AMiClANASACIAIoAugDNgL4AyACIAo3A/ADAkAgAkHYAmogAkHwA2oQwQtFDQAgAikD8AMQyCEMAQsgAkHQA2ogChDCBgwACwtCABCDKyACQSBqENsKCwJAIAIoAsADQYGAgIB4Rg0AAkBBMEUNACACQSBqIARBMPwKAAALAkADQCACQfADaiACQSBqENENIAIpA/ADIgpQDQEgAkHQA2ogChDCBgwACwtCABCDKyAC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CGohAyABQQRqIQEMAAsLIAogBhCLLSACKQOQAiEfIAJByAFqIgEgCzYCACACIAtFOgDMASACIB83A8ABIAJBwAFqEPsFIAJBnAJqIAEpAwA3AgAgAiACKQPAATcClAIgAkEANgKQAiAAIAJBkAJqEKwODAoLIAIoApACIAIoApQCEIstCyACKAI8IQEgAigCQCEEQQAhAyACQQA2ApgCIAJCgICAgBA3ApACIARBHGwhBEEBIQoCQANAIARFDQECQCABKAIAQQFGDQAgAigCkAIhBwwJCyACKAKQAiEHIAEoAghBAUcNCCABKAIELQAAIQYCQCADIAdHDQAgAkGQAmpBjNGEARCKDyACKAKUAiEKCyABQRxqIQEgCiADaiAGOgAAIAIgA0EBaiIDNgKYAiAEQWRqIQQMAAsLIAIoApACIgpBgICAgHhGDQcgAigClAIhBiACQSBqIANBAUECQeiymwEQsRlBACEBIAJBADYCmAIgAiACKQMgNwOQAiACQZACaiADEJQlIAIoApQCIAIoApgCIgtBAXRqIQQCQANAIAMgAUYNASAEQQFqIAYgAWotAAAiBzoAACAEIAc6AAAgBEECaiEEIAFBAWohAQwACwsgCiAGEIctIAIpA5ACIR8gAkHIAWoiAyALIAFqIgE2AgAgAiABRToAzAEgAiAfNwPAASACQcABahDtBSACQZwCaiADKQMANwIAIAIgAikDwAE3ApQCIAJBATYCkAIgACACQZACahCsDgwICyAAEJ4WDAcLIAQgASkCBDcCACAEQQhqIAFBDGopAgA3AgAgBEEQaiABQRRqKQIANwIAIAIgBzYCRCACQZACaiACQcQAahCvGyACQcABakEQaiIHIAJBkAJqQRBqIgspAgA3AwAgAkHAAWpBCGoiCSACQZACakEIaiIIKQIANwMAIAIgAikCkAIiHzcDwAEgAigCqAIhCiAfp0EHRg0BIAsgBykDADcDACAIIAkpAwA3AwAgAiACKQPAATcDkAIgAiAKNgKoAiACQThqIAJBkAJqQbTPhAEQzxQMAgtBpM+EARDSLAALIAIoAswBIQsgAigCyAEhByACIAIoAsQBNgKYAiACIAc2ApACIAIgBzYClAIgAkE4aiALEI4lIAIoAkAhCQJAIAtBHGwiCEUNACACKAI8IAlBHGxqIAcgCPwKAAALIAIg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ADAgASADNgIsIAEgCzYCKCABIAk2AiQgASAINgIgIAEgBTYCHCABIAw2AhggASAPNgIUIAEgDjYCECABIBs2AgwgASAVNgIIIAEgHDYCBCABIBM2AgAgAEEMaiACQcAAaigCADYCACAAIAIpAjg3AgQgACABNgIYIABBBzYCAAwHCyATIBQgEyABKAIEIh0gHE9xIh4bIRMgHCAdIB4bIRxBACEUCyAWIAtyIQsgFyAJciEJIBggCHEhCCAZIAVxIQUgGiAMciEMQX8gBCADGyEDQQAhBCASQQFxDQALQQEhCkEAIQRBACESIAEoAggiFkEBRw0ACyAVIBYgFSABKAIMIgEgG01xIgQbIRIgGyABIAQbIRtBACEEDAALCyADIAEQmRUAC0GgppwBQShBzNGEARDSHgALIAJBsAJqJAAL8iICKn8CfiMAQbACayICJAAgASgCBCEDIAJB0AFqIAEoAggiBEEIQdgAEJUPIAIoAtQBIQUCQAJAAkACQAJAIAIoAtABQQFGDQAgAigC2AEhBgJAIAVFDQAgAyAEQdgAbGohByACQdABakEdaiEIIAJB0AFqQTBqIQkgAkHYAGpBKGohCiACQdgAakEkaiELIAJBBHIhDCACQQhqIQ0gBSEOQQAhDwNAIAMgB0YNAQJAAkACQAJAAkACQAJAAkACQAJAIAMoAgAiAUF8akEAIAFBe2pBCEkbDgkAAQIDBAUGBwgACyADKAJMIRAgAygCPCERIAMoAjghEiACQdgAaiADEMMEIAMoAkQhEyACQdABaiADKAJIIhRBCEHAABCVDyACKALUASEVIAIoAtABQQFGDQwgAigC2AEhFgJAIBVFDQAgFEEGdCEXQQAhGCAVIRkDQCAXIBhGDQECQAJAIBMgGGoiASgCAEEHRg0AIAFBKGooAgAhGiABQSxqKAIAIRsgCSABQTBqEO0IIAJB0AFqIAEQvAIgAkHMAWpBAmogCEECai0AADoAACACQcABakEIaiAJQQhqKAIANgIAIAIgGzYC/AEgAiAaNgL4ASACIAgvAAA7AcwBIAIgCSkDADcDwAEgAigC0AEhHCACKALUASEdIAIoAtgBIR4gAigC3AEhHyACKALgASEgIAIoAuQBISEgAigC6AEhIiACLQDsASEjIAIoAvABISQgAigC9AEhJSACLQCPAiEmIAItAI4CIScgAi0AjQIhKCACLQCMAiEpDAELIAFBLGooAgAhGyABQShqKAIAIRogAkGgAWogAUEwahDtCCABQT1qLQAAISggAUE8ai0AACEpIAFBPmotAAAhJwJAAkAgAUEcai0AACIjQQJHDQAgAUEUaigCACEhIAFBEGooAgAhICABQQhqKAIAIR8Q/SchHiACQdABaiAfELwCIB5BIGogAkHQAWpBIGoiIikDADcDACAeQRhqIAJB0AFqQRhqIiMpAwA3AwAgHkEQaiACQdABakEQaiIcKQMANwMAIB5BCGogAkHQAWpBCGoiJCkDADcDACAeIAIpA9ABNwMAIAFBDGooAgAhARD6JyEfIAJB0AFqIAEQQiAfQThqIAJB0AFqQThqKQMANwMAIB9BMGogCSkDADcDACAfQShqIAJB0AFqQShqKQMANwMAIB9BIGogIikDADcDACAfQRhqICMpAwA3AwAgH0EQaiAcKQMANwMAIB9BCGogJCkDADcDACAfIAIpA9ABNwMAQQIhIyAqISIMAQsgAUEIaiIcKAIAIR4gAUEUaigCACEhIAFBEGooAgAhICABQQxqKAIAIR8gAUEYaigCACEiAkAgHCkDACIsQgODQgBSDQAgLKciHCAcKAIAIhxBAWo2AgAgHEF/TA0SCwJAIAFBIGooAgAiAQ0AQQAhKwwBCxD7JyErIAEpAgQhLCABKAIAIRwQ/CchASACQdABaiAcEHYCQEHgAEUNACABIAJB0AFqQeAA/AoAAAsgKyAsNwIEICsgATYCAAsgAkHAAWpBCGogAkGgAWpBCGooAgA2AgAgAiACKQOgATcDwAFBByEcICIhKiArISQLIBYgGGoiASAcNgIAIAFBHGogIzoAACABQRhqICI2AgAgAUEUaiAhNgIAIAFBEGogIDYCACABQQxqIB82AgAgAUEIaiAeNgIAIAFBBGogHTYCACABQR1qIAIvAcwBOwAAIAFBH2ogAkHMAWpBAmotAAA6AAAgAUEsaiAbNgIAIAFBKGogGjYCACABQSRqICU2AgAgAUEgaiAkNgIAIAFBMGogAikDwAE3AwAgAUE4aiACQcABakEIaigCADYCACABQT9qICY6AAAgAUE+aiAnOgAAIAFBPWogKDoAACABQTxqICk6AAAgGEHAAGohGCAZQX9qIhkNAAsLQYCAgIB4ISICQCADKAIgQYCAgIB4Rg0AIAMoAiQhGiADKAI0ISEgAygCMCEgIAMoAiwhGSACQdABaiADKAIoIiNBCEEwEJUPIAIoAtQBISIgAigC0AFBAUYNDyACKALYASEeAkAgIg0AQQAhIgwBCyAjQTBsIRtBACEYICIhHwNAIBsgGEYNASACQdABaiAaIBhqEEwgHiAYaiIBQShqIAJB0AFqQShqKQMANwMAIAFBIGogAkHQAWpBIGopAwA3AwAgAUEYaiACQdABakEYaikDADcDACABQRBqIAJB0AFqQRBqKQMANwMAIAFBCGogAkHQAWpBCGopAwA3AwAgASACKQPQATcDACAYQTBqIRggH0F/aiIfDQALCyANIAJB2ABqQQhqKQMANwMAIAJBEGogAkHYAGpBEGopAwA3AwAgAkEYaiACQdgAakEYaikDADcDACACIAIpA1g3AwAgAiAUNgJIIAIgFjYCRCACIBU2AkAgAiAQNgJMIAIgETYCPCACIBI2AjggAiAhNgI0IAIgIDYCMCACIBk2AiwgAiAjNgIoIAIgHjYCJCACICI2AiAgAiADLwFQOwFQDAgLIAMpAyghLCACQdABaiADQQhqEMMEIAJB0AFqQShqIgEgAygCMBDRBDYCACACQdABakEgaiAsNwMAIA1BIGogLDcDACANIAIpA9ABNwMAIA1BCGogAkHQAWpBCGopAwA3AwAgDUEQaiACQdABakEQaikDADcDACANQRhqIAJB0AFqQRhqKQMANwMAIAIgAy0ANDoA/AEgAiADKAA1NgD9ASANQShqIAEpAwA3AwAgAiADLQA5OgCBAiANQTBqIAkpAwA3AwAgAkEFNgIADAcLIAMoAhQhASADKAIQIRggAygCHCEfIAMoAhghHgJAIAMpAwgiLEIDg0IAUg0AICynIhogGigCACIaQQFqNgIAIBpBf0wNDAsgAiADKAIgENEENgIgIAIgHzYCHCACIB42AhggAiABNgIUIAIgGDYCECACICw3AwggAkEGNgIAIAIgAy8BKDsBKCACIAMoAiQ2AiQMBgsgAygCLCEeIAMoAighGiACQaABaiADQQhqEMMEQQAhGEEAIQECQCADKAI8Ih9FDQAQ+ichASACQdABaiAfEEIgAUE4aiACQdABakE4aikDADcDACABQTBqIAkpAwA3AwAgAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwALAkAgAygCQCIfRQ0AEPsnIRggHykCBCEsIB8oAgAhGxD8JyEfIAJB0AFqIBsQdgJAQeAARQ0AIB8gAkHQAWpB4AD8CgAACyAYICw3AgQgGCAfNgIACyADLQBEIR8gCiADQTBqEO0IIAJB2ABqQQhqIAJBoAFqQQhqKQMANwMAIAJB2ABqQRBqIAJBoAFqQRBqKQMANwMAIAJB2ABqQRhqIAJBoAFqQRhqKQMANwMAIAIgHjYCfCACIBo2AnggAiAfOgCUASACIBg2ApABIAIgATYCjAEgAiACKQOgATcDWCACIAMtAEs6AJsBIAIgAy8ASTsAmQEgAiADKABFNgCVAQJAQcgARQ0AIA0gAkHYAGpByAD8CgAACyACQQc2AgAMBQsgAygCFCEeIAMoAhAhGiADKAIgIRsgAygCHCEiIAMoAhghIwJAIAMpAwgiLEIDg0IAUg0AICynIgEgASgCACIBQQFqNgIAIAFBf0wNCgtBACEYQQAhAQJAIAMoAiQiH0UNABD6JyEBIAJB0AFqIB8QQiABQThqIAJB0AFqQThqKQMANwMAIAFBMGogCSkDADcDACABQShqIAJB0AFqQShqKQMANwMAIAFBIGogAkHQAWpBIGopAwA3AwAgAUEYaiACQdABakEYaikDADcDACABQRBqIAJB0AFqQRBqKQMANwMAIAFBCGogAkHQAWpBCGopAwA3AwAgASACKQPQATcDAAsCQCADKAIoIh9FDQAQ+ychGCAfKQIEIS0gHygCACEZEPwnIR8gAkHQAWogGRB2AkBB4ABFDQAgHyACQdABakHgAPwKAAALIBggLTcCBCAYIB82AgALIAMtADkhHyALIANBLGoQ7QggAkHYAGpBCGoiGSAaNgIAIAJB2ABqQRBqIhogIzYCACACQdgAakEYaiIjIBs2AgAgAkHYAGpBIGoiGyAYNgIAIAJB2ABqQTBqIhggAy0AODoAACANICw3AwAgDUEoaiAKKQMANwMAIAIgHjYCZCANQQhqIBkpAwA3AwAgAiAiNgJsIA1BEGogGikDADcDACACIAE2AnQgDUEYaiAjKQMANwMAIA1BIGogGykDADcDACACIB86AIkBIAIgAygBOjYBigEgDUEwaiAYKQMANwMAIAIgLDcDWCACQQg2AgAMBAsgDCADQQRqEL8IIAJBCTYCAAwDC0HYAEUNAiACIANB2AD8CgAADAILIAMoAgghGCADKAIYISMgAygCFCEZIAMoAhAhICADKAIgISEgAygCHCEnIAJB0AFqIAMoAgwiG0EIQTAQlQ8gAigC1AEhGiACKALQAUEBRg0IIAIoAtgBISICQCAaRQ0AIBtBMGwhHyAiIQEgGiEeA0AgH0UNASACQdABaiAYEEwgAUEoaiACQdABakEoaikDADcDACABQSBqIAJB0AFqQSBqKQMANwMAIAFBGGogAkHQAWpBGGopAwA3AwAgAUEQaiACQdABakEQaikDADcDACABQQhqIAJB0AFqQQhqKQMANwMAIAEgAikD0AE3AwAgAUEwaiEBIB9BUGohHyAYQTBqIRggHkF/aiIeDQALCyACICE2AiAgAiAnNgIcIAIgIzYCGCACIBk2AhQgAiAgNgIQIAIgGzYCDCACICI2AgggAiAaNgIEIAJBCzYCAAwBCyADKAIsIR4gAygCKCEaAkACQCADKAIIQQVGDQAgAkGgAWogA0EIahDDBAwBCyADKAIcIQEgAygCGCEYAkAgAykDECIsQgODQgBSDQAgLKciHyAfKAIAIh9BAWo2AgAgH0F/TA0HCyACIAE2ArQBIAIgGDYCsAEgAiAsNwOoASACQQU2AqABC0EAIRhBACEBAkAgAygCPCIfRQ0AEPonIQEgAkHQAWogHxBCIAFBOGogAkHQAWpBOGopAwA3AwAgAUEwaiAJKQMANwMAIAFBKGogAkHQAWpBKGopAwA3AwAgAUEgaiACQdABakEgaikDADcDACABQRhqIAJB0AFqQRhqKQMANwMAIAFBEGogAkHQAWpBEGopAwA3AwAgAUEIaiACQdABakEIaikDADcDACABIAIpA9ABNwMACwJAIAMoAkAiH0UNABD7JyEYIB8pAgQhLCAfKAIAIRsQ/CchHyACQdABaiAbEHYCQEHgAEUNACAfIAJB0AFqQeAA/AoAAAsgGCAsNwIEIBggHzYCAAsgAy0ARCEfIAogA0EwahDtCCACQdgAakEIaiACQaABakEIaikDADcDACACQdgAakEQ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CjoAOSAAIAs6ADggACAENgI0IAAgBTYCMCAAIBI6ACwgACADNgIoIAAgCDYCJCAAIBA2AiAgACAUNwMYIAAgETYCFCAAIA42AhAgACAPNgIMIAAgDTYCCCAAQRA2AgAMBgsgASgCLCEHIAEoAighAwJAAkACQAJAAkACQCABKAIIIgRBgICAgHhzIgVBBCAFQQRJGw4FAAECAwQACyABKAIkIQggASgCICEFIAEpAxghFCABKAIUIRAgASgCECERAkAgASkDICIVUA0AIBVCA4NQRQ0AIBWnIgEgASgCACIBQQFqNgIAIAFBf0wNBwsgFEIgiKchDiAUpyEGQYCAgIB4IQQMBAsgASgCHCEOIAEoAhghBgJAIAEpAxAiFEIDg0IAUg0AIBSnIgQgBCgCACIEQQFqNgIAIARBf0wNBgsgASgCJCEIIAEoAiAhBQJAIAEpAyAiFVANACAVQgODUEUNACAVpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIBRCIIinIRAgFKchEUGBgICAeCEEDAMLIAEpAxgiFEIgiKchDiABKQMQIhVCIIinIRAgASgCJCEIIAEoAiAhBSABKAIMIQEgFKchBiAVpyERDAILIAEoAiAhBCABKAIUIRAgASgCECEREP4nIQUgBC0ADCEGIAJBoAFqIARBBGooAgAgBEEIaigCABDgFyAFIAIpAqABNwIAIAIgBjoArAEgBUEIaiACQaABakEIaikCADcCACABKQMYIhSnIQYCQCAUUA0AIBRCA4NQRQ0AIAYgBigCACIBQQFqNgIAIAFBf0wNBAsgFEIgiKchDkGDgICAeCEEDAELIAEoAiQhCCABKAIgIQUgAkGgAWogAUEIahDVDCACQawBaiABKAIYIAEoAhwQ+AggAikCsAEiFEIgiKchDiACKQKoASIVQiCIpyEQIAIoAqQBIQEgAigCoAEhBCAUpyEGIBWnIRELIAAgBzYCLCAAIAM2AiggACAINgIkIAAgBTYCICAAIAE2AgwgACAENgIIIABBETYCACAAIA6tQiCGIAathDcDGCAAIBCtQiCGIBGthDcDEAwFCyABLQAsIQUgASgCJCEGIAEoAiAhByABLQAcIgNBAkYNASABKAIYIQggASgCFCEQIAEoAhAhESABKQMIIhRCA4NCAFINAiAUpyIEIAQoAgAiBEEBajYC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IAkgAUsbIgFBKU8NACABQQJ0IQECQAJAA0AgAUUNASABQXxqIgEgA0HsA2pqKAIAIgUgASADQfwIamooAgAiBkYNAAsgBSAGSyAFIAZJayEBDAELQX9BACADQfwIaiADQfwIaiABakcbIQELAkACQAJAAkACQAJAAkAgASAESA0AIAMoAqABIgZBKU8NBgJAAkAgBg0AQQAhBgwBCyADIAZBAnQiBWohCiADIQFCACEZA0AgASABNQIAQgp+IBl8Iho+AgAgAUEEaiEBIBpCIIghGSAFQXxqIgUNAAsgGkKAgICAEFQNACAGQShGDQYgCiAZpzYCACAGQQFqIQYLIAMgBjYCoAEgAygCxAIiBkEpTw0EQQAhCkEAIQECQCAGRQ0AIANBpAFqIAZBAnQiBWohCyADQaQBaiEBQgAhGQNAIAEgATUCAEIKfiAZfCIaPgIAIAFBBGohASAaQiCIIRkgBUF8aiIFDQALAkAgGkKAgICAEFoNACAGIQEMAQsgBkEoRg0EIAsgGac2AgAgBkEBaiEBCyADIAE2AsQCAkAgCEUNACADQcgCaiAIQQJ0aiEGIAhBAnQhBSADQcgCaiEBQgAhGQNAIAEgATUCAEIKfiAZfCIaPgIAIAFBBGohASAaQiCIIRkgBUF8aiIFDQALAkAgGkKAgICAEFoNACADIAg2AugDDAMLIAhBKEYNAyAGIBmnNgIAIAhBAWohCgsgAyAKNgLoAwwBCyAHQQFqIQcLAkBBpAFFIgENACADQZAFaiADQewDakGkAfwKAAALIANBkAVqQQEQowMhDQJAIAENACADQbQGaiADQewDakGkAfwKAAALIANBtAZqQQIQowMhDgJAIAENACADQdgHaiADQewDakGkAfwKAAALAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIANB2AdqQQMQowMiDygCoAEiECADKAKgASIKIBAgCksbIglBKEsNACANKAKgASERIA4oAqABIRIgAygCjAUhE0EAIRQDQCAUIRUgCUECdCEBAkACQAJAAkADQCABRQ0BIAFBfGoiASADaigCACIFIAEgA0HYB2pqKAIAIgZGDQALIAUgBkkNAQwCCyAPIANB2AdqIAFqRg0BC0EAIRYgCiEJDAELAkAgCUUNAEEBIQogA0HYB2ohBSADIQEgCSEL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yO6eATYC0O6eAUEAQdDungE2AtzungFBAEHQ7p4BNgLY7p4BQQBB2O6eATYC5O6eAUEAQdjungE2AuDungFBAEHg7p4BNgLs7p4BQQBB4O6eATYC6O6eAUEAQejungE2AvTungFBAEHw7p4BNgL87p4BQQBB6O6eATYC8O6eAUEAQfjungE2AoTvngFBAEHw7p4BNgL47p4BQQBBgO+eATYCjO+eAUEAQfjungE2AoDvngFBAEGI754BNgKU754BQQBBgO+eATYCiO+eAUEAQZDvngE2ApzvngFBAEGI754BNgKQ754BQQBBmO+eATYCpO+eAUEAQZDvngE2ApjvngFBAEGg754BNgKs754BQQBBmO+eATYCoO+eAUEAQajvngE2ArTvngFBAEGg754BNgKo754BQQBBsO+eATYCvO+eAUEAQajvngE2ArDvngFBAEG4754BNgLE754BQQBBsO+eATYCuO+eAUEAQcDvngE2AszvngFBAEG4754BNgLA754BQQBByO+eATYC1O+eAUEAQcDvngE2AsjvngFBAEHQ754BNgLc754BQQBByO+eATYC0O+eAUEAQdjvngE2AuTvngFBAEHQ754BNgLY754BQQBB4O+eATYC7O+eAUEAQdjvngE2AuDvngFBACAFNgKE8J4BQQBB4O+eATYC6O+eAUEAIAhBWGoiADYC/O+eASAFIABBAXI2AgQgBSAAakEoNgIEQQBBgICAATYCkPCeAQwICyABIAVPDQAgBiABSw0AIAAoAgxFDQMLQQBBACgClPCeASIAIAUgACAFSRs2ApTwngEgBSAIaiEGQdjtngEhAAJAAkACQANAIAAoAgAiByAGRg0BIAAoAggiAA0ADAILCyAAKAIMRQ0BC0HY7Z4BIQACQANAAkAgACgCACIGIAFLDQAgASAGIAAoAgRqIgZJDQILIAAoAgghAAwACwtBACAFNgKE8J4BQQAgCEFYaiIANgL8754BIAUgAEEBcjYCBCAFIABqQSg2AgRBAEGAgIABNgKQ8J4BIAEgBkFgakF4cUF4aiIAIAAgAUEQakkbIgdBGzYCBEEAKQLY7Z4BIQkgB0EQakEAKQLg7Z4BNwIAIAcgCTcCCEEAIAg2AtztngFBACAFNgLY7Z4BQQAgB0EIajYC4O2eAUEAQQA2AuTtngEgB0EcaiEAA0AgAEEH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AAAgACAFrUI0hiAQhL8iFZogFSAEQS1GGzkDCAsgA0HADGokAAuIIQElfyMAQdAEayICJAACQAJAAkACQCABLQDgAUECRg0AIAEoAtwBIQMgASgC2AEhBCACQTRqIAEQ1CYgAkEBNgK8ASACQZy/nAE2ArgBIAJCATcCxAEgAkGzBzYCiAEgAkECOgCgASACIAJBhAFqNgLAASACIAJBgARqNgKEASACIAJBoAFqNgKABCACQagEaiACQbgBahD9GiACQbwEaiACQTxqKAIANgIAIAIgAikCNDcCtAQgBCADIAJBqARqEOAaIQMgAS0A4AFBogFGDQEMAgsgARChCyACQShqQQhBCEE4QaDUmwEQpxogAkEANgJUIAIgAigCLCIFNgJQIAIgAigCKDYCTCACQagEakEMaiEGIAJBgARqQQxqIQcgAkG4AWpBKGohCCACQagEakEIaiEJIAJBqARqQQRyIQogAkG4AWpBBHIhCyACQYQBakEMaiEMIAJBhAFqQQhqIQ0gAkG4AWpBCGohDkEAIQQDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQDgASIDQQNGDQACQAJAAkACQAJAIANFDQAgA0HjAEYNASADQRJHDQILIAJBuAFqIAFBABDVBCACKAK4ASIDQQJGDRFBBUEEIANBAXEbIQQMEAsgAkG4AWogARDdASABIAEoAogBQQFyEKgSIAEQoQsgAS0A4AEhAyABIAJBuAFqEMcFIANFDQEgA0ESRg0BCyABKALYASEPIAJBuAFqIAFBvLicAUEBQQAQwgQgAigCvAEhAyACKAK4AUUNASADIRAMEQsgAkG4AWogAUEBENUEIAIoArgBIgNBAkYNDkEFQQQgA0EBcRshBAwNCyACQbgBaiABIA8gA0EARyIFQQAQ2gIgAigCvAEhEAJAIAIoArgBIhFBgYCAgHhHDQBBCyEEDA8LIA0gDikCADcCACANQRBqIA5BEGooAgA2AgAgDUEIaiAOQQhqKQIANwIAIAIgEDYCiAEgAiARNgKEAQJAIBFBgICAgHhGDQBBCiEEIAIoApwBIRIgAigCmAEhEyACKAKUASEUIAIoApABIRUgAigCjAEhFiAQIRcgESEQDA8LIAEtAJEBQSBxRQ0LIAEoAogBIRggAkHAAmogARDdASABIAEoAogBQQFyEKgSIAEoAtgBIRkCQAJAAkACQAJAAkACQCADDQACQCABLQDgASIEQf8ARg0AAkAgBEGTAUYNACABKALcASEEIAJBzANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkGTAToA2AMgAiACQZgEajYCsAQgAiACQaAEajYCmAQgAiACQdgDajYCoAQgAkGABGogAkGoBGoQ/RogB0EIaiACQcwDakEIaigCADYCACAHIAIpAswDNwIAIBkgBCACQYAEahDgGiEQIAEtAOABQaIBRg0DDAQLIAEQoQsgAkGoBGogARC+ByACKAKsBCEQIAItAKgEIhpBAkYNAyACIBA2AtgDAkAgAS0A4AFFDQAgASgC3AEhBCABKALYASERIAJB9ANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkEAOgCnBCACIAJBmARqNgKwBCACIAJBoARqNgKYBCACIAJBpwRqNgKgBCACQYAEaiACQagEahD9GiAHQQhqIAJB9ANqQQhqKAIANgIAIAcgAikC9AM3AgAgESAEIAJBgARqEOAaIQQgAS0A4AFBogFGDQoMEQsgARChCyACQagEaiABELMDIAIoAqwEIRsgAigCqAQiHEGAgICAeEYNDyACIAIoArAEIhE2AogEIAIgGzYChAQgAiAcNgKABAJAIBFFDQAgGygCACIdQQRGDQsgAiAdNgKoBAJAQSRFDQAgCiAbQQRqQST8CgAACyAbQTBqIQQgEUEobEFYakEobiERAkADQCARRQ0BAkACQAJAAkACQCAEQXhqKAIADgQBAgMAAQsgBEF8ahC0JwwDCyAEEIcrDAILIARBfGoQiCYMAQsgBEF8ahCILAsgEUF/aiERIARBKGohBAwACwsgHCAbEKEtIAEQjCciBEUNBSACQQw2ArgBIAIgBDYCvAECQAJAAkACQCAdDgQBAgMAAQsgChDIJwwVCyAJEKcrDBQLIAoQlyYMEwsgChCfLAwSCyABKALcASEEIAEoAtgBIREgAkGYgICAeDYCqAQgESAEIAJBqARqEOAaIQQgAS0A4AFBogFHDQ4gASABEJosEKcXDA4LIAEQoQsgAkGoBGogARC+ByACKAKsBCEQIAItAKgEIgRBAkYNAiACIBA2AtgDAkAgAS0A4AFFDQAgASgC3AEhBCABKALYASERIAJB3ANqIAEQ1CYgAkEBNgKsBCACQZy/nAE2AqgEIAJCATcCtAQgAkGzBzYCnAQgAkEAOgCnBCACIAJBmARqNgKwBCACIAJBoARqNgKYBCACIAJBpwRqNgKgBCACQYAEaiACQagEahD9GiAHQQhqIAJB3ANqQQhqKAIANgIAIAcgAikC3AM3AgAgESAEIAJBgARqEOAaIQQgAS0A4AFBogFHDQ0gASABEJosEKcXDA0LIAEQoQsCQCABLQDgAUEBRg0AIAEoAtwBIQQgASgC2AEhESACQegDaiABENQmIAJBATYCrAQgAkGcv5wBNgKoBCACQgE3ArQEIAJBswc2ApwEIAJBAToApwQgAiACQZgEajYCsAQgAiACQaAEajYCmAQgAiACQacEajYCoAQgAkGABGogAkGoBGoQ/RogB0EIaiACQegDakEIaigCADYCACAHIAIpAugDNwIAIBEgBCACQYAEahDgGiEEIAEtAOABQaIBRw0MIAEgARCaLBCnFwwMCyABEKELIAJBIGogARCaGSACKAIkIREgAigCIEEBcQ0KIAIgETYCqAQgARCMJyIbRQ0EIAJBDDYCuAEgAiAbNgK8ASACQagEahCmKwwQCyABKALcASEEIAJBj4CAgHg2AqgEIBkgBCACQagEahDgGiEQIAEtAOABQaIBRw0BCyABIAEQmiwQpxcLIAJBDDYCuAEgAiAQNgK8AQwOCyABKALUASEEAkBBKEUNACACQbgBaiACQagEakEo/AoAAAsgAiAaOgDsASACIBA2AugBIAIgBDYC5AEgAiAZNgLgAQJAIAIoArgBIgRBdWoOAgMOAAsgAigCyAEhFSACKALEASEWIAIoAsABIRcgAigCvAEhEAwBCyACIAQ6AMwBIAIgETYCyAEgAiAZNgLAASACIBA2ArwBQQchBCACQQc2ArgBIAIgASgC1AEiFjYCxAEgESEVIBkhFwsgAkGgAWpBCGoiAyAIQQhqKQMANwMAIAIgAi8B3gE7AbYBIAIgCCkDADcDoAEgAi0A3QEhHiACLQDcASEfIAIoAtgBISAgAigC1AEhEiACKALQASETIAIoAswBIRQgASABKAKIAUF+cSAYQQFxchCoEiACQcACahCWJiACQdgAakEIaiADKQMA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IAEoAgQgASgCCBCKFCACQdwCaiADKQMANwIAIAJB5AJqIAJBoAJqKQMANwIAIAJBIDYCrAIgAiACKQOQAjcC1AJBwABFDRsgACACQawCakHAAPwKAAAMGwsgAkEoaiABEK0JIAJBNGogAkEYakEIaigCADYCACAAQqKAgICggICAgH83AgAgAEEYaiACQShqQRBqKQIANwIAIABBIGogAkEoakEYaikCADcCACACIAIpAxg3AiwgACACKQIoNwIIIABBEGogAkEoakEIaikCADcCAAwaCyACQQA2AqwCIAJBFGpBpMOEASACQawCakGow4QBELchAAsgBEGlf2pBBEkNACAEQYV/akEESQ0AAkAgBEH/AEsNACAEQVBqQQpJDQAgBEG/f2pBGkkNACAEQZ9/akEaSQ0AIARB/QBxQTxHDQMLIARBRGoOBw8EEAQECw4BCyAAIAIpA/gBNwIMIABBAToAJCAAIAQ2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwXCwJAIARBjn9qDgkIAwYDCQMDAwsACyAEQZ9/ag4GAwsCAgIEAQsgACACKQP4ATcCDCAAQQI6ACQgACAENgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMFQsgBEHuAEYNBAsgAkHIAmogASgCBCABKAIIEIoUIAJB3AJqIAJBgAJqKQMANwIAIAJB5AJqIAJBiAJqKQMANwIAIAJBCzYCrAIgAiACKQP4ATcC1AJBwABFDRMgACACQawCakHAAPwKAAAMEwsgACACKQP4ATcCDCAAQQY7ASQgAEEHNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMEgsgACACKQP4ATcCDCAAQYYCOwEkIABBDDYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADBELIAAgAikD+AE3AgwgAEGGBDsBJCAAQQk2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwQCyAAIAIpA/gBNwIMIABBhgY7ASQgAEEKNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBiAJqKQMANwIAIABBFGogAkGAAmopAwA3AgAMDwsgACACKQP4ATcCDCAAQYYIOwEkIABBDTYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYgCaikDADcCACAAQRRqIAJBgAJqKQMANwIADA4LIAAgAikD+AE3AgwgAEGGCjsBJCAAQQs2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGIAmopAwA3AgAgAEEUaiACQYACaikDADcCAAwNCyAAIAIpA/gBNwIIIABBAjoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJBgAJqKQMANwIADAwLIAAgAikD+AE3AgggAEEDOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJB+AFqQRBqKQMANwIAIABBEGogAkGAAmopAwA3AgAMCwsgAkGQAmpBEGoiByACQfgBakEQaikDADcDACACQZACakEIaiIIIAJB+AFqQQhqKQMANwMAIAIgAikD+AE3A5ACQQQhBiAFKAIAIAEoAggiBEYNCSABEPsPQfsARw0JIAIgARD7DyIJNgLsAiAJQfsARw0EIAJB8AJqQQhqIAVBCGoiCSgCADYCACACIAUpAgA3A/ACIAEQ1CQNAyACQbQBaiAJKAIANgIAIAJBoAFqQQhqIgMgAkEYakEIaigCADYCACACIAIpAxg3A6ABIAIgBSkCADcCrAEgAkHIAmogASgCBCAEEIoUIAJB3AJqIAMpAwA3AgAgAkHkAmogAkGwAWopAwA3AgBBHiEDIAJBHjYCrAIgAiACKQOgATcC1AIgAi0AsAIhAQwHCyAAIAIpA/gBNwIIIABBBToAICAAQqKAgICwgICAgH83AgAgAEEYaiACQfgBakEQaikDADcCACAAQRBqIAJBgAJqKQMANwIADAkLIAAgAikD+AE3AgggAEEIOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJB+AFqQRBqKQMANwIAIABBEGogAkH4AWpBCGopAwA3AgAMCAsgACACKQP4ATcCCCAAQQk6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkH4AWpBEGopAwA3AgAgAEEQaiACQYACaikDADcCAAwHCyACQYADakEIaiAJKAIANgIAIAIgBSkCADcDgAMCQCABEPsPIglBLUYNACAJQd///wBxQb9/akEaSQ0AIAUgAikD8AI3AgAgBUEIaiACQfACakEIaigCADYCAAwGCyACQQhqIANBwABqQbjDhAEQ7CMgAigCDCEKIAIoAggiCUEANgIIA0ACQAJAAkACQCAFKAIAIARGDQAgARD7DyIDQS1GDQMgA0Hf//8AcUG/f2pBGkkNAyAFKAIAIARGDQAgARD7D0H9AEYNAQsgAkG0AWogBUEIaigCADYCACACQaABakEIaiIDIAJB8AJqQQhqKAIANgIAIAIgAikD8AI3A6ABIAIgBSkCADcCrAEgAkGsAmpBHGogASgCBCAEEIoUIAJB3AJqIAMpAwA3AgAgAkHkAmogAkGwAWopAwA3AgAgAkEcNgKsAiACIAIpA6ABNwLUAgwBCyACQZADakEIaiAFQQhqKAIANgIAIAIgBSkCADcDkAMgARCNCxoCQCAJKAIEIgsgCSgCCCIJQdXPhAFBBRDrJUUNAEEGIQMMBQsCQCALIAlB2s+EAUEDEOslRQ0AQQchAwwFC0EKIQMgCyAJQcjDhAFBChDrJQ0EAkAgCyAJQdLDhAFBCBDrJUUNAEELIQMMBQsgAkGgAWpBCGoiAyACQYADakEIaigCADYCACACQbQBaiACQZADakEIaigCADYCACACIAIpA4ADNwOgASACIAIpA5ADNwKsASACQcgCaiABKAIEIAQQihQgAkHcAmogAykDADcCACACQeQCaiACQbABaikDADcCACACQR02AqwCIAIgAikDoAE3AtQCCyAKIAooAgBBAWo2AgAMBAsgCSABEPsPEMAXIAEQ1CQaDAALCyACQQA2AqABIAJB7AJqQcyGmQEgAkGgAWpB3MOEARC3IQALIAJBIjYCrAIgAiADOgCwAiAKIAooAgBBAWo2AgALIAItALACIQEgAigCrAIiA0EiRg0BCwJAQTtFDQAgAEEFaiACQawCakEFakE7/AoAAAsgACABOgAEIAAgAzYCAAwCCyABQf8BcUEMRg0AIAJBpAJqIAVBCGooAgA2AgAgAiAFKQIANwKcAiABIQYLIAAgAikDkAI3AgggACAGOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAcpAwA3AgAgAEEQaiAIKQMANwIACyACQaADaiQAC/weARN/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GyEGIAFByABqIQogAigCCCEPIAFBCGohCyABQQRqIRUgAUEgaiEQIAFBHGohEQNAQQAhDCAEIAVGDQYCQAJAIAQgBkYNACAKIA8gBGotAAAiAmohDiAJIQcDQAJAAkACQCAVKAIAIAsoAgAgB0HkkYQBEL8lKAIEIglFDQAgESgCACAQKAIAIAkgDi0AAGpB9JGEARC+JSgCACEJDAELIANBwABqIAEgBxCuJiADIAMpA0A3AtABA0AgA0HcAWogA0HQAWoQvxMgAy0A3AFBAUcNAiACIAMtAN0BIglLDQALIAIgCUcNASADKADeASEJCyAJQQFHDQMLIBUoAgAgCygCACAHQay4gAEQvyUoAgwhBwwACwsgBiAIQayfgAEQkRUACwJAIAkgASgC0AJLDQAgCUUNByAJIAEoAtQCSw0AIANBOGogASAJEK8mIAMgAykDODcC3AEgA0EwaiADQdwBakEAEJQWAkAgAygCMEEBcUUNACADKAI0IQIgA0HcAWogAiAEQQFqIgkgAUE0aigCACABQThqKAIAIAJBlL6DARC+JSgCAGsgCRDdFwwHC0GkvoMBENIsAAsgBEEBaiEEDAALC0GkvoMBENIsAAtBpL6DARDSLAALIAwgDUGsn4ABEJEVAAtBpL6DARDSLAALIAAgAykC3AE3AgQgAEEMaiADQeQBaigCADYCAEEBIQwLIAAgDDYCAAwFCwJAAkACQAJAIAEoAtgCIglFDQAgCSABKALUAksNACADQaABaiABIAkQryYgAyADKQOgATcC3AEgA0GYAWogA0HcAWpBABCUFiADKAKYAUEBcUUNASADKAKcASECIANB0AFqIAIgBCABQTRqKAIAIAFBOGooAgAgAkGUvoMBEL4lKAIAayAEEN0XIABBATYCACAAQQxqIANB2AFqKAIANgIAIAAgAykC0AE3AgQMCAsgA0HcAWogByABQcAAaiIPKAIAIgsoAghBf2pBeHFqQQhqIAIoAggiBiACKAIMIgwgBCAFIAsoAhAREgACQCADKALcASICDgMDAgADCyABQcgAaiEKIAMoAuABIQIgAUEIaiELIAFBBGohFSABQSBqIRAgAUEcaiERA0ACQCACIgQgBUkNACAAQQA2AgAMCQsCQAJAIAQgDE8NACAKIAYgBGotAAAiAmohDiAJIQcDQAJAAkACQCAVKAIAIAsoAgAgB0HkkYQBEL8lKAIEIglFDQAgESgCACAQKAIAIAkgDi0AAGpB9JGEARC+JSgCACEJDAELIANBkAFqIAEgBxCuJiADIAMpA5ABNwL0AQNAIANB3AFqIANB9AFqEL8TIAMtANwBQQFHDQIgAiADLQDdASIJSw0ACyACIAlHDQEgAygA3gEhCQsgCUEBRw0DCyAVKAIAIAsoAgAgB0GsuIABEL8lKAIMIQcMAAsLIAQgDEGsn4ABEJEVAAsCQCAJIAEoAtACSw0AAkAgCUUNAAJAAkAgCSABKALUAksNACADQYgBaiABIAkQryYgAyADKQOIATcC3AEgA0GAAWogA0HcAWpBABCUFiADKAKAAUEBcQ0BQaS+gwEQ0iwACyADQdwBaiABKAI8IA8oAgAiAigCCEF/akF4cWpBCGogBiAMIAQgBSACKAIQERIAAkAgAygC3AFFDQAgAygC4AEiAiAESw0EDAMLIABBADYCAAwLCyADKAKEASECIANB0AFqIAIgBEEBaiIJIAFBNGooAgAgAUE4aigCACACQZS+gwEQviUoAgBrIAkQ3RcgAEEBNgIAIABBDGogA0HYAWooAgA2AgAgACADKQLQATcCBAwKCyAAQQA2AgAMCQsgBEEBaiECDAALC0GkvoMBENIsAAsgACADKQLgATcCBCAAQQxqIANB3AFqQQxqKAIANgIACyAAIAI2AgAMBAsgACADKQLgATcCBCAAQQxqIANB3AFqQQxqKAIANgIACyAAIAI2AgAMAgsgAUHIAGohDyADKALgASECIAFBCGohCyABQQRqIRUgAUE4aiEUIAFBNGohDSABQSBqIRAgAUEcaiERAkADQAJAAkACQCACIgQgBU8NAAJAAkAgBCAMTw0AIA8gBiAEai0AACICaiEOIAkhBwNAAkACQAJAIBUoAgAgCygCACAHQeSRhAEQvyUoAgQiCUUNACARKAIAIBAoAgAgCSAOLQAAakH0kYQBEL4lKAIAIQkMAQsgA0G4AWogASAHEK4mIAMgAykDuAE3AvQBA0AgA0HcAWogA0H0AWoQvxMgAy0A3AFBAUcNAiACIAMtAN0BIglLDQALIAIgCUcNASADKADeASEJCyAJQQFHDQMLIBUoAgAgCygCACAHQay4gAEQvyUoAgwhBwwACwsgBCAMQayfgAEQkRUACwJAIAkgASgC0AJLDQAgCUUNBQJAIAkgASgC1AJLDQAgA0GwAWogASAJEK8mIAMgAykDsAE3AtwBIANBqAFqIANB3AFqQQAQlBYgAygCqAFBAXENBEGkvoMBENIsAAsgA0HcAWogASgCPCAKKAIAIgIoAghBf2pBeHFqQQhqIAYgDCAEIAUgAigCEBESACADKALcAUUNAiADKALgASICIARLDQQLIARBAWohAgwDCyAAIAMpAtABNwIEIAAgCDYCACAAQQxqIANB2AFqKAIANgIADAULIABBADYCAAwECyADKAKsASEHQQEhCCADQdABaiAHIARBAWoiAiANKAIAIBQoAgAgB0GUvoMBEL4lKAIAayACEN0XDAALCyAAIAMpAtABNwIEIAAgCDYCACAAQQxqIANB2AFqKAIANgIADAELIAAgCjYCACAAIAspAgA3AgQgAEEMaiALQQhqKAIANgIACyADQYACaiQAC6AjAgN/AX4jAEHQAGsiAyQAIAMgAjYCGEHdq5wBIQRBASEFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFB/wFxDqQBqAEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0MDQ4eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5OjuUAZUBlgGXAZgBmQGZAZkBmQGaAZsBnAE8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7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DgsgAkUNCSACKAIAQQJHDQkgAyACQQhqNgI0IANBAjYCPCADQZyhmgE2AjggA0IBNwJEIANB2AStQiCGIANBNGqthDcDICADIANBIGo2AkAgACADQThqEKAODA4LIAJFDQkgAigCAEEERw0JIAMgAkEQajYCNCADQQI2AjwgA0HIoZoBNgI4IANCATcCRCADQdgErUIghiADQTRqrYQ3AyAgAyADQSBqNgJAIAAgA0E4ahCgDgwNCyACRQ0JIAIoAgBBAkcNCSADQRBqIAJBCGoQ8RUgAygCFCEFIAMoAhAhBAwLCyACRQ0JIAIoAgBBCEcNCSADIAJBBGo2AjQgA0ECNgI8IANBmKKaATYCOCADQgE3AkQgA0HyA61CIIYgA0E0aq2ENwMgIAMgA0EgajYCQCAAIANBOGoQoA4MCwsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBlJ+aARDpIwALIANBATYCTCADQfyemgE2AkggA0EBNgI8IANBhKGbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQdCfmgEQ6SMACyADQQE2AkwgA0H8npoBNgJIIANBATYCPCADQYShmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGIoJoBEOkjAAsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJAIANBOGpBwKCaARDpIwALIANBATYCTCADQfyemgE2AkggA0EBNgI8IANBhKGbATYCOCADQQE2AkQgA0HgBK1CIIYgA0EYaq2ENwMgIAMgA0EgajYCQCADQThqQfCgmgEQ6SMACyADQQE2AkwgA0H8npoBNgJIIANBATYCPCADQYShmwE2AjggA0EBNgJEIANB4AStQiCGIANBGGqthDcDICADIANBIGo2AkAgA0E4akGAoZoBEOkjAAsgA0EBNgJMIANB/J6aATYCSCADQQE2AjwgA0GEoZsBNgI4IANBATYCRCADQeAErUIghiADQRhqrYQ3AyAgAyADQSBqNgJA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ASkDCCIxQgODQgBSDQAgMaciBiAGKAIAIgZBAWo2AgAgBkF/TA0GCwJAIAEpAxAiMkIDg0IAUg0AIDKnIgEgASgCACIBQQFqNgIAIAFBf0wNBgsgACAENgIcIAAgBTYCGCAAIDI3AxAgACAxNwMIDAQLQQEhBCABKAIIIQUgASgCFCEGIAEoAhAhBwJAAkAgASgCBCIIQQFHDQAQ+ichASACQSBqIAUQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMADAELIAEoAgwhCSAFIQEgCCEECyAAIAY2AhQgACAHNgIQIAAgCTYCDCAAIAE2AgggACAENgIEDAMLIAEpAwghMSABKAIEIQQQ+ichASACQSBqIAQQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMAIAAgMTcDCCAAIAE2AgQMAgsQ/ychBiABKAIEIgooAgQhCyAKKAIAIQwCQAJAAkACQCAKLQBsQX1qIgFBASABQf8BcUEDSRtB/wFxDgMAAQIACyAKKAJQIQ0gCigCTCEOIAooAkghDwJAIAopA0AiM0IDg0IAUg0AIDOnIgEgASgCACIBQQFqNgIAIAFBf0wNBgsgCi0AVCEQQQMhEUEAIRIMAgsgCigCVCEQIAooAlAhDSACQSBqIApB2ABqEKkIIAooAkwhDiAKKAJIIQ8CQCAKKQNAIjNCA4NCAFINACAzpyIBIAEoAgAiAUEBajYCACABQX9MDQULIAJBEmogAkE3ai0AADoAACACIAIvADU7ARAgEEEIdiESIAItADQhESACKAIwIRMgAigCLCEUIAIoAighFSACKAIkIRYgAigCICEXDAELIAooAkwhDiAKKAJIIQ8gCigCZCEUIAooAmAhFQJAIAopA0AiM0IDg0IAUg0AIDOnIgEgASgCACIBQQFqNgIAIAFBf0wNBAsgCigCXCEWIAooAlghFyAKKQNQIjGnIQ0CQCAxQgODQgBSDQAgDSANKAIAIgFBAWo2AgAgAUF/TA0ECyAxQiiIpyESIDFCIIinIRBBBSERCyAKKAKAASEEIAooAnQhGCAKKAJwIRkgAkEgaiAKKAKEASIaQQhB2AAQlQ8gAigCJCEbIAIoAiBBAUYNAyACKAIoIRwCQCAbRQ0AIAQgGkHYAGxqIR1BACEHIBshHgNAIAQgHUYNAQJAAkAgBCgCAEEFRw0AIAQoAgwhHyAEKAIIISAgBCgCBCEBEPonIQUgAkEgaiABEEIgBUE4aiACQSBqQThqKQMANwMAIAVBMGogAkEgakEwaikDADcDACAFQShqIAJBIGpBKGopAwA3AwAgBUEgaiACQSBqQSBqKQMANwMAIAVBGGogAkEgakEYaikDADcDACAFQRBqIAJBIGpBEGopAwA3AwAgBUEIaiACQSBqQQhqKQMANwMAIAUgAikDIDcDAEEFISEMAQsgBCgCLCEiIAQoAighIwJAAkAgBCkDMCIxUA0AIAQoAjwhJCAEKAI4ISUgBCgCVCEmIAQoAlAhJwJAIDFCA4NCAFINACAxpyIBIAEoAgAiAUEBajYCACABQX9MDQgLIAQoAkwhKCAEKAJIISkgBCkDQCIypyEqAkAgMkIDg0IAUg0AICogKigCACIBQQFqNgIAIAFBf0wNCAsgMkIgiKchKwwBCyAEKAJEISsgBCgCQCEqIAQpAzgiMachJQJAIDFCA4NCAFINACAlICUoAgAiAUEBajYCACABQX9MDQcLIDFCIIinISRCACExCwJAAkACQAJAAkAgBCgCACIhDgUAAQIDBAALIAJBIGogBEEIahDyAyACKAI8IQggAigCOCEJIAIoAjQhLCACKAIwIS0gAigCLCEuIAIoAighLyACKAIkIR8gAigCICEgDAMLIAQoAgghASAEKAIUIS4gBCgCECEvAkAgBCgCBCIFQQFHDQAQ+ichICACQSBqIAEQQiAgQThqIAJBIGpBOGopAwA3AwAgIEEwaiACQSBqQTBqKQMANwMAICBBKGogAkEgakEoaikDADcDACAgQSBqIAJBIGpBIGopAwA3AwAgIEEYaiACQSBqQRhqKQMANwMAICBBEGogAkEgakEQaikDADcDACAgQQhqIAJBIGpBCGopAwA3AwAgICACKQMgNwMAQQEhBQwDCyAEKAIMIR8gASEgDAILEP8nIQUgAkEgaiAEKAIEEO0BAkBBoAFFDQAgBSACQSBqQaAB/AoAAAsMAQsgBCgCCCEJIAQoAhwhLCAEKAIYIS0gBCgCFCEuIAQoAhAhLyACQSBqIAQoAgwiH0EIQSgQlQ8gAigCJCEFIAIoAiBBAUYNCCACKAIoISACQCAFRQ0AIB9BKGwhCCAgIQEgBSEwA0AgCEUNASACQSBqIAkQiAEgAUEgaiACQSBqQSBqKQMANwMAIAFBGGogAkEgakEYaikDADcDACABQRBqIAJBIGpBEGopAwA3AwAgAUEIaiACQSBqQQhqKQMANwMAIAEgAikDIDcDACAIQVhqIQggAUEoaiEBIAlBKGohCSAwQX9qIjANAAsLIAQoAiQhCCAEKAIgIQkLICutQiCGICqthCE0ICStQiCGICWthCEyCyAEQdgAaiEEIBwgB0HYAGxqIgEgJjYCVCABICc2AlAgASAoNgJMIAEgKTYCSCABIDQ3A0AgASAyNwM4IAEgMTcDMCABICI2AiwgASAjNgIoIAEgCDYCJCABIAk2AiAgASAsNgIcIAEgLTYCGCABIC42AhQgASAvNgIQIAEgHzYCDCABICA2AgggASAFNgIEIAEgITYCACAHQQFqIQcgHkF/aiIeDQALCyAKLQCIASEeAkACQCAKKAJ4IgQNAEEAISAMAQsQgCghICAEKAIEIQEgBCgCECEvIAQoAgwhLiACQSBqIAQoAggiMEEEQQQQlQ8gAigCJCEfIAIoAiBBAUYNBiACKAIoISECQCAfRQ0AIDBBAnQhBCAhIQUgHyEJA0AgBEUNASABKAIAIQgQ/CchByACQSBqIAgQdgJAQeAARQ0AIAcgAkEgakHgAPwKAAALIAUgBzYCACAFQQRqIQUgBEF8aiEEIAFBBGohASAJQX9qIgkNAAsLICAgLzYCECAgIC42AgwgICAwNgIIICAgITYCBCAgIB82AgALIAJBDGpBAmoiBCACQRBqQQJqLQAAOgAAIAIgAi8BEDsBDCACQRBqIApBkAFqEJgKQQYhAQJAAkAgCi0APCIFQQZHDQAMAQsgCigCDCEIIAooAgghCQJAAkACQAJAIAVBfWoiAUEBIAFBA0kbQf8BcQ4DAAECAAsgCigCICEjIAooAhwhBSAKKAIYIQcCQCAKKQMQIjFCA4NCAFINACAxpyIBIAEoAgAiAUEBajYCACABQX9MDQcLIAotACQhLkEDIQFBACEiDAILIAooAiQhLiAKKAIgISMgAkEgaiAKQShqEKkIIAooAhwhBSAKKAIYIQcCQCAKKQMQIjFCA4NCAFINACAxpyIBIAEoAgAiAUEBajYCACABQX9MDQYLIAJBHmogAkE3ai0AADoAACACIAIvADU7ARwgLkEIdiEiIAItADQhASACKAIwIQogAigCLCEfIAIoAighMCACKAIkISEgAigCICEvDAELIAooAhwhBSAKKAIYIQcgCigCNCEfIAooAjAhMAJAIAopAxAiMUIDg0IAUg0AIDGnIgEgASgCACIBQQFqNgIAIAFBf0wNBQsgCigCLCEhIAooAighLyAKKQMgIjKnISMCQCAyQgODQgBSDQAgIyAjKAIAIgFBAWo2AgAgAUF/TA0FCyAyQiiIpyEiIDJCIIinIS5BBSEBCyAiQQh0IC5B/wFxcq1CIIYgI62EITILIAYgAToAPCAGIAo2AjggBiAfNgI0IAYgMDYCMCAGICE2AiwgBiAvNgIoIAYgMjcDICAGIAU2AhwgBiAHNgIYIAYgMTcDECAGIAg2AgwgBiAJNgIIIAYgCzYCBCAGIAw2AgAgBiACLwEcOwA9IAZBP2ogAkEcakECai0AADoAACAGIBE6AGwgBiATNgJoIAYgFDYCZCAGIBU2AmAgBiAWNgJcIAYgFzYCWCAGIBJBCHQgEEH/AXFyrUIghiANrYQ3A1AgBiAONgJMIAYgDzYCSCAGIDM3A0AgBiAeOgCIASAGIBo2AoQBIAYgHDYCgAEgBiAbNgJ8IAYgIDYCeCAGIBg2AnQgBiAZNgJwIAYgAi8BDDsAbSAGQe8AaiAELQAAOgAAIAZBjAFqIAJBI2ooAAA2AAAgBiACKAAgNgCJASAGQZgBaiACQRBqQQhqKAIANgIAIAYgAikDEDcDkAEgACAGNgIEDAELIAEpAxAhMSABKQMYITIgAEEEaiABQQRqEJgKIAAgMjcDGCAAIDE3AxAgACABKQMgNwMgCyAAIAM2AgAgAkHAAWokAA8LAAsgGyACKAIoQbTymgEQjikACyAFIAIoAihBtPKaARCOKQALIB8gAigCKEG08poBEI4pAAvlGwIUfwF+IwBBIGsiASQAIABBPGohAiAAQTBqIQMDQCABQQA6ABQgAUEANgIQIAEgACgCaCIENgIIIAEgACgCbCIFIARrIgY2AgwCQCAFIARGDQAgBEEBaiEHQQAhCAJAAkACQANAAkAgBCAIai0AACIJQSBHDQAgCCEFA0ACQCAFQQFqIgggBkkNACABLQAUIQUgBiEIDAQLIAcgBWohCSAIIQUgCS0AACIJQSBGDQALCwJAAkACQAJAIAlBdmoOBAACAgECCyABQQE6ABQgCEEBaiIIIAZJDQMgAS0AFCEFDAQLAkACQCAIQQFqIgUgBkkNACAFIQgMAQsgCEECaiAFIAQgBWotAABBCkYbIQgLIAFBAToAFCAIIAZJDQIMAQsgASAINgIQIAlBAnRBgIGaAWooAgAiBUUNACABQQhqIAURBAAhBSABKAIQIQggBUUNACAIIAVqIgggBkkNAQsLIAEtABQhBSAIRQ0BCyAAIAAoAnggCGoiCDYCeCAAIAAoAnAiCSAAKAJ0ajYCbCAAIAkgCCAAKAJ8a2o2AmggBUEBcQ0BDAILIAVBAXFFDQELIABBAToAKAsCQAJAAkAgACgCbCIIIAAoAmgiBUYNACAFLQAAQS9HDQAgBUEBaiIJIAhGDQACQAJAIAksAAAiCEF/TA0AIAhB/wFxIQUMAQsgBS0AAkE/cSEJIAhBH3EhBgJAIAhBX0sNACAGQQZ0IAlyIQUMAQsgCUEGdCAFLQADQT9xciEJAkAgCEFwTw0AIAkgBkEMdHIhBQwBCyAJQQZ0IAUtAARBP3FyIAZBEnRBgIDwAHFyIQULAkACQCAFQVZqDgYBAgICAgACCyAAQQIQsAIMBAsgACAAKAJ4IgpBAmoiCzYCeCAAIAAoAnAiDCAAKAJ0Ig1qIg42AmwgACAMIAsgACgCfCIPayIQaiIRNgJoIA0gEEYNASAALQAoIRIgDSAQayEHQQAhEyARIQkCQANAAkAgBw0AQQAhBwwCC0EAIQgDQAJAIAgiBSAHIAVBIGoiBCAHIARJGyIITw0AAkADQCAJIAVqLQAAIgZBwJKaAWotAAANASAIIAVBAWoiBUYNAgwACwsCQAJAIAZB4gFHDQAgBUEBaiEIAkAgBUECaiIGIAdPDQACQCAIIAdPDQAgCSAGai0AAEEIdCAJIAhqLQAAckGAAnJB//8DcUGA0wJHDQFB4gEhBgwCCyAIIAdBwJSaARCRFQALAkAgCEUNACAAIA42AmwgACALIAhqIgs2AnggACAMIAsgD2tqIgk2AmgLIA4gCWshByAOIAlHDQQMAQsCQAJAIAUNACAJIQUMAQsgACAONgJsIAAgCyAFaiILNgJ4IAAgDCALIA9raiIFNgJoCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGQXZqDgQDAQEEAAsgBkEqRg0BCyAFQQFqIQkgBSwAACIIQX9KDQggCS0AAEE/cSEHIAhBH3EhBgJAAkACQAJAIAhBX00NACAHQQZ0IgcgBS0AAkE/cXIhCSAGQQx0IQQgCEFwSSIIRQ0BIAkgBHIhFAwCCyAAIAVBAmoiCTYCaCAGQQZ0IAdyIgVB/g9xQajAAEYgE3IhEwwCCyAJQQZ0IAUtAANBP3FyIAZBEnRBgIDwAHFyIRQLIAAgBUEDaiIJNgJoIAcgBS0AAkE/cXIhByAUQf7//wBxQajAAEYgE3IhEwJAIAhFDQAgByAEciEFDAELIAAgBUEEaiIJNgJoIAdBBnQgBS0AA0E/cXIgBkESdEGAgPAAcXIhBQsCQCAFQYABTw0AQQEgC2ohCwwMCwJAIAVBgBBPDQBBAiALaiELDAwLQQNBBCAFQYCABEkbIAtqIQsMCwsgBSEIAkAgBSAORg0AAkAgBSwAACIIQX9MDQAgBUEBaiEIDAELAkAgCEFgTw0AIAVBAmohCAwBCyAFQQRBAyAIQW9LG2ohCAsCQCAIIA5GDQACQAJAIAgsAAAiCUF/TA0AIAlB/wFxIQgMAQsgCC0AAUE/cSEGIAlBH3EhBwJAIAlBX0sNACAHQQZ0IAZyIQgMAQsgBkEGdCAILQACQT9xciEGAkAgCUFwTw0AIAYgB0EMdHIhCAwBCyAGQQZ0IAgtAANBP3FyIAdBEnRBgIDwAHFyIQgLIAhBL0YNBgtBASEIIAAgBUEBaiIJNgJoIAUsAAAiBkF/Sg0EIAAgBUECaiIJNgJoIAUtAAFBP3EhByAGQR9xIQQgBkFgTw0CIARBBnQgB3IhBQwDC0EBIRMgACAFQQFqIgk2AmhBASEIAkAgBSwAACIGQX9KDQAgACAFQQJqIgk2AmggBS0AAUE/cSEHIAZBH3EhCAJAAkAgBkFgTw0AIAhBBnQgB3IhBQwBCyAAIAVBA2oiCTYCaCAHQQZ0IAUtAAJBP3FyIQcCQCAGQXBPDQAgByAIQQx0ciEFDAELIAAgBUEEaiIJNgJoIAdBBnQgBS0AA0E/cXIgCEESdEGAgPAAcXIhBQsCQCAFQYABTw0AQQEgC2ohCwwLC0ECIQggBUGAEEkNAEEDQQQgBUGAgARJGyEICyAIIAtqIQsMCQtBASEJIAAgBUEBaiIINgJoAkAgBSwAACIGQX9KDQAgACAFQQJqIgg2AmggBS0AAUE/cSEEIAZBH3EhBwJAAkAgBkFgTw0AIAdBBnQgBHIhBQwBCyAAIAVBA2oiCDYCaCAEQQZ0IAUtAAJBP3FyIQQCQCAGQXBPDQAgBCAHQQx0ciEFDAELIAAgBUEEaiIINgJoIARBBnQgBS0AA0E/cXIgB0ESdEGAgPAAcXIhBQsgBUGAAUkNAEECIQkgBUGAEEkNAEEDQQQgBUGAgARJGyEJCyAAIAkgC2oiCzYCeCAIIQUCQCAIIA5GDQACQCAILAAAIgVBf0wNACAIQQFqIQUMAQsCQCAFQWBPDQAgCEECaiEFDAELIAhBBEEDIAVBb0sbaiEFC0EBIRMCQCAFIA5HDQAgCCEJDAoLAkACQCAFLAAAIglBf0wNACAJQf8BcSEFDAELIAUtAAFBP3EhBiAJQR9xIQcCQCAJQV9LDQAgB0EGdCAGciEFDAELIAZBBnQgBS0AAkE/cXIhBgJAIAlBcE8NACAGIAdBDHRyIQUMAQsgBkEGdCAFLQADQT9xciAHQRJ0QYCA8ABxciEFCyAFQQpGDQQgCCEJDAkLIAAgBUEDaiIJNgJoIAdBBnQgBS0AAkE/cXIhBwJAIAZBcE8NACAHIARBDHRyIQUMAQsgACAFQQRqIgk2AmggB0EGdCAFLQADQT9xciAEQRJ0QYCA8ABxciEFCyAFQYABSQ0AQQIhCCAFQYAQSQ0AQQNBBCAFQYCABEkbIQgLIAggC2ohCwwFCyAAIA42AmwgACALQQJqIgU2AnggACAMIAUgD2siCWoiBjYCaCATQQFxDQIMAwtBASETIAAgCEEBaiIJNgJoQQEhBQJAIAgsAAAiBkF/Sg0AIAAgCEECaiIJNgJoIAgtAAFBP3EhBSAGQR9xIQcCQAJAIAZBYE8NACAHQQZ0IAVyIQgMAQsgACAIQQNqIgk2AmggBUEGdCAILQACQT9xciEFAkAgBkFwTw0AIAUgB0EMdHIhCAwBCyAAIAhBBGoiCTYCaCAFQQZ0IAgtAANBP3FyIAdBEnRBgIDwAHFyIQgLAkAgCEGAAU8NAEEBIAtqIQsMBQtBAiEFIAhBgBBJDQBBA0EEIAhBgIAESRshBQsgBSALaiELDAMLIAAgCTYCaEEBIAtqIQsMAgsgAEEBOgAoC0EBIQgCQCASQQFxDQBBASEIAkAgAC0AKyIHQaQBRg0AIAdBtH9qQf8BcUEnSQ0AQQAhCAJAIAdBfmoOSgEBAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQEBAQAAAAAAAAEBAAsgB0HfAGpB/wFxQdIBSSEICyANIAlGDQAgBi0AAEE7RyAIcSEICyADKAIAQYCAgIB4Rg0KIAAgBTYCeCAAIA42AmwgACAGNgJoAkACQAJAAkAgCSAQayIGQX5qIglFDQAgBkECSQ0BIBEgCWosAABBv39MDQELIAAoAoQBQQhqIBEgCRDkAyEVAkAgCA0AIAAoAjAiCEGAgICAeEYNAiAAKAIkIQYCQCAAKAI4IgkgCEcNACADQeiZmgEQ6R0LIAAoAjQgCUEFdGoiCEEBOgAcIAggBjYCGCAIQQE6ABAgCCAFNgIMIAggCjYCCCAIIBU3AwAgACAJQQFqNgI4DA4LIAMoAgBBgICAgHhGDQICQCAAKAJEIgkgACgCPEcNACACQfiZmgEQ1x0LIAAoAkAgCUEYbGoiCEEBOgAQIAggBTYCDCAIIAo2AgggCCAVNwMAIAAgCUEBajYCRAwNCyARIAZBACAJQdCUmgEQ4yoAC0HglJoBENIsAAtB8JSaARDSLAALIAAgCzYCeAsgDiAJayEHIA4gCUcNAwsgE0EBcUUNBSAAQQE6ACgMBQsgBCAHSQ0ACwsLIAAgDjYCbCAAIAsgB2oiBTYCeCAAIAwgBSAPa2o2AmggE0EBcUUNAiAAQQE6ACgMAgsgAUEgaiQADwsgACgCgAEhBSABQZqAgIB4NgIIIAAgBSAFIAFBCGoQqiQMAQsgACgCgAEhBSABQZqAgIB4NgIIIAAgBSAFIAFBCGoQqiQMAAsL6RwCDn8DfiMAQdAAayIFJAACQAJAAkACQAJAIAIOAwEAAgELIAEoAgAiBigCgAVBsAJqIQcMAgsgASgCACIGKAKABUG0AmohBwwBCwJAIAEoAgAiBi0AWUEBcQ0AIAAgA61CIIZCAoQ3AgAMAgsCQCADIAYoAoAFIgcoAtwCTw0AIAcoAtgCIANBAnRqIQcMAQsgBkGEBWooAgAQ1xohByAAQQU2AgAgACAHNgIEDAELIAcoAgAhCCABKAIEIgcpAqQBIRMgB0KAgICAEDcCpAEgB0GsAWoiCSgCACEKIAlBADYCACAFQcAAaiAKNgIAIAUgEzcDOCAFQSRqIAVBOGoQkSUgBigCgAUiCSgCuAIhCyAJLQDgAiEMIAktAOQCIQ0gBSgCLCEKIAUoAighCQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARB/wFxDgYAAQIDBAUACyALQcD/D3FFDTUgCSAKELAhIQsgCkUNBSAKQX9qIgxFDQYgCSALOgABIAxBAUYNByAJIAtBgIAFciINQQh2OgACIAxBAk0NCCAJIA1BEHY6AAMgDEEDRg0JIAkgC0EYdjoABAw1CyALQcD/D3FFDTQMMwsCQCALQQNxRQ0AIAkgChCwISEMIApFDQkgCkF/aiINRQ0KIAkgDEEBcjoAASANQQFGDQsgCSAMQQh2OgACIA1BAk0NDCAJIAxBEHY6AAMgDUEDRg0NIAkgDEEYdjoABAsCQCALQTxxRQ0AIAkgChCwISEMIApFDQ4gCkF/aiINRQ0PIAkgDEEUcjoAASANQQFGDRAgCSAMQQh2OgACIA1BAk0NESAJIAxBEHY6AAMgDUEDRg0SIAkgDEEYdjoABAsgC0HA/w9xRQ0zIAkgChCwISELIApFDRIgCkF/aiIMRQ0TIAkgCzoAASAMQQFGDRQgCSALQYCABXIiDUEIdjoAAiAMQQJNDRUgCSANQRB2OgADIAxBA0YNFiAJIAtBGHY6AAQMMwsCQCANQQFxDQAgC0E8cUUNMSAJIAoQsCEhDSAKRQ0XIApBf2oiDkUNGCAJIA1BEHI6AAEgDkEBRg0ZIAkgDUEIdjoAAiAOQQJNDRogCSANQRB2OgADIA5BA0YNGwwwCwJAIAtBMHFFDQAgCSAKEPwlCyALQTxxRQ0wIAkgChCwISENIApFDRsgCkF/aiIORQ0cIAkgDUEEcjoAASAOQQFGDR0gCSANQQh2OgACIA5BAk0NHiAJIA1BEHY6AAMgDkEDRw0vQQNBA0HorIQBEJEVAAsgC0EwcUUNLQJAIA1BAXENACAJIAoQ/CUMLgsgCSAKELAhIQ0gCkUNHiAKQX9qIg5FDR8gCSANQRByOgABIA5BAUYNICAJIA1BCHY6AAIgDkECTQ0hIAkgDUEQdjoAAyAOQQNGDSIgCSANQRh2OgAEDC0LAkAgC0E8cUUNACAJIAoQsCEhDSAKRQ0jIApBf2oiDkUNJCAJIA1BBHI6AAEgDkEBRg0lIAkgDUEIdjoAAiAOQQJNDSYgCSANQRB2OgADIA5BA0YNJyAJIA1BGHY6AAQLIAtBwP8PcUUNMCAMQdi0hAFqLQAADS8gCSAKELAhIQsgCkUNJyAKQX9qIgxFDSggCSALOgABIAxBAUYNKSAJIAtBgIAFciINQQh2OgACIAxBAk0NKiAJIA1BEHY6AAMgDEEDRg0rIAkgC0EYdjoABAwwC0EBQQBBqLGEARDgLAALQQBBAEG4rIQBEJEVAAtBAUEBQcishAEQkRUAC0ECQQJB2KyEARCRFQALQQNBA0HorIQBEJEVAAtBAUEAQaixhAEQ4CwAC0EAQQBBuKyEARCRFQALQQFBAUHIrIQBEJEVAAtBAkECQdishAEQkRUAC0EDQQNB6KyEARCRFQALQQFBAEGosYQBEOAsAAtBAEEAQbishAEQkRUAC0EBQQFByKyEARCRFQALQQJBAkHYrIQBEJEVAAtBA0EDQeishAEQkRUAC0EBQQBBqLGEARDgLAALQQBBAEG4rIQBEJEVAAtBAUEBQcishAEQkRUAC0ECQQJB2KyEARCRFQALQQNBA0HorIQBEJEVAAtBAUEAQaixhAEQ4CwAC0EAQQBBuKyEARCRFQALQQFBAUHIrIQBEJEVAAtBAkECQdishAEQkRUAC0EDQQNB6KyEARCRFQALQQFBAEGosYQBEOAsAAtBAEEAQbishAEQkRUAC0EBQQFByKyEARCRFQALQQJBAkHYrIQBEJEVAAtBAUEAQaixhAEQ4CwAC0EAQQBBuKyEARCRFQALQQFBAUHIrIQBEJEVAAtBAkECQdishAEQkRUAC0EDQQNB6KyEARCRFQALQQFBAEGosYQBEOAsAAtBAEEAQbishAEQkRUAC0EBQQFByKyEARCRFQALQQJBAkHYrIQBEJEVAAtBA0EDQeishAEQkRUAC0EBQQBBqLGEARDgLAALQQBBAEG4rIQBEJEVAAtBAUEBQcishAEQkRUAC0ECQQJB2KyEARCRFQALQQNBA0HorIQBEJEVDAULAkAgDEENRw0AIAtBPHFFDQAgCSAKELAhIQwCQAJAAkACQAJAIApFDQAgCkF/aiINRQ0BIAkgDEEEcjoAASANQQFGDQIgCSAMQQh2OgACIA1BAk0NAyAJIAxBEHY6AAMgDUEDRg0EIAkgDEEYdjoABAwFC0EBQQBBqLGEARDgLAALQQBBAEG4rIQBEJEVAAtBAUEBQcishAEQkRUAC0ECQQJB2KyEARCRFQALQQNBA0HorIQBEJEVAAsgC0HA/w9xRQ0DIAkgChCwISELAkACQAJAAkACQCAKRQ0AIApBf2oiDEUNASAJIAs6AAEgDEEBRg0CIAkgC0GAgAVyIg1BCHY6AAIgDEECTQ0DIAkgDUEQdjoAAyAMQQNGDQQgCSALQRh2OgAEDAgLQQFBAEGosYQBEOAsAAtBAEEAQbishAEQkRUAC0EBQQFByKyEARCRFQALQQJBAkHYrIQBEJEVAAtBA0EDQeishAEQkRUACyAJIA1BGHY6AAQgDEEKRw0AIAkgCSAKELAhIgxBGHY6AAQgCSAMQRB2OgADIAkgDEEIdjoAAiAJIAxBBHI6AAELIAtBwP8PcUUNASAJIAoQsCEhCwJAAkACQAJAAkAgCkUNACAKQX9qIgxFDQEgCSALOgABIAxBAUYNAiAJIAtBgIAFciINQQh2OgACIAxBAk0NAyAJIA1BEHY6AAMgDEEDRg0EIAkgC0EYdjoABAwGC0EBQQBBqLGEARDgLAALQQBBAEG4rIQBEJEVAAtBAUEBQcishAEQkRUAC0ECQQJB2KyEARCRFQALQQNBA0HorIQBEJEVAAsgCSAKEPslCyAHQQA2AkggCSAKELUhIQkgBigCgAUgCCAJIAdBmAFqIAdBMGoiChCnAyAFQThqIAVBJGoQjw4gBigCgAUgCiAFQThqENgGIAYtAFwhDiAFKAJAIQkgBSgCPCEKIAUoAjghDAJAAkAgBygCDEUNACAHKQMQIAdBGGopAwAgCiAJENwGIRMgBygCACIIQXRqIQ8gBygCBCINIBOncSELIBNCGYhC/wCDQoGChIiQoMCAAX4hFEEAIRACQANAAkAgCCALaikAACIVIBSFIhNCf4UgE0L//fv379+//358g0KAgYKEiJCgwIB/gyITUA0AA0AgCiAJIA9BACATeqdBA3YgC2ogDXFrIhFBDGxqIhIoAgAgEkEEaigCABDvKg0DIBNCf3wgE4MiE1BFDQALCyAVIBVCAYaDQoCBgoSIkKDAgH+DUEUNAiALIBBBCGoiEGogDXEhCwwACwsgCCARQQxsakF8aigCACEJIAchAQwBCyAFQRhqIAogCRCvECAFKAIYIQsCQAJAAkAgBSgCHCINIAcQkhhqQQQgBkGEBWooAgB0akEUaiAGKAKIBU0NACABEIcODQELIAVBEGogARDjEyAFKAIQQQFxRQ0BCyALIAsoAgAiB0F/ajYCAAJAIAdBAUcNACALIA0QgR8LIAEoAgQgCq1CIIYgDK2EEM8lIABCAzcCAAwFCyAFKAIUIQkgCyANEPMmIQggB0H0AGpBASAGQYQFaigCAHQQ9hUgCUGAgICAAXIgCSAOQQFxGyIJQYCAgMAAciAJIAgbIQkCQCAGQeAEaiIOQYCLhAFBIBCIG0UNACAGIAkQ/iENACAGQYQFaigCABDlGyEIIAVBADYCNCAFIA42AjADQCAFQQhqIAVBMGoQzRAgBS0ACEUNASAGIAcgCSAFLQAJQf8BcUEIdCAIEKwJDAALCyAHIAcoAmggDWo2AmggCyALKAIAIghBAWo2AgAgCEF/TA0BAkAgBygClAEiCCAHKAKMAUcNACAHQYwBahChHAsgBygCkAEgCEEDdGoiDiANNgIEIA4gCzYCACAHIAhBAWo2ApQBIAcgCyANIAkQlAYgASgCBCEBCyABIAqtQiCGIAythBDPJQJAAkAgCUH///8/cSIKIAcoAnxPDQAgCkF/IAYoAoQFdEF/c3FFDQELQeSHhAFBLEGQiIQBENIeAAsgBEH/AXEhCgJAAkAgAg4DBAABBAsgCkEGaiEKDAMLIAYtAFlBAXFFDQEgA0EGbCAKakEMaiEKDAILAAsgBUEANgJIIAVBATYCPCAFQfSIhAE2AjggBUIENwJAIAVBOGpB/IiEARDpIwALAkAgCiAHKAKIASIGSQ0AIAogBkGMiYQBEJEVAAsgACAJNgIEIABBBTYCACAHKAKEASAKQQJ0aiAJNgIACyAFQdAAaiQAC8gdAhR/AX4jAEHAAWsiBiQAAkACQAJAAkAgAygCACIHQX9qQQJJDQACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAFIAEoAqQNIggoAsQCQRBqKAIAQQF0Sw0AIAZB7ABqIAEoArANIAEoArQNIgkoAghBf2pBeHFqQQhqIgogAygCCCILIAMoAgwiDCADKAIQIg0gAygCFCIOIAkoAhAiDxESAAJAAkACQCAGKAJsQQFHDQAgAkGYA2ohECABQZAFaiERIAMtABghEkEAIRMgAS0ArA1BAXEhFCABKQMAQgKFIAEpAwiEIRogDSEVA0AgBigCcCEWIAYgBigCdCIJNgKMASAGIA02AogBAkACQCAJIAxLDQAgDSAJQQFqTQ0BCyAGQQI2ApgBIAZB4OibATYClAEgBkICNwKgASAGQQs2ArgBIAZBkgE2ArABIAYgDDYCkAEgBiAGQawBajYCnAEgBiAGQZABajYCtAEgBiAGQYgBajYCrAEgBkGUAWpB8OibARDpIwALIAYgF0GAfnEgEnIiFzYChAEgBiAJNgKAASAGIA02AnwgBiAMNgJ4IAYgCzYCdCAGQQE2AmwgFA0FAkACQCAaUA0AIAIoAsgEQQJGDQggBkGsAWogESAQIAZB7ABqIBMQ7gEgBigCsAEhGCAGKAKsASITQQJHDQEgGEEBcUUNBSAGQcAAaiABIAIgAxDOBAwYCyAGQQE2ApgBIAZBvJ6DATYClAEgBkIANwKgASAGIAZBvAFqNgKcASAGQZQBakHEnoMBEOkjAAsgE0EBcQ0CIBUgDk8NASAWQX9GDQcgBkHsAGogCiALIAwgFkEBaiIVIA4gDxESACAJIRMgBigCbA0ACwsgBkEANgJADBQLIAYgBigCtAEiCTYCiAEgBiAONgKMASAOIAxLDQUgCSAOQQFqSw0FIAYgEjYChAEgBiAONgKAASAGIAk2AnwgBiAMNgJ4IAYgCzYCdCAGIBg2AnAgBkECNgJsIAIoAsgEQQJGDQYgAkHYAWohDQJAAkACQAJAAkAgASgCgAUiDC0A4gINACAGQZQBaiABIA0gBkHsAGoQTyAGKAKUASIMQQJHDQEMFgsgDC0A4wIhDiAGQZQBaiABIA0gBkHsAGoQTyAGKAKUASIMQQJGDRUgDEEBcUUNAyAGKAKcASEWIA5BAXFFDQIgBkGsAWogBkHsAGogBigCmAEgFiAWIAEgDRC+BiAGKAKsASIMQQJHDQEgBigCsAEhCQwWCyAMQQFxRQ0CIAYoApwBIRYMAQsgBigCtAEhFgsgDEEBcUUNACAJIBZLDQggBiAYNgJMIAYgFjYCSCAGIAk2AkQgBkEBNgJADBQLIAZBATYCmAEgBkG8n4MBNgKUASAGQgA3AqABIAYgBkG8AWo2ApwBIAZBlAFqQcSfgwEQ6SMACyACKALIBEECRg0HIAZB7ABqIAEgAkHYAWogAxCFBAJAIAYoAmwiCUECRw0AIAYoAnAQ0xMaIAZBwABqIAEgAiADEM4EDBMLIAYgBikCdDcCSCAGIAYoAnA2AkQgBiAJNgJADBILIAMoAgQhGSAGQewAaiABKAKwDSABKAK0DSIJKAIIQX9qQXhxakEIaiIKIAMoAggiCyADKAIMIgwgAygCECINIAMoAhQiDiAJKAIQIg8REgAgBigCbEEBRw0TIAJBmANqIRAgAUGQBWohESADLQAYIRJBACETIAEtAKwNQQFxIRQgASkDAEIChSABKQMIhCEaIA0hFQJAA0AgBigCcCEWIAYgBigCdCIJNgJEIAYgDTYCQCAJIAxLDQkgDSAJQQFqSw0JIAYgF0GAfnEgEnIiFzYChAEgBiAJNgKAASAGIA02AnwgBiAMNgJ4IAYgCzYCdCAGQQE2AmwgFA0KAkACQCAaUA0AIAIoAsgEQQJGDQ0gBkGsAWogESAQIAZB7ABqIBMQ7gEgBigCsAEhGCAGKAKsASITQQJHDQEgGEEBcUUNAyAGQRhqIAEgAiADIAQgBRDHBiAGKAIcIQMgBigCGCEBDBkLIAZBATYCmAEgBkG8noMBNgKUASAGQgA3AqABIAYgBkG8AWo2ApwBIAZBlAFqQcSegwEQ6SMACwJAIBNBAXENACAVIA5PDRYgFkF/Rg0NIAZB7ABqIAogCyAMIBZBAWoiFSAOIA8REgAgCSETIAYoAmxFDRYMAQsLIAYgBigCtAEiAzYCrAEgBiAONgKwASAOIAxLDQwgAyAOQQFqSw0MIAYgEjoAhAEgBiAONgKAASAGIAM2AnwgBiAMNgJ4IAYgCzYCdCAGIBg2AnAgBkECNgJsIAZBOGogASACIAZB7ABqIAQgBRDHBiAGKAI8IQMgBigCOCEBDBYLAkAgBSAIKALEAkEQaigCAEEBdEsNACACKALIBEECRg0NIAZB7ABqIAEgAkHYAWogAxCFBAJAAkAgBigCbCIJQQJHDQAgBigCcBDTExogBkGUAWogASACIAMQzgQgBigClAEhCQwBCyAGIAYpAnQ3ApwBIAYgBigCcDYCmAELIAlBAXFFDRQgBigCoAEiA0EBdCIBQQFyIQkgBikCmAEhGgJAIAEgBU8NACAEIAFBAnRqIBqnQQFqNgIAC0EBIQEgCSAFTw0WQQEhASAEIAlBAnRqIBpCIIinQQFqNgIADBYLAkAgASgC5ApBA0YNACABKAKICyIJKAKwAiAJKAK0AkcNACAGQTBqIAEgAiADIAQgBRDHBiAGKAI0IQMgBigCMCEBDBYLIAIoAsgEQQJGDQ0gBkHsAGogASACQdgBaiADEIUEAkAgBigCbCIJQQJHDQAgBigCcBDTExogBkEgaiABIAIgAyAEIAUQxwYgBigCJCEDIAYoAiAhAQwWCyAJQQFxRQ0TIAYoAnghAyAGKAJ0IQkgBigCcCEWIAYgDjYCgAEgBiANNgJ8IAYgDDYCeCAGIAs2AnQgBiASOgCEASAGIBk2AnAgBiAHNgJsIAZB0ABqIAZB7ABqIBYgCRCfDCAGIAM2AlQgBkECNgJQIAZBKGogASACIAZB0ABqIAQgBRDHBiAGKAIoQQFxRQ0OIAYoAiwhA0EBIQEMFQtBoKacAUEoQaSjgwEQ0h4AC0HEooMBENIsAAtB5J2DARDSLAALIAZBAjYCmAEgBkHg6JsBNgKUASAGQgI3AqABIAZBCzYCuAEgBkGSATYCsAEgBiAMNgKQASAGIAZBrAFqNgKcASAGIAZBkAFqNgK0ASAGIAZBiAFqNgKsASAGQZQBakHw6JsBEOkjAAtBlKKDARDSLAALIAZBADYCpAEgBkEBNgKYASAGQfyUhAE2ApQBIAZCBDcCnAEgBkGUAWpB1KSDARDpIwALQYSigwEQ0iwACyAGQQI2ApgBIAZB4OibATYClAEgBkICNwKgASAGQQs2ArgBIAZBkgE2ArABIAYgDDYCiAEgBiAGQawBajYCnAEgBiAGQYgBajYCtAEgBiAGQcAAajYCrAEgBkGUAWpB8OibARDpIwALQaCmnAFBKEGko4MBENIeAAtBxKKDARDSLAALQeSdgwEQ0iwACyAGQQI2AnAgBkHg6JsBNgJsIAZCAjcCeCAGQQs2AqABIAZBkgE2ApgBIAYgDDYCQCAGIAZBlAFqNgJ0IAYgBkHAAGo2ApwBIAYgBkGsAWo2ApQBIAZB7ABqQfDomwEQ6SMAC0GEooMBENIsAAtBhKKDARDSLAALQdycgwFBE0HwnIMBELIXAAsgBigCmAEhCQsgCRDTExogBkHAAGogASACIAMQzgQLIAYoAkBFDQFBASEBIAYoAkwiA0EBdCIJQQFyIQIgBikCRCEaAkAgCSAFTw0AIAQgCUECdGogGqdBAWo2AgALIAIgBU8NA0EBIQEgBCACQQJ0aiAaQiCIp0EBajYCAAwDCwJAAkACQAJAAkACQAJAAkAgBSABKAKkDSgCxAJBEGooAgBBAXRLDQAgAS0ArA1BAUYNASABKQMAQgKFIAEpAwiEUA0DIAIoAsgEQQJGDQIgBkHsAGogASACQdgBaiADEIUEAkAgBigCbCIJQQJHDQAgBigCcBDTExogBkGUAWogASACIAMQzgQMCAsgBiAGKQJ0NwKcASAGIAYoAnA2ApgBIAYgCTYClAEMBwsCQAJAIAEoAuQKQQNHDQAgAS0ArA1FDQFBoKacAUEoQeSigwEQ0h4ACyAGQRBqIAEgAiADIAQgBRDHBiAGKAIUIQMgBigCECEBDAoLAkACQCABKQMAQgKFIAEpAwiEUA0AIAIoAsgEQQJGDQUgBkHsAGogASACQdgBaiADEIUEIAYoAmwiCUECRw0BIAYoAnAQ0xMaCyAGIAEgAiADIAQgBRDHBiAGKAIEIQMgBigCACEBDAoLIAlBAXFFDQcgBigCeCEMIAYoAnAhCSADLQAYIRYgAygCDCENIAMoAgghDiAGIAYoAnQiAzYCsAEgBiAJNgKsASAJIANBAWpLDQQgAyANSw0EIAYgFjoAhAEgBiADNgKAASAGIAk2AnwgBiANNgJ4IAYgDjYCdCAGIAw2AnAgBkECNgJsIAZBCGogASACIAZB7ABqIAQgBRDHBkEBIQEgBigCCEEBcUUNBSAGKAIMIQMMCQtBoKacAUEoQeSigwEQ0h4AC0GEooMBENIsAAsgBkGUAWogASACIAMQzgQMAwtBhKKDARDSLAALIAZBAjYCcCAGQeDomwE2AmwgBkICNwJ4IAZBCzYCoAEgBkGSATYCmAEgBiANNgJAIAYgBkGUAWo2AnQgBiAGQcAAajYCnAEgBiAGQawBajYClAEgBkHsAGpB8OibARDpIwALQdycgwFBE0HwnIMBELIXAAsgBigClAENAQtBACEBDAELQQEhASAGKAKgASIDQQF0IglBAXIhAiAGKQKYASEaAkAgCSAFTw0AIAQgCUECdGogGqdBAWo2AgALIAIgBU8NAEEBIQEgBCACQQJ0aiAaQiCIp0EBajYCAAsgACABNgIAIAAgAzYCBCAGQcABaiQAC5YaAw5/An4BfCMAQcAAayICJAAgASgCeCEDIAJBADoAJyACQQA6ABggASACQSdqIAJBJmogAkEYahCQAwJAAkACQAJAAkACQCACLQAnDQAgAkGXgICAeDYCKCACQQo6ACwgASgCeCADIAJBKGoQzy4hBAwBCyABKAJ4IQUgAi0AGCEGIAEgASgCcCIHIAEoAnQiCGoiBDYCbCAFIAEoAnwiCWsiCiADIAlrIgtrIQwCQAJAIAggCkYNAAJAAkACQAJAAkACQAJAAkAgByAKaiIILQAAQe4ARw0AIAEgBUEBaiIINgJ4IAEgByAIIAlrIglqNgJoIAJBKGogByALaiIFIAwQ2wQgAigCKA0CIAJBCGogAigCLCIIIAIoAjAiB0EtEI0YAkACQCACKAIIIgQNAEECIQQMAQsgCCAEIAQgAigCDCIKQSsQrB8iBhshCCAHIAogBhshB0EAIQQLIAJBKGogCCAHQQoQ8QEgAigCKCIKQYCAgIB4Rg0CIAJBFmoiBiACQShqQQdqLQAAOgAAIAIgAi8ALTsBFEEALQCg8Z4BGiACLQAsIQMgAigCMCEHQRAQfSIIDQEACwJAAkACQCAILAAAIgdBf0oNACAHQR9xIgpBBnQgCC0AAUE/cSILciEJAkAgB0FgSQ0AIAtBBnQgCC0AAkE/cXIhDAJAAkAgB0FwTw0AIAwgCkEMdHIhDAwBCyAMQQZ0IAgtAANBP3FyIApBEnRBgIDwAHFyIQwLIAxBLkYNAgwHCyAJQS5HDQYgASAIQQJqIg02AmhBASEHDAILIAdBLkcNBUEBIQcgASAIQQFqIg02AmgMAQsgASAIQQJqIg02AmgCQCAHQWBJDQAgASAIQQNqIg02AmggC0EGdCAILQACQT9xciEJAkAgB0FwTw0AIAkgCkEMdHIhCQwBCyABIAhBBGoiDTYCaCAJQQZ0IAgtAANBP3FyIApBEnRBgIDwAHFyIQkLAkAgCUGAAU8NAEEBIQcMAQsCQCAJQYAQTw0AQQIhBwwBC0EDQQQgCUGAgARJGyEHCyABIAcgBWoiDjYCeCANIARGDQIgDiELQYCAxAAhCQNAIAlBUmohDyANIQgCQAJAA0ACQAJAIAgsAAAiB0F/SiIKDQAgCC0AAUE/cSEJIAdBH3EhDAJAIAdBYE8NACAMQQZ0IAlyIQkMAgsgCUEGdCAILQACQT9xciEJAkAgB0FwTw0AIAkgDEEMdHIhCQwCCyAJQQZ0IAgtAANBP3FyIAxBEnRBgIDwAHFyIQkMAQsgB0H/AXEhCQsCQAJAIAlB3wBGDQBBASEMIAlBgIDEAEYNCiAJQVBqQQlLDQpBASEMIAEgCEEBaiINNgJoQQEhDyAKDQQgASAIQQJqIg02AmggCC0AAUE/cSEKIAdBH3EhDyAHQWBPDQEgD0EGdCAKciEIDAMLAkACQCAKRQ0AIAhBAWohCQwBCwJAIAdBYE8NACAIQQJqIQkMAQsgCEEEQQMgB0FvSxtqIQkLAkACQCAJIARGDQACQAJAIAksAAAiCkF/Sg0AIAktAAFBP3EhBiAKQR9xIQsCQCAKQWBPDQAgC0EGdCAGciEJDAILIAZBBnQgCS0AAkE/cXIhBgJAIApBcE8NACAGIAtBDHRyIQkMAgsgBkEGdCAJLQADQT9xciALQRJ0QYCA8ABxciEJDAELIApB/wFxIQkLIAlBUGpBCUsNACAPDkIAAQEBAQEBAQEBAQEBAQEBAQEBAQABAQABAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAAEBAAEBAAEBAQEBAQEBAQABCyACQe6AgIB4NgIoIAEgDiACQShqEI8sIAEoAmwhBCABKAJoIggtAAAhBwsgASAIQQFqIgo2AmgCQAJAIAfAQX9KDQAgASAIQQJqIgo2AmggCC0AAUE/cSEJIAdBH3EhBgJAAkAgB0H/AXEiB0HgAU8NACAGQQZ0IAlyIQgMAQsgASAIQQNqIgo2AmggCUEGdCAILQACQT9xciEJAkAgB0HwAU8NACAJIAZBDHRyIQgMAQsgASAIQQRqIgo2AmggCUEGdCAILQADQT9xciAGQRJ0QYCA8ABxciEICyABKAJ4IQcCQCAIQYABTw0AQQEhCSAKIQgMAgsCQCAIQYAQTw0AQQIhCSAKIQgMAgtBA0EEIAhBgIAESRshCSAKIQgMAQsgASgCeCEHQQEhCSAKIQgLIAEgCSAHaiILNgJ4QQEhBkEBIQwgCCAERg0JDAELCyABIAhBA2oiDTYCaCAKQQZ0IAgtAAJBP3FyIQoCQCAHQXBPDQAgCiAPQQx0ciEIDAELIAEgCEEEaiINNgJoIApBBnQgCC0AA0E/cXIgD0ESdEGAgPAAcXIhCAsCQCAIQYABTw0AQQEhDwwBC0ECIQ8gCEGAEEkNAEEDQQQgCEGAgARJGyEPCyABIA8gC2oiCzYCeCANIQggDSAERg0FDAALCyAIIAM6AAQgCCAKNgIAIAggAi8BFDsABSAIIAc2AgggCCAEQQEgBxs6AAwgCEEHaiAGLQAAOgAAIAEoAoQBQQhqIAUgCSALaxDkAyEQIAIgCDYCGCACKQMYIREgAiAQNwMwIAIgET4COCACQQc2AiggASACQShqEJQFQcIAIQEMCgtBoIqaARDSLAALIAEoAnwhCSABKAJ0IQggASgCcCEHIA4hBQwCC0EAIQwgBSELCwJAIAggBEYNAAJAAkACQAJAIAgsAAAiCUF/Sg0AIAlBH3EiDkEGdCAILQABQT9xIg9yIQoCQCAJQWBJDQAgD0EGdCAILQACQT9xciEHAkACQCAJQXBPDQAgByAOQQx0ciEHDAELIAdBBnQgCC0AA0E/cXIgDkESdEGAgPAAcXIhBwsgB0Hf//8AcUHFAEcNBSABIAhBAmoiBzYCaCAJQWBJDQMgASAIQQNqIgc2AmggD0EGdCAILQACQT9xciEFIAlBcE8NAiAFIA5BDHRyIQoMAwsgCkHfD3FBxQBHDQQgASAIQQJqIgc2AmgMAgsgCUHfAHFBxQBHDQNBASEJIAEgCEEBaiIHNgJoDAILIAEgCEEEaiIHNgJoIAVBBnQgCC0AA0E/cXIgDkESdEGAgPAAcXIhCgsCQCAKQYABTw0AQQEhCQwBCwJAIApBgBBPDQBBAiEJDAELQQNBBCAKQYCABEkbIQkLIAEgCSALaiIJNgJ4AkACQCAHIARGDQACQCAHLAAAIghBf0wNACAIQf8BcSEEDAILIActAAFBP3EhBCAIQR9xIQUCQCAIQV9LDQAgBUEGdCAEciEEDAILIARBBnQgBy0AAkE/cXIhBAJAIAhBcE8NACAEIAVBDHRyIQQMAgsgBEEGdCAHLQADQT9xciAFQRJ0QYCA8ABxciIEQYCAxABHDQELIAJBpYCAgHg2AiggCSAJIAJBKGoQ1iMhBAwGCwJAAkAgBEFVag4DAAEAAQtBASEEIAEgB0EBajYCaAJAIAhBf0oNACABIAdBAmo2AmggBy0AAUE/cSEFIAhBH3EhCgJAAkAgCEFgTw0AIApBBnQgBXIhCAwBCyABIAdBA2o2AmggBUEGdCAHLQACQT9xciEFAkAgCEFwTw0AIAUgCkEMdHIhCAwBCyABIAdBBGo2AmggBUEGdCAHLQADQT9xciAKQRJ0QYCA8ABxciEICyAIQYABSQ0AQQIhBCAIQYAQSQ0AQQNBBCAIQYCABEkbIQQLIAEgBCAJaiIJNgJ4CyACQQA6ACcgAkEAOgAYIAEgAkEnaiACQSZqIAJBGGoQkAMCQCACLQAnDQAgAkGXgICAeDYCKCACQQo6ACwgASgCeCAJIAJBKGoQzy4hBAwGCyAGIAItABhyIQYgASgCeCEFIAEoAnwhCSABKAJ0IQggASgCcCEHDAELIAEoAnwhCSABKAJ0IQggASgCcCEHIAxFDQEgCyEFCyABIAcgCGo2AmwgASAHIAUgCWsiBGo2AmggAkEYaiAHIAMgCWsiCmogBCAKayAGQQFxEPkIIAJBKGogAigCHCIEIAIoAiAQgQEgAi0AKEEBRg0HIAIrAzAhEiACKAIYIgpBgICAgHhGDQIgCiAEENgsDAILIAUgCWsiCiADIAlrIgtrIQwLIAEgBTYCeCABIAcgCGo2AmwgASAHIApqNgJoIAJBKGogByALaiAMIAZBAXEQ+QggAigCLCIEIAIoAjAQvQ8hEiACKAIoIgpBgICAgHhGDQAgCiAEENgsCyABEO8KIgRFDQELIAAgBDYCBEEBIQEMAgsgASAHIAhqNgJsIAEgByAFIAlrIghqNgJoIAIgByADIAlrIgRqIAggBGsQ0ww3AzAgAiASOQM4IAJBBjYCKCABIAJBKGoQlAVBwQAhAQsgACABOgABQQAhAQsgACABOgAAIAJBwABqJAAPCyACIAItACk6ACdB8omaAUEdIAJBJ2pB0JiaAUGQipoBEOoSAAuwGgILfwJ+IwBBMGsiBCQAIARBGGpBCEEBQQEQlQ8gBCgCHCEFAkACQAJAAkAgBCgCGEEBRg0AIAQoAiAhBiABIAEoAmgiB0EBaiIINgJoIARBADYCDCAEIAY2AgggBCAFNgIEIAEoAmwhCQJAAkACQAJAIAcsAAAiBUF/Sg0AIAEgB0ECaiIINgJoIActAAFBP3EhBiAFQR9xIQogBUFfSw0BIApBBnQgBnIhBQwCCyABKAJ4IQdBASEFDAILIAEgB0EDaiIINgJoIAZBBnQgBy0AAkE/cXIhBgJAIAVBcE8NACAGIApBDHRyIQUMAQsgASAHQQRqIgg2AmggBkEGdCAHLQADQT9xciAKQRJ0QYCA8ABxciEFCyABKAJ4IQcCQCAFQYABTw0AQQEhBQwBCwJAIAVBgBBPDQBBAiEFDAELQQNBBCAFQYCABEkbIQULIAEgBSAHaiILNgJ4AkAgCCAJRw0AIAshBQwDCyALIQUgCyEKA0ACQAJAIAgsAAAiBkF/SiIMRQ0AIAZB/wFxIQcMAQsgCC0AAUE/cSEHIAZBH3EhDQJAIAZBX0sNACANQQZ0IAdyIQcMAQsgB0EGdCAILQACQT9xciEHAkAgBkFwTw0AIAcgDUEMdHIhBwwBCyAHQQZ0IAgtAANBP3FyIA1BEnRBgIDwAHFyIQcLAkACQAJAAkACQAJAAkACQCAHQdsASg0AIAdBdmoOGwQDAwQDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAQMLIAdB2L9/akECSQ0DAkACQCAHQaR/ag4FAwQEBAEACyAHQYCAxABHDQMMCwsCQAJAIAQoAgRBgICAgHhHDQBBASEGIAQoAgghBQwBCyABIAU2AnggASABKAJwIgcgASgCdGo2AmwgASAHIAUgASgCfCIIa2oiBTYCaCAEQQRqIAcgCiAIa2ogBRDXICAEKAIIIQUCQCAEKAIEIgdBgICAgHhHDQBBASEGDAELIAEoAoQBQQhqIAUgBCgCDBDkAyEPIAcgBRDYLEEAIQYLIAEgASgCcCIHIAEoAnRqNgJsIAEgByABKAJ4IAEoAnwiCGsiCmo2AmggASgChAFBCGogByALIAhrIghqIAogCGsQ5AMhEEEBIQggASABKAJoIgdBAWo2AmgCQAJAAkACQCAHLAAAIgpBf0oNACABIAdBAmo2AmggBy0AAUE/cSEIIApBH3EhDCAKQV9LDQEgDEEGdCAIciEIDAILIAEoAnghBwwCCyABIAdBA2o2AmggCEEGdCAHLQACQT9xciEIAkAgCkFwTw0AIAggDEEMdHIhCAwBCyABIAdBBGo2AmggCEEGdCAHLQADQT9xciAMQRJ0QYCA8ABxciEICyABKAJ4IQcCQCAIQYABTw0AQQEhCAwBCwJAIAhBgBBPDQBBAiEIDAELQQNBBCAIQYCABEkbIQgLIAEgCCAHajYCeCABQQhqIQcCQCABKAIIQQlGDQAgBxDABQtBxQBByAAgAxshCCAHIAY2AgAMCQsCQAJAIAxFDQAgCEEBaiEHDAELAkAgBkFgTw0AIAhBAmohBwwBCyAIQQRBAyAGQW9LG2ohBwsgByAJRg0BAkACQCAHLAAAIglBf0wNACAJQf8BcSEHDAELIActAAFBP3EhDSAJQR9xIQ4CQCAJQV9LDQAgDkEGdCANciEHDAELIA1BBnQgBy0AAkE/cXIhDQJAIAlBcE8NACANIA5BDHRyIQcMAQsgDUEGdCAHLQADQT9xciAOQRJ0QYCA8ABxciEHCyAHQfsARw0BAkACQCAEKAIEQYCAgIB4Rw0AQQEhBiAEKAIIIQUMAQsgASAFNgJ4IAEgASgCcCIHIAEoAnRqNgJsIAEgByAFIAEoAnwiCGtqIgU2AmggBEEEaiAHIAogCGtqIAUQ1yAgBCgCCCEFAkAgBCgCBCIHQYCAgIB4Rw0AQQEhBgwBCyABKAKEAUEIaiAFIAQoAgwQ5AMhDyAHIAUQ8ylBACEGCyABIAEoAnAiByABKAJ0ajYCbCABIAcgASgCeCABKAJ8IghrIgpqNgJoIAEoAoQBQQhqIAcgCyAIayIIaiAKIAhrEOQDIRAgASABKAJ4QQJqIgc2AnggASABKAJwIgggASgCdGo2AmwgASAIIAcgASgCfGtqNgJoIAFBCGohBwJAIAEoAghBCUYNACAHEMAFC0HGAEHHACADGyEIIAcgBjYCAAwICyAEKAIEQYCAgIB4Rg0CIAEgBTYCeCABIAEoAnAiByABKAJ0ajYCbCABIAcgBSABKAJ8IghraiIFNgJoIARBBGogByAKIAhraiAFENcgDAILQQEhByABIAhBAWo2AmgCQCAMDQAgASAIQQJqNgJoIAgtAAFBP3EhDCAGQR9xIQkCQAJAIAZBYE8NACAJQQZ0IAxyIQgMAQsgASAIQQNqNgJoIAxBBnQgCC0AAkE/cXIhDAJAIAZBcE8NACAMIAlBDHRyIQgMAQsgASAIQQRqNgJoIAxBBnQgCC0AA0E/cXIgCUESdEGAgPAAcXIhCAsgCEGAAUkNAEECIQcgCEGAEEkNAEEDQQQgCEGAgARJGyEHCyABIAcgBWoiBTYCeAwDCwJAIAQoAgRBgICAgHhGDQAgASAFNgJ4IAEgASgCcCIIIAEoAnRqNgJsIAEgCCAFIAEoAnwiBmtqIgU2AmggBEEEaiAIIAogBmtqIAUQ1yALQQEhCAJAAkACQAJAIAdBdmoOBAMCAgABCyABKAJoIgUhBwJAIAUgASgCbCIGRg0AAkAgBSwAACIHQX9MDQAgBUEBaiEHDAELAkAgB0FgTw0AIAVBAmohBwwBCyAFQQRBAyAHQW9LG2ohBwsCQCAHIAZHDQBBCiEHDAMLAkACQCAHLAAAIgZBf0wNACAGQf8BcSEGDAELIActAAFBP3EhCiAGQR9xIQwCQCAGQV9LDQAgDEEGdCAKciEGDAELIApBBnQgBy0AAkE/cXIhCgJAIAZBcE8NACAKIAxBDHRyIQYMAQsgCkEGdCAHLQADQT9xciAMQRJ0QYCA8ABxciEGC0EKIQcgBkEKRw0CIAEgBUEBajYCaAJAAkACQAJAIAUsAAAiBkF/Sg0AIAEgBUECajYCaCAFLQABQT9xIQogBkEfcSEMIAZBX0sNASAMQQZ0IApyIQYMAgsgASgCeCEFQQEhBgwCCyABIAVBA2o2AmggCkEGdCAFLQACQT9xciEKAkAgBkFwTw0AIAogDEEMdHIhBgwBCyABIAVBBGo2AmggCkEGdCAFLQADQT9xciAMQRJ0QYCA8ABxciEGCyABKAJ4IQUCQCAGQYABTw0AQQEhBgwBCwJAIAZBgBBPDQBBAiEGDAELQQNBBCAGQYCABEkbIQYLIAEgBiAFajYCeAwCCyAHQdi/f2pBAk8NAEEAIQgMAQtBoKacAUEoQfCcmgEQ0h4ACyABIAEoAmgiBUEBajYCaAJAAkACQAJAIAUsAAAiBkF/Sg0AIAEgBUECajYCaCAFLQABQT9xIQwgBkEfcSEKIAZBX0sNASAKQQZ0IAxyIQYMAgsgASgCeCEFQQEhBgwCCyABIAVBA2o2AmggDEEGdCAFLQACQT9xciEMAkAgBkFwTw0AIAwgCkEMdHIhBgwBCyABIAVBBGo2AmggDEEGdCAFLQADQT9xciAKQRJ0QYCA8ABxciEGCyABKAJ4IQUCQCAGQYABTw0AQQEhBgwBCwJAIAZBgBBPDQBBAiEGDAELQQNBBCAGQYCABEkbIQYLIAEgBiAFaiIFNgJ4IAUhCiAEKAIEQYCAgIB4Rg0CIAQoAgwhBiAEQQRqQQFBAyAIGyIKEJYlIAQoAgggBCgCDGohBQJAIAgNACAFQYABOgABIAUgB0GAAXI6AAIgB0EMdkFgciEHCyAFIAc6AAAgBCAGIApqNgIMDAELIARBGGogAUEBEJ0BAkACQCAEKAIYIghBgICAgHhqDgICAAELIAQoAgghByAEKAIcIQUCQAJAIAQoAgQiCEGAgICAeEYNACAIIAcQ2CwMAQsgB0EIahCZAyAHQSBBCBCzFgsgBCAFNgIIIARBgICAgHg2AgQMAQsgBCgCHCEGAkAgBCgCBEGAgICAeEYNACAEKAIgIgdFDQAgB0ECdCEFIAYhBwNAIARBBGogBygCABDhBCAHQQRqIQcgBUF8aiIFDQALCyAIIAYQ9CwLIAEoAngiBSEKCyABKAJoIgggASgCbCIJRw0ADAMLCyAFIAQoAiBBiK+cARCOKQALIAEgEDcDGCABIA83AxAgASAFNgIMIAAgCDoAASAAQQA6AAAMAQsgBEGfgICAeDYCGCAEQRBqIAUgAiAEQRhqELQtAkAgBC0AECIBQQJHDQAgBCgCFCEBIABBAToAACAAIAE2AgQgBCgCBCAEKAIIEOokDAELIAAgBC8AETsAASAAQQNqIAQtABM6AAAgACAEKAIUNgIEIAAgAToAACAEKAIEIAQoAggQ6iQLIARBMGokAAuzJAIEfwJ+IwBBIGsiAiQAIAAgASkDADcDACAAQQhqIQMgAUEIaiEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAggiBUE0IAVBu4GAgHhIG0H/AXEOuwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugEACyADQYCAgIB4NgIADLoBCyADQYGAgIB4NgIADLkBCyADQYKAgIB4NgIADLgBCyADQYOAgIB4NgIADLcBCyADQYSAgIB4NgIADLYBCyADQYWAgIB4NgIADLUBCyADQYaAgIB4NgIADLQBCyADQYeAgIB4NgIADLMBCyADQYiAgIB4NgIADLIBCyADQYmAgIB4NgIADLEBCyADQYqAgIB4NgIADLABCyADQYuAgIB4NgIADK8BCyADQYyAgIB4NgIADK4BCyADQY2AgIB4NgIADK0BCyADQY6AgIB4NgIADKwBCyADQY+AgIB4NgIADKsBCyADQZCAgIB4NgIADKoBCyADQZGAgIB4NgIADKkBCyADQZKAgIB4NgIADKgBCyADQZOAgIB4NgIADKcBCyADQZSAgIB4NgIADKYBCyADQZWAgIB4NgIADKUBCyADQZaAgIB4NgIADKQBCyADIAQpAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDAAyjAQsgA0GYgICAeDYCAAyiAQsgA0GZgICAeDYCAAyhAQsgA0GagICAeDYCAAygAQsgA0GbgICAeDYCAAyfAQsgA0GcgICAeDYCAAyeAQsCQCABKQMQIgZCA4NCAFINACAGpyIBIAEoAgAiAUEBajYCACABQX9MDZ8BCyAAQZ2AgIB4NgIIIAAgBjcDEAydAQsgA0GegICAeDYCAAycAQsgA0GfgICAeDYCAAybAQsgA0GggICAeDYCAAyaAQsgAyAEKQMANwMAIANBEGogBEEQaikDADcDACADQQhqIARBCGopAwA3AwAMmQELIANBooCAgHg2AgAMmAELIANBo4CAgHg2AgAMlwELIAMgBCkDADcDACADQRBqIARBEGopAwA3AwAgA0EIaiAEQQhqKQMANwMADJYBCyADQaWAgIB4NgIADJUBCyADQaaAgIB4NgIADJQBCwJAIAEpAxAiBkIDg0IAUg0AIAanIgEgASgCACIBQQFqNgIAIAFBf0wNlQELIABBp4CAgHg2AgggACAGNwMQDJMBCyADQaiAgIB4NgIADJIBCyADQamAgIB4NgIADJEBCyADQaqAgIB4NgIADJABCyADQauAgIB4NgIADI8BCyACQRRqIAEoAhAgASgCFBCvFyAAQayAgIB4NgIIIAAgAikCFDcCDCAAQRRqIAJBFGpBCGooAgA2AgAgACABKQMYNwMYDI4BCyADQa2AgIB4NgIADI0BCyADQa6AgIB4NgIADIwBCyADQa+AgIB4NgIADIsBCyACQRRqIAEoAhAgASgCFBCvFyAAQbCAgIB4NgIIIAAgAikCFDcCDCAAQRRqIAJBFGpBCGooAgA2AgAgACABKQMYNwMYDIoBCyACQRRqIAEoAhAgASgCFBCkFyAAQbGAgIB4NgIIIABBFGogAkEUakEIaigCADYCACAAIAIpAhQ3AgwMiQELIANBsoCAgHg2AgAMiAELIANBs4CAgHg2AgAMhwELIAJBCGogASgCDCABKAIQEK8XIAJBFGogASgCGCABKAIcEK8XIANBCGogAkEIakEIaigCADYCACADIAIpAgg3AgAgACACKQIUNwIUIABBHGogAkEUakEIaigCADYCAAyGAQsgAEG1gICAeDYCCCAAIAEpAgw3AgwMhQELIANBtoCAgHg2AgAMhAELIANBt4CAgHg2AgAMgwELIANBuICAgHg2AgAMggELIABBuYCAgHg2AgggACABKQIMNwIM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ASACIAJBnAJqNgK0ASACIAJBlAFqNgKcAiACQcABaiACQegBahCWECACQdQBaiACQYwBaigCADYCACACIAIpAoQBNwLMASAEIAMgAkHAAWoQ4BohAyABLQDgAUGiAUYNAgwPCyABEKELIAIgEjYCkAEgAkEwaiABEIQTIAIoAjQhAwJAAkAgAigCMEEBcUUNACAAQQI2AgwgACADNgIADAELIAIgAzYClAECQAJAIAEtAOABQQlGDQAgASgC3AEhAyABKALYASEEIAJBmAFqIAEQ1CYgAkEBNgLsASACQZy/nAE2AugBIAJCATcC9AEgAkGzBzYCuAEgAkEJOgCnASACIAJBtAFqNgLwASACIAJBnAJqNgK0ASACIAJBpwFqNgKcAiACQcABaiACQegBahCWECACQdQBaiACQaABaigCADYCACACIAIpApgBNwLMASAEIAMgAkHAAWoQ4BohFSABLQDgAUGiAUcNASABIAEQmiwQpxcMAQsgARChCwJAAkAgASgCiAEiFUGAgAJxDQAgASAVQYCAAnI2AogBIAJBIGogARC5EyACKAIgIRQgASABKAKIAUH//31xNgKIASACKAIkIRUMAQsgAkEoaiABELkTIAIoAiwhFSACKAIoIRQLIBRBAXFFDQQLIABBAjYCDCAAIBU2AgAgAkGUAWoQsSwLIAJBkAFqELEsDA8LIAEQoQsCQCAVRQ0AIAEoAtQBIQMgASgC0AEhFyACQf6AgIB4NgLoASABIBcgAyACQegBahDeIwsCQCASKAIAQRpHDQBBASEVDAQLIAJBOGogEhDJAyACKAI8IQMCQAJAIBVBAXENACACKAI4IQQMAQsgFCADIBQgA0kbIQQgFCADIBQgA0sbIQMLIAJB5oCAgHg2AugBIAQgAyACQegBahDgGiEDIAEtAOABQaIBRw0NCyABIAEQmiwQpxcMDAsgAkEYaiAVEMkDIAIgDzYC9AEgAiAVNgLwASACIAM2AuwBIAIgEjYC6AEgAiACKAIcNgL4ASACIAJB6AFqEIIeIhI2AoABIAJBADYCdCABLQDgASEDCyABLQCRAUEgcUUNASADQf8BcUEJRw0BQQAhFQsgAkHoAWogAUEAIBIQaiACKALsASESIAIoAugBIgNBB0cNASAAQQI2AgwgACASNgIADAoLIBBBAXENAQwDCyAEIAop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AtwBIQogASgC2AEhCyACQegAaiABENQmIAJBATYC5AEgAkGcv5wBNgLgASACQgE3AuwBIAJBswc2AnwgAkEHOgDYASACIAJB+ABqNgLoASACIAJB2ABqNgJ4IAIgAkHYAWo2AlggAkGQAWogAkHgAWoQkhAgAkGkAWogAkHwAGooAgA2AgAgAiACKQJoNwKcASALIAogAkGQAWoQ4BohCiABLQDgAUGiAUcNACABIAEQmiwQpxcLIABBMjYCACAAIAo2AgQgAkHMAGoQqisLIAJBkAJqJAAPCyABEKELQQEgDCABLQDgASIKQQNGIg0bIQwgASkD0AEgFSANGyEVDAALC6QYAht/CH4jAEGAAWsiBiQAIAAoAgghByAAQQA2AgggACgCACEIIAAoAgQhCSAAQoCAgICAATcCACAAKAIQIQogACgCDCELIABBACkD+ISeASIhNwIMIABBFGpBACkDgIWeASIiNwIAIAZBGGpBCGogIjcDACAGICE3AxggBkEANgIsIAsgChC6IyADQRBqIQwgCSAHQRhsaiENQboHrUIghiAGQcgAaq2EISNBzAStQiCGIAZBMGqthCEkIAUoAgAiDkF4aiEPIAZBGGpBEGohECAEKAIEIREgBCgCACESIAUoAgQhEyAFKAIMIRQgBCgCDCEVIAkhFgJAA0ACQCAWIgcgDUcNACANIRYMAgsgB0EYaiEWIAcpAwAiIVANASAGIAcoAggiBzYCOCAGICE3AzACQAJAAkAgFUUNACASIBEgISAHEOweIAZBMGoQkg0NAQsgASAGQTBqEKILDQAgAiAGQTBqEKILDQAgBkEwakHE7ZsBQQQQhCINAAJAAkAgBigCJEUNACAGKQMwENYgIiFCGYhCgYKEiJCgwIABfiEiIAYoAhwiCyAhp3EhB0EAIRcgBigCGCEKA0AgCiAHaikAACIlICKFIiFCf4UgIUL//fv379+//358g0KAgYKEiJCgwIB/gyEhAkACQANAICFQDQEgBkEwaiAGKAIYICF6p0EDdiAHaiALcSIYQQR0a0FwahCTDA0CICFCf3wgIYMhIQwACwsgJSAlQgGGg0KAgYKEiJCgwIB/g1BFDQIgByAXQQhqIhdqIAtxIQcMAQsLIApBACAYa0EEdGpBeGooAgAhBwwBC0EAIQcLIAYgBzYCLCAAKAIcIhlBcGoh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IQILIAsgAmohCwwACwsgCiAEKAKIA0HAvJwBEI4pCwALIARBgANqQQRBABCTFyACQQhqIARBgANqQQhqKAIANgIAIAIgBCkCgAM3AgAgB0F/aiEHIAJBDGohAgwACwtBhJqAARDSLAALQeSZgAEQ0iwAC0HUmYABENIsAAtBxJmAARDSLAALQbSZgAEQ0iwAC0EBIAMgBEGAA2oQ2QQMAQtBACADIARBgANqENkECwJAIAQoAoADIAQoAogDIgJNDQAgBEEQaiAEQYADaiACQQQQlRUgBCgCECICQYGAgIB4Rw0CCwJAIAQoApgDIAQoAqADIgJNDQAgBEEIaiAEQZgDaiACQQQQlRUgBCgCCCICQYGAgIB4Rw0DCwJAIAQoAowDIAQoApQDIgJNDQAgBCAEQYwDaiACQQwQlRUgBCgCACICQYGAgIB4Rw0ECwJAQdwCRQ0AIABBBGogBEGAA2pB3AL8CgAACyAAQQA2AgALIARBwAZqJAAPCyACIAQoAhRBtJqAARCOKQALIAIgBCgCDEHEmoABEI4pAAsgAiAEKAIEQdSagAEQjikAC6QgAgt/An4jAEEgayIBJAAQ6CkhAiAAKAIAIgAoAgQhAyAAKAIAIQRBgICAgHghBQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCCCIGQTQgBkG7gYCAeEgbQf8BcQ67AboBAAECAwQFBgcICQoLDA0ODxAR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KGohASARQVhqIREgCUEoaiEJIBJBf2oiEg0ACwtBACEBQQAhCQJAIAMoAhgiEUUNABD7JyEJIBEpAgQhGiARKAIAIRIQ/CchESACQcAAaiASEHYCQEHgAEUNACARIAJBwABqQeAA/AoAAAsgCSAaNwIEIAkgETYCAAsCQCADKAIcIhFFDQAQgCghASARKAIMIRIgESgCECETIAJBwABqIBEQ4QYgAUEQaiATNgIAIAEgAikCQDcCACACIBI2AkwgAUEIaiACQcAAakEIaikCADcCAAsgAiABNgIkIAIgCTYCICACIAw2AhwgAiANNgIYIAIgDjYCFCACIBA2AhAgAiAPNgIMIAJBBTYCCAwFCyADLQAUIRIgAygCCCEPIAMoAgQhDiADKAIQIQkQ+ichASACQcAAaiAJEEIgAUE4aiACQcAAakE4aikDADcDACABQTBqIAJBwABqQTBqKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaikDADcDACABQRhqIAJBwABqQRhqKQMANwMAIAFBEGogAkHAAGpBEGopAwA3AwAgAUEIaiACQcAAakEIaikDADcDACABIAIpA0A3AwAgAy0AFiEQIAMtABUhDAJAAkAgAygCDCIRDQBBACEJDAELEPsnIQkgESkCBCEaIBEoAgAhDRD8JyERIAJBwABqIA0QdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACyACIBA6AB4gAiAMOgAdIAIgEjoAHCACIAE2AhggAiAJNgIUIAIgDzYCECACIA42AgwgAkEGNgIIDAQLIAMoAgwhEiADKAIIIQ8gAygCBCEJEPonIQEgAkHAAGogCRBCIAFBOGogAkHAAGpBOGopAwA3AwAgAUEwaiACQcAAakEwaikDADcDACABQShqIAJBwABqQShqKQMANwMAIAFBIGogAkHAAGpBIGopAwA3AwAgAUEYaiACQcAAakEYaikDADcDACABQRBqIAJBwABqQRBqKQMANwMAIAFBCGogAkHAAGpBCGopAwA3AwAgASACKQNANwMAIAMtABQhDgJAAkAgAygCECIRDQBBACEJDAELEPsnIQkgESkCBCEaIBEoAgAhEBD8JyERIAJBwABqIBAQdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACyACIA46ABwgAiAJNgIYIAIgEjYCFCACIA82AhAgAiABNgIMIAJBBzYCCAwDCyADKQMoIRogAygCMCEJEPonIQEgAkHAAGogCRBCIAFBOGogAkHAAGpBOGopAwA3AwAgAUEwaiACQcAAakEwaiIJKQMANwMAIAFBKGogAkHAAGpBKGopAwA3AwAgAUEgaiACQcAAakEgaiIRKQMANwMAIAFBGGogAkHAAGpBGGoiEikDADcDACABQRBqIAJBwABqQRBqIg8pAwA3AwAgAUEIaiACQcAAakEIaiIOKQMANwMAIAEgAikDQDcDACADLQA0IRAgAkHAAGogAxCfAyAJIAE2AgAgAkEIakEoaiAaNwMAIAJBCGpBCGogDikDADcDACACQQhqQRBqIA8pAwA3AwAgAkEIakEYaiASKQMANwMAIAJBCGpBIGogESkDADcDACACIBA6AHQgAkEIakEwaiAJKQMANwMAIAIgAikDQDcDCAwCCyADKAIYIRQgAygCFCEVIAMoAhAhARD6JyENIAJBwABqIAEQQiANQThqIAJBwABqQThqKQMANwMAIA1BMGogAkHAAGpBMGopAwA3AwAgDUEoaiACQcAAakEoaikDADcDACANQSBqIAJBwABqQSBqIg4pAwA3AwAgDUEYaiACQcAAakEYaiIQKQMANwMAIA1BEGogAkHAAGpBEGoiDCkDADcDACANQQhqIAJBwABqQQhqIg8pAwA3AwAgDSACKQNANwMAIAMoAgghCSADLQAlIRYgAy0AJCEXIAJBwABqIAMoAgwiGEEIQSgQlQ8gAigCRCETIAIoAkBBAUYNByACKAJIIRkCQCATRQ0AIBhBKGwhESAZIQEgEyESA0AgEUUNASACQcAAaiAJEJ8DIAFBIGogDikDADcDACABQRhqIBApAwA3AwAgAUEQaiAMKQMANwMAIAFBCGogDykDADcDACABIAIpA0A3AwAgAUEoaiEBIBFBWGohESAJQShqIQkgEkF/aiISDQALC0EAIQFBACEJAkAgAygCHCIRRQ0AEPsnIQkgESkCBCEaIBEoAgAhEhD8JyERIAJBwABqIBIQdgJAQeAARQ0AIBEgAkHAAGpB4AD8CgAACyAJIBo3AgQgCSARNgIACwJAIAMoAiAiEUUNABCAKCEBIBEoAgwhEiAR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IAIoAgwiCiAEIAogBEsbIQcgAUHAAGohCyACKAIIIQwgAUEIaiENIAFBBGohDiABQRRqIQ8gAUEQaiEQIAFBIGohESABQRxqIRIgBCECA0ACQCAFIAJHDQAgACADKQMANwIEIAAgCTYCACAAQQxqIANBCGooAgA2AgAMCAsCQAJAIAcgAkYNACAOKAIAIA0oAgAgCCALIAwgAmotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQEgCEUNByAIIAEoAswCSw0BIBAoAgAgDygCACAIIAEoAjx2QX5qQcC6gwEQwyUiEygCBCATKAIIQQAQxCUoAgAhEyADQRBqIBMgAkEBaiIUIBIoAgAgESgCACATQbC6gwEQviUoAgBrIBQQ3RcgAygCECAESw0BIANBCGogA0EQakEIaigCADYCACADIAMpAhA3AwBBASEJIAZBAXFFDQEgA0EQaiECDAgLIAcgCkGsn4ABEJEVAAsgAkEBaiECDAALCyAAQQA2AgAMBQsCQCAGQQFxDQACQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAYLQQAhBgJAIAggASgCzAJLDQAgAUEQaigCACABQRRqKAIAIAggASgCPHZBfmpBwLqDARDDJSIHKAIEIAcoAghBABDEJSgCACEHIANBEGogByAEIAFBHGooAgAgAUEgaigCACAHQbC6gwEQviUoAgBrIAQQ3RdBASEGCyACKAIMIhIgBCASIARLGyEHIAFBwABqIQsgAigCCCECIAFBCGohDCABQQRqIQ0gAUEUaiEUIAFBEGohDyABQSBqIRAgAUEcaiERA0ACQCAFIARHDQAgACADKQIQNwIEIAAgBjYCACAAQQxqIANBGGooAgA2AgAMBwsCQAJAIAcgBEYNACANKAIAIAwoAgAgCCALIAIgBGotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQECQAJAIAhFDQAgCCABKALMAk0NAQwDCyAAIAMpAhA3AgQgACAGNgIAIABBDGogA0EYaigCADYCAAwJCyAPKAIAIBQoAgAgCCABKAI8dkF+akHAuoMBEMMlIg4oAgQgDigCCEEAEMQlKAIAIQ5BASEGIANBEGogDiAEQQFqIhMgESgCACAQKAIAIA5BsLqDARC+JSgCAGsgExDdFwwBCyAHIBJBrJ+AARCRFQALIARBAWohBAwACwsCQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAULAkACQCAIIAEoAswCTQ0AIAIoAgwiDiAEIA4gBEsbIQcgAUHAAGohCyACKAIIIQIgAUEIaiEMIAFBBGohDQNAAkAgBSAERw0AIABBADYCAAwICwJAAkAgByAERg0AIA0oAgAgDCgCACAIIAsgAiAEai0AAGotAABqQaC6gwEQviUoAgAiCCABKALIAksNAQJAIAgNAEEAIQIMBQsgCCABKALMAksNASAEQQFqIQQMAwsgByAOQayfgAEQkRUACyAEQQFqIQQMAAsLIAFBEGooAgAgAUEUaigCACAIIAEoAjx2QX5qQcC6gwEQwyUiAigCBCACKAIIQQAQxCUoAgAhAiADQRBqIAIgBCABQRxqKAIAIAFBIGooAgAgAkGwuoMBEL4lKAIAayAEEN0XIABBDGogA0EYaigCADYCACAAIAMpAhA3AgRBASECCyAAIAI2AgAMBAsCQCABKALQAiIIDQAQjDAhAiAAQQI2AgAgACACNgIEDAQLAkAgCCABKALMAksNACABQRBqKAIAIAFBFGooAgAgCCABKAI8dkF+akHAuoMBEMMlIgIoAgQgAigCCEEAEMQlKAIAIQIgAyACIAQgAUEcaigCACABQSBqKAIAIAJBsLqDARC+JSgCAGsgBBDdFyAAQQE2AgAgAEEMaiADQQhqKAIANgIAIAAgAykCADcCBAwECyADQRBqIAcgAUEsaiITKAIAIgwoAghBf2pBeHFqQQhqIAIoAggiCyACKAIMIgcgBCAFIAwoAhAREgACQAJAAkAgAygCECICDgMCAQACCyABQcAAaiEMIAMoAhQhBCABQQhqIQ0gAUEEaiEOAkACQAJAA0ACQCAEIgIgBUkNACAAQQA2AgAMCgsgAiAHTw0CAkACQCAOKAIAIA0oAgAgCCAMIAsgAmotAABqLQAAakGguoMBEL4lKAIAIgggASgCyAJLDQAgCEUNBSAIIAEoAswCTQ0DIANBEGogASgCKCATKAIAIgQoAghBf2pBeHFqQQhqIAsgByACIAUgBCgCEBESACADKAIQRQ0BIAMoAhQiBCACSw0CCyACQQFqIQQMAQsLIABBADYCAAwICyABQRBqKAIAIAFBFGooAgAgCCABKAI8dkF+akHA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CAwBCyACEKELIANBwAFqIAIQxAQgAygCxAEhBQJAIAMoAsABIghBgICAgHhGDQAgAygCyAEhCQwBCyAAQQM6ABQgACAFNgIADAELIAMgCTYCVCADIAU2AlAgAyAINgJMIAItAOABIQUCQAJAIAIvAZABQYDAAHEiCEUNACAFQf8BcUGBAUcNACACEKELIAIoAtQBIQUgAigC0AEhCCADQZiBgIB4NgLAASACIAggBSADQcABahDeIyADQcABaiACEMQEIAMoAsQBIQUCQCADKALAASIIQYCAgIB4Rw0AIABBAzoAFCAAIAU2AgAMAgsgAyADKALIATYCoAEgAyAFNgKcASADIAg2ApgBIANBmAFqELUoIAIvAZABQYDAAHEhCCACLQDgASEFCwJAAkAgCEUNACAFQf8BcUHZAEcNACACEKELIAIoAtQBIQUgAigC0AEhCCADQZaBgIB4NgLAASACIAggBSADQcABahDeIyADQcABaiACEN0LIAMoAsQBIQUCQCADKALAASIIDQAgAEEDOgAUIAAgBTYCAAwDCyADIAg2AsABIAYhCQJAAkACQAJAAkAgBg0AIANByABqELMrIAMgCDYCSCAFDQEgCCEJCyAFEIQsIAYNAQwCCyAHEIQsIAUhBwwCCyADQcABahCnLAsgCSEICyACLQDgASEFDAELIAYhCAsCQAJAAkACQAJAIAVB/wFxQQJGDQAgAigC3AEhBSACKALYASEGIANB2ABqIAIQ1CYgA0EBNgLEASADQZy/nAE2AsABIANCATcCzAEgA0GzBzYCaCADQQI6AJABIAMgA0HkAGo2AsgBIAMgA0GIAWo2AmQgAyADQZABajYCiAEgA0GYAWogA0HAAWoQkhAgA0GsAWogA0HgAGooAgA2AgAgAyADKQJYNwKkASAGIAUgA0GYAWoQ4BohBSACLQDgAUGiAUYNAQwECyACEKELIAhFDQECQAJAIAIoAogBIgVBgICAAnENACACIAVBgICAAnI2AogBIANBwAFqIAIQrgcgAiACKAKIAUH///99cTYCiAEMAQsgA0HAAWogAhCuBwsgAygCxAEhBSADKALAASIGQYCAgIB4Rw0CIABBAzoAFCAAIAU2AgAMBAsgAiACEJosEKcXDAILAkACQCACKAKIASIFQYCAgAJxRQ0AIAIgBUH///99cTYCiAEgA0HAAWogAhCuByACIAIoAogBQYCAgAJyNgKIAQwBCyADQcABaiACEK4HCyADKALEASEFIAMoAsABIgZBgICAgHhHDQAgAEEDOgAUIAAgBTYCAAwCCyADIAMoAsgBNgJsIAMgBTYCaCADIAY2AmQCQAJAAkAgAi0A4AEiBUEDRg0AAkAgBUGjAUcNACADQfAAaiACENQmIAIoAtwBIQUgAigC2AEhBiADQQE2AsQBIANBnL+cATYCwAEgA0IBNwLMASADQbUHNgKMASADQQM6AJABIAMgA0GIAWo2AsgBIAMgA0GQAWo2AogBIANBmAFqIANBwAFqEJIQIANBrAFqIANB+ABqKAIANgIAIAMgAykCcDcCpAEgAiAGIAUgA0GYAWoQ3iMMAgsgAigC3AEhBSACKALYASEGIANB/ABqIAIQ1CYgA0EBNgLEASADQZy/nAE2AsABIANCATcCzAEgA0GzBzYCjAEgA0EDOgCXASADIANBiAFqNgLIASADIANBkAFqNgKIASADIANBlwFqNgKQASADQZgBaiADQcABahCSECADQawBaiADQYQBaigCADYCACADIAMpAnw3AqQBIAYgBSADQZgBahDgGiEFIAItAOABQaIBRw0CIAIgAhCaLBCnFwwCCyACEKELCyAAIAMpAzA3AwAgAEEIaiADQTBqQQhqKQMANwMAIABBEGogA0EwakEQaikDADcDACABKAIQKAIAIQUgAigC1AEhBiADQawBaiADQeQAakEIaigCADYCACADQZgBakEIaiABQQhqKAIANgIAIAMgAykCZDcCpAEgAyABKQIANwOYASADQbgBaiADQcwAakEIaigCADYCACADIAMpAkw3A7ABIANB9QFqQgA3AAAgA0EANgLsASADQgA3AuQBIANCADcC8AEgA0EANgLYASADQgg3AtABIANCADcCyAEgA0KAgICAwAA3AsABIANCBDcC3AFBwABBBBCsKiECAkBBJEUNACACIANBmAFqQST8CgAACyACQQA6ADwgAiAHNgI4IAIgBDYCNCACIAg2AjAgAkEANgIsIAIgBjYCKCACIAU2AiQgACACNgIYIANBwAFqEOAjDAkLIABBAzoAFCAAIAU2AgAgA0HkAGoQxSgMAQsgAEEDOgAUIAAgBTYCAAsgA0HMAGoQtSgLIAcQhCwgA0HIAGoQsysL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IAIoAiQhFSALIAhBAmotAAA6AAAgAiAILwAAOwEMIBVBgH5xIRYgLEIgiKchESArQiCIpyEUIAIoAjQhGSAspyESICunIRNBBiEPDAQLIA8oAiAhFyAPKAIcIRUgDygCGCEQIA8oAgwhFCAPKAIIIRMgDykDECIrpyESAkAgK0IDg0IAUg0AIBIgEigCACIOQQFqNgIAIA5Bf0wNDAsgDy0AJCEYIA8oAighDxD6JyEOIAJBOGogDxBCIA5BOGogAkE4akE4aikDADcDACAOQTBqIAJBOGpBMGopAwA3AwAgDkEoaiACQThqQShqKQMANwMAIA5BIGogAkE4akEgaikDADcDACAOQRhqIAJBOGpBGGopAwA3AwAgDkEQaiACQThqQRBqKQMANwMAIA5BCGogAkE4akEIaikDADcDACAOIAIpAzg3AwAgFUGAfnEhFiArQiCIpyERQQchDwwECyAPKAJEIRogDygCQCEbIAJBEGogD0EIahDDBAJAAkAgDygCSCIODQBBACEcDAELEPsnIRwgDikCBCErIA4oAgAhFRD8JyEOIAJBOGogFRB2AkBB4ABFDQAgDiACQThqQeAA/AoAAAsgHCArNwIEIBwgDjYCAAtBgICAgHghDgJAIA8oAihBgICAgHhGDQAgDygCLCEdIA8oAjwhHiAPKAI4IR8gDygCNCEgIAJBOGogDygCMCIhQQhBMBCVDyACKAI8IQ4gAigCOEEBRg0MIAIoAkAhGQJAIA4NAEEAIQ4MAQsgIUEwbCEiQQAhFSAOISMDQCAiIBVGDQEgAkE4aiAdIBVqEEwgGSAVaiIPQShqIAJBOGpBKGopAwA3AwAgD0EgaiACQThqQSBqKQMANwMAIA9BGGogAkE4akEYaikDADcDACAPQRBqIAJBOGpBEGopAwA3AwAgD0EIaiACQThqQQhqKQMANwMAIA8gAikDODcDACAVQTBqIRUgI0F/aiIjDQALCyALIAhBAmotAAA6AAAgAiAILwAAOwEMIAIoAiQiFUGAfnEhFiACKQMYIitCIIinIREgAikDECIsQiCIpyEUIAItACwhGCACKAIoIRcgAigCICEQICunIRIgLKchE0EIIQ8MAwsgDygCZCEkIA8oAmAhJSACQRBqIA8QwwRBByEXAkAgDygCIEEHRg0AIAJBOGogD0EgahC8AiACQZwBakECaiAJQQJqLQAAOgAAIAIgCS8AADsBnAEgAi0APCEYIAIoAjghFyACKAJAIQ4gAigCRCEZIAIoAkghISACKAJMISAgAigCUCEfIAIoAlQhHiACKAJYIRsgAigCXCEaCyAPKAJoIRUQ/SchHSACQThqIBUQvAIgHUEgaiACQThqQSBqIhMpAwA3AwAgHUEYaiACQThqQRhqIhApAwA3AwAgHUEQaiACQThqQRBqIhEpAwA3AwAgHUEIaiACQThqQQhqIhQpAwA3AwAgHSACKQM4NwMAQYCAgIB4IRwCQCAPKAJIQYCAgIB4Rg0AIA8oAkwhFiAPKAJcISYgDygCWCEnIA8oAlQhKCACQThqIA8oAlAiIkEIQTAQlQ8gAigCPCEcIAIoAjhBAUYNDCACKAJAISMCQCAcDQBBACEcDAELICJBMGwhKUEAIRUgHCESA0AgKSAVRg0BIAJBOGogFiAVahBMICMgFWoiD0EoaiACQThqQShqKQMANwMAIA9BIGogEykDADcDACAPQRhqIBApAwA3AwAgD0EQaiARKQMANwMAIA9BCGogFCkDADcDACAPIAIpAzg3AwAgFUEwaiEVIBJBf2oiEg0ACwsgCyACQZwBakECai0AADoAACACIAIvAZwBOwEMIAIoAiwiFUGAfnEhFiACKQMgIitCIIinIREgAikDGCIsQiCIpyEUIAIoAighECACKAIUISkgAigCECEPICunIRIgLKchEwwDCyACQThqIA9BCGoQwwQgDygCKBDRBCEOIAsgCkECai0AADoAACACIAovAAA7AQwgAigCTCIVQYB+cSEWIAIpA0AiK0IgiKchESACKQM4IixCIIinIRQgAi0AVCEYIAIoAlAhFyACKAJIIRAgAigCXCEZICunIRIgLKchE0EKIQ8LCwsgASAYOgAkIAEgFzYCICABIBA2AhggASApNgIEIAEgDzYCACABIAIvAQw7ACUgASAdNgJoIAEgJDYCZCABICU2AmAgASAmNgJcIAEgJzYCWCABICg2AlQgASAiNgJQIAEgIzYCTCABIBw2AkggASAaNgJEIAEgGzYCQCABIB42AjwgASAfNgI4IAEgIDYCNCABICE2AjAgASAZNgIsIAEgDjYCKCABIBYgFUH/AXFyNgIcIAFBJ2ogCy0AADoAACABIBGtQiCGIBKthDcDECAB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IgMNAAwOCwsgACgCDCICRQ0MIAAoAggiAyACQThsaiEFA0ACQAJAAkACQAJAAkACQAJAIAMoAgAiAkF8aiIAQQQgAEEHSRsOBwABAgMEBQYACwJAIAMoAgwiAkUNACADKAIIIQAgAkEobCECA0ACQAJAAkACQAJAIAAoAgAOBAABAgMACyAAQQhqKQMAIABBGGooAgAgARCCIwwDCyAAQQRqIAEQ2RcMAgsgAEEEaiABENklDAELIABBBGogARDJDgsgAEEoaiEAIAJBWGoiAg0ACwsCQCADKAIYIgBFDQAgACgCACABEKgBCyADKAIcIgBFDQYgAEEIaigCACICRQ0GIAJBMGwhAiAAQQRqKAIAQSRqIQADQAJAIABBfGooAgAiBEUNACAEIAEQqAELAkAgACgCACIERQ0AIAQgARCoAQsgAEEwaiEAIAJBUGoiAg0ADAcLCwJAIAMoAgwiAkUNACADKAIIIQAgAkEobCECA0ACQAJAAkACQAJAIAAoAgAOBAABAgMACyAAQQhqKQMAIABBGGooAgAgARCCIwwDCyAAQQRqIAEQ2RcMAgsgAEEEaiABENklDAELIABBBGogARDJDgsgAEEoaiEAIAJBWGoiAg0ACwsCQCADKAIYIgBFDQAgACgCACABEKgBCyADKAIcIgBFDQUgAEEIaigCACICRQ0FIAJBMGwhAiAAQQRqKAIAQSRqIQADQAJAIABBfGooAgAiBEUNACAEIAEQqAELAkAgACgCACIERQ0AIAQgARCoAQsgAEEwaiEAIAJBUGoiAg0ADAYLCyADKAIQIAEQpQEgAygCDCIARQ0EIAAoAgAgARCoAQwECyADKAIEIAEQpQEgAygCECIARQ0DIAAoAgAgARCoAQwDCyADKAIwIAEQpQECQAJAAkACQCACDgQAAQIDAAsgAykDCCADQRhqKAIAIAEQgiMMBQsgA0EEaiABENkXDAQLIANBBGogARDZJQwDCyADQQRqIAEQyQ4MAgsgAygCECABEKUBAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEIIjDAMLIABBBGogARDZFwwCCyAAQQRqIAEQ2SUMAQsgAEEEaiABEMkOCyAAQShqIQAgAkFYaiICDQALCwJAIAMoAhwiAEUNACAAKAIAIAEQqAELIAMoAiAiAEUNASAAQQhqKAIAIgJFDQEgAkEwbCECIABBBGooAgBBJGohAANAAkAgAEF8aigCACIERQ0AIAQgARCoAQsCQCAAKAIAIgRFDQAgBCABEKgBCyAAQTBqIQAgAkFQaiICDQAMAgsLAkAgAygCDCICRQ0AIAMoAgghACACQShsIQIDQAJAAkACQAJAAkAgACgCAA4EAAECAwALIABBCGopAwAgAEEYaigCACABEIIjDAMLIABBBGogARDZFwwCCyAAQQRqIAEQ2SUMAQsgAEEEaiABEMkOCyAAQShqIQAgAkFYaiICDQALCyADKAIQIgBFDQAgACgCACABEKgBCyADQThqIgMgBUcNAAwNCwsgACgCBCEADA0LIAAoAgwiA0UNCiAAKAIIIQAgA0E4bCEDA0ACQCAAKAIAQQdGDQAgACABELYICyAAQTBqKAIAIAEQqAEgAEE4aiEAIANBSGoiAw0ADAsLCyAAKAIEIQAMCwsgACgCECECIAAoAgwhAwJAIAAoAgRBAUcNACACRQ0JIAJBAnQhAANAIAMoAgAgARCoASADQQRqIQMgAEF8aiIADQAMCgsLIAJFDQggAkECdCEAA0AgAygCACABEKgBIANBBGohAyAAQXxqIgANAAwJCwsgACgCBCABEKgBIAAoAgggARCoASAAKAIMIAEQqAEgACgCECEADAkLAkAgACgCMCIDRQ0AIAMgARCoAQsgACgCNCIADQgMBgsgACgCBCEADAcLIAAoAgQgARCoASAAKAIIIQAMBgsCQCAAKAIwIgNFDQAgAyABEKgBCwJAIAAoAjQiA0UNACADIAEQqAELAkAgACgCQCIDRQ0AIAMgARCoAQsgACgCRCIADQUMAwsgACgCCEGEgICAeEgNAiABIABBCGoQxR8PCyAAKAIoIgBFDQEgACgCACEADAMLAkAgAC0APEECRw0AIAAoAigQxCcLAkAgACgCQCIDRQ0AIANBCGooAgAiAkUNACADQQRqKAIAIQMgAkECdCECA0AgAygCACABEKgBIANBBGohAyACQXxqIgINAAsLIAAoAkQiAEUNACAAIAEQjBkLDwsgACgCACgCACEADAALC+0TAxB/Bn4BfCMAQeABayICJAACQAJAAkACQAJAAkACQAJAAkACQCAAKAIA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Qf9+cTYCiAEgA0EIaiADQdgBaiACEJwMIAMoAgghByACIAIoAogBQYABcjYCiAEgAygCDCEEDAELIAMgA0HYAWogAhCcDCADKAIEIQQgAygCACEHCwJAAkAgB0EBcUUNACAEIQhBgICAgHghBwwBCyAEKAIEIQggBCgCACEHAkBBKEUNACADQTBqIARBCGpBKPwKAAALIANBsAJqIARBwABqKQIANwMAIANBoAJqQQhqIARBOGopAgA3AwAgAyAEKQIwNwOgAiAEEIovCyADQdgAakEIaiABQQhqKQMANwMAIANB2ABqQRBqIAFBEGopAwA3AwAgA0HYAGpBGGogAUEYaikDADcDACADIAU2AoABIAMgBjYCfCADIAI2AnggAyABKQMANwNYAkAgB0GAgICAeEcNACAAQQE2AgAgACAINgIEIANB2ABqELgdDAMLIAMgCDYC3AEgAyAHNgLYAQJAQShFDQAgA0HYAWpBCGogA0EwakEo/AoAAAsgA0GYAmogA0GgAmpBEGopAwAiEDcCACADQdgBakE4aiADQaACakEIaikDADcCACADIAMpA6ACNwKIAgJAIAItAJEBQSBxRQ0AIAItAJIBQf8BcQ0AIAYoAgQhBCAGKAIAIQcgA0GAgYCAeDYC0AIgAiAHIAQgA0HQAmoQ3iMLIANBoAFqQQhqIAFBCGopAwA3AwAgA0GgAWpBEGogAUEQaikDADcDACADQaABakEYaiABQRhqKQMANwMAIANByAFqIANBMGpBGGopAgA3AwAgA0HQAWogA0EwakEgaikCADcDACADIAMpAkA3A8ABIAMgASkDADcDoAEgBSgCACEEIAIoAtQBIQICQEE4RQ0AIANB0AJqQQRqIANBoAFqQTj8CgAACyAQpyEFQfAAQQgQnSoiAUEINgIAAkBBPEUNACABQQRqIANB0AJqQTz8CgAACyABIAU2AkggASACNgJEIAEgBDYCQCADQdgBahC6KCADQeQBahCUKCADKAKUAhCjLCAAIAE2AgggAEIANwIADAILIAEoAiQiCCgCACEEIAMgASgCKCIJNgLoASADQQA2AuABIANCgICAgMAANwLYASADQQA6AKABIANBADoAWCADIAQ2AtACIAIoAogBIQQgAyADQaABajYC9AEgAyADQdACajYC8AEgAyADQdgAajYC7AEgAyAD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AyABEMEBIAEgBDoAOgsgAUEBOgA5IAAoAkQiAEUNAyABLQA0QQFHDQMgAS0AOiEDIAFBAToAOiAAIAEQwQEgASADOgA6IAFBAToAOQwDCyAAKAIIQYSAgIB4SA0CIAAoAhAiA0UNAiAAKAIMIQAgA0ECdCEDA0AgASAAKAIAEOwkIABBBGohACADQXxqIgMNAAwDCwsgAS0ANEEBRw0BIAEtADohAyABQQE6ADogAS0AOSEEAkAgAC0AHEECRg0AIAEgAEEIahC0EwsgASADOgA6IAEgBDoAOSAAKAIoIgBFDQEgASAAEKskDAELIAEgAEEIahD3EQsgAkHgAGokAAu3EgEIfyMAQdAAayIDJAACQAJAAkADQAJAAkACQAJAAkACQAJAIAIoAgAOCAABBAACBgMFAAsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIAAgA0HAAGoQziAMCQsgAigCBCEEIANBCGogAigCCCICQQFBAUHAvJwBELIZIAMoAgghBSADKAIMIQYCQCACRQ0AIAYgBCAC/AoAAAsgA0EBOgBMIAMgAjYCSCADIAY2AkQgAyAFNgJAIANBIGogA0HAAGoQziAgASgCCCABLQAQIANBIGoQvSYgAEEIaiADQSBqQQhqKAIANgIAIAAgAykCIDcCAAwICyADQRRqIAEgAigCDBDCASACKAIEIQQCQCACKAIQIgUNACACLQAUIQYCQAJAIARFDQAgAigCCEEBRg0BCyADQRRqEKgeCyADQQA2AkggA0KAgICAEDcCQCADQQE6AEwgA0EgaiADQcAAahDOIAJAIAZBAXENACADQRRqIANBIGpBAxCMHwsgA0HAAGpBCGogA0EUakEIaigCADYCACADIAMpAhQ3A0AgACABKAIMIAEtABAgA0HAAGogA0EgahC5CCADQSBqEM0pDAgLIAEoAgQiByAFIAcgBUkbIQYCQCAERQ0AIAUgAigCCEcNACADQQE6AEwgA0EANgJIIANCgICAgBA3AkAgA0E0aiADQcAAahDOIAJAA0AgBkUNASADQTRqEIsUDQEgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiADQRRqEOELIANBNGogASADQSBqIANBwABqEMICIAZBf2ohBiADQcAAahDNKQwACwsgBSAHTQ0GIANBNGoQqB4MBgsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIANBNGogA0HAAGoQziADQAJAAkAgBkUNACADQTRqEIsURQ0BCyADQTRqEKgeIAAgAykCNDcCACAAQQhqIANBNGpBCGooAgA2AgAMCAsgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiADQRRqEOELIANBNGogASADQSBqIANBwABqEMICIAZBf2ohBiADQcAAahDNKQwACwsgAigCDCEFIAIoAgghBgJAIAEtABANACADQQE6AEwgA0EANgJIIANCgICAgBA3AkAgBUEcbCECIANBNGogA0HAAGoQziACQANAIAJFDQEgA0E0ahCLFA0BIANBIGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3AyAgA0HAAGogASAGEMIBIANBNGogASADQSBqIANBwABqEMICIAJBZGohAiAGQRxqIQYgA0HAAGoQzSkMAAsLIAAgAykCNDcCACAAQQhqIANBNGpBCGooAgA2AgAMBwsgA0EBOgBMIANBADYCSCADQoCAgIAQNwJAIAVBHGwhAiAGQWRqIQYgA0E0aiADQcAAahDOIAJAA0AgAkUNASADQTRqEIsUDQEgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQcAAaiABIAYgAmoQwgEgA0E0aiABIANBIGogA0HAAGoQwgIgAkFkaiECIANBwABqEM0pDAALCyAAIAMpAjQ3AgAgAEEIaiADQTRqQQhqKAIANgIADAYLAkAgAigCBA0AIAJBDGooAgAiBCACQRBqKAIAQQN0IgZqIQggASgCACEHQQAhBSAEIQICQAJAA0AgBkUNASAFIAdLDQIgBkF4aiEGIAJBBGooAgAgAigCAGsgBWpBAWohBSACQQhqIQIMAAsLIAUgB0sNACADQQA2AhwgA0KAgICAwAA3AhQDQAJAAkACQCAEIAhGDQAgBEEIaiEHIAQoAgQhBSAEKAIAIQJBACEGA0AgBkEBcQ0DIAIgBUsNAyADQQA2AjBBASEGAkAgAkGAAUkNAEECIQYgAkGAEEkNAEEDQQQgAkGAgARJGyEGCyACIANBMGoQ5g0gA0EANgI8IANCgICAgBA3AjQgA0Hw04QBNgJEIANCoICAgA43AkggAyADQTRqNgJAIANBwABqIANBMGogBhCCBg0CIAJBgMADIAJBAWogAkH/rwNGGyACIAVPIgYbIQIgA0EgakEIaiADQTRqQQhqKAIANgIAIAMgAykCNDcDICADQQE6ACwgA0EUaiADQSBqEOIRDAALCyABKAIIIAEtABAgA0EUahC9JiAAQQhqIANBFGpBCGooAgA2AgAgACADKQIUNwIADAoLQYysnAFBNyADQSBqQYjUhAFBkK2cARDqEgALIAchBAwACwsgAEGAgICAeDYCAAwGCyACQQxqKAIAIgggAkEQaigCAEEBdCIGaiEJIAEoAgAhCkEAIQUgCCECAkACQAJAAkADQCAGRQ0BIAUgCksNAiACQQFqLQAAIgQgAi0AACIHSQ0EIAJBAmohAiAGQX5qIQYgBCAHa0H/AXEgBWpBAWohBQwACwsgBSAKSw0AIANBADYCKCADQoCAgIDAADcCIAwBCyAAQYCAgIB4NgIADAcLA0ACQAJAIAggCUYNACAILQABIQcgCC0AACECQQAhBANAIARBAXENAiACQf8BcSIGIAdB/wFxIgVLDQJBAUEBEKknIgQgAjoAACADQQE6AEwgA0EBNgJIIAMgBDYCRCADQQE2AkAgBiAFTyEEIAIgBiAFSWohAiADQSBqIANBwABqEOIRDAALCyABKAIIIAEtABAgA0EgahC9JiAAQQhqIANBIGpBCGooAgA2AgAgACADKQIgNwIADAgLIAhBAmohCAwACwtBkNCEARDSLAALIAIoAgxBHGwhBiABLQAQIQggASgCDCEKIAIoAgghBUEEIQRBACECQQAhBwJAA0AgBkUNASACQYCAgIB4Rg0BIAMgBzYCKCADIAQ2AiQgAyACNgIgIANBwABqIAEgBRDCASADQTRqIAogCCADQSBqIANBwABqELkIIAZBZGohBiAFQRxqIQUgAygCNCECIAMoAjghBCADKAI8IQcgA0HAAGoQzSkMAAsLIAAgBzYCCCAAIAQ2AgQgACACNgIADAQLIAIoAgQhAgwACwsgACADKQI0NwIAIABBCGogA0E0akEIaigCADYCAAsgA0EUahDNKQsgA0HQAGokAAvUEgEMfyMAQYABayICJAACQCABLQA8RQ0AIAAgACgCHCAAKAIgIAFBJGoiAyABKAIEIAEoAggiBEEMbGoiBUF8aiAFQQxGGyADIAQbKAIAEPkT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FwQXFxcBFwIDAxcLIAAoAighAAwECyAAKAIIIQAMAwsgACgCDCEADAILIAAoAhAhAAwBCyAAKAIUIgANAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMoAgAOEwABAgMEBQYHCAkKCwwNDg8QERIACyADQRRqIQAgA0EQaiEBDBILIANBCGohACADQQRqIQEMEQsgA0EIaiEAIANBBGohAQwQCyADQRBqIQAgA0EMaiEBDA8LIANBCGohACADQQRqIQEMDgsgA0EMaiEAIANBCGohAQwNCyADQQxqIQAgA0EIaiEBDAwLIANBDGohACADQQhqIQEMCwsgA0EQaiEAIANBDGohAQwKCyADQRhqIQAgA0EUaiEBDAkLIANBDGohACADQQhqIQEMCAsgAygCBCIBQfwAaiEAIAFB+ABqIQEMBwsgA0EQaiEAIANBDGohAQwGCyADQRBqIQAgA0EMaiEBDAULIANBFGohACADQRBqIQEMBAsgA0EYaiEAIANBFGohAQwDCyADQRhqIQAgA0EUaiEBDAILAkACQAJAAkACQAJAAkACQCADKAIIDggAAQIDBAUGBwALIAMoAigiAUEoaiEAIAFBJGohAQwICyADKAIoIgFBNGohACABQTBqIQEMBwsgAygCDCIBQRBqIQAgAUEMaiEBDAYLIAMoAgwiAUEQaiEAIAFBDGohAQwFCyADKAIMIgFBBGohAAwECyADKAIMIgFBBGohAAwDCyADKAIMIgFBHGohACABQRhqIQEMAgsgAygCDCIBQcwAaiEAIAFByABqIQEMAQsgA0EMaiEAIANBCGohAQtBAC0AoPGeARogASgCACEFIAAoAgAhBkEwEH0iAEUNDEEALQCg8Z4BGkEwEH0iAUUNDCABQQA2AgggAUIBNwMAIAQgATYCACAAIAMpAwA3AwAgAEEIaiADQQhqKQMANwMAIABBEGogA0EQaikDADcDACAAQRhqIANBGGopAwA3AwAgAEEgaiADQSBqKQMANwMAIABBKGogA0EoaikDADcDAEEALQCg8Z4BGkEwEH0iAUUNDCABQQA2AhggASAGNgIUIAEgBTYCECABQQE2AgwgASAANgIIIAFCgICAgBA3AwAgBBDbASAEIAE2AgBBAEEIEJ4tIANBMEEIELMWDBELIAEgACgC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gICAeEYNACAAIAIpAkg3AgQgAEGMgICAeDYCACAAQQxqIAJB0ABqKAIANgIADAULAkACQCABEPEtDQAgAkHUAGogAkHEAGoQ3xAgAigCVEGAgICAeEYNASAAIAIpAlQ3AgQgAEGOgICAeDYCACAAQQxqIAJB3ABqKAIANgIADAYLIAIgATYCwAECQAJAIAEQ8S1FDQAgARAEIQEgAkEANgJ0IAIgATYCcCACQQA2AmwgAiACQcABajYCaCACQdABaiABQYCABCABQYCABEkbENofIAJBwAFqIQECQAJAA0AgAUUNASACQQhqIAJB6ABqEMkdIAIoAghBAXFFDQEgAigCDCEBIAIgAigCdEEBajYCdCACQeABaiABEM0BAkACQAJAIAIoAuABQZWAgIB4Rw0AIAIoAuQBIQEMAQsgAkGQAWpBCGogAkHgAWpBCGopAwA3AwAgAiACKQPgASIINwOQASAIpyIBQZaAgIB4Rw0BIAIoApQBIQELIABBlYCAgHg2AgAgACABNgIEIAJB0AFqEOUqDAULIAFBlYCAgHhGDQIgAkHQAWogAkGQAWoQ1hsgAigCaCEBDAALCyACQZWAgIB4NgKQAQsgAkGQAWoQoikgAEGUgICAeDYCACAAIAIpAtABNwIEIABBDGogAkHYAWooAgA2AgAMAQsgAkHgAWogARCmDCACKALgASEBAkACQAJAIAItAOQBIgNBfmoOAgIAAQsgAEGVgICAeDYCACAAIAE2AgQMAgsgAiADQQFxOgDUASACIAE2AtABIAJB6ABqQQAQ2h8CQAJAA0AgAkEQaiACQdABahDNESACKAIQIgNBAkYNASACKAIUIQECQAJAIANBAXENACACQeABaiABEM0BIAIoAuQBIQEgAigC4AEiA0GVgICAeEcNAQsgAEGVgICAeDYCACAAIAE2AgQgAkHoAGoQ5SoMAwsgAiACKQPoATcDmAEgAiABNgKUASACIAM2ApABIAJB6ABqIAJBkAFqENYbDAALCyACQZWAgIB4NgKQASACQZABahCiKSAAQZSAgIB4NgIAIABBDGogAkHwAGooAgA2AgAgACACKQJoNwIECyACKALQARDcKgwBCyAAIAJBwAFqELwiCyACKALAARDcKgwGCyABEOEtRQ0DEBMiAyABENQsIQQgAxDcKgJAIARFDQAgARAURQ0E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AhDRDyACKAIAIAJBBGooAgAQni0gAkEUQQQQsxYLIAFBPGoiAigCACABQcAAaigCABCAECABKAI4IAIoAgAQmy0gAUEoaiICKAIAIAFBLGooAgAQnyUgASgCJCACKAIAEKMtIAFByABBCBCzFgwCCwJAIAAoAgwiASkDCCIEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCABKAIgIgJFDQAgAhDRDyACKAIAIAJBBGooAgAQni0gAkEUQQQQsxYLIAEoAiQiAhDWAyACQeAAQQgQsxYgAUEwQQgQsxYMAQsCQCAAKAIMIgEpAwAiBEIDg0IAUg0AIASnIgIgAigCACIDQX9qNgIAIANBAUcNACACIAIoAhAQxiQLIAFBIGoQ0BAgASgCICABQSRqKAIAEJ4tIAFBMEEIELMWCyAAQTBBCBCzFgunEAIIfwJ+IwBBsAFrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACLQDgASIEQbB/ag4CAQIACyAEQd0ARw0CIANB4ABqQQhqIAFBCGooAgA2AgAgAyABKQIANwNgIANBGGogAiADQeAAahChLAJAAkACQCADKAIYIgRBCEYNACADQRhqQQhqIQUgAygCOCECIARBAUcNASABKAIMIQEgA0HgAGpBCGogAkEIaigCADYCACADQeAAakEUaiACQRRqKAIANgIAIANB4ABqQSBqIAJBIGopAgA3AwAgA0HgAGpBKGogAkEoaikCADcDACADIAIpAgA3A2AgAyACKQIMNwJsIAMgAikCGDcDeCABKAIAIQYgAikCNCELIAIpAjwhDCACLwFEIQdByABBBBCaKiEBAkBBMEUNACABIANB4ABqQTD8CgAACyABIAc7AUQgASAMNwI8IAEgCzcCNCABIAY2AjAgA0HIAGpBCGogBUEIaikDADcDACADQcgAakEQaiAFQRBqKQMANwMAIAMgBSkDADcDSCACEIovQQEhBgwCCyADKAIcIQIgAEEJNgIAIAAgAjYCBAwMCyADLQA8IQYgA0HIAGpBCGogBUEIaikDADcDACADQcgAakEQaiAFQRBqKQMANwMAIANBxgBqIANBP2otAAA6AAAgAyADLwA9OwFEIAMgBSkDADcDSCADKAIcIQUgAiEBCyAAIAU2AgQgACAENgIAIAAgAykDSDcDCCAAIAY6ACQgACABNgIgIAAgAy8BRDsAJSAAQRBqIANB0ABqKQMANwMAIABBGGogA0HIAGpBEGopAwA3AwAgAEEnaiADQcYAai0AADoAAAwKCyADQeAAaiACIAEoAhAoAgAiBCAEIAFBABCMBAJAAkACQCADKAJgIgRBCEYNACADQeAAakEIaiEFIAMoAoABIQIgBA0BIAEoAgwhASADQRhqQQhqIAJBCGooAgA2AgAgA0EYakEUaiACQRRqKAIANgIAIANBGGpBIGogAkEgaigCADYCACADIAIpAgA3AxggAyACKQIMNwIkIAMgAikCGDcDMCABKAIAIQYgAikCKCELIAIpAjAhDCACKAI4IQcgAi0APCEIQcAAQQQQmiohAQJAQSRFDQAgASADQRhqQST8CgAACyABIAg6ADwgASAHNgI4IAEgDDcCMCABIAs3AiggASAGNgIkIANBmAFqQQhqIAVBCGopAwA3AwAgA0GYAWpBEGogBUEQaikDADcDACADIAUpAwA3A5gBIAIQiy9BASEGDAILIAMoAmQhAiAAQQk2AgAgACACNgIEDAsLIAMtAIQBIQYgA0GYAWpBCGogBUEIaikDADcDACADQZgBakEQaiAFQRBqKQMANwMAIANBlgFqIANBhwFqLQAAOgAAIAMgAy8AhQE7AZQBIAMgBSkDADcDmAEgAygCZCEFIAIhAQsgACAFNgIEIAAgBDYCACAAIAMpA5gBNwMIIAAgBjoAJCAAIAE2AiAgACADLwGUATsAJSAAQRBqIANBoAFqKQMANwMAIABBGGogA0GYAWpBEGopAwA3AwAgAEEnaiADQZYBai0AADoAAAwJCwJAIAIQ2AkiBEUNACAELQAAQf0ARg0CCyACLQDgASEECyAEQf8BcSIFQdEARg0BIAVB4gBGDQEgBUHtAEYNASAFQYABRg0CIAQQpRUNAyAAQQg2AgAMBQsgAhChCyACEKELIANBEGogAiABKAIQKAIAQQEQ0AEgAygCFCECAkAgAygCEEEBcQ0AIAEoAgwhBCACKAIAIQUgA0HgAGpBCGoiBiACQQxqKQIANwMAIANB8ABqIgcgAkEUaigCADYCACADIAIpAgQ3A2AgAi0ALSEIIAIoAhwhCSAEKAIAIQogAikCJCELIAIoAiAhBCACQTBBCBCzFiAE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+ARqIANB0AFqQRhqKQMANwMAIABB8ARqIANB0AFqQRBqKQMANwMAIABB6ARqIAMpA9gBNwMAIAAgAykD0AE3A+AEIAAgAykD8AE3AxAgAEEYaiADKQP4ATcDACAAQSBqIANB8AFqQRBqKQMANwMAIABBKGogA0HwAWpBGGopAwA3AwAMAgsgAEIANwMIIABCAjcDACAAQbEBNgIYIABBzImEATYCFCAAQSw2AhALIAIgAigCACIEQX9qNgIAIARBAUcNACACEO8SCyADQbAGaiQAC4cPAgZ/An4jAEHQAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4JAAECAwQFBgcIAAsCQCAAKAIMIgNFDQAgA0HIAGwhAwNAIANBuH9qIgMNAAsLIAAoAhwiA0UNByADIAEQixkMBwtBCCEDIABBCGogARCpAQJAAkACQAJAAkACQAJAAkACQCAAKAIIQX5qDgYADw8PAQIPCyAAKAIMIQBBACEEIAJBADYCECACQoCAgICAATcCCEEAIQUCQCAAKAIIIgZFDQAgACgCBCEDIAZBOGwhBANAIAMgAkEIahCdCyADQThqIQMgBEFIaiIEDQALIAIoAhAhBCACKAIMIQMgAigCCCEFCyABKQMQIghQRQ0CDAMLIAJBCGogACgCDCIDKQMAIANBEGooAgAQuR8gAigCECEDIAIpAwghCSABKQMQIghCAFINAyACQQhqIAFBMGogCSADQgAgAhCwBQwECyACQQhqIAAoAgwQ7SQgAigCECEDIAIpAwghCSABKQMQIghCAFINBCACQQhqIAFBMGogCSADQgAgAhCwBQwFCwJAIAhCA4NCAFINACAIpyIAIAAoAgAiAEEBajYCACAAQX9MDQ0LIAEoAhghAAsgAUEwaiIGIARBAWpBAXYgBCABKAI8GyABQcAAahDDJyACQSxqQgA3AgAgAkIANwIkIAIgADYCICACIAg3AxggAiADIARBBHRqNgIUIAIgBTYCECACIAM2AgwgAiADNgIIAkAgBEUNAANAAkACQCACKAIMIgMgAigCFEcNAEIAIQkMAQsgAiADQRBqNgIMIAMoAgghACADKQMAIQkLAkAgAikDGCIIUA0AIAIoAiAhAyAIQgODQgBSDQAgCKciASABKAIAIgFBAWo2AgAgAUF/TA0OCyACQThqIAYg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QQhqIgYgBDYCACADIAUpAgAiETcChAIgAyARNwP4ASAAQRxqIAEoAgQgASgCCBCKFCAAQRs2AgAgACADKQP4ATcCKCAAQTBqIAYpAwA3AgAgAEE4aiADQYgCaikDADcCAAwJCyADQYwCaiAFQQhqKAIAIgQ2AgAgA0H4AWpBCGoiBiAENgIAIAMgBSkCACIRNwKEAiADIBE3A/gBIABBHGogASgCBCABKAIIEIoUIABBGzYCACAAIAMpA/gBNwIoIABBMGogBikDADcCACAAQThqIANBiAJqKQMANwIADAcLIANB+AFqIAEQ3QYgA0EZNgKEASADQQU2AmggA0EoaiADQfgBaiADQegAaiADQYQBahCgDAJAAkACQAJAAkAgBSgCACIIIAEoAggiCUYNACABEPsPQSxHDQIgARDUJA0DIANBjAJqIAVBCGooAgA2AgAgA0H4AWpBCGoiBCADQRBqQQhqKAIANgIAIAMgAykDEDcD+AEgAyAFKQIANwKEAiAAQRxqIAEoAgQgCRCKFCAAQRo2AgAgACADKQP4ATcCKCAAQTBqIAQpAwA3AgAgAEE4aiADQYgCaikDADcCAAwBCyADQYwCaiAFQQhqKAIANgIAIANB+AFqQQhqIgQgA0EQakEIaigCADYCACADIAMpAxA3A/gBIAMgBSkCADcChAIgAEEcaiABKAIEIAgQihQgAEEaNgIAIAAgAykD+AE3AiggAEEwaiAEKQMANwIAIABBOGogA0GIAmopAwA3AgALQQEhBEEBIQgMCAsgAygCLCEKIAMoAigiBEEiRw0BQQAhC0EBIQxBACEEQQAhCAwECyABEPsPIQggAygCKCENAkAgCEH9AEcNACADKAIsIQoCQCANQSJHDQBBACEEQQEhDEEBIQtBACEIDAULAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAgCjYCBAwFCwJAAkACQCANQSJGIggNACADQShqQdTBhAEQsBNFDQEgBC0AZw0CAkBBwABFDQAgACADQShqQcAA/AoAAAtBACEIQQEhBAwJCyADKAIsIQoMBAsgAygCLCEBAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAgATYCBAwFCyADKAJEIAMoAkgQhy1BACEKDAILAkBBOEUNACAAQQhqIANBKGpBCGpBOPwKAAALIAAg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FgwECyAAQQRqEOUBIAAoAggiAhC3HyACKAIAIAJBBGooAgAQny0gAkEUQQQQsxYMAwsgAEEEahDlASAAKAIIIgIQ3AMgAkHgAEEIELMWDAILIAApAwgiA0IDg0IAUg0BIAOnIgIgAigCACIBQX9qNgIAIAFBAUcNASACIAIoAhAQxiQMAQsCQAJAIAAoAgQiAigCAEEDRg0AIAJBIGoQ5QEgAhCWEgwBCyACQRBqEOUBIAJBBGoQ6R4gAigCBCACQQhqKAIAEJstIAIoAiAiAUUNACABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgsgAkEoQQgQsxYLIABBwABBCBCzFgvpDwEJfyMAQfAAayICJAACQAJAAkACQAJAAkADQAJAIAEoAgAiA0FXakEFSw0AA0BBAC0AoPGeARpBwAAQfSIERQ0HIARBADYCCCAEQjE3AwAgASgCBCEDIAEgBDYCBCACQQhqIgQgA0EIaikDADcDACACQRBqIgUgA0EQaikDADcDACACQRhqIgYgA0EYaikDADcDACACQSBqIgcgA0EgaikDADcDACACQShqIgggA0EoaikDADcDACACQTBqIgkgA0EwaikDADcDACACQThqIgogA0E4aikDADcDACACIAMpAwA3AwAgARC+ASABQThqIAopAwA3AwAgAUEwaiAJKQMANwMAIAFBKGogCCkDADcDACABQSBqIAcpAwA3AwAgAUEYaiAGKQMANwMAIAFBEGogBSkDADcDACABQQhqIAQpAwA3AwAgASACKQMANwMAIANBwABBCBCzFiABKAIAIgNBV2pBBkkNAAsLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQXRqIgRBByAEQSZJGw4mHgABAgMEBQYHCAkKCwwNHg4PEBESHhMTFB4eFRYXGBgZGxweHR4eCyABKAIMIgNFDR0gASgCCCEBIANBBHQhAwNAAkAgASgCAEECRg0AIAAgAUEMaigCABDmAQsgAUEQaiEBIANBcGoiAw0ADB4LCyABKAIMIgNFDRwgASgCCCEBIANBDGwhAwNAAkACQCABKAIAIgQNACABQQRqKAIAIAAQsgoMAQsgACAEEOYBCyABQQxqIQEgA0F0aiIDDQAMHQsLAkAgAS0AHEEC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CGooAgA2AgAgAiAFKQIANwOwASACQbABakEUaiACQcAAahDWJCIFQRRqKAIANgIAIAIgBSkCDDcCvAECQCADDQAgAkHIAmogAkEIakE4/AoAAAsgAkGIAmogAkHIAmogASgCBCIDIAQQ2gsgAkHIAWpBCGogAkGIAmpBEGopAgA3AwAgAkHIAWpBEGoiBSACQYgCakEYaikCADcDACACQcgBakEYaiIGIAJBqAJqKAIANgIAIAIgAikCkAI3A8gBIAIoAowCIQECQCACKAKIAiIHQSJGDQAgACACKQKsAjcCKCAAQcAAaiACQcQCaigCADYCACAAQThqIAJBvAJqKQIANwIAIABBMGogAkG0AmopAgA3AgAgAEEkaiAGKAIANgIAIABBHGogBSkDADcCACAAQRRqIAJB0AFqKQMANwIAIAAgAikDyAE3AgwgACABNgIIIAAgBzYCBCAAQYiAxAA2AgAgAkHAAGoQ8icMBAsCQEE4RQ0AIAJByAJqIAJBwABqQTj8CgAACyACQYgCaiACQcgCaiADIAQQ2gsgAkHoAWpBCGoiBiACQYgCakEQaikCADcDACACQegBakEQaiIHIAJBiAJqQRhqKQIANwMAIAJB6AFqQRhqIgggAkGoAmooAgA2AgAgAiACKQKQAjcD6AEgAigCjAIhBQJAIAIoAogCIglBIkYNACAAIAIpAqwCNwIoIABBwABqIAJBxAJqKAIANgIAIABBOGogAkG8AmopAgA3AgAgAEEwaiACQbQCaikCADcCACAAQSRqIAgoAgA2AgAgAEEcaiAHKQMANwIAIABBFGogBikDADcCACAAIAIpA+gBNwIMIAAgBTYCCCAAIAk2AgQgAEGIgMQANgIADAQLIAJB+ABqQQhqIAYpAwA3AwAgAkH4AGpBEGogBykDADcDACACQfgAakEYaiAIKAIANgIAIAJB+ABqQSRqIAJBsAFqQQhqKQMANwIAIAJBpAFqIAJBsAFqQRBqKQMANwIAIAIgAikD6AE3A3ggAiACKQOwATcClAECQCABIAVNDQAgAEEgaiADIAQQihQgAEKIgMSAIDcCACAAIAIpA7ABNwIsIABBNGogAkG4AWopAwA3AgAgAEE8aiACQcABaikDADcCAAwECyAAQQRqIgMgAikDyAE3AgAgA0EYaiACQcgBakEYaigCADYCACADQRBqIAJByAFqQRBqKQMANwIAIANBCGogAkHIAWpBCGopAwA3AgACQEE0RQ0AIABBJGogAkH4AGpBNPwKAAALIAAgBTYCICAAIAE2AgAMAwsgAEEEaiABEP4JIABBiIDEADYCAAsgAkEIahDyJwwBCyACQSxqIQUgAkEIakEEaiEDAkACQAJAAkAgAigCCCIHQf7///8HaiIGQQQgBkEESRsOBQEAAAIDAAsgAkGUAmogA0EIaikCADcCACACQZwCaiADQRBqKQIANwIAIAJBpAJqIANBGGopAgA3AgAgAkG0AmogBUEIaikCADcCACACQYgCakE0aiAFQRBqKAIANgIAIAIgBzYCiAIgAiADKQIANwKMAiACIAUpAgA3AqwCIAJByAJqQRBqIgUgAkGIAmoQ1iQiA0EQaikCADcDACACQcgCakEIaiIGIANBCGopAgA3AwAgAiADKQIANwPIAiAAQSBqIAEoAgQgBBCKFCAAQQE2AgQgACACKQPIAjcCLCAAQTRqIAYpAwA3AgAgAEE8aiAFKQMANwIAIABBiIDEADYCACACQYgCahDyJwwDCyAAQYGAxAA2AgAgACADKQIANwIEIABBHGogA0EYaikCADcCACAAQRRqIANBEGopAgA3AgAgAEEMaiADQQhqKQIANwIADAILIABBhYDEADYCACAAIAMpAgA3AgQgAEEcaiADQRhqKAIANgIAIABBFGogA0EQaikCADcCACAAQQxqIANBCGopAgA3AgAMAQsgACAHNgIEIABBhIDEADYCACAAIAMpAgA3AgggACAFKQIANwIoIABBEGogA0EIaikCADcCACAAQRhqIANBEGopAgA3AgAgAEEgaiADQRhqKQIANwIAIABBMGogBUEIaikCADcCACAAQThqIAVBEGooAgA2AgALIAJBgANqJAALyA8BDH8jAEEQayIDJABBACEEIAJBADYCAAJAIAEoAgAiBSABKAIEIgZLDQAgAkEEaiEHAkACQAJAAkACQAJAIAAoAigiCEUNACABLQAQQQFHDQELAkACQCACKAIQQQFHDQAgAigCFCEJIAIoAhgNASACKAIgIQUMBAsCQAJAIAEtABBBAUcNACAAKALUAiIJDQEQjTAhBAwICyAAKALQAiIJRQ0GCyAJIAAoAswCSw0CQQAhBCACKAIcQQAgAigCGBsiCCAA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QegBaikCADcCACAAQTRqIAJB4AFqKQIANwIAIAAgBDYCECAAIAg2AgwgACAJNgIIIAAgAikDUDcCFCAAQRxqIAYpAwA3AgAgAEEkaiAHKQMANwIAIAAgCjYCBCAAQYSAgIB4NgIADAULIAJB+ABqQQhqIAYpAwA3AwAgAkH4AGpBEGogBykDADcDACACIAIpA1A3A3ggAiABEPsPIgY2ApQBIAEQjQsaAkACQCAGQSlGDQAgBkE6Rw0BIAAgBDYCDCAAIAg2AgggACAJNgIEIAAgAikDeDcCECAAQRhqIAJB+ABqQQhqKQMANwIAIABBIGogAkH4AGpBEGopAwA3AgAgAkHEAWogA0EIaigCACIBNgIAIAJBsAFqQQhqIAE2AgAgAiADKQIAIgs3ArwBIAIgCzcDsAEgAkEIaiACQbABahCHHyACKAIMIQNBCBDxJyIBIAM2AgQgAUEANgIAIAAgATYCLCAAQYKAgIB4NgIAIAAgAikCIDcCMCAAQThqIAJBIGpBCGopAgA3AgAgAEHAAGogAkEgakEQaikCADcCAAwGCwJAIARFDQAgAkGsAWogA0EIaigCADYCACAAIAIpA3g3AhAgACAENgIMIAAgCDYCCCAAIAk2AgQgAEGDgICAeDYCACACQZgBakEIaiIBIAJBIGpBCGooAgA2AgAgAEEYaiACQfgAakEIaikDADcCACAAQSBqIAJB+ABqQRBqKQMANwIAIAIgAykCADcCpAEgAiACKQIgNwOYASAAQThqIAJBmAFqQRBqKQMANwIAIABBMGogASkDADcCACAAIAIpA5gBNwIoDAYLIABBIGogASgCBCAFEIoUIABChICAgLgDNwIAIAAgAikDODcCLCAAQTRqIAJBwABqKQMANwIAIABBPGogAkHIAGopAwA3AgAgCSAIEPYsDAULIAJBADYCsAEgAkGUAWpBvMKEASACQbABakHAwoQBELchAAsgAkGwAWogASAEEPIBIAIoArABIQECQEEoRQ0AIAJB0ABqIAJBtAFqQSj8CgAACwJAIAFBIkYNACAAIAIpAtwBNwIwIABBwABqIAJB7AFqKAIANgIAIABBOGogAkHkAWopAgA3AgACQEEoRQ0AIABBCGogAkHQAGpBKPwKAAALIABBhICAgHg2AgAgACABNgIEDAQLAkBBKEUNACAAIAJB0ABqQSj8CgAACyACQcQBaiADQQhqKAIAIgE2AgAgAkGwAWpBCGogATYCACACIAMpAgAiCzcCvAEgAiALNwOwASACIAJBsAFqEIcfIAIoAgQhA0EIEPEnIgEgAzYCBCABQQA2AgAgACABNgIsIAAgBToAKCAAIAIpAiA3AjAgAEE4aiACQSBqQQhqKQIANwIAIABBwABqIAJBMGopAgA3AgAMAwsgAkEANgKwASACQRxqQZi8hAEgAkGwAWpB0MKEARC3IQALIAJBsAFqQQhqIgMgAkEgakEIaigCADYCACACQcQBaiABKAIAIgRB2ABqKAIANgIAIAIgAikCIDcDsAEgAiAEKQJQNwK8ASAAQSBqIAEoAgQgASgCCBCKFCAAQSE2AgQgACACKQOwATcCLCAAQTRqIAMpAwA3AgAgAEE8aiACQcABaikDADcCACAAQYSAgIB4NgIADAELIABBIGogASgCBCAEEIoUIABChICAgNgCNwIAIAAgAikCIDcCLCAAQTRqIAJBKGopAgA3AgAgAEE8aiACQTBqKQIANwIACyACQfABaiQAC+MQAQp/IwBBwAFrIgMkAAJAAkAgASgCACIELQAUIgVBAkYNACAFQQFxDQAgACABKAIEIAEoAggQjBQgAEEAOgAkIAAgAikCHDcCDCAAQRRqIAJBJGopAgA3AgAgAEEcaiACQSxqKQIANwIADAELAkACQAJAAkACQAJAAkAgAigCAEGAgICAeHMiBUECIAVBAkkbDgMCAAECCyADQfAAaiACKAIIIAIoAgwQxAggAkEcaiEGDAILIAIoAhQhBSACKAIQIQcgA0GoAWogAigCBCACKAIIEL8FIANBtAFqIAcgBRC/BSADQZgBaiADKAKsASIHIAMoArABEK8MIAJBHGohBgJAAkAgAy0AmAFBAUYNAAJAIAMoApwBIggNAEEAIQUMAgsCQAJAIAggAygCoAEiCUHchogBQRAQ6yUNAAJAIAggCUHshogBQQYQ6yUNACADQZgBaiAIIAkQsAwgAy0AmAENA0EBIQUgAygCnAEiCkUNBCADQTBqIAogAygCoAEgAygCuAEiCyADKAK8ARD4DiADKAIwIgpFDQQgAygCNCEMQQMhBQwCCyADQZgBaiADKAK4ASILIAMoArwBEKETIAMtAJgBDQICQCADKAKcASIIRQ0AIAMoAqAB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NwMAIAFBOGpCADcDACABQgA3AzAgAULzytHLp4zZsvQANwMoIAFCg9+R85bM3LfkADcDICABQuHklfPW7Nm87AA3AxggAUL1ys2D16zbt/MANwMQIAFBEGogAxCfECACKAIUIQMgAUEQaiACKAIYIgUQshEgAyAFIAFBEGoQjxQgAUEQaiACKAIAIgNBAkcQnxACQCADQQJGDQAgAUEQaiADEJ8QIAJBCGooAgAgAkEMaigCACABQRBqENUKCyACKAIgIQMgAUEQaiACKAIkIgUQshEgAyAFIAFBEGoQ6h8gAigCLCEDIAFBEGogAigCMCIFELIRIAMgBSABQRBqEMsMIAIoAjghCSABQRBqIAIoAjwiAxCyESADQQZ0IQhBACEFAkADQCAIIAVGDQEgCSAFaiIDQTxqLQAAIAFBEGoQly0gA0EEaigCACEGIAFBEGogA0EIaigCACIHELIRIAYgByABQRBqEI8UIANBDGogAUEQahC+ISABQRBqIANBJGoiBigCACIDQYCAgIB4RxC/JgJAIANBgICAgHhGDQAgBiABQRBqEL4hCyAFQcAAaiEFDAALCyACKAJEIQggAUEQaiACKAJIIgMQshEgCCADQRxsaiEJAkADQCAIIAlGDQEgCCgCBCEGIAFBEGogCCgCCCIDELIRIAYgA0EMbGohBwJAA0AgBiAHRg0BIAYoAgQhAyABQRBqIAYoAggiBRCyESAFQRRsIQUCQANAIAVFDQEgAygCDCABQRBqEM4QIAMoAhAgAUEQahDOECADQQRqKAIAIANBCGooAgAgAUEQahDVCiAFQWxqIQUgA0EUaiEDDAALCyAGQQxqIQYMAAsLIAhBEGooAgAgCEEUaigCACABQRBqENUKIAFBEGogCC0AGBCfECABQRBqIAgtABkQnxAgCEEcaiEIDAALCyABKQNAIQogATUCSCELIAFB2ABqQRBqIgUgAUEQakEQaikDADcDACABQdgAakEIaiIDIAFBEGpBCGopAwA3AwAgAUHYAGpBGGoiBiAKIAtCOIaEIgogAUEQakEYaikDAIU3AwAgASABKQMQNwNYIAFB2ABqEP0NIAMgAykDAELuAYU3AwAgASABKQNYIAqFNwNYIAFB2ABqEOAIIAUgBSkDACIKQt0BhTcDACAGKQMAIQsgAykDACEMIAEpA1ghDSABQdgAahDgCCAGKQMAIQ4gAykDACEPIAUpAwAhECABKQNYIREgBEHIAGoiBRDkJSABIA4gDyAQIBGFhYUiDjcDGCABIAogCyANIAyFhYUiCjcDECAEQcwAaiEDIAogDhDUICEKIAEgAUEQajYCjAECQCAEKAJUDQAgAyAEQdwAahD3BhoLIAEgAzYCXCABIAFBjAFqNgJYIAEgBCgCTCAEKAJQIAogAUHYAGpBHBDfCQJAAkAgASgCAEEBcUUNACAEKAJMIgMgASgCBCIGaiIHLQAAIQggASkDECELIAEpAxghDCAHIApCGYinIgk6AAAgAyAEKAJQIAZBeGpxakEIaiAJOgAAIAQgBCgCWEEBajYCWCAEIAQoAlQgCEEBcWs2AlQgAyAGQQR0a0FwaiIDIAw3AwggAyALNwMAIAUQ+yQgBEEEaiIDEOQlIAQoAgggACAEKAIMKAIMEQYAIAMQ+yQgACgCBCICLQBMQQxxQQRGDQEgBC0AX0EBRg0DIAQgBCgCAEEBajYCACAAKAIEIQIMAQsgBRD7JAsgAkEHOgBMCyABQZABaiQADwsgAUEANgIgIAFBATYCFCABQZjimAE2AhAgAUIENwIYIAFBEGpBoOKYARDpIwALig8BDX8jAEGgAWsiAyQAAkACQCABLQCQAUEEcQ0AIABBADYCCCAAQoCAgIDAADcCAAwBCyADQQA2AiwgA0KAgICAwAA3AiQgA0HQAGpBDGohBCADQYgBakEMaiEFIAEoAtgBIQZBACEHAkACQAJAA0ACQAJAAkACQAJAAkAgAS0A4AEiCEEYRg0AIAdFDQEgCEHYAEcNCSABKAKIASIHQYCACHFFDQIMCQsgASgC2AEhCSABEKELAkAgAS0A4AFFDQAgA0GIAWogAUEAQQAQywMCQCADLQCcAUECRw0AIAMoAogBIQgMCAsgA0HQAGpBEGogA0GIAWpBEGopAwA3AwAgA0HQAGpBCGogA0GIAWpBCGopAwA3AwAgAyADKQOIATcDUEHAAEEIEKwqIgdBGjYCAAJAQThFDQAgB0EIaiADQdAAakE4/AoAAAsgA0EFOgBYIAMgBzYCUCADQRhqIAEgA0HQAGpBAEEBEGIgAygCHCEIIAMoAhhBAXENBwwFCyABEKELIANBEGogARD/CSADKAIUIQggAygCEEEBcQ0GIAMgCDYCMCABLQDgAUEBRg0CIAEoAtwBIQcgASgC2AEhCCADQTRqIAEQ1CYgA0EBNgJUIANBnL+cATYCUCADQgE3AlwgA0GzBzYCRCADQQE6AE8gAyADQcAAajYCWCADIANByABqNgJAIAMgA0HPAGo2AkggA0GIAWogA0HQAGoQkhAgBUEIaiADQTRqQQhqKAIANgIAIAUgAykCNDcCACAIIAcgA0GIAWoQ4BohCCABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgACADKQIkNwIAIABBCGogA0EkakEIaigCADYCAAwICyAHQYCAIHEhBwJAIAINACAHDQAgASgC3AEhByABKALYASEIIANBjoCAgHg2AlAgCCAHIANB0ABqEOAaIQggAS0A4AFBogFHDQUgASABEJosEKcXDAULIAcNBiABLQCQAUEIcQ0GIAEoAtQBIQcgA0HagICAeDYCUCAGIAcgA0HQAGoQ4BohCCABLQDgAUGiAUcNBCABIAEQmiwQpxcMBAsgARChCwwBCyADQTBqEKcsDAILIAMgCDYCiAEgAS0A4AEhBwJAAkACQAJAAkAgAS0AkQFBIHFFDQAgB0H/AXFBEkcNACADQQhqIAEQzgcgAygCDCEKAkAgAygCCEEBcUUNACAKIQgMAwsgARChCwwBCwJAIAdB/wFxRQ0AIAghBwwEC0EAIQoLIANB0ABqIAFBABCfHyADKAJUIQsgAygCUCIMQYCAgIB4Rw0BIAoQhCwgCyEICyADQYgBahCnLAwDCyADKAJYIQ0CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIKAIAQXRqIgdBByAHQSZJGw4mAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyAIQQRqIQcMLAsgCEEQaiEHDCsLIAhBEGohBwwqCyAIKAIgQTBqIQcMKQsgCEEIaiEHDCgLIAhBBGohBwwnCyAIQQxqIQcMJgsgCEEwaiEHDCULIAhBIGohBwwkCyAIQSBqIQcMIwsgCEEQaiEHDCILIAhBHGohBwwhCyAIQRRqIQcMIAsgCEEQaiEHDB8LIAhBEGohBwweCyAIKAIIDgcWFxgZGhscFgsgCEEcaiEHDBwLIAhBDGohBwwbCyAIQRRqIQcMGgsgCCgCIEEkaiEHDBkLIAhBBGohBwwYCyAIQQRqIQcMFwsgCEEIaiEHDBYLIAhBCGohBwwVCyAIQRhqIQcMFAsgCEEoaiEHDBMLIAhBBGohBwwSCyAIKAIEIQcMEQsgCEEQaiEHDBALIAhBDGohBwwPCyAIQQhqIQcMDgsgCEEIaiEHDA0LIAhBDGohBwwMCyAIQQxqIQcMCwsgCEEMaiEHDAoLIAhBEGohBwwJCyAIQQhqIQcMCAsgCEEEaiEHDAcLIAhBGGohBwwGCyAIQQxqIQcMBQsgCEEMaiEHDAQLIAhBEGohBwwDCyAIQRBqIQcMAgsgCEEgaiEHDAELIAhBIGohBwsgASgC1AEhDiAHKAIAIQ8gA0IANwJoIANBAzoAZCADQQA2AmAgA0IANwJwIANCADcCWCADQoCAgIDAADcCUEEIQcAAEKksIgdFDQMgB0IANwIkIAcgDjYCICAHIA82AhwgB0EFOgAYIAcgCDYCECAHIA02AgwgByALNgIIIAcgDDYCBCAHQRc2AgAgChCELCAEEKkqIANB0ABqEP8qCyABKALUASELAkAgAygCLCIIIAMoAiRHDQAgA0EkahDfHQsgAygCKCAIQQxsaiIKIAs2AgggCiAJNgIEIAogBzYCACADIAhBAWoiBzYCLAwACwsgAEGAgICAeDYCACAAIAg2AgQgA0EkahCUKAwCCwALIAAgAykCJDcCACAAQQhqIANBJGpBCGooAgA2AgALIANBoAFqJAALqA4BBH8jAEHQAGsiBSQAAkACQAJAAkAgBA4CAAECCwJAAkAgAigCGCIEKAIAQQFHDQAgBCgCBA0BCyAFIAEgAhBNIAUoAgghAiAFKAIEIQQCQCAFKAIAIgZBKkYNAAJAQTRFDQAgAEEMaiAFQQxqQTT8CgAACyAAIAI2AgggACAENgIEIAAgBjYCAAwECwJAAkAgAw0AIAUgARCtGQwBCyAFIAEQkxgLIAUoAgQhBgJAIAUoAgAiB0EqRg0AAkBBOEUNACAAQQhqIAVBCGpBOPwKAAALIAAgBjYCBCAAIAc2AgAMBAsgBSABIAIgBhC1CAJAIAUoAgAiAkEqRg0AAkBBPEUNACAAQQRqIAVBBHJBPPwKAAALIAAgAjYCAAwECyAFIAEgBiAEELUIAkAgBSgCACICQSpGDQACQEE8RQ0AIABBBGogBUEEckE8/AoAAAsgACACNgIADAQLAkACQCADDQAgBSABEK0ZDAELIAUgARCTGAsgBSgCBCECAkAgBSgCACIDQSpGDQACQEE4RQ0AIABBCGogBUEIakE4/AoAAAsgACACNgIEIAAgAzYCAAwECyAFIAEQ3iIgBSgCBCEDAkAgBSgCACIHQSpGDQACQEE4RQ0AIABBCGogBUEIakE4/AoAAAsgACADNgIEIAAgBzYCAAwECyAFIAEgAiAEELUIAkAgBSgCACIEQSpGDQACQEE8RQ0AIABBBGogBUEEckE8/AoAAAsgACAENgIADAQLIAUgASACIAMQtQgCQCAFKAIAIgRBKkYNAAJAQTxFDQAgAEEEaiAFQQRyQTz8CgAACyAAIAQ2AgAMBAsgBSABIAYgAxC1CAJAIAUoAgAiAUEqRg0AAkBBPEUNACAAQQRqIAVBBHJBPPwKAAALIAAgATYCAAwECyAAIAM2AgggACACNgIEIABBKjYCAAwDCwJAAkAgAw0AIAUgARCtGQwBCyAFIAEQkxgLIAUoAgQhBAJAIAUoAgAiA0EqRg0AAkBBOEUNACAAQQhqIAVBCGpBOPwKAAALIAAgBDYCBCAAIAM2AgAMAwsgBSABIAIQTSAFKAIIIQMgBSgCBCECAkAgBSgCACIGQSpGDQACQEE0RQ0AIABBDGogBUEMakE0/AoAAAsgACADNgIIIAAgAjYCBCAAIAY2AgAMAwsgBSABIAQgAhC1CAJAIAUoAgAiAkEqRg0AAkBBPEUNACAAQQRqIAVBBHJBPPwKAAALIAAgAjYCAAwDCyAFIAEgAyAEELUIAkAgBSgCACIBQSpGDQACQEE8RQ0AIABBBGogBUEEckE8/AoAAAsgACABNgIADAMLIAAgBDYCCCAAIAQ2AgQgAEEqNgIADAILIAUgASACEE0gBSgCCCECIAUoAgQhBAJAIAUoAgAiBkEqRg0AAkBBNEUNACAAQQxqIAVBDGpBNPwKAAALIAAgAjYCCCAAIAQ2AgQgACAGNgIADAILAkACQCADDQAgBSABEK0ZDAELIAUgARCTGAsgBSgCBCEDAkAgBSgCACIGQSpGDQACQEE4RQ0AIABBCGogBUEIakE4/AoAAAsgACADNgIEIAAgBjYCAAwCCyAFIAEgAiADELUIAkAgBSgCACICQSpGDQACQEE8RQ0AIABBBGogBUEEckE8/AoAAAsgACACNgIADAILIAUgASADIAQQtQgCQCAFKAIAIgFBKkYNAAJAQTxFDQAgAEEEaiAFQQRyQTz8CgAACyAAIAE2AgAMAgsgACADNgIIIAAgBDYCBCAAQSo2AgAMAQsgBSAEQX9qNgJMIAVBADYCSCAFIAI2AkQgBSABNgJAIAUgASAFQcAAahDrBCAFKAIIIQQgBSgCBCEGAkAgBSgCACIHQSpGDQACQEE0RQ0AIABBDGogBUEMakE0/AoAAAsgACAENgIIIAAgBjYCBCAAIAc2AgAMAQsgBSABIAIQTSAFKAIIIQcgBSgCBCECAkAgBSgCACIIQSpGDQACQEE0RQ0AIABBDGogBUEMakE0/AoAAAsgACAHNgIIIAAgAjYCBCAAIAg2AgAMAQsCQAJAIAMNACAFIAEQrRkMAQsgBSABEJMYCyAFKAIEIQMCQCAFKAIAIghBKkYNAAJAQThFDQAgAEEIaiAFQQhqQTj8CgAACyAAIAM2AgQgACAINgIADAELIAUgASAEIAIQtQgCQCAFKAIAIgRBKkYNAAJAQTxFDQAgAEEEaiAFQQRyQTz8CgAACyAAIAQ2AgAMAQsgBSABIAcgAxC1CAJAIAUoAgAiBEEqRg0AAkBBPEUNACAAQQRqIAVBBHJBPPwKAAALIAAgBDYCAAwBCyAFIAEgAyACELUIAkAgBSgCACIBQSpGDQACQEE8RQ0AIABBBGogBUEEckE8/AoAAAsgACABNgIADAELIAAgAzYCCCAAIAY2AgQgAEEqNgIACyAFQdAAaiQAC78PAQd/IwBBgAJrIgIkACABKALYASEDIAEQoQsCQAJAAkACQAJAAkACQCABLQDgAUUNACABKALcASEEIAEoAtgBIQMgAkEMaiABENQmIAJBATYCpAEgAkGcv5wBNgKgASACQgE3AqwBIAJBswc2AhwgAkEAOgDkASACIAJBGGo2AqgBIAIgAkHUAGo2AhggAiACQeQBajYCVCACQegAaiACQaABahD9GiACQfwAaiACQRRqKAIANgIAIAIgAikCDDcCdCADIAQgAkHoAGoQ4BohBCABLQDgAUGiAUYNAQwFCyABEKELIAEtAOABIgRBwABGDQEgBEGiAUcNAiABEJosIQEgAEEEOgA0IAAgATYCAAwFCyABIAEQmiwQpxcMAwsgAkEYaiABEP4aDAELIAEoAtwBIQQgASgC2AEhBSABEKELIAJBkYGAgHg2AqABIAEgBSAEIAJBoAFqEN4jIAIgBDYCJCACIAU2AiAgAkKhxIgBNwMoIAJCATcDGAtBACEFAkACQAJAIAEtAOABIgRBB0cNACABEKELIAEtAOABIgRBAkcNACABKALYASEGIAEQoQsCQAJAAkAgAS0A4AFB8ABGDQAgASgC3AEhBCABKALYASEDIAJBPGogARDUJiACQQE2AqQBIAJBnL+cATYCoAEgAkIBNwKsASACQbMHNgJYIAJB8AA6APgBIAIgAkHUAGo2AqgBIAIgAkHwAWo2AlQgAiACQfgBajYC8AEgAkHoAGogAkGgAWoQ/RogAkH8AGogAkHEAGooAgA2AgAgAiACKQI8NwJ0IAMgBCACQegAahDgGiEEIAEtAOABQaIBRw0CDAELIAEQoQsCQCABLQDgAUEJRg0AIAEoAtwBIQQgASgC2AEhAyACQcgAaiABENQmIAJBATYCpAEgAkGcv5wBNgKgASACQgE3AqwBIAJBswc2AlggAkEJOgD4ASACIAJB1ABqNgKoASACIAJB8AFqNgJUIAIgAkH4AWo2AvABIAJB6ABqIAJBoAFqEP0aIAJB/ABqIAJB0ABqKAIANgIAIAIgAikCSDcCdCADIAQgAkHoAGoQ4BohBCABLQDgAUGiAUYNAQwCCyABEKELIAJBoAFqIAEQqyAgAigCpAEhBCACKAKgASIFQTJGDQECQEE4RQ0AIAJB6ABqIAJBqAFqQTj8CgAACwJAAkAgBUEORw0AIAJB4ABqIAJB8ABqKQMANwIAIAIgAikDaDcCWCACIAQ2AlQCQCABLQDgASIEQQdHDQAgARChCyABLQDgASEECwJAIARB/wFxQQNGDQAgASgC3AEhBCABKALYASEDIAJB5AFqIAEQ1CYgAkEBNgKkASACQZy/nAE2AqABIAJCATcCrAEgAkGzBzYC9AEgAkEDOgD/ASACIAJB8AFqNgKoASACIAJB+AFqNgLwASACIAJB/wFqNgL4ASACQegAaiACQaABahD9GiACQfwAaiACQewBaigCADYCACACIAIpAuQBNwJ0IAMgBCACQegAahDgGiEEIAEtAOABQaIBRw0CIAEgARCaLBCnFwwCCyABEKELIAEoAtQBIQdBFEEEEJoqIgVBEGogAkHUAGpBEGooAgA2AgAgBUEIaiACQdQAakEIaikCADcCACAFIAIpAlQ3AgAgAS0A4AEhBAwFC0GgppwBQShBjNabARDSHgALIAJB1ABqEPwqDAELIAEgARCaLBCnFwsgAEEEOgA0IAAgBDYCAAwCCwsCQAJAAkACQAJAAkAgBEH/AXFBAUYNACABKALcASEEIAEoAtgBIQMgAkEwaiABENQmIAJBATYCpAEgAkGcv5wBNgKgASACQgE3AqwBIAJBswc2AlggAkEBOgBIIAIgAkHUAGo2AqgBIAIgAkHkAWo2AlQgAiACQcgAajYC5AEgAkHoAGogAkGgAWoQ/RogAkH8AGogAkE4aigCADYCACACIAIpAjA3AnQgAyAEIAJB6ABqEOAaIQQgAS0A4AFBogFGDQEMBAsgARChCwJAIAEtAOABIgRBCEYNACACQQM6AHwMAwsgARChCyACQaABaiABQQAQwgUgAigCoAEhBCACLQC0ASIIQQNGDQEgAkHoAGpBDGogAkGgAWpBDGopAgA3AgAgAkHoAGpBF2ogAkGgAWpBF2otAAA6AAAgAiACKQKkATcCbCACIAIvALUBOwB9IAIgCDoAfCACIAQ2AmggAS0A4AEhBAwCCyABIAEQmiwQpxcMAgsgAEEEOgA0IAAgBDYCAAwCC0EAIQgCQCAEQf8BcUESRw0AIAIgARC3EyACKAIEIQgCQCACKAIAQQFxRQ0AIABBBDoANCAAIAg2AgAgAkHoAGoQmSoMAwsgARChCwsgACACKQMYNwMIIAAgAikDaDcDICAAIAc2AkQgACAGNgJAIAAgBTYCPCAAIAg2AjggACADNgIAIAAgASgC1AE2AgQgAEEQaiACQRhqQQhqKQMANwMAIABBGGogAkEYakEQaikDADcDACAAQShqIAJB6ABqQQhqKQMANwMAIABBMGogAkHoAGpBEGopAwA3AwAMBAsgAEEEOgA0IAAgBDYCAAsgBRC4KAsgAikDGCACKQMoEKYuDAELIABBBDoANCAAIAQ2AgALIAJBgAJqJAALwgwBDn8jAEEwayIGJAAgAkF8aiEHAkACQAJAA0ACQAJAAkACQCABQSFJDQAgBA0BIAAgASACIANBARDrAgwHCyABQQJJDQYgAyABQRBqSQ0EIAFBAXYhCCABQQ9LDQECQCABQQdNDQAgACACEO8MIAAgCEECdCIJaiACIAlqEO8MQQQhCgwGCyACIAAoAgA2AgAgAiAIQQJ0IglqIAAgCWooAgA2AgBBASEKDAULIAAgAUEDdiIJQRxsaiELIAAgCUEEdGohDAJAAkAgAUHAAEkNACAAIAwgCyAJEJwRIQoMAQsgACALIAwgACgCACIJIAwoAgAiDUkiCiANIAsoAgAiCElzGyAKIAkgCElzGyEKCyAEQX9qIQQgBiAKKAIAIgk2AhQgCiAAa0ECdiEOAkAgBUUNACAFKAIAIAlPDQILIAMgAUkNAyACIAFBAnQiD2ohC0EAIQwgACEJIA4hEANAIABBACAQQX1qIg0gDSAQSxtBAnRqIRECQANAIAkgEU8NASACIAtBfGogCSgCACIIIAooAgAiDUkiEhsgDEECdGogCDYCACACIAtBeGogCUEEaigCACIIIA1JIhMbIAwgEmoiDEECdGogCDYCACACIAtBdGogCUEIaigCACIIIA1JIhIbIAwgE2oiDEECdGogCDYCACACIAtBcGoiCyAJQQxqKAIAIgggDUkiDRsgDCASaiIMQQJ0aiAINgIAIAwgDWohDCAJQRBqIQkMAAsLIAAgEEECdGohEgNAAkAgCSASSQ0AAkAgECABRg0AIAtBfGoiCyAMQQJ0aiAJKAIANgIAIAlBBGohCSABIRAMAwsCQCAMQQJ0Ig1FDQAgACACIA38CgAACyABIAxrIQggByAPaiELIAwhCSAAIA1qIhIhDQJAA0AgASAJRg0BIA0gCygCADYCACAJQQFqIQkgC0F8aiELIA1BBGohDQwACwsgDEUNBAJAIAEgDE8NACAGQQA2AiggBkEBNgIcIAZB0JmcATYCGCAGQgQ3AiAgBkEYakHkm5wBEOkjAAsgEiAIIAIgAyAEIAZBFGoQ+gEgDCEBDAULIAIgC0F8aiILIAkoAgAiDSAKKAIASSIIGyAMQQJ0aiANNgIAIAlBBGohCSAMIAhqIQwMAAsLCyAAIAIgAiABQQJ0aiIJEOYlIAAgCEECdCILaiACIAtqIAlBIGoQ5iVBCCEKDAMLIAMgAUkNASACIAFBAnQiEGohC0EAIQwgACEJA0AgAEEAIA5BfWoiDSANIA5LG0ECdGohEQJAA0AgCSARTw0BIAIgC0F8aiAKKAIAIg0gCSgCACIITyISGyAMQQJ0aiAINgIAIAIgC0F4aiANIAlBBGooAgAiCE8iExsgDCASaiIMQQJ0aiAINgIAIAIgC0F0aiANIAlBCGooAgAiCE8iEhsgDCATaiIMQQJ0aiAINgIAIAIgC0FwaiILIA0gCUEMaigCACIITyINGyAMIBJqIgxBAnRqIAg2AgAgDCANaiEMIAlBEGohCQwACwsgACAOQQJ0aiESA0ACQCAJIBJJDQACQCAOIAFGDQAgAiAMQQJ0aiAJKAIANgIAIAlBBGohCSAMQQFqIQwgC0F8aiELIAEhDgwDCwJAIAxBAnQiDUUNACAAIAIgDfwKAAALIAEgDGshCSAHIBBqIQsgACANaiENAkADQCAJRQ0BIA0gCygCADYCACAJQX9qIQkgC0F8aiELIA1BBGohDQwACwsgBkEIaiAMIAAgARC2IiAGKAIMIQEgBigCCCEAQQAhBQwDCyACIAtBfGoiCyAKKAIAIAkoAgAiDU8iCBsgDEECdGogDTYCACAJQQRqIQkgDCAIaiEMDAALCwsLAAsgBkKAgICAIDcCGCAGQQA2AiBBACAKayESIAAgCkECdCIJaiETIAIgCWohESAGIAg2AiQgASAIayEQAkADQCAGIAZBGGoQgRwgBigCAEEBcUUNASASIBAgCCAGKAIEIgkbIgsgCiALIApLG2ohCyATIAlBAnQiDWohDCARIA1qIQkgAiANaiENA0AgC0UNASAJIAwoAgA2AgAgDSAJEM8aIAtBf2ohCyAMQQRqIQwgCUEEaiEJDAALCwsgAiABIAAQpwkLIAZBMGokAAvsDAIHfwZ+IwBBEGsiAiQAIAC9IglCNIinQf8PcSEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCUL/////////B4MiCkIAUg0AIANFDQELQQAhBAJAIAlCf1UNACABQS06AABBASEECyAKQgBSIANBAklyIQUgCkKAgICAgICACIQgCiADGyIJQgKGIQsgCUIBgyEMIANBy3dqQcx3IAMbIgNBf0oNASAJQZiRmAEgA0GFolNsQRR2IANBf0drIgYgA2oiB0EEdCIDaykDAEGgkZgBIANrKQMAIAYgB0Gx2bV/bEETdmtB/ABqIAIgAkEIaiAFEOgeIQ0gAikDCCEKIAIpAwAhDiAGQQJJDQIgBkE/Tw0GIAtCfyAGrYZCf4WDUEUNBkEAIQgMAwsgAUEwOgAAQQEhAwwKCyAJIANBwegEbEESdiADQQNLayIHQQR0IgZBuOaXAWopAwAgBkHA5pcBaikDACAHIANrIAdBz6bKAGxBE3ZqQf0AaiACIAJBCGogBRDoHiENIAIpAwghCiACKQMAIQ4gB0EWTw0EQQAhCAJAIAtCBYCnQXtsQQAgC6drRg0AIAxQDQMgDiALQgKEIAcQ2yStfSEODAULIAsgBxDbJEUNBAwBCyAOIAx9IQ4gBSAMUHEhCAtBASEGDAELIAWtQn+FIAt8IAcQ2yRFDQFBASEIQQAhBgtBACEFQQAhAwNAIA5CCoAiDiAKQgqAIglYDQIgCCAJp0F2bEEAIAqna0ZxIQggA0EBaiEDIAVB/wFxRSAGcSEGIA1CCoAiC6dBdmwgDadqIQUgCSEKIAshDQwACwtBACEFAkACQCAOQuQAgCILIApC5ACAIgxWDQBBACEDIAohDCAOIQsgDSEJDAELIA1C5ACAIgmnQZx/bCANp2pBMUshBUECIQMLA0AgC0IKgCILIAxCCoAiClgNAiADQQFqIQMgCUIKgCINp0F2bCAJp2pBBEshBSAKIQwgDSEJDAALCyAIQQFxRQ0BA0AgCkIKgCIJp0F2bEEAIAqna0cNAiADQQFqIQMgBUH/AXFFIAZxIQYgDUIKgCILp0F2bCANp2ohBSAJIQogCyENDAALCyAJIAxRIAVyIQUMAQsgDSIJIApRIAxCAFIgCEEBc3JxQQRBBSAJQgGDUBsgBSAGQQFxGyAFIAVB/wFxQQVGG0H/AXFBBEtyIQULIAcgA2ohAwJAAkAgCSAFrUIBg3wiCUL//4P+pt7hEVgNAEERIQgMAQsCQCAJQv//mabqr+MBWA0AQRAhCAwBCwJAIAlC///og7HeFlgNAEEPIQgMAQsCQCAJQv+/yvOEowJYDQBBDiEIDAELAkAgCUL/n5SljR1YDQBBDSEIDAELAkAgCUL/z9vD9AJYDQBBDCEIDAELAkAgCUL/x6+gJVgNAEELIQgMAQsCQCAJQv+T69wDWA0AQQohCAwBCwJAIAlC/8HXL1gNAEEJIQgMAQsCQCAJQv+s4gRYDQBBCCEIDAELAkAgCUK/hD1YDQBBByEIDAELAkAgCUKfjQZYDQBBBiEIDAELAkAgCUKPzgBYDQBBBSEIDAELAkAgCULnB1gNAEEEIQgMAQsCQCAJQuMAWA0AQQMhCAwBC0ECQQEgCUIJVhshCAsgCCADaiEGAkACQCADQQBIDQAgBkEWSA0BCwJAAkACQCAGQX9qIgNBFUkNACAGQQVqQQZJDQIgCEEBRw0BIAEgBGoiBUHlADoAASAFIAmnQTBqOgAAIAMgASAEQQJyIgVqEPURIAVqIQMMBAsgCSABIAQgCGpBAWoiA2oQnwcgASAEaiEFAkAgBkUNACAFIAVBAWogBvwKAAALIAUgBmpBLjoAAAwDCyAJIAEgCCAEaiIGaiIIQQFqEJ8HIAEgBGoiBSAFLQABOgAAIAVBLjoAASAIQeUAOgABIAMgASAGQQJqIgVqEPURIAVqIQMMAgsgASAEaiIDQbDcADsAAEECIAZrIQUgA0ECaiEDAkADQCAGRQ0BIANBMDoAACAGQQFqIQYgA0EBaiEDDAALCyAJIAEgCCAEaiAFaiIDahCfBwwBCyAJIAEgBGogCGoQnwcgASAIIARqaiEFIAggBiAIIAZKGyAIayEDAkADQCADRQ0BIAVBMDoAACADQX9qIQMgBUEBaiEFDAALCyAGIARqIQMLIAJBEGokACADC4YOAQZ/IwBB8ABrIgIkAAJAAkACQAJAAkACQAJAAkACQANAAkAgASgCACIDQQVGDQACQAJAAkACQAJAIAMOCAABAgMECgcIAAsgABC5GjYCGCAAQQA2AgAMDgsgASgCBCEEIAJB1ABqIAFBCGooAgAiAUEAQQFBARCoDCACKAJYIQUgAigCVEEBRg0HIAIoAlwhAwJAIAFFDQAgAyAEIAH8CgAACyACIAE2AlwgAiADNgJYIAIgBTYCVCACIAJB1ABqQbS8gwEQohQCQAJAIAIoAgQiAUUNACACKAIAIgUgARCAEiEDIAAgATYCCCAAIAU2AgRBASEBDAELQQAhARC5GiEDCyAAIAM2AhggACABNgIADA0LQQEhBSABQRBqKAIAIQQgAUEMaigCACEGIAJBGGohAwJAAkAgASgCBEEBRw0AIAJBKGogBiAEEJgXIAMgAikCKDcCACACIAEtABQ6ADQgA0EIaiACQShqQQhqKQIANwIADAELIAJB1ABqIAYgBBCZFyADIAIpAlQ3AgAgAiABLQAUOgBgIANBCGogAkHUAGpBCGopAgA3AgBBACEFCyACIAU2AhQCQAJAIAIoAiBFDQAgAkHUAGogAkEUahDqCQJAIAIoAlRBgICAgHhGDQAgAkEoakEIaiACQdQAakEIaigCADYCACACIAIpAlQ3AyggAkEIaiACQShqQZTwhAEQohQCQAJAIAIoAgwiAUUNACACKAIIIgUgARCAEiEDIAAgATYCCCAAIAU2AgRBASEBDAELQQAhARC5GiEDCyAAIAM2AhggACABNgIADAILIAAgAkEUahCgCTYCGCAAQQI2AgAgAEEUaiACQSRqKAIANgIAIABBDGogAkEcaikCADcCACAAIAIpAhQ3AgQMDgsgAkHYAGoQySMgAkEBNgJUIAAgAkHUAGoQoAk2AhggAEECNgIAIABBFGogAkHkAGooAgA2AgAgAEEMaiACQdwAaikCADcCACAAIAIpAlQ3AgQLIAJBFGoQ0CQMDAsgACABKAIEIgEQuho2AhggACABNgIEIABBAzYCAAwLCyACQdQAaiABKAIMEPwBQQAtAKDxngEaIAEtABQhBiABKAIIIQUgASgCBCEEIAEoAhAhA0EcEH0iAUUNBSABIAIpAlQ3AgAgAUEYaiIHIAJB1ABqQRhqKAIANgIAIAFBEGogAkHUAGpBEGopAgA3AgAgAUEIaiACQdQAakEIaikCADcCACACIAM2AiAgAiAGOgAkIAIgBTYCGCACIAQ2AhQgAiABNgIcIAcoAgAiBigCCEEBRw0IIAYoAgwNCEEBIQYgAkEBNgIUIAIgA0EARyIDNgIgIAIgBEEBcyAFQQBHciIFNgIYDAkLIAEoAgQhAQwACwsgASgCCCEDIAJB1ABqIAEoAgwiBUEAQQRBHBCoDCACKAJYIQEgAigCVEEBRg0DIAJBADYCRCACIAIoAlw2AkAgAiABNgI8IAJBPGogBRCOJSACKAJEIQECQCAFRQ0AIAUgAWohBCACKAJAIAFBHGxqIQEDQCACQdQAaiADEPwBIAFBGGogAkHUAGpBGGooAgA2AgAgAUEQaiACQdQAakEQaikCADcCACABQQhqIAJB1ABqQQhqKQIANwIAIAEgAikCVDcCACABQRxqIQEgA0EcaiEDIAVBf2oiBQ0ACyAEIQELIAIgATYCRCAAIAJBPGoQ0wEMBwsgASgCCCEDIAJB1ABqIAEoAgwiBUEAQQRBHBCoDCACKAJYIQEgAigCVEEBRg0DIAJBADYCUCACIAIoAlw2AkwgAiABNgJIIAJByABqIAUQjiUgAigCUCEBAkAgBUUNACAFIAFqIQQgAigCTCABQRxsaiEBA0AgAkHUAGogAxD8ASABQRhqIAJB1ABqQRhqKAIANgIAIAFBEGogAkHUAGpBEGopAgA3AgAgAUEIaiACQdQAakEIaikCADcCACABIAIpAlQ3AgAgAUEcaiEBIANBHGohAyAFQX9qIgUNAAsgBCEBCyACIAE2AlAgACACQcgAahB0DAYLIAUgAigCXEHAvJwBEI4pCwALIAEgAigCXEHg6ZsBEI4pAAsgASACKAJcQeDpmwEQjikACyAEIQYLAkACQAJAAkAgAw4CAAECCyAGRQ0BIAUNASAAELkaNgIYIABBADYCACABEOQoDAILIAZFDQAgBUEBRw0AIAAgASkCADcCACAAQRhqIAFBGGooAgA2AgAgAEEQaiABQRBqKQIANwIAIABBCGogAUEIaikCADcCAAwBCyAAIAJBFGoQrgg2AhggAEEENgIAIAAgAikCFDcCBCAAQRRqIAJBJGooAgA2AgAgAEEMaiACQRxqKQIANwIADAELIAFBHEEEELMWCyACQfAAaiQAC6sOAgV/An4jAEHgAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQXxqIgNBBCADQQdJGw4HAAECAwQFBgALIAEtADRBAUcNDCABKAIwEPwVIQMgAkHAAGpBGGpBACkDgIWeASIHNwMAIAJBwABqQRBqQQApA/iEngEiCDcDACACQcAAakEIaiAHNwMAIAJBNGogAUE0aigCADYCACACQQhqIAc3AwAgAkEQaiAINwMAIAJBGGogBzcDACACIAg3A0AgAiABKQIsNwIsIAIgCDcDACABLQA4IQQgAS0APSEFIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAM2AiQgAiABNgIgIAIgBToAPSACIAQ6ADgCQCAAKAIcIgFFDQAgAi0ANEEBRw0AIAJBADoAOSACIAEQrQsgAkEBOgA6CwJAIAAoAgwiA0UNACACLQA0QQFHDQAgACgCCCEBIANBKGwhAwNAAkAgAi0ANEEBRw0AIAEgAhC8HgsgAUEoaiEBIANBWGoiAw0ACwsCQCAAKAIYIgFFDQAgAi0ANEEBRw0AIAIvADkhACACQYECOwA5IAEoAgAgAhDBASACIAA7ADkLIAIQsAogAkEQahDMCgwMCyABLQA0QQFHDQsgASgCMBD8FSEDIAJBwABqQRhqQQApA4CFngEiBzcDACACQcAAakEQakEAKQP4hJ4BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIAFBNGooAgA2AgAgAkEIaiAHNwMAIAJBEGogCDcDACACQRhqIAc3AwAgAiAINwNAIAIgASkCLDcCLCACIAg3AwAgAS0AOCEEIAEtAD0hBSACIAEvADs7ADsgAkGBAjsAOSACQQE6ACggAiADNgIkIAIgATYCICACIAU6AD0gAiAEOgA4AkAgACgCHCIBRQ0AIAItADRBAUcNACACQQA6ADkgAiABEK0LIAJBAToAOgsCQCAAKAIMIgNFDQAgAi0ANEEBRw0AIAAoAgghASADQShsIQMDQAJAIAItADRBAUcNACABIAIQvB4LIAFBKGohASADQVhqIgMNAAsLAkAgACgCGCIBRQ0AIAItADRBAUcNACACLwA5IQAgAkGBAjsAOSABKAIAIAIQwQEgAiAAOwA5CyACELAKIAJBEGoQzAoMCwsgAS0ANEEBRw0KIAAtABVFDQkgAS0AOSEDIAFBAToAOSAAKAIQIAEQ2gEgASADOgA5DAkLIAAtABQNAwwHCyAALQA0RQ0FIAEtADkhAyABQQE6ADkgACgCMCABENoBIAEgAzoAOQwFCyABLQA0QQFHDQcgASgCMBD8FSEDIAJBwABqQRhqQQApA4CFngEiBzcDACACQcAAakEQakEAKQP4hJ4BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIAFBNGooAgA2AgAgAkEIaiAHNwMAIAJBEGogCDcDACACQRhqIAc3AwAgAiAINwNAIAIgASkCLDcCLCACIAg3AwAgAS0AOCEEIAEtAD0hBSACIAEvADs7ADsgAkGBAjsAOSACQQE6ACggAiADNgIkIAIgATYCICACIAU6AD0gAiAEOgA4AkAgACgCICIBRQ0AIAItADRBAUcNACACQQA6ADkgAiABEK0LIAJBAToAOgsgAC0AJA0CDAMLIAEgAEEEahCpFgwGCyABLQA5IQMgAUEBOgA5IAAoAgQgARDaASABIAM6ADkMAwsgAi0AOSEBIAJBAToAOSAAKAIQIAIQ2gEgAiABOgA5CwJAIAAoAgwiA0UNACACLQA0QQFHDQAgACgCCCEBIANBKGwhAwNAAkAgAi0ANEEBRw0AIAEgAhC8HgsgAUEoaiEBIANBWGoiAw0ACwsCQCAAKAIcIgFFDQAgAi0ANEEBRw0AIAIvADkhACACQYECOwA5IAEoAgAgAhDBASACIAA7ADkLIAIQsAogAkEQahDMCgwDCyABLQA0QQFHDQIgACABELweDAILIAAoAhAiAEUNASABLQA0QQFHDQEgAS8AOSEDIAFBgQI7ADkgACgCACABEMEBIAEgAzsAOQwBCyAAKAIMIQAgASgCMBD8FSEDIAJBwABqQRhqQQApA4CFngEiBzcDACACQcAAakEQakEAKQP4hJ4BIgg3AwAgAkHAAGpBCGogBzcDACACQTRqIAFBNGooAgA2AgAgAkEIaiAHNwMAIAJBEGoiBCAINwMAIAJBGGogBzcDACACIAg3A0AgAiABKQIsNwIsIAIgCDcDACABLQA4IQUgAS0APSEGIAIgAS8AOzsAOyACQYECOwA5IAJBAToAKCACIAM2AiQgAiABNgIgIAIgBjoAPSACIAU6ADgCQCAARQ0AIAItADRBAUcNACACQQE6ADkgACgCACACEMEBIAJBgQI7ADkLIAIQsAogBBDMCgsgAkHgAGokAAveDAIIfxJ+IwBB4ABrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkAgASkDACILQgBRDQAgASkDCCIMQgBRDQEgASkDECINQgBRDQIgCyANfCINIAtUDQMgCyAMVA0EIA1CgICAgICAgIAgWg0FIAMgAS8BGCIBOwE4IAMgCyAMfSIONwMwIAMgDiANeSIMhiIPIAyIIhA3A0AgECAOUg0GIAMgATsBOCADIAs3AzAgAyALIAxCP4MiDoYiECAOiCIONwNAIA4gC1INB0GgfyABIAynayIEa8FB0ABsQbCnBWpBzhBtIgFB0QBPDQggA0EgaiABQQR0IgFBqIeBAWopAwAiC0IAIA0gDIZCABDpEiADQRBqIAtCACAPQgAQ6RIgAyALQgAgEEIAEOkSQgFBACAEIAFBsIeBAWovAQBqa0E/ca0iDIYiD0J/fCERIAMpAxBCP4chEiADKQMAQj+IIRMgAykDCCEUIAFBsoeBAWovAQAhBCADKQMYIRUCQCADKQMoIhYgAykDIEI/iCIXfCIYQgF8IhkgDIinIgVBkM4ASQ0AIAVBwIQ9SQ0KAkAgBUGAwtcvSQ0AQQhBCSAFQYCU69wDSSIBGyEGQYDC1y9BgJTr3AMgARshAQwMC0EGQQcgBUGAreIESSIBGyEGQcCEPUGAreIEIAEbIQEMCwsCQCAFQeQASQ0AQQJBAyAFQegHSSIBGyEGQeQAQegHIAEbIQEMCwtBCkEBIAVBCUsiBhshAQwKC0H/g4EBQRxB+JGBARDSHgALQayEgQFBHUGIkoEBENIeAAtB3ISBAUEcQZiSgQEQ0h4AC0GAhoEBQTZBmJOBARDSHgALQbiFgQFBN0GIk4EBENIeAAtBqJKBAUEtQdiSgQEQ0h4ACyADQQA2AkggA0HAAGogA0EwaiADQcgAahCgIQALIANBADYCSCADQcAAaiADQTBqIANByABqEKAhAAsgAUHRAEHokYEBEJEVAAtBBEEFIAVBoI0GSSIBGyEGQZDOAEGgjQYgARshAQsgGSARgyELIBMgFHwhGiAGIARrQQFqIQcgEiAVfSAZfEIBfCIQIBGDIQ1BACEEAkACQAJAAkACQAJAAkACQANAIAIgBGogBSABbiIIQTBqIgk6AAAgBEEBaiEKAkACQCAQIAUgCCABbGsiBa0gDIYiGyALfCIOVg0AIAYgBEcNASAEQQFqIQFCASEOA0AgDiEQIAFBEUYNBSACIAFqIAtCCn4iCyAMiKdBMGoiBDoAACABQQFqIQEgEEIKfiEOIA1CCn4iDSALIBGDIgtYDQALIA4gGSAafX4iDCAOfCETIA0gC30gD1QiBQ0HIAsgDCAOfSIRVA0DDAcLIBAgDn0iDyABrSAMhiIMVCEBIBkgGn0iDUIBfCEcIA4gDUJ/fCIRWg0EIA8gDFQNBCACIApqQX9qIQQgGCASfCAVfSALIAx8IgsgG3x9QgJ8IRkgGCAafSAOfSESIAsgE3wgFHwgF30gFn0gG3whD0IAIQsDQAJAIA4gDHwiDSARVA0AIBIgC3wgD1oNAEEAIQEMBgsgBCAJQX9qIgk6AAAgGSALfCIbIAxUIQEgDSARWg0GIA8gDHwhDyALIAx9IQsgDSEOIBsgDFQNBgwACwsgAUEKSSEIIAohBCABQQpuIQEgCEUNAAtB6JKBARDlIQALIAIgAWpBf2ohCCANIA99IRkgDyARfSESQgAgC30hDANAAkAgCyAPfCIOIBFUDQAgESAMfCASIAt8Wg0AQQAhBQwFCyAIIARBf2oiBDoAACAZIAx8IhsgD1QhBSAOIBFaDQUgDCAPfSEMIA4hCyAbIA9UDQUMAAsLQRFBEUH4koEBEJEVAAsgDiENCwJAIBwgDVgNACABDQACQCANIAx8IgsgHFQNACAcIA19IAsgHH1UDQELIABBADYCAAwECwJAAkAgDUICVA0AIA0gEEJ8fFgNAQsgAEEANgIADAQLIAAgBzsBCCAAIAo2AgQMAgsgCyEOCwJAIBMgDlgNACAFDQACQCAOIA98IgsgE1QNACATIA59IAsgE31UDQELIABBADYCAAwCCwJAAkAgEEIUfiAOVg0AIA4gEEJYfiANfFgNAQsgAEEANgIADAILIAAgBzsBCCAAIAE2AgQLIAAgAjYCAAsgA0HgAGokAAugDgIEfwN+IwBBgARrIgUkAEEAIQYgBUHwAGogBCABKAJAIgdBABCbDAJAIARFDQBBASEGQQAgBxD1BSEICyAFQfABaiEHAkBB1ABFDQAgByAFQfAAakHUAPwKAAALIAVBzAJqQQApA4CFngEiCTcCACAFQdQBaiAJNwIAIAVB5AFqIAk3AgAgBUEAOgDUAiAFIAg2AsgBIAUgBjYCxAEgBUEAOgDsASAFQQApA/iEngEiCTcCxAIgBSAJNwLMASAFIAk3AtwBIANBMGwhBCAFQdwBaiEIIAVBzAFqIQYgBUHEAmohAwJAA0AgBEUNASAFQQA6AMECIARBUGohBCACIAVBxAFqEOQCIAJBMGohAgwACwsgBUHYAmpBCGogBkEIaikCADcDACAFIAYpAgA3A9gCIAVB6AJqIAMQ1RAgBUGgA2oiBCAIENUQIAUgBUHYAmo2ApgDIAVB0ANqQQhqQQApA4CFngE3AwAgBUEAKQP4hJ4BNwPQAyAFQSBqIAVB6AJqEOUSIAVB0ANqIAUoAiAQiigCQCAFKAKIA0GBgICAeEYNAAJAQTBFDQAgBUEgaiAFQegCakEw/AoAAAsCQANAIAVB4ANqIAVBIGoQ0Q0gBSkD4AMiCVANASAFIAUoAugDNgL4AyAFIAk3A/ADAkAgBUHYAmogBUHwA2oQwQtFDQAgBSkD8AMQyCEMAQsgBUHQA2ogCRDCBgwACwtCABCDKyAFQSBqENsKCwJAIAUoAsADQYGAgIB4Rg0AAkBBMEUNACAFQSBqIARBMPwKAAALAkADQCAFQfADaiAFQSBqENENIAUpA/ADIglQDQEgBUHQA2ogCRDCBgwACwtCABCDKyAFQSBqENsKCyAFQeQAaiIEIAVB0ANqQQhqKQMANwIAIAUgBSkD0AM3AlwCQEE8RSICDQAgBUEgaiAHQTz8CgAACyAFQdgCahC0CiAFQawCahDAKAJAIAINACAFQcQBaiAFQSBqQTz8CgAACyAFQRBqQQhqIgIgBCkCADcDACAFIAUpAlw3AxAgBUHEAWoQhAkgAUEgaiIEEMwKIAFBKGogAikDADcCACABIAUpAxA3AiAgBSAENgLcAiAFQQA2AtgCAkACQAJAAkAgASgCHEUNACAFQdgCahCtGiEIIAEoAhAiAikDACEJIAggASgCHCIGQQFqQQF2IAYgCCgCDBsQiiggAkEIaiEEIAlCf4VCgIGChIiQoMCAf4MhCQNAAkAgCVANAAJAIAIgCXqnQQF0QfABcWtBcGopAwAiCkIDg0IAUg0AIAqnIgMgAygCACIDQQFqNgIAIANBf0wNBAsgCUJ/fCAJgyEJIAggChDCBiAGQX9qIQYMAQsgBkUNASACQYB/aiECIAQpAwBCf4VCgIGChIiQoMCAf4MhCSAEQQhqIQQMAAsLIAVBADYC8AIgBUKAgICAgAE3AugCIAVB6AJqEMEoIAVB0ANqQQhqIghBACkDgIWeASIJNwMAIAVBACkD+ISeASIKNwPQAyAFQegCakEIaiAJNwMAIAVBADYC+AIgBSAKNwPoAiAFQcQBaiAFQdADaiABQTBqIAVB6AJqIAFBEGoiBCAFQdgCaiAFKALcAiAFKALYAhsQlAEgBUHoAmoQtwogASgCAEUNASABIAUoAtwDIAQQ0ScgBSgC0AMiBCkDACEJIAUoAtQDIQIgBSAFKALcAzYCiAEgBSAENgKAASAFIAQgAmpBAWo2AnwgBSAEQQhqNgJ4IAUgCUJ/hUKAgYKEiJCgwIB/gzcDcANAIAVBCGogBUHwAGoQ/x0gBSgCCCIERQ0CIAUoAgwhAgJAIAQpAwAiCUIDg0IAUg0AIAmnIgYgBigCACIGQQFqNgIAIAZBf0wNAgsgBUHoAmogASAJIAQoAggQ2gggBSgC8AIhBgJAIAUpA+gCIgpQDQAgBSgCgAMhBCAFKQP4AiELAkAgAikDACIJQgODQgBSDQAgCaciAiACKAIAIgJBAWo2AgAgAkF/TA0DCyAFIAk3A/gCIAUgBjYC8AIgBSAKNwPoAiAEIAsgBUHoAmoQqhEMAQsLAkAgBkF4aikDACIJQgODQgBSDQAgCaciBiAGKAIAIgZBAWo2AgAgBkF/TA0BCyAFQQA2AugDIAUgCTcD4AMgAikDACIJQgODQgBSDQIgCaciAiACKAIAIgJBAWo2AgAgAkF/Sg0CCwALIAAgBSkD0AM3AgAgAEEIaiAIKQMANwIAIAVB2AJqELErIAVBxAFqEKEfIAVBgARqJAAPCyAFQQA2AvgDIAUgCTcD8AMgBUEDNgIkIAVBpOybATYCICAFQgM3AiwgBUHMBK1CIIYiCSAFQfADaq2ENwP4AiAFIAkgBUHgA2qthDcD8AIgBSAJIASthDcD6AIgBSAFQegCajYCKCAFQSBqQbTtmwEQ6SMAC/QMAg9/BH4jAEEwayICJAACQAJAAkACQAJAIAAoAgwiA0F/Rg0AAkAgAyAAKAIEIgQgBEEBaiIFQQN2IgZBB2wgBEEISRsiBEEBdkkNAAJAAkAgBCADIAQgA0sbIgRBDkkNACAEQf7///8BSw0DQX8gBEEDdEEIakEHbkF/amd2QQFqIQQMAQtBBEEIQRAgBEEHSRsgBEEDSRshBAsgAkEgakEoQQggBBCjEiACKAIkIQUgAigCICIHRQ0FIAIpAighEQJAIAVBCWoiBEUNACAHQf8BIAT8CwALIAIgEUIgiD4CHCACIBGnIgg2AhggAiAFNgIUIAIgBzYCECACQQg2AgxBACEJQQAhBAJAIANFDQAgB0EIaiEKIAAoAgAiC0FYaiEMIAspAwBCf4VCgIGChIiQoMCAf4MhEUEAIQQgAyENIAshBgNAAkAgEUIAUg0AA0AgBEEIaiEEIAZBCGoiBikDAEKAgYKEiJCgwIB/gyIRQoCBgoSIkKDAgH9RDQALIBFCgIGChIiQoMCAf4UhEQsCQCAHIAUgDEEAIBF6p0EDdiAEaiIOa0EobGoQ+hIiEqdxIg9qKQAAQoCBgoSIkKDAgH+DIhNCAFINAEEIIRADQCAPIBBqIQ8gEEEIaiEQIAcgDyAFcSIPaikAAEKAgYKEiJCgwIB/gyITUA0ACwsgEUJ/fCEUAkAgByATeqdBA3YgD2ogBXEiD2osAABBAEgNACAHKQMAQoCBgoSIkKDAgH+DeqdBA3YhDwsgFCARgyERIAcgD2ogEkIZiKciEDoAACAKIA9BeGogBXFqIBA6AAAgByAPQX9zQShsaiIPQSBqIAsgDkF/c0EobGoiDkEgaikAADcAACAPQRhqIA5BGGopAAA3AAAgD0EQaiAOQRBqKQAANwAAIA9BCGogDkEIaikAADcAACAPIA4pAAA3AAAgDUF/aiINDQALIAMhBAsgAiAENgIcIAIgCCAEazYCGAJAA0AgCUEQRg0BIAAgCWoiBCgCACEGIAQgAkEEaiAJakEMaiIPKAIANgIAIA8gBjYCACAJQQRqIQkMAAsLIAIoAhQiBEUNBCAEIARBKGxBL2pBeHEiBmpBCWoiBEUNBCACKAIQIAZrIARBCBCzFgwECyAAKAIAIQQCQCAGIAVBB3FBAEdqIglFDQAgBCEGA0AgBiAGKQMAIhFCf4VCB4hCgYKEiJCgwIABgyARQv/+/fv379+//wCEfDcDACAGQQhqIQYgCUF/aiIJDQALCwJAIAVBCEkNACAEIAVqIAQpAAA3AAAMAgsCQCAFRQ0AIARBCGogBCAF/AoAAAsgBQ0BQQAhBAwCCxDnIQALQQEhDkEAIQ9BACEJA0AgCSEGIA4hCQJAIAQgBmotAABBgAFHDQAgBCAPaiELIAQgBkF/c0EobGohCkEAIAZrQShsIRACQANAIAAoAgQiDiAEIBBqQVhqEPoSIhOncSIHIQ0CQCAEIAdqKQAAQoCBgoSIkKDAgH+DIhFCAFINAEEIIQwgByENA0AgDSAMaiENIAxBCGohDCAEIA0gDnEiDWopAABCgIGChIiQoMCAf4MiEVANAAsLAkAgBCAReqdBA3YgDWogDnEiDWosAABBAEgNACAEKQMAQoCBgoSIkKDAgH+DeqdBA3YhDQsCQCANIAdrIAYgB2tzIA5xQQhJDQAgBCANaiIHLQAAIQwgByATQhmIpyIDOgAAIAAoAgAiByANQXhqIA5xakEIaiADOgAAIAxB/wFGDQJBWCEOIAQgDUFYbGohDAJAA0AgDkUNASALIA5qIgQoAAAhByAEIAwgDmoiDSgAADYAACANIAc2AAAgDkEEaiEODAALCyAAKAIAIQQMAQsLIAQgBmogE0IZiKciBzoAACAAKAIAIgQgDiAGQXhqcWpBCGogBzoAAAwBCyAHIAZqQf8BOgAAIAcgACgCBCAGQXhqcWpBCGpB/wE6AAAgBCANQX9zQShsaiIEQSBqIApBIGopAAA3AAAgBEEYaiAKQRhqKQAANwAAIARBEGogCkEQaikAADcAACAEQQhqIApBCGopAAA3AAAgBCAKKQAANwAAIAchBAsgD0FYaiEPIAkgCSAFSSIGaiEOIAYNAAsgACgCBCIEIARBAWpBA3ZBB2wgBEEISRshBAsgACAEIAAoAgxrNgIIC0GBgICAeCEFCyACQTBqJAAgBQuYDgIEfwN+IwBBgARrIgUkAEEAIQYgBUHwAGogBCABKAJAIgdBABCbDAJAIARFDQBBASEGQQAgBxD1BSEICyAFQfABaiEHAkBB1ABFDQAgByAFQfAAakHUAPwKAAALIAVBzAJqQQApA4CFngEiCTcCACAFQdQBaiAJNwIAIAVB5AFqIAk3AgAgBUEAOgDUAiAFIAg2AsgBIAUgBjYCxAEgBUEAOgDsASAFQQApA/iEngEiCTcCxAIgBSAJNwLMASAFIAk3AtwBIANBOGwhBCAFQdwBaiEIIAVBzAFqIQYgBUHEAmohAwJAA0AgBEUNASAEQUhqIQQgAiAFQcQBahCDBCACQThqIQIMAAsLIAVB2AJqQQhqIAZBCGopAgA3AwAgBSAGKQIANwPYAiAFQegCaiADENUQIAVBoANqIgQgCBDVECAFIAVB2AJqNgKYAyAFQdADakEIakEAKQOAhZ4BNwMAIAVBACkD+ISeATcD0AMgBUEgaiAFQegCahDlEiAFQdADaiAFKAIgEIooAkAgBSgCiANBgYCAgHhGDQACQEEwRQ0AIAVBIGogBUHoAmpBMPwKAAALAkADQCAFQeADaiAFQSBqENENIAUpA+ADIglQDQEgBSAFKALoAzYC+AMgBSAJNwPwAwJAIAVB2AJqIAVB8ANqEMELRQ0AIAUpA/ADEMghDAELIAVB0ANqIAkQwgYMAAsLQgAQgysgBUEgahDbCgsCQCAFKALAA0GBgICAeEYNAAJAQTBFDQAgBUEgaiAEQTD8CgAACwJAA0AgBUHwA2ogBUEgahDRDSAFKQPwAyIJUA0BIAVB0ANqIAkQwgYMAAsLQgAQgysgBUEgahDbCgsgBUHkAGoiBCAFQdADakEIaikDADcCACAFIAUpA9ADNwJcAkBBPEUiAg0AIAVBIGogB0E8/AoAAAsgBUHYAmoQtAogBUGsAmoQwCgCQCACDQAgBUHEAWogBUEgakE8/AoAAAsgBUEQakEIaiICIAQpAgA3AwAgBSAFKQJcNwMQIAVBxAFqEIQJIAFBIGoiBBDMCiABQShqIAIpAwA3AgAgASAFKQMQNwIgIAUgBDYC3AIgBUEANgLYAgJAAkACQAJAIAEoAhxFDQAgBUHYAmoQrRohCCABKAIQIgIpAwAhCSAIIAEoAhwiBkEBakEBdiAGIAgoAgwbEIooIAJBCGohBCAJQn+FQoCBgoSIkKDAgH+DIQkDQAJAIAlQDQACQCACIAl6p0EBdEHwAXFrQXBqKQMAIgpCA4NCAFINACAKpyIDIAMoAgAiA0EBajYCACADQX9MDQQLIAlCf3wgCYMhCSAIIAoQwgYgBkF/aiEGDAELIAZFDQEgAkGAf2ohAiAEKQMAQn+FQoCBgoSIkKDAgH+DIQkgBEEIaiEEDAALCyAFQQA2AvACIAVCgICAgIABNwLoAiAFQegCahDBKCAFQdADakEIaiIIQQApA4CFngEiCTcDACAFQQApA/iEngEiCjcD0AMgBUHoAmpBCGogCTcDACAFQQA2AvgCIAUgCjcD6AIgBUHEAWogBUHQA2ogAUEwaiAFQegCaiABQRBqIgQgBUHYAmogBSgC3AIgBSgC2AIbEJQBIAVB6AJqELcKIAEoAgBFDQEgASAFKALcAyAEENEnIAUoAtADIgQpAwAhCSAFKALUAyECIAUgBSgC3AM2AogBIAUgBDYCgAEgBSAEIAJqQQFqNgJ8IAUgBEEIajYCeCAFIAlCf4VCgIGChIiQoMCAf4M3A3ADQCAFQQhqIAVB8ABqEP8dIAUoAggiBEUNAiAFKAIMIQICQCAEKQMAIglCA4NCAFINACAJpyIGIAYoAgAiBkEBajYCACAGQX9MDQILIAVB6AJqIAEgCSAEKAIIENoIIAUoAvACIQYCQCAFKQPoAiIKUA0AIAUoAoADIQQgBSkD+AIhCwJAIAIpAwAiCUIDg0IAUg0AIAmnIgIgAigCACICQQFqNgIAIAJBf0wNAwsgBSAJNwP4AiAFIAY2AvACIAUgCjcD6AIgBCALIAVB6AJqEKoRDAELCwJAIAZBeGopAwAiCUIDg0IAUg0AIAmnIgYgBigCACIGQQFqNgIAIAZBf0wNAQsgBUEANgLoAyAFIAk3A+ADIAIpAwAiCUIDg0IAUg0CIAmnIgIgAigCACICQQFqNgIAIAJBf0oNAgsACyAAIAUpA9ADNwIAIABBCGogCCkDADcCACAFQdgCahCxKyAFQcQBahChHyAFQYAEaiQADwsgBUEANgL4AyAFIAk3A/ADIAVBAzYCJCAFQaTsmwE2AiAgBUIDNwIsIAVBzAStQiCGIgkgBUHwA2qthDcD+AIgBSAJIAVB4ANqrYQ3A/ACIAUgCSAErYQ3A+gCIAUgBUHoAmo2AiggBUEgakG07ZsBEOkjAAuCDAIRfwJ+IwBB0AJrIgUkACABrSIWQv//////////P3wgFoAhFgJAAkAgAUGBIEkNAEEBQSAgAUEBcmdrQQF2IgZ0IAEgBnZqQQF2IQcMAQsgASABQQF2ayIGQcAAIAZBwABJGyEHCyAAQXBqIQhBASEJQQAhCkEAIQsDQEEBIQxBACENAkAgASAKTQ0AIAAgCkEEdCIMaiEOAkACQCABIAprIg8gB0kNAAJAAkAgD0ECTw0AIA8hEAwBCwJAIA4oAhQiESAOKAIYIhIgDigCBCAOKAIIENsiIgZB/wFxDQAgDi0AHCAOLQAMayEGCwJAAkACQAJAIAbAQQBIIhMNAEECIRAgD0ECRg0EQQIhECAOIQYDQAJAIAZBJGooAgAiFCAGQShqKAIAIg0gESASENsiIhFB/wFxDQAgBkEsai0AACAGQRxqLQAAayERCyARwEEASA0DIAZBEGohBiANIRIgFCERIA8gEEEBaiIQRw0ADAILC0ECIRBBASEVIA9BAkYNAkECIRAgDiEGA0ACQCAGQSRqKAIAIhQgBkEoaigCACINIBEgEhDbIiIRQf8BcQ0AIAZBLGotAAAgBkEcai0AAGshEQsgEcBBf0oNAiAGQRBqIQYgDSESIBQhESAPIBBBAWoiEEcNAAsLIA8hEAsgECAHSQ0CIBNFDQECQCAQQQJPDQBBASEQDAILIBBBAXYhFQsgCCAMIBBBBHRqaiEUQQAhDQNAQQAhBgJAA0AgBkEQRg0BIA4gBmoiDygCACERIA8gFCAGaiISKAIANgIAIBIgETYCACAGQQRqIQYMAAsLIA5BEGohDiAUQXBqIRQgDUEBaiINIBVHDQALCyAQQQF0QQFyIQwMAQsCQCAEDQAgDyAHIA8gB0kbQQF0IQwMAQsgDiAPQSAgD0EgSRsiBiACIANBAEEAEJgBIAZBAXRBAXIhDAsgDEEBdiAKaq0gCq0iF3wgFn4gCiAJQQF2a60gF3wgFn6FeachDQsCQAJAIAtBAkkNACAIIApBBHQiBmohEyAAIAZqIRUDQCAFQY4CaiALQX9qIg5qLQAAIA1JDQECQAJAAkACQAJAAkAgBUEEaiAOQQJ0aigCACIGQQF2IhEgCUEBdiIUaiIQIANLDQAgBiAJckEBcUUNAQsgACAKIBBrQQR0aiELAkAgBkEBcQ0AIAsgESACIAMgEUEBcmdBAXRBPnNBABCYAQsCQCAJQQFxDQAgCyARQQR0aiAUIAIgAyAUQQFyZ0EBdEE+c0EAEJgBCyAGQQJJDQMgCUECSQ0DIAMgFCARIBQgEUkiBhsiCUkNAyALIBFBBHRqIhIgCyAGGyEGAkAgCUEEdCIPRQ0AIAIgBiAP/AoAAAsgAiAPaiEPAkAgFCARTw0AIBMhEQNAAkAgD0F0aigCACAPQXhqKAIAIAZBdGooAgAgBkF4aigCABDbIiISQf8BcQ0AIA9BfGotAAAgBkF8ai0AAGshEgsgESAPQXBqIg8gBkFwaiIGIBLAQX9KIgkbIhQpAgA3AgAgEUEIaiAUQQhqKQIANwIAIA8gEkGAAXFBA3ZqIQ8gBiAJQQR0aiIGIAtGDQMgEUFwaiERIA8gAkcNAAwDCwsgCUUNASASIBVGDQEgAiERA0ACQCASKAIEIBIoAgggESgCBCARKAIIENsiIglB/wFxDQAgEi0ADCARLQAMayEJCyAGIBEgEiAJwEF/SiIUGyILKQIANwIAIAZBCGogC0EIaikCADcCACAGQRBqIQYgESAUQQR0aiIRIA9GDQMgEiAJQYABcUEDdmoiEiAVRw0ADAMLCyAQQQF0IQkMAwsgAiERCyAPIBFrIg9FDQAgBiARIA/8CgAACyAQQQF0QQFyIQkLQQEhBiAOIQsgDkEBSw0ADAILCyALIQYLIAVBjgJqIAZqIA06AAAgBUEEaiAGQQJ0aiAJNgIAAkAgASAKTQ0AIAZBAWohCyAMQQF2IApqIQogDCEJDAELCwJAIAlBAXENACAAIAEgAiADIAFBAXJnQQF0QT5zQQAQmAELIAVB0AJqJAAL7gwCDX8EfiMAQTBrIgMkAAJAAkACQAJAAkAgACgCDCIEIAFqIgEgBEkNAAJAIAEgACgCBCIFIAVBAWoiBkEDdiIHQQdsIAVBCEkbIgVBAXZNDQACQAJAIAVBAWoiBSABIAUgAUsbIgFBD0kNACABQf////8BSw0DQX8gAUEDdEEHbkF/amd2QQFqIQEMAQtBBEEIQRAgAUEISRsgAUEESRshAQsgA0EgakEgQQggARCjEiADKAIkIQYgAygCICIIRQ0FIAMpAighEAJAIAZBCWoiAUUNACAIQf8BIAH8CwALIAMgEEIgiD4CHCADIBCnIgk2AhggAyAGNgIUIAMgCDYCECADQQg2AgxBACEHQQAhAQJAIARFDQAgCEEIaiEKIAAoAgAiCykDAEJ/hUKAgYKEiJCgwIB/gyEQQQAhASAEIQwgCyEFA0ACQCAQQgBSDQADQCABQQhqIQEgBUEIaiIFKQMAQoCBgoSIkKDAgH+DIhBCgIGChIiQoMCAf1ENAAsgEEKAgYKEiJCgwIB/hSEQCwJAIAggBiALIBB6p0EDdiABaiINQQV0ayIOQWBqKQMAIA5BaGooAgAQ7B4iEadxIg5qKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQ8DQCAOIA9qIQ4gD0EIaiEPIAggDiAGcSIOaikAAEKAgYKEiJCgwIB/gyISUA0ACwsgEEJ/fCETAkAgCCASeqdBA3YgDmogBnEiDmosAABBAEgNACAIKQMAQoCBgoSIkKDAgH+DeqdBA3YhDgsgEyAQgyEQIAggDmogEUIZiKciDzoAACAKIA5BeGogBnFqIA86AAAgCCAOQX9zQQV0aiIOQRhqIAsgDUF/c0EFdGoiDUEYaikAADcAACAOQRBqIA1BEGopAAA3AAAgDkEIaiANQQhqKQAANwAAIA4gDSkAADcAACAMQX9qIgwNAAsgBCEBCyADIAE2AhwgAyAJIAFrNgIYAkADQCAHQRBGDQEgACAHaiIBKAIAIQUgASADQQRqIAdqQQxqIggoAgA2AgAgCCAFNgIAIAdBBGohBwwACwsgAygCFCIBRQ0EIAEgAUEFdEEnakFgcSIFakEJaiIBRQ0EIAMoAhAgBWsgAUEIELMWDAQLIAAoAgAhAQJAIAcgBkEHcUEAR2oiB0UNACABIQUDQCAFIAUpAwAiEEJ/hUIHiEKBgoSIkKDAgAGDIBBC//79+/fv37//AIR8NwMAIAVBCGohBSAHQX9qIgcNAAsLAkAgBkEISQ0AIAEgBmogASkAADcAAAwCCwJAIAZFDQAgAUEIaiABIAb8CgAACyAGDQFBACEBDAILEOchAAtBASEOQQAhCEEAIQcDQCAHIQUgDiEHAkAgASAFai0AAEGAAUcNACABIAhqIQ8gASAFQX9zQQV0aiEKQQAgBWtBBXQhDAJAA0AgACgCBCIOIAEgDGoiDUFgaikDACANQWhqKAIAEOweIhKncSINIQsCQCABIA1qKQAAQoCBgoSIkKDAgH+DIhBCAFINAEEIIQQgDSELA0AgCyAEaiELIARBCGohBCABIAsgDnEiC2opAABCgIGChIiQoMCAf4MiEFANAAsLAkAgASAQeqdBA3YgC2ogDnEiC2osAABBAEgNACABKQMAQoCBgoSIkKDAgH+DeqdBA3YhCwsCQCALIA1rIAUgDWtzIA5xQQhJDQAgASALaiINLQAAIQQgDSASQhmIpyIJOgAAIAAoAgAiDSALQXhqIA5xakEIaiAJOgAAIARB/wFGDQIgASALQQV0ayEEQWAhAQJAA0AgAUUNASAPIAFqIg4oAAAhDSAOIAQgAWoiCygAADYAACALIA02AAAgAUEEaiEBDAALCyAAKAIAIQEMAQsLIAEgBWogEkIZiKciDToAACAAKAIAIgEgDiAFQXhqcWpBCGogDToAAAwBCyANIAVqQf8BOgAAIA0gACgCBCAFQXhqcWpBCGpB/wE6AAAgASALQX9zQQV0aiIBQRhqIApBGGopAAA3AAAgAUEQaiAKQRBqKQAANwAAIAFBCGogCkEIaikAADcAACABIAopAAA3AAAgDSEBCyAIQWBqIQggByAHIAZJIgVqIQ4gBQ0ACyAAKAIEIgEgAUEBakEDdkEHbCABQQhJGyEBCyAAIAEgACgCDGs2AggLQYGAgIB4IQYLIANBMGokACAGC4UOAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4SARERAgMEBQYHCAkKCwwNDg8QAAsgAEEEahDUAQ8LIAAoAggiASAAKAIMEJ4lIAAoAgQgARCeLQwPCyAAQQRqENQBIAAoAggiABCEAiAAQTBBCBCzFg8LIAAoAgxFDQ0gAEEMahDUAQ8LAkAgACkDECIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIAEIQCIABBMEEIELMWDwsgAC0AJEECRg0LIAApAxAiA0IDg0IAUg0LIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNCyAAIAAoAhAQxiQPCyAALQAkQQJGDQogACkDECIDQgODQgBSDQogA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0KIAAgACgCEBDGJA8LIABBBGoQ1AEgACgCCCIBEIQCIAFBMEEIELMWIAAoAhQiAEUNCSAAEIQCIABBMEEIELMWDwsgAEEQahDUASAAKAIIIgEgACgCDBCkEiAAKAIEIAEQpC0PCyAAQQRqENQBDwsgACgCBCIAQcwAaiIBKAIAIABB0ABqKAIAEJ4lIAAoAkggASgCABCeLQJAAkACQCAAKAIAQXlqDgIBAgALIAAQywsLIABBLGoiASgCACAAQTBqKAIAEJ4lIAAoAiggASgCABCeLQsCQCAAKAJgQYCAgIB4Rg0AIABB5ABqIgEoAgAgAEHoAGooAgAQniUgACgCYCABKAIAEJ4tCyAAQYABQQgQsxYPCyAAQQRqENQBIAAoAggiABCEAiAAQTBBCBCzFg8LIABBBGoQ1AEgACgCCCIAEIQCIABBMEEIELMWDwsCQCAAKAIEIgFBAkYNACAAQQhqIQICQCABDQAgAigCACIBQQRqIgIoAgAgAUEIaigCABCsHiABKAIAIAIoAgAQoy0gAUEcQQQQsxYMAQsgAhDUAQsCQCAAKAIYRQ0AIABBGGoQ1AELAkAgACgCHEUNACAAQRxqENQBCyAAKAIMIgAQhAIgAEEwQQgQsxYPCyAAKAIEIAAoAggQwRQgAEEMahDUASAAKAIQIgAQhAIgAEEwQQgQsxYPCyAAKAIEIAAoAggQwRQgAEEMahDUASAAKAIQIgAQhAIgAEEwQQgQsxYPCwJAAkACQAJAAkACQAJAAkAgACgCCA4IAQIDBAUGBwABCyAAKAIMIgBBCGohAQJAAkAgACgCAA0AIAEpAwAiA0IDg0IAUg0BIAOnIgEgASgCACICQX9qNgIAIAJBAUcNASABIAEoAhAQxiQMAQsgARDIEwsCQCAALQBFIgFBA0YNAAJAIAFBAkcNACAAQSRqIgEoAgAgAEEoaigCABCcJSAAKAIgIAEoAgAQoy0MAQsCQCAAKQMoIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAQcAAahDzEgsgAEHYAEEIELMWDwsCQCAAKQMQIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAKAIoIgAQpA8gAEHAAEEEELMWDwsCQCAAKQMQIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAKAIoENcNDwsgACgCDCIAQQRqIgEoAgAgAEEIaigCABCsHiAAKAIAIAEoAgAQoy0gAEEcQQQQsxYPCyAAKAIMIgBBBGoiASgCACAAQQhqKAIAEKweIAAoAgAgASgCABCjLSAAQRhBBBCzFg8LAkAgACgCDCIAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCwJAIAAoAiAiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgAEE8aiIBKAIAIABBwABqKAIAEIAQIAAoAjggASgCABCbLSAAQShqIgEoAgAgAEEsaigCABCfJSAAKAIkIAEoAgAQoy0gAEHIAEEIELMWDwsCQCAAKAIMIgApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLAkAgACgCICIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAKAIkIgEQ4QMgAUHgAEEIELMWIABBMEEIELMWDwsCQCAAKAIMIgApAwAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIABBIGoQ0BAgACgCICAAQSRqKAIAEJ4tIABBMEEIELMWDwsLhQ4CAn8BfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhIBERECAwQFBgcICQoLDA0ODxAACyAAQQRqENUBDwsgACgCCCIBIAAoAgwQniUgACgCBCABEJ4tDA8LIABBBGoQ1QEgACgCCCIAEIUCIABBMEEIELMWDwsgACgCDEUNDSAAQQxqENUBDwsCQCAAKQMQIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAKAIoIgAQhQIgAEEwQQgQsxYPCyAALQAkQQJGDQsgACkDECIDQgODQgBSDQsgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0LIAAgACgCEBDGJA8LIAAtACRBAkYNCiAAKQMQIgNCA4NCAFINCiADpyIAIAAoAgAiAUF/ajYCACABQQFHDQogACAAKAIQEMYkDwsgAEEEahDVASAAKAIIIgEQhQIgAUEwQQgQsxYgACgCFCIARQ0JIAAQhQIgAEEwQQgQsxYPCyAAQRBqENUBIAAoAggiASAAKAIMEKQSIAAoAgQgARCkLQ8LIABBBGoQ1QEPCyAAKAIEIgBBzABqIgEoAgAgAEHQAGooAgAQniUgACgCSCABKAIAEJ4tAkACQAJAIAAoAgBBeWoOAgECAAsgABDMCwsgAEEsaiIBKAIAIABBMGooAgAQniUgACgCKCABKAIAEJ4tCwJAIAAoAmBBgICAgHhGDQAgAEHkAGoiASgCACAAQegAaigCABCeJSAAKAJgIAEoAgAQni0LIABBgAFBCBCzFg8LIABBBGoQ1QEgACgCCCIAEIUCIABBMEEIELMWDwsgAEEEahDVASAAKAIIIgAQhQIgAEEwQQgQsxYPCwJAIAAoAgQiAUECRg0AIABBCGohAgJAIAENACACKAIAIgFBBGoiAigCACABQQhqKAIAEKweIAEoAgAgAigCABCjLSABQRxBBBCzFgwBCyACENUBCwJAIAAoAhhFDQAgAEEYahDVAQsCQCAAKAIcRQ0AIABBHGoQ1QELIAAoAgwiABCFAiAAQTBBCBCzFg8LIAAoAgQgACgCCBDDFCAAQQxqENUBIAAoAhAiABCFAiAAQTBBCBCzFg8LIAAoAgQgACgCCBDDFCAAQQxqENUBIAAoAhAiABCFAiAAQTBBCBCzFg8LAkACQAJAAkACQAJAAkACQCAAKAIIDggBAgMEBQYHAAELIAAoAgwiAEEIaiEBAkACQCAAKAIADQAgASkDACIDQgODQgBSDQEgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0BIAEgASgCEBDGJAwBCyABEMgTCwJAIAAtAEUiAUEDRg0AAkAgAUECRw0AIABBJGoiASgCACAAQShqKAIAEJwlIAAoAiAgASgCABCjLQwBCwJAIAApAygiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIABBwABqEPMSCyAAQdgAQQgQsxYPCwJAIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIAAoAigiABClDyAAQcAAQQQQsxYPCwJAIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIAAoAigQ2A0PCyAAKAIMIgBBBGoiASgCACAAQQhqKAIAEKweIAAoAgAgASgCABCjLSAAQRxBBBCzFg8LIAAoAgwiAEEEaiIBKAIAIABBCGooAgAQrB4gACgCACABKAIAEKMtIABBGEEEELMWDwsCQCAAKAIMIgApAwgiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLAkAgACgCICIBRQ0AIAEQ0Q8gASgCACABQQRqKAIAEJ4tIAFBFEEEELMWCyAAQTxqIgEoAgAgAEHAAGooAgAQgBAgACgCOCABKAIAEJstIABBKGoiASgCACAAQSxqKAIAEJ8lIAAoAiQgASgCABCjLSAAQcgAQQgQsxYPCwJAIAAoAgwiACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsCQCAAKAIgIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIAAoAiQiARDiAyABQeAAQQgQsxYgAEEwQQgQsxYPCwJAIAAoAgwiACkDACIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgAEEgahDQECAAKAIgIABBJGooAgAQni0gAEEwQQgQsxYPCwuFDgICfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEgEREQIDBAUGBwgJCgsMDQ4PEAALIABBBGoQ1gEPCyAAKAIIIgEgACgCDBCeJSAAKAIEIAEQni0MDwsgAEEEahDWASAAKAIIIgAQhgIgAEEwQQgQsxYPCyAAKAIMRQ0NIABBDGoQ1gEPCwJAIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLIAAoAigiABCGAiAAQTBBCBCzFg8LIAAtACRBAkYNCyAAKQMQIgNCA4NCAFINCyADpyIAIAAoAgAiAUF/ajYCACABQQFHDQsgACAAKAIQEMYkDwsgAC0AJEECRg0KIAApAxAiA0IDg0IAUg0KIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNCiAAIAAoAhAQxiQPCyAAQQRqENYBIAAoAggiARCGAiABQTBBCBCzFiAAKAIUIgBFDQkgABCGAiAAQTBBCBCzFg8LIABBEGoQ1gEgACgCCCIBIAAoAgwQpBIgACgCBCABEKQtDwsgAEEEahDWAQ8LIAAoAgQiAEHMAGoiASgCACAAQdAAaigCABCeJSAAKAJIIAEoAgAQni0CQAJAAkAgACgCAEF5ag4CAQIACyAAEM0LCyAAQSxqIgEoAgAgAEEwaigCABCeJSAAKAIoIAEoAgAQni0LAkAgACgCYEGAgICAeEYNACAAQeQAaiIBKAIAIABB6ABqKAIAEJ4lIAAoAmAgASgCABCeLQsgAEGAAUEIELMWDwsgAEEEahDWASAAKAIIIgAQhgIgAEEwQQgQsxYPCyAAQQRqENYBIAAoAggiABCGAiAAQTBBCBCzFg8LAkAgACgCBCIBQQJGDQAgAEEIaiECAkAgAQ0AIAIoAgAiAUEEaiICKAIAIAFBCGooAgAQrB4gASgCACACKAIAEKMtIAFBHEEEELMWDAELIAIQ1gELAkAgACgCGEUNACAAQRhqENYBCwJAIAAoAhxFDQAgAEEcahDWAQsgACgCDCIAEIYCIABBMEEIELMWDwsgACgCBCAAKAIIEMQUIABBDGoQ1gEgACgCECIAEIYCIABBMEEIELMWDwsgACgCBCAAKAIIEMQUIABBDGoQ1gEgACgCECIAEIYCIABBMEEIELMWDwsCQAJAAkACQAJAAkACQAJAIAAoAggOCAECAwQFBgcAAQsgACgCDCIAQQhqIQECQAJAIAAoAgANACABKQMAIgNCA4NCAFINASADpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIAEQyBMLAkAgAC0ARSIBQQNGDQACQCABQQJHDQAgAEEkaiIBKAIAIABBKGooAgAQnCUgACgCICABKAIAEKMtDAELAkAgACkDKCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgAEHAAGoQ8xILIABB2ABBCBCzFg8LAkAgACkDECIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIAEKYPIABBwABBBBCzFg8LAkAgACkDECIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKBDZDQ8LIAAoAgwiAEEEaiIBKAIAIABBCGooAgAQrB4gACgCACABKAIAEKMtIABBHEEEELMWDwsgACgCDCIAQQRqIgEoAgAgAEEIaigCABCsHiAAKAIAIAEoAgAQoy0gAEEYQQQQsxYPCwJAIAAoAgwiACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsCQCAAKAIgIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIABBPGoiASgCACAAQcAAaigCABCAECAAKAI4IAEoAgAQmy0gAEEoaiIBKAIAIABBLGooAgAQnyUgACgCJCABKAIAEKMtIABByABBCBCzFg8LAkAgACgCDCIAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCwJAIAAoAiAiAUUNACABENEPIAEoAgAgAUEEaigCABCeLSABQRRBBBCzFgsgACgCJCIBEOMDIAFB4ABBCBCzFiAAQTBBCBCzFg8LAkAgACgCDCIAKQMAIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAQSBqENAQIAAoAiAgAEEkaigCABCeLSAAQTBBCBCzFg8LC6AOAgR/AX4jAEHwAGsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDQXRqIgRBByAEQSZJGw4mIQABAgMEBQYHCAkKCwwNIQ4PEBESIRMUFSEhFhcYGRobHB0hHiEhCyAAKAIMIgRFDSAgACgCCCEAIARBBHQhBANAAkAgACgCAEECRg0AIAEgAEEMaigCABCQIAsgAEEQaiEAIARBcGoiBA0ADCELCyAAKAIMIgRFDR8gACgCCCEAIARBDGwhBANAAkACQCAAKAIAIgMNACAAQQRqKAIAIAEQyQ0MAQsgASADEJAgCyAAQQxqIQAgBEF0aiIEDQAMIAsLIAEgAEEIahDaBQweCyABIAAoAgQQkCAMHQsgASAAKAIMEJAgDBwLIAEgACgCBBCQICABIAAoAggQkCAMGwsgAS0AeSEFIAFBADoAeQJAAkAgA0ELRw0AAkACQCAAKAIEDgMAAQMACyAAKAIQIgNFDQIgACgCDCEEIANBKGwhAwNAAkAgBCgCAEEHRg0AIAQgARCSCwsgBEEoaiEEIANBWGoiAw0ADAMLCyAAKAIQIgNFDQEgACgCDCEEIANBOGwhAwNAAkACQAJAAkAgBCgCAA4DAAECAAsgBEEIaiABEJ0oIARBKGooAgAgARCSCwwCCyABIARBCGoQ6hEMAQsgBEEEaigCACABEJILCyAEQThqIQQgA0FIaiIDDQAMAgsLAkACQAJAAkACQAJAAkACQAJAAkAgAw4LAAECAwQFBgcICQoACyABIABBCGoQwAsMCQsgASAAKAIoEJAgIAAoAghBAkkNCCAAQQxqIAEQ7S4MCAsgASAAQQhqELgjDAcLIAEgACgCBBCQIAwGCyAAKAIEIAEQ7hMMBQsgAEEEaiABEO4uDAQLIABBBGogARDuLgwDCyAAQQRqIAEQ7S4MAgsgAEEEaiABEO4uDAELIABBBGogARDuLgsgASAFOgB5IAEgACgCOBCQIAwaCyABIAAoAigQkCAgACgCCEECSQ0ZIABBDGogARDtLgwZCyABIABBCGoQuCMMGAsgASAAKAIEEJAgIAEgACgCCBCQICABIAAoAgwQkCAMFwsCQCAALQAYQQVHDQAgASAAKAIQEJAgCyAAKAIMIgRFDRYgBEEEdCEEIAAoAghBDGohAANAIAEgACgCABCQICAAQRBqIQAgBEFwaiIEDQAMFwsLIAEgACgCEBCQICAAKAIEQYCAgIB4Rg0VIAAoAgwiBEUNFSAEQQR0IQQgACgCCEEMaiEAA0AgASAAKAIAEJAgIABBEGohACAEQXBqIgQNAAwWCwsgACgCDCIERQ0UIAAoAgghACAEQQJ0IQQDQCABIAAoAgAQkCAgAEEEaiEAIARBfGoiBA0ADBULCyAAKQMIIAAoAhggARDqHgwTCyAAKAIMIgRFDRIgACgCCCEAIARBAnQhBANAIAEgACgCABCQICAAQQRqIQAgBEF8aiIEDQAMEwsLIAEgACgCBBCQICAAKAIIIgAoAggiBEUNESAAKAIEIQAgBEECdCEEA0AgASAAKAIAEJAgIABBBGohACAEQXxqIgQNAAwSCwsgASAAQQRqELIMDBALIAJBDGogAUEsaiIEEIENIAQgAEEIahC8EiAALQAcQQJGDQ0gACkDCCEGIAAoAhghAwJAIAEtAJABDQAgA0UNACACQeAAaiAGIAMQuR8gAUGAAWogAikDYCACKAJoEIkGGgsgACgCICABEK8GIAEgBiADENURDA4LIAAoAgwiAEUNDiABIAAQkCAMDgsgASAAKAIEEJAgDA0LIAEgACgCBBCQIAwMCwJAIAAtADRBAkYNACAAKQMgIAAoAjAgARDqHgwMCyAAQSBqIAEQ1yMMCwsgACgCBCIDQcAAaiABEKoWAkAgAygChAEiBEUNACADKAKAASEAIARB2ABsIQQDQAJAAkACQCAAKAIAQXxqDgICAAELIAEgAEEEaigCABCQIAwBCyABIAAQ1gcLIABB2ABqIQAgBEGof2oiBA0ACwsCQCADKAKYASIERQ0AIAMoApQBIQAgBEEobCEEA0AgACABEMoJIABBKGohACAEQVhqIgQNAAsLIAMtADxBBkYNCiADQRBqIAEQqhYMCgsgACgCDCIERQ0JIAAoAgghACAEQShsIQQDQCAAIAEQygkgAEEoaiEAIARBWGoiBA0ADAoLCyABIAAoAgQQkCAMCAsgASAAKAIEEJAgDAcLIAEgACgCBBCQIAwGCyABIAAoAgQQkCAMBQsgASAAKAIEEJAgDAQLIAEgACgCBBCQIAwDCyAAKAIEIAEQ7hMMAgsgACgCICABEK8GCyAEIAJBDGoQpgMLIAJB8ABqJAAL5wwCDn8EfiMAQTBrIgIkAAJAAkACQAJAAkAgACgCDCIDQX9GDQACQCADIAAoAgQiBCAEQQFqIgVBA3YiBkEHbCAEQQhJGyIEQQF2SQ0AAkACQCAEIAMgBCADSxsiBEEOSQ0AIARB/v///wFLDQNBfyAEQQN0QQhqQQduQX9qZ3ZBAWohBAwBC0EEQQhBECAEQQdJGyAEQQNJGyEECyACQSBqQSBBCCAEEKMSIAIoAiQhBSACKAIgIgdFDQUgAikCKCEQAkAgBUEJaiIERQ0AIAdB/wEgBPwLAAsgAiAQQiCIPgIcIAIgEKciCDYCGCACIAU2AhQgAiAHNgIQIAJBCDYCDEEAIQlBACEEAkAgA0UNACAHQQhqIQogACgCACILKQMAQn+FQoCBgoSIkKDAgH+DIRBBACEEIAMhDCALIQYDQAJAIBBCAFINAANAIARBCGohBCAGQQhqIgYpAwBCgIGChIiQoMCAf4MiEEKAgYKEiJCgwIB/UQ0ACyAQQoCBgoSIkKDAgH+FIRALAkAgByAFIAsgEHqnQQN2IARqIg1BBXRrIg5BYGopAwAgDkFoaigCABDsHiIRp3EiDmopAABCgIGChIiQoMCAf4MiEkIAUg0AQQghDwNAIA4gD2ohDiAPQQhqIQ8gByAOIAVxIg5qKQAAQoCBgoSIkKDAgH+DIhJQDQALCyAQQn98IRMCQCAHIBJ6p0EDdiAOaiAFcSIOaiwAAEEASA0AIAcpAwBCgIGChIiQoMCAf4N6p0EDdiEOCyATIBCDIRAgByAOaiARQhmIpyIPOgAAIAogDkF4aiAFcWogDzoAACAHIA5Bf3NBBXRqIg5BGGogCyANQX9zQQV0aiINQRhqKQAANwAAIA5BEGogDUEQaikAADcAACAOQQhqIA1BCGopAAA3AAAgDiANKQAANwAAIAxBf2oiDA0ACyADIQQLIAIgBDYCHCACIAggBGs2AhgCQANAIAlBEEYNASAAIAlqIgQoAgAhBiAEIAJBBGogCWpBDGoiBygCADYCACAHIAY2AgAgCUEEaiEJDAALCyACKAIUIgRFDQQgBCAEQQV0QSdqQWBxIgZqQQlqIgRFDQQgAigCECAGayAEQQgQsxYMBAsgACgCACEEAkAgBiAFQQdxQQBHaiIJRQ0AIAQhBgNAIAYgBikDACIQQn+FQgeIQoGChIiQoMCAAYMgEEL//v379+/fv/8AhHw3AwAgBkEIaiEGIAlBf2oiCQ0ACwsCQCAFQQhJDQAgBCAFaiAEKQAANwAADAILAkAgBUUNACAEQQhqIAQgBfwKAAALIAUNAUEAIQQMAgsQ5yEAC0EBIQ5BACEHQQAhCQNAIAkhBiAOIQkCQCAEIAZqLQAAQYABRw0AIAQgB2ohDyAEIAZBf3NBBXRqIQpBACAGa0EFdCEMAkADQCAAKAIEIg4gBCAMaiINQWBqKQMAIA1BaGooAgAQ7B4iEqdxIg0hCwJAIAQgDWopAABCgIGChIiQoMCAf4MiEEIAUg0AQQghAyANIQsDQCALIANqIQsgA0EIaiEDIAQgCyAOcSILaikAAEKAgYKEiJCgwIB/gyIQUA0ACwsCQCAEIBB6p0EDdiALaiAOcSILaiwAAEEASA0AIAQpAwBCgIGChIiQoMCAf4N6p0EDdiELCwJAIAsgDWsgBiANa3MgDnFBCEkNACAEIAtqIg0tAAAhAyANIBJCGYinIgg6AAAgACgCACINIAtBeGogDnFqQQhqIAg6AAAgA0H/AUYNAiAEIAtBBXRrIQNBYCEEAkADQCAERQ0BIA8gBGoiDigAACENIA4gAyAEaiILKAAANgAAIAsgDTYAACAEQQRqIQQMAAsLIAAoAgAhBAwBCwsgBCAGaiASQhmIpyINOgAAIAAoAgAiBCAOIAZBeGpxakEIaiANOgAADAELIA0gBmpB/wE6AAAgDSAAKAIEIAZBeGpxakEIakH/AToAACAEIAtBf3NBBXRqIgRBGGogCkEYaikAADcAACAEQRBqIApBEGopAAA3AAAgBEEIaiAKQQhqKQAANwAAIAQgCikAADcAACANIQQLIAdBYGohByAJIAkgBUkiBmohDiAGDQALIAAoAgQiBCAEQQFqQQN2QQdsIARBCEkbIQQLIAAgBCAAKAIMazYCCAtBgYCAgHghBQsgAkEwaiQAIAULuw4CC38EfiMAQeAeayIFJAACQAJAAkACQCABLQBFIgZBAkYNACAGQQFxDQAgAi0ADCEGDAELIAVB3QtqQQI6AABCACEQIAVCADcDiAsgBUIANwOACyAFQYKEiBA2ANkLIAVBAjYC0AsgBUECNgLICyAFQQA2AsALIAVBAzoAvAsgBSABLQBCIgZBAkYgBnJBAXE6ANgLAkACQCACLQAMIgZBAkYNACACKAIAIgcgBygCACIIQQFqNgIAIAhBf0wNASAFIAc2AmAgBSACKQIENwJkQoCAgIAQIRALIAUgBjoAbCAFQfAFaiAFQYALaiAFQeAAahCdFyAFQQE6AMkGAkBBwABFDQAgBSAFQfAFakHAAPwKAAALIAVCgYCAgKABNwNQIAVCgYCAgDA3A0ggBUEBNgJAIAUpA8gGIREgBSABKAIMQYCAgAEgASgCCBsiCDYCRCAFIBAgEUL//4OAgIBAg4RCgIAEQoCABEIAIAEtAEkiAUEBcRsgAUECRhsiEoRCgICACIQiEzcDWCAFQYALahCfHgJAAkAgBS0APCIHQQNGDQAgB0ECRg0AIAUoAjAiASABKAIAIglBAWo2AgAgCUF/TA0CIAUoAjghCiAFKAI0IQsMAQsLIBJCEIinIQkgEEIgiKchDCARQgiIpyENIBGnIQ4CQAJAIAUoAgAiD0EBcQ0AQgAhEQwBCyAFQfAbakEYaiAFQShqKQMANwMAIAVBgBxqIAVBIGopAwA3AwAgBSAFKQMQNwPwGyAFIAVBGGopAwA3A/gbQgEhEQsgBUHwBWpBGGogBSkD+Bs3AwAgBUGQBmogBUGAHGopAwA3AwAgBUGYBmogBUHwG2pBGGopAwA3AwAgBSARNwPwBSAFQQE6AMsGIAUgCToAygYgBSANOgDJBiAFIAc6AKwGIAUgCjYCqAYgBSALNgKkBiAFIAE2AqAGIAUgDjoAyAYgBSAFKQPwGzcDgAYgBSAMOgDMBiAFQgA3A/gFIAVBADoAzQYgBSAINgK0BiAFQQE2ArAGIAVCgYCAgDA3A7gGIAVCgYCAgKABNwPABiAFQYALaiAFQfAFahC1BSEBIAMgAygCACIKQQFqNgIAIApBf0wNACAFQTBqIQogBUHgAGogASADEN4BIAFBMGoQ3B4gAUHgAGoQ6Q0CQAJAAkAgBSkDYCIQQgKFIAUpA2giEYRQRQ0AIAUoAnBBKUsNASAFQfAAahD1FQwBCwJAQZAFRQ0AIAVB8AVqIAVB4ABqQZAF/AoAAAsgBUHwG2oQnx4CQAJAIAdBA0YNACAHQQJGDQAgBSgCMCIBIAEoAgAiA0EBajYCACADQX9MDQQgBSgCOCEDIAUoAjQhCwwBCwsgE0IYiKchDgJAAkAgD0EBcQ0AQgAhEgwBCyAFQcAeakEYaiAFQShqKQMANwMAIAVB0B5qIAVBIGopAwA3AwAgBSAFKQMQNwPAHiAFIAVBGGopAwA3A8geQgEhEgsgBUHwEGpBGGogBSkDyB43AwAgBUGQEWogBUHQHmopAwA3AwAgBUGYEWogBUHAHmpBGGopAwA3AwAgBSASNwPwECAFIAUpA8AeNwOAESAFQQA6AM0RIAUgDDoAzBEgBSAOOgDLESAFIAk6AMoRIAUgDToAyREgBUEAOgDIESAFQoGAgICgATcDwBEgBUKBgICAMDcDuBEgBSAINgK0ESAFIAc6AKwRIAUgAzYCqBEgBSALNgKkESAFIAE2AqARIAVCADcD+BAgBUEBNgKwESAFQQI6ANwRIAVBkBBqIAVB8BBqIAVB0BFqEJ0XIAVBADoA7BAgBUHwG2ogBUGQEGoQtQUhASAEIAQoAgAiA0EBajYCACADQX9MDQIgBUGAC2ogASAEEN4BIAFBMGoQ3B4gAUHgAGoQ6Q0gBSkDgAtCAoUgBSkDiAuEQgBSDQECQCAFKAKQC0EpSw0AIAVBkAtqEPUVCyAFQaAGahDcHiAFKALwCiIBIAEoAgAiAUF/ajYCACABQQFHDQAgBSgC8AoQ7xILIAoQ3B4MAgsCQEGQBUUNACAFQeARakGABWogBUGAC2pBkAX8CgAACyAFQdAcaiIBELQJIAVBzBxqQYIEOwEAIAVCADcD+BsgBUIANwPwGyAFQYKEiBA2AsgcIAVBAjYCwBwgBUECNgK4HCAFQQA2ArAcIAVBAzoArBwCQEGABUUNACAFQeARaiAFQfAAakGABfwKAAALIAVBoBxqENweIAEQ6Q0gChDcHiAGQQJGDQMgAigCACIBIAEoAgAiAUF/ajYCACABQQFHDQMMAgsACwJAIAZB/wFxQQJHDQBCACERQgIhEAwCCyACKAIAIgEgASgCACIBQX9qNgIAQgAhEUICIRAgAUEBRw0BCyACKAIAIAIoAgQQ7hILIAAgETcDCCAAIBA3AwACQEGQCkUNACAAQRBqIAVB4BFqQZAK/AoAAAsgBUHgHmokAAusDgIMfwJ+IwBB8AFrIgIkAAJAAkACQAJAAkACQAJAAkACQCABEPsPQfAARg0AIAEQ+w9B0ABHDQELIAJB0ABqIAEoAgAiA0HAAGpB4MiEARDsIyACKAJUIQQgAigCUCIFQQA2AgggARD7DyEGAkAgARDUJA0AIAJBvAFqIANB2ABqKAIAIgU2AgAgAkGwAWoiBiAFNgIAIAIgAykCUCIONwK0ASACIA43A6gBIABBHGogASgCBCABKAIIEIoUIABBCjYCACAAIAIpA6gBNwIoIABBMGogBikDADcCACAAQThqIAJBuAFqKQMANwIADAcLAkAgARD7D0H7AEcNACACQagBaiABEKcNIAJB4ABqIAJBvAFqKAIANgIAIAIgAikCtAE3A1gDQCABENQkRQ0EIAEQ+w9B/QBGDQQgBSABEPsPEMAXDAALCyACQegAakEIaiADQdgAaigCADYCACACIAMpAlA3A2ggARD7DyIFQdwARg0BIAEQ1CQaQYCAgIB4IQcgAkHoAGohAQwDC0HgyYQBQTpBnMqEARDSHgALIAJBqAFqIAEQpw0gAEEcaiABKAIEIAEoAggQihQgAEEfNgIAIAAgAikCqAE3AiggAEEwaiACQagBakEIaikCADcCACAAQThqIAJBuAFqKQIANwIADAQLIAMoAlAiCCABKAIIRg0CIAIgARD7DyIINgJkAkAgCEH9AEYNACACQQA2AqgBIAJB5ABqQcjGhAEgAkGoAWpB0MmEARC3IQALIAEQjQsaIAJBqAFqIAUoAgQiCSAFKAIIIgpBgOObAUECENMCAkACQAJAIAIoAqgBQQFHDQAgAkGwAWohASACKALkASEFIAIoAuABIQggAigC3AEhByACKALYASELIAIoAswBQX9GDQEgAkGcAWogASALIAcgCCAFQQAQ5AYMAgtBACEMAkAgAi0AtgENACACKALcASELIAIoAtgBIQ0gAigCrAEhBSACLQC0ASEIAkADQCACQcgAaiAFIA0gCxCUGCACKAJIIgFFDQkgAigCTCEHIAIgATYC6AEgAiABIAdqNgLsASACQcAAaiACQegBahChDAJAIAIoAkBBAXFFDQAgCEEBcQ0CQQEhCEEBIQECQCACKAJEIgdBgAFJDQBBAiEBIAdBgBBJDQBBA0EEIAdBgIAESRshAQsgASAFaiEFDAELCyAIQQFxRQ0BCyACIAU2AqABQQEhDAsgAiAMNgKcAQwBCyACQZwBaiABIAsgByAIIAVBARDkBgsCQCACKAKcAUUNACACQQhqIAkgCiACKAKgASIBQfDIhAEQkxsgAkGcAWogAigCCCACKAIMEIoUQQIhCCACIAkgCiABQQJqQYDJhAEQvhogAkGoAWogAigCACACKAIEEIoUIAI1AqgBQiCGIAI1AqQBhCEOIAIpAqwBIQ8gAigCoAEhBSACKAKcASEHIAJB2ABqIQEMAgsgAkE4aiAJIApBOhCWCUEBIQgCQCACKAI4QQFxRQ0AIAJBGGogCSAKIAIoAjwiAUGQyYQBEJMbIAJBnAFqIAIoAhggAigCHBCKFCACQRBqIAkgCiABQQFqQaDJhAEQvhogAkGoAWogAigCECACKAIUEIoUIAI1AqgBQiCGIAI1AqQBhCEOIAIpAqwBIQ8gAigCoAEhBSACKAKcASEHIAJB2ABqIQEMAgsgAkEwaiAJIApBPRCWCQJAIAIoAjBBAXFFDQAgAkEoaiAJIAogAigCNCIBQbDJhAEQkxsgAkGcAWogAigCKCACKAIsEIoUIAJBIGogCSAKIAFBAWpBwMmEARC+GiACQagBaiACKAIgIAIoAiQQihQgAjUCqAFCIIYgAjUCpAGEIQ4gAikCrAEhDyACKAKgASEFIAIoApwBIQdBACEIIAJB2ABqIQEMAgsgAkGoAWogCSAKEIoUIAIpAqwBIQ4gAigCqAEhBUEAIQhBgYCAgHghByACQdgAaiEBCwsgAkH4AGpBCGoiCyABQQhqKAIAIg02AgAgAkGMAWogA0HYAGooAgA2AgAgACAIOgAcIAAgDzcCFCAAIA43AgwgACAFNgIIIAAgBzYCBCAAIAEpAgAiDjcCICACQZABakEIaiANNgIAIAIgAykCUDcChAEgAEEoaiALKQMANwIAIABBMGogAkGIAWopAwA3AgAgAiAONwOQASACIA43A3ggAEEiNgIAIAAgBkHQAEY6ADgMAQsgAkG8AWogA0HQAGoiBUEIaigCACIDNgIAIAJBqAFqQQhqIgYgAzYCACACIAUpAgAiDjcCtAEgAiAONwOoASAAQRxqIAEoAgQgCBCKFCAAQQo2AgAgACACKQOoATcCKCAAQTBqIAYpAwA3AgAgAEE4aiACQbgBaikDADcCAAsgBCAEKAIAQQFqNgIAIAJB8AFqJAAPCyANIAsgBSALQaCwnAEQ4yoAC54NAgN/AX4jAEHAAGsiBCQAAkACQAJAAkACQAJAIAJBAmoOAwABAwELQQAhAkEALQCg8Z4BGkEYEH0iBQ0BAAsCQCABKAJEIgZFDQAgBEEwaiAGIAIgA2sgASgCSCgCHBEKAAJAIAQoAjBBgICAgHhGDQAgBEEgakEIaiAEQTBqQQhqKAIAIgI2AgAgBCAEKQIwNwMgIAJBGGwhAyAEKAIkIQICQANAAkACQAJAAkACQAJAAkACQCADRQ0AIAJBCGooAgAhBiACQRBqLQAARQ0BAkAgBkUNACAEQTBqIAEgBhCOIyAELQAwQQRGDQAgBCkDMCIHQv8Bg0IEUg0GCyAEQTBqIAFB9OSbAUECEJQQIAQtADBBBEYNAiAEKQMwIgdC/wGDQgRRDQIgACAHNwIADA4LIABBBDoAAAwNCwJAIAZFDQAgBEEwaiABIAYQjiMgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAgsgBEEwaiABQfLkmwFBAhCUEAJAIAQtADBBBEYNACAEKQMwIgdC/wGDQgRRDQAgACAHNwIADA0LIARBCGogAhDxFSAEQTBqIAEgBCgCCCAEKAIMEJQQAkAgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFENACAAIAc3AgAMDQsCQCACQQxqKAIAIgZFDQAgBEEwaiABIAYQjiMgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAwsgBEEwaiABEIwWIAQtADBBBEYNBSAEKQMwIgdC/wGDQgRRDQUgACAHNwIADAwLIAQgAhDxFSAEQTBqIAEgBCgCACAEKAIEEJQQAkAgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFENACAAIAc3AgAMDAsgAkEMaigCACIGQQJNDQMgBEEwaiABIAZBfmoQjiMgBC0AMEEERg0DIAQpAzAiB0L/AYNCBFENAyAAIAc3AgAMCwsgACAHNwIADAoLIAAgBzcCAAwJCyAAIAc3AgAMCAsgBEEwaiABQfbkmwFBAhCUEAJAIAQtADBBBEYNACAEKQMwIgdC/wGDQgRRDQAgACAHNwIADAgLIAEtAE0NACAEQTBqIAEQkREgBC0AMEEERg0AIAQpAzAiB0L/AYNCBFINAgsgAkEYaiECIANBaGohAwwACwsgACAHNwIADAQLIABBBDoAAAwECyAAQQQ6AAAMAwsQ2SAhByAFQQE6ABAgBUIANwMIIAUgBzcDACAEQQE2AjggBCAFNgI0IARBATYCMAJAAkADQAJAAkACQAJAAkACQAJAAkAgAkEYRg0AIAUgAmoiA0EIaigCACEGIANBEGotAABFDQECQCAGRQ0AIARBIGogASAGEI4jIAQtACBBBEYNACAEKQMgIgdC/wGDQgRSDQYLIARBIGogAUH05JsBQQIQlBAgBC0AIEEERg0CIAQpAyAiB0L/AYNCBFENAiAAIAc3AgAMCgsgAEEEOgAADAkLAkAgBkUNACAEQSBqIAEgBhCOIyAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUg0CCyAEQSBqIAFB8uSbAUECEJQQAkAgBC0AIEEERg0AIAQpAyAiB0L/AYNCBFENACAAIAc3AgAMCQsgBEEYaiADEPEVIARBIGogASAEKAIYIAQoAhwQlBACQCAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUQ0AIAAgBzcCAAwJCwJAIANBDGooAgAiA0UNACAEQSBqIAEgAxCOIyAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUg0DCyAEQSBqIAEQjBYgBC0AIEEERg0FIAQpAyAiB0L/AYNCBFENBSAAIAc3AgAMCAsgBEEQaiADEPEVIARBIGogASAEKAIQIAQoAhQQlBACQCAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUQ0AIAAgBzcCAAwICyADQQxqKAIAIgNBAk0NAyAEQSBqIAEgA0F+ahCOIyAELQAgQQRGDQMgBCkDICIHQv8Bg0IEUQ0DIAAgBzcCAAwHCyAAIAc3AgAMBgsgACAHNwIADAULIAAgBzcCAAwECyAEQSBqIAFB9uSbAUECEJQQAkAgBC0AIEEERg0AIAQpAyAiB0L/AYNCBFENACAAIAc3AgAMBAsgAS0ATQ0AIARBIGogARCRESAELQAgQQRGDQAgBCkDICIHQv8Bg0IEUg0CCyACQRhqIQIMAAsLIAAgBzcCAAsgBEEwahC/KAwCCyAAQQQ6AAAMAQsgBEEgahC/KAsgBEHAAGokAAvADgIHfwF+IwBBIGsiAiQAAkACQAJAIAAoAgAiAw0AIAAoAhAiAEUNASAAQaeZnAFBARCCBiEDDAILAkACQAJAAkACQAJAIAAoAggiBCAAKAIEIgVJDQAgACgCECIDRQ0BIANBvOOXAUEQEIIGRQ0BDAULIAAgBEEBaiIGNgIIIAMgBGotAAAhByAAIAAoAgxBAWoiCDYCDAJAIAhB9QNJDQACQCAAKAIQIgNFDQAgA0HM45cBQRkQggYNBgsgAEEBOgAEDAILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgB0Gvf2oOKQsKAQ8BEAEBAQEBAQEBAQEEBwgBCQEBAwQDAQQDBAMCAQEEAwEBAQQDAAsgB0G/f2oOAg0EAAsgACgCECIDRQ0RIANBvOOXAUEQEIIGDRUMEQsgACgCECIERQ0TQQEhAyAEQaqumwFBARCCBkUNEwwWCyAAIAcQqQkNEwwSCyAGIAVPDRAgAyAGai0AAEHuAEYNAQwQCyAAIAEQmwsNEQwQCyAAIARBAmo2AgggACgCECIERQ0OQQEhAyAEQcrzmwFBARCCBkUNDgwSCyACQRhqIAAQrAsCQCACKAIYIgMNACACLQAcIQQCQCAAKAIQIgFFDQBBASEDIAFBzOOXAUG845cBIARBAXEiBRtBGUEQIAUbEIIGDRMLIAAgBDoABAwNCyACQQhqIAMgAigCHBDFBwJAAkACQCACKAIIQQFHDQAgAikDECIJQgFWDQAgCacOAgECAQsgACgCECIDRQ0NIANBvOOXAUEQEIIGDREMDQsgACgCECIDRQ0PIANBjKucAUEFEIIGDRAMDwsgACgCECIDRQ0OIANBkaucAUEEEIIGDQ8MDgsgAkEYaiAAEKwLAkAgAigCGCIDDQAgAi0AHCEEAkAgACgCECIBRQ0AQQEhAyABQczjlwFBvOOXASAEQQFxIgUbQRlBECAFGxCCBg0SCyAAIAQ6AAQMDAsgAkEIaiADIAIoAhwQxQcCQCACKAIIIAIpAxAiCUKAgICAEFRxQQFHDQBBgIDEACAJpyIDIANBgLADc0GAgLx/akGAkLx/SRsiA0GAgMQARg0AIAAoAhAgAxCYBQ0PDA4LIAAoAhAiA0UNCiADQbzjlwFBEBCCBg0ODAoLAkAgAQ0AIAAoAhAiBEUNAEEBIQMgBEGomZwBQQEQggYNEAsCQCAAKAIQIgRFDQBBASEDIARB3qucAUEBEIIGDRALIAAQ5gMNDQwICyAGIAVPDQAgAyAGai0AAEHlAEYNAQsCQCABDQAgACgCECIERQ0AQQEhAyAEQaiZnAFBARCCBg0OCwJAIAAoAhAiBEUNAEEBIQMgBEGW45sBQQEQggYNDgsgB0HSAEcNAQwFCyAAIARBAmo2AgggABDmAw0KDAkLIAAoAhAiA0UNAyADQf3jlwFBBBCCBg0JDAMLAkAgAQ0AIAAoAhAiBEUNAEEBIQMgBEGomZwBQQEQggYNCwsCQCAAKAIQIgRFDQBBASEDIARB4aucAUEBEIIGDQsLQQEhAyAAEOMRQQFxDQogACgCECIERQ0HQQEhAyAEQeKrnAFBARCCBkUNAwwKCwJAIAENACAAKAIQIgRFDQBBASEDIARBqJmcAUEBEIIGDQoLAkAgACgCECIERQ0AQQEhAyAEQd2rnAFBARCCBg0KCyACIAAQ/w9BASEDIAIoAgBBAXENCQJAIAIoAgRBAUcNACAAKAIQIgRFDQdBASEDIARB36ucAUEBEIIGDQoLIAAoAhAiBEUNBkEBIQMgBEHchJ4BQQEQggZFDQIMCQsCQCABDQAgACgCECIERQ0AQQEhAyAEQaiZnAFBARCCBg0JC0EBIQMgAEEBEPUBDQgCQCAAKAIAIgQNACAAKAIQIgBFDQggAEGnmZwBQQEQggYhAwwJCwJAIAAoAggiBSAAKAIESQ0AIAAoAhAiBEUNAyAEQbzjlwFBEBCCBkUNAwwJCyAAIAVBAWo2AggCQAJAAkAgBCAFai0AAEGtf2oOAwIBBAALIAAoAhAiA0UNBCADQbzjlwFBEBCCBg0IDAQLAkAgACgCECIERQ0AQQEhAyAEQd2rnAFBARCCBg0KC0EBIQMgABDjEUEBcQ0JIAAoAhAiBEUNBkEBIQMgBEHchJ4BQQEQggZFDQIMCQsCQCAAKAIQIgNFDQAgA0G85JcBQQMQggYNBwtBASEDIAAQ7AZBAXENCCAAKAIQIgRFDQUgBEG/5JcBQQIQggZFDQEMCAtBASEDIABBARCMAg0HCyABDQMgACgCECIERQ0DQQEhAyAEQamZnAFBARCCBkUNAwwGC0EAIQMgAEEAOgAEIABBADYCAAwFC0EAIQMgAEEANgIADAQLIAAgBxCpCQ0BC0EAIQMgACgCAEUNAiAAIAAoAgxBf2o2AgwMAgtBASEDDAELQQAhAwsgAkEgaiQAIAMLgQ0CCX8BfiMAQTBrIgckAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIARBgIDAAHENACAEQSBxRQ0LIAJB/v97Sw0LIAMgAnJFDQsCQAJAIAIgA0sNAAJAIAJFDQAgB0EgaiABKAJAQQhqIgggAhCOFCAHKAIkIQkCQCAHKAIgIgINACAJEPknIQgMBwsgByAJNgIUIAcgAjYCECAHQSBqIAggAxCOFCAHKAIkIQoCQAJAAkAgBygCICIIDQAgChD5JyEIDAELIAcgCjYCHCACKAJ0IQsgByAINgIYAkACQCALIAgoAnRHDQAgAigCeCALayELIAogCUkNASAKIAtLDQEgAkEYaigCACEIIAJBFGooAgAhCyAJRQ0JIAkgCEkNAyAJIAhHDRAMCQsgAigCaCIKIAooAgAiCUEBajYCACAJQX9MDQcgAigCdCELIAgoAmgiAiACKAIAIglBAWo2AgAgCUF/TA0HIAgoAnQhCUHIAEEEEK0nIgggCTYCECAIIAI2AgwgCCALNgIIIAggCjYCBEENIQIgCEENNgIAIAdBGGoQ3CQgB0EQahDcJAwLCyACKAJoIgIgAigCACIIQQFqNgIAIAhBf0wNBkHIAEEEEK0nIgggCjYCECAIIAk2AgwgCCALNgIIIAggAjYCBCAIQQ42AgAgB0EYahDcJAsgB0EQahDcJAwHCyALIAlqLAAAQb9/Sg0FDAwLQQshAkHIAEEEEK0nIQgMAQtByABBBBCtJyIIIAM2AgggCCACNgIEQQwhAgsgCCACNgIADAULIARBEHFFDQoMBQsACwJAIApFDQACQCAKIAhJDQAgCiAIRw0IDAELIAsgCmosAABBv39MDQcLIAdBIGogCiAJayICQQFBARCVDyAHKAIkIQoCQCAHKAIgQQFHDQAgCiAHKAIoQcC8nAEQjikACyAHKAIoIQgCQCACRQ0AIAggCyAJaiAC/AoAAAsgB0EYahDcJCAHQRBqENwkIApBgICAgHhHDQELIAgoAgAhAgwBCyACQQNJDQVBfyEJAkAgCCACaiILQX9qLAAAIgxBf0oNAAJAAkAgC0F+ai0AACINwCIOQb9/TA0AIA1BH3EhCwwBCwJAAkAgC0F9ai0AACINwCIPQb9/TA0AIA1BD3EhCwwBCyALQXxqLQAAQQdxQQZ0IA9BP3FyIQsLIAtBBnQgDkE/cXIhCwsgC0EGdCAMQT9xckGAgMQARg0DIAtBAkkNAEF+IQkgC0EgSQ0AQX1BfCALQYAISRshCQsCQAJAIAkgAmoiCQ0AQQAhCQwBCyAJIAJPDQQgCCAJaiwAAEG/f0wNBAsgB0EIaiAIIAkQ6wYgBygCCCAHKAIMQSwQsh8hAiAKIAgQzywgBEEQcUUNBiACRQ0GDAELAkACQAJAAkAgAkF1aiIKQQQgCkEGSRtBfmoOAwABAgMLIAhBBGoQ3SQgCEEMahDdJAwCCyAIQQRqEN0kDAELQRAhCgJAAkAgAkF+aiICQQYgAkEJSRtBfmoOBQICAgIBAAtBBCEKCyAIIApqIgIoAgAgAkEEaigCABDPLAsgCEHIAEEEELMWDAULAkAgBEGAgIABSQ0AIAEtAE1BAXENBQsgB0EANgIgIAdBGGogASAHQSBqQd+rnAFBARCuDQJAIActABhBBEYNACAHKQMYIhBC/wGDQgRRDQAgACAQNwIADAYLIAEtAE0NBCAHQSBqIAEQkREgBy0AIEEERg0EIAcpAyAiEEL/AYNCBFENBCAAIBA3AgAMBQtBsOObARDSLAALIAggAkEAIAlBwOObARDjKgALIAsgCCAJIApBiOGYARDjKgALIAogCBDPLAsCQCAFQQFxRQ0AIARBHHFBHEcNACAGIANGDQAgASgCREUNACAHQSBqIAEgBkEBEIsCIActACBBBEYNACAHKQMgIhBC/wGDQgRRDQAgACAQNwIADAELAkAgBEHAAHFFDQAgAS0ATUEBRg0AIAEgASgCLEF/ajYCLAsCQAJAIARBgIAEcUUgBEECcUEBdiAEQQFxGw0AIARBgAFxRQ0BIAEtAE0NASAHQSBqIAEQkREgBy0AIEEERg0BIAcpAyAiEEL/AYNCBFENASAAIBA3AgAMAgsgAS0ATQ0AIAdBIGogARCMFiAHLQAgQQRGDQAgBykDICIQQv8Bg0IEUQ0AIAAgEDcCAAwBCyAAQQQ6AAALIAdBMGokAAuyDgIGfwJ+IwBBwAFrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCAABAgMEBQYHAAsgAC0AJA0HDA0LIAAtACQNBwwLCyABIAAoAgQQjBAMDAsgASAAKAIEENgSDAsLIAEgACgCBBDQBgwKCyABLQA6IQMgAUEBOgA6IAEgACgCBCIAQQhqQQQQgRACQCABLQA0QQFHDQAgACgCJCEEIAAoAiAhACABKAIwEPwVIQUgAkGgAWpBGGpBACkDgIWeASIINwMAIAJBoAFqQRBqQQApA/iEngEiCTcDACACQaABakEIaiAINwMAIAJB4ABqQTRqIAFBNGooAgA2AgAgAkHgAGpBCGogCDcDACACQeAAakEQaiAJNwMAIAJB4ABqQRhqIAg3AwAgAiAJNwOgASACIAEpAiw3AowBIAIgCTcDYCABLQA4IQYgAS0APSEHIAIgAS8AOzsAmwEgAkGBAjsAmQEgAkEBOgCIASACIAU2AoQBIAIgATYCgAEgAiAHOgCdASACIAY6AJgBAkAgAEUNACACLQCUAUEBRw0AIAJBADoAmQEgAkHgAGogABCtCyACQQE6AJoBCwJAIAItAJQBQQFHDQAgAi0AmQEhACACQYECOwCZASAEIAJB4ABqEMEBIAJBAToAmgEgAiAAOgCZAQsgAkHgAGoQsAogAkHwAGoQzAoLIAEgAzoAOgwJCyAAKAIEIgAtACxFDQUgAS0ANA0FDAgLIAAoAgQiAC0AUA0CDAMLIAEtADQNBQwGCyABLQA0DQMMBQsgAS0ANEUNBAsCQCAAKAIADQAgASAAQQhqQQAQgRALIAEoAjAQ/BUhAyACQaABakEYakEAKQOAhZ4BIgg3AwAgAkGgAWpBEGpBACkD+ISeASIJNwMAIAJBoAFqQQhqIAg3AwAgAkHgAGpBNGogAUE0aigCADYCACACQeAAakEIaiAINwMAIAJB4ABqQRBqIgUgCTcDACACQeAAakEYaiAINwMAIAIgCTcDoAEgAiABKQIsNwKMASACIAk3A2AgAS0AOCEGIAEtAD0hByACIAEvATo7AZoBIAJBAToAmQEgAkEAOgCIASACIAM2AoQBIAIgATYCgAEgAiAHOgCdASACIAY6AJgBIAJBAToAnAECQCAALQBFQQNGDQAgAEEgaiACQeAAahD4HQsgAkHgAGoQsAogBRDMCgwDCyABIABBABCBECAAKAIoIQUgACgCJCEHIAEoAjAQ/BUhACACQeAAakE0aiABQTRqKAIANgIAIAJB4ABqQQhqQQApA4CFngEiCDcDACACQfAAaiIGQQApA/iEngEiCTcDACACQfgAaiAINwMAIAIgATYCgAEgAiAANgKEASACQQE6AJkBIAJBADoAiAEgAiABKQIsNwKMASACIAk3A2AgAiABKAE6NgGaASACIAEtADg6AJgBIAJB4ABqQQAgBhDAJwJAAkAgBUUNACAHIQEgBSEAA0ACQCABKAIADQACQCABQQhqKQMAIghCA4NCAFINACAIpyIDIAMoAgAiA0EBajYCACADQX9MDQQLIAJB4ABqIAhBABCHBgsgAUEwaiEBIABBf2oiAA0ACyAFQTBsIQAgB0EoaiEBA0ACQCABKAIAIgNFDQAgAkHgAGogAxCAJwsgAUEwaiEBIABBUGoiAA0ACwsgAkHgAGoQsAogBhDMCgwDCwALAkAgACgCICIHKAIUIgNFDQAgBygCECEAIANBDGwhAyABLQA5IQYDQCAAKAIAIQUgAUEBOgA5IAUgARDaASABIAY6ADkgAEEMaiEAIANBdGoiAw0ACwsgASgCMBD8FSEAIAJB4ABqQTRqIAFBNGooAgA2AgAgAkHoAGpBACkDgIWeASIINwMAIAJB8ABqIgNBACkD+ISeASIJNwMAIAJB+ABqIAg3AwAgAiABNgKAASACIAA2AoQBIAJBAToAmQEgAkEBOgCIASACIAEpAiw3AowBIAIgCTcDYCACIAEoATo2AZoBIAIgAS0AODoAmAEgAkHgAGogBxDUBCACQeAAahCwCiADEMwKDAELIAEgAEEIakEAEIEQAkAgACgCICIHKAIIIgNFDQAgBygCBCEAIANBDGwhAyABLQA5IQYDQCAAKAIAIQUgAUEBOgA5IAUgARDaASABIAY6ADkgAEEMaiEAIANBdGoiAw0ACwsgASgCMBD8FSEAIAJB4ABqQTRqIAFBNGooAgA2AgAgAkHoAGpBACkDgIWeASIINwMAIAJB8ABqIgNBACkD+ISeASIJNwMAIAJB+ABqIAg3AwAgAiABNgKAASACIAA2AoQBIAJBAToAiAEgAiABKQIsNwKMASACIAk3A2AgAiABKAE6NgGaASACIAEtADg6AJgBIAJBAToAmQEgAkHgAGogBxCmASACQeAAahCwCiADEMwKCyACQcABaiQAC7oMAg9/BH4jAEEwayICJAACQAJAAkACQAJAIAAoAgwiA0F/Rg0AAkAgAyAAKAIEIgQgBEEBaiIFQQN2IgZBB2wgBEEISRsiBEEBdkkNAAJAAkAgBCADIAQgA0sbIgRBDkkNACAEQf7///8BSw0DQX8gBEEDdEEIakEHbkF/amd2QQFqIQQMAQtBBEEIQRAgBEEHSRsgBEEDSRshBAsgAkEgakEYQQggBBCjEiACKAIkIQcgAigCICIIRQ0FIAIpAighEQJAIAdBCWoiBEUNACAIQf8BIAT8CwALIAIgEUIgiD4CHCACIBGnIgk2AhggAiAHNgIUIAIgCDYCECACQQg2AgxBACEKQQAhBAJAIANFDQAgCEEIaiELIAAoAgAiDEFoaiENIAwpAwBCf4VCgIGChIiQoMCAf4MhEUEAIQQgAyEOIAwhBgNAAkAgEUIAUg0AA0AgBEEIaiEEIAZBCGoiBikDAEKAgYKEiJCgwIB/gyIRQoCBgoSIkKDAgH9RDQALIBFCgIGChIiQoMCAf4UhEQsCQCAIIAcgDUEAIBF6p0EDdiAEaiIFa0EYbGopAwAQ1iAiEqdxIg9qKQAAQoCBgoSIkKDAgH+DIhNCAFINAEEIIRADQCAPIBBqIQ8gEEEIaiEQIAggDyAHcSIPaikAAEKAgYKEiJCgwIB/gyITUA0ACwsgEUJ/fCEUAkAgCCATeqdBA3YgD2ogB3EiD2osAABBAEgNACAIKQMAQoCBgoSIkKDAgH+DeqdBA3YhDwsgFCARgyERIAggD2ogEkIZiKciEDoAACALIA9BeGogB3FqIBA6AAAgCCAPQX9zQRhsaiIPQRBqIAwgBUF/c0EYbGoiBUEQaikAADcAACAPQQhqIAVBCGopAAA3AAAgDyAFKQAANwAAIA5Bf2oiDg0ACyADIQQLIAIgBDYCHCACIAkgBGs2AhgCQANAIApBEEYNASAAIApqIgQoAgAhBiAEIAJBBGogCmpBDGoiCCgCADYCACAIIAY2AgAgCkEEaiEKDAALCyACKAIUIgRFDQQgBCAEQRhsQR9qQXhxIgZqQQlqIgRFDQQgAigCECAGayAEQQgQsxYMBAsgACgCACEEAkAgBiAFQQdxQQBHaiIKRQ0AIAQhBgNAIAYgBikDACIRQn+FQgeIQoGChIiQoMCAAYMgEUL//v379+/fv/8AhHw3AwAgBkEIaiEGIApBf2oiCg0ACwsCQCAFQQhJDQAgBCAFaiAEKQAANwAADAILAkAgBUUNACAEQQhqIAQgBfwKAAALIAUNAUEAIQQMAgsQ5yEAC0EBIQ9BACEIQQAhCgNAIAohBiAPIQoCQCAEIAZqLQAAQYABRw0AIAQgCGohDCAEIAZBf3NBGGxqIQtBACAGa0EYbCEQAkADQCAAKAIEIg8gBCAQakFoaikDABDWICITp3EiByEOAkAgBCAHaikAAEKAgYKEiJCgwIB/gyIRQgBSDQBBCCENIAchDgNAIA4gDWohDiANQQhqIQ0gBCAOIA9xIg5qKQAAQoCBgoSIkKDAgH+DIhFQDQALCwJAIAQgEXqnQQN2IA5qIA9xIg5qLAAAQQBIDQAgBCkDAEKAgYKEiJCgwIB/g3qnQQN2IQ4LAkAgDiAHayAGIAdrcyAPcUEISQ0AIAQgDmoiBy0AACENIAcgE0IZiKciAzoAACAAKAIAIgcgDkF4aiAPcWpBCGogAzoAACANQf8BRg0CQWghDyAEIA5BaGxqIQ0CQANAIA9FDQEgDCAPaiIEKAAAIQcgBCANIA9qIg4oAAA2AAAgDiAHNgAAIA9BBGohDwwACwsgACgCACEEDAELCyAEIAZqIBNCGYinIgc6AAAgACgCACIEIA8gBkF4anFqQQhqIAc6AAAMAQsgByAGakH/AToAACAHIAAoAgQgBkF4anFqQQhqQf8BOgAAIAQgDkF/c0EYbGoiBEEQaiALQRBqKQAANwAAIARBCGogC0EIaikAADcAACAEIAspAAA3AAAgByEECyAIQWhqIQggCiAKIAVJIgZqIQ8gBg0ACyAAKAIEIgQgBEEBakEDdkEHbCAEQQhJGyEECyAAIAQgACgCDGs2AggLQYGAgIB4IQcLIAJBMGokACAHC+4LAhJ/An4jAEGAA2siBSQAIAGtIhdC//////////8/fCAXgCEXAkACQCABQYEgSQ0AIAEQvyQhBgwBCyABIAFBAXZrIgdBwAAgB0HAAEkbIQYLIABBaGohCEEBIQdBACEJQQAhCgNAQQEhC0EAIQwCQCAJIAFPDQAgBUEoaiAJIAAgAUH0mpwBEOYiIAUoAighDQJAAkAgBSgCLCIOIAZJDQBBACEPAkACQCAOQQJJDQACQAJAAkAgDSgCGCIQIA0oAgAiEUcNACANQSRqKAIAIA1BDGooAgBPDQEMAgsgECARSQ0BCyANQSRqIRFBAiEQA0AgDiAQRg0CAkACQCARQQxqKAIAIhIgEUF0aigCACITRw0AIBFBGGooAgAgESgCAEkNBQwBCyASIBNJDQQLIBFBGGohESAQQQFqIRAMAAsLIA1BJGohEUECIRADQEEBIQ8gDiAQRg0BAkACQCARQQxqKAIAIhIgEUF0aigCACITRw0AIBFBGGooAgAgESgCAE8NBAwBCyASIBNPDQMLIBFBGGohESAQQQFqIRAMAAsLIA4hEAsgECAGSQ0AAkAgD0UNACAFQSBqIBAgDSAOQcSanAEQvSRBACERQQAgBSgCJCITQQF2Ig1rIQ8gBSgCICIOIBNBGGxqQWhqIRIDQCAPIBFGDQEgEUF/aiERAkAgE0ECSQ0AIA4gEkEGEIwfIBJBaGohEiAOQRhqIQ4MAQsLIBEgDUHwrpwBEJEVAAsgEEEBdEEBciELDAELAkAgBA0AIA4gBiAOIAZJG0EBdCELDAELIAVBGGogDkEgIA5BIEkbIhAgDSAOQbSanAEQvSQgBSgCGCAFKAIcIAIgA0EAQQAQswEgEEEBdEEBciELCyALQQF2IAlqrSAJrSIYfCAXfiAJIAdBAXZrrSAYfCAXfoV5pyEMCyAIIAlBGGwiEGohFCAAIBBqIRUDQAJAAkACQAJAAkACQAJAIApBAkkNACAFQb4CaiAKQX9qIg1qLQAAIAxPDQELIAVBvgJqIApqIAw6AAAgBUE0aiAKQQJ0aiAHNgIAIAkgAU8NASAKQQFqIQogC0EBdiAJaiEJIAshBwwHCwJAIAVBNGogDUECdGooAgAiCkEBdiIQIAdBAXYiEWoiFiADSw0AIAogB3JBAXFFDQILIAAgCSAWa0EYbGohDwJAIApBAXENACAFQRBqIBAgDyAWQdSanAEQvSQgBSgCECAFKAIUIAIgAxCAJgsCQCAHQQFxDQAgBUEIaiAQIA8gFkHkmpwBEOYiIAUoAgggBSgCDCACIAMQgCYLIApBAkkNBCAHQQJJDQQgAyARIBAgESAQSSIKGyIRSQ0EIA8gEEEYbGoiECAPIAobIQcCQCARQRhsIhFFDQAgAiAHIBH8CgAACyACIBFqIREgCg0CIAIhCgNAIAogEUYNBCAQIBVGDQQCQAJAIBAoAgAiDiAKKAIAIhJGDQAgDiASSyAOIBJJayEODAELIBBBDGooAgAiDiAKQQxqKAIAIhJLIA4gEklrIQ4LIAcgCiAQIA5Bf0oiExsiEikCADcCACAHQRBqIBJBEGopAgA3AgAgB0EIaiASQQhqKQIANwIAIAdBGGohByAKIBNBGGxqIQogECAOQYABcUEHdkEYbGohEAwACwsCQCAHQQFxDQAgACABIAIgAxCAJgsgBUGAA2okAA8LIBZBAXQhByANIQoMAwsgFCEKA0ACQAJAIBFBaGoiECgCACISIAdBaGoiDigCACITRg0AIBIgE0sgEiATSWshBwwBCyARQXRqKAIAIhEgB0F0aigCACIHSyARIAdJayEHCyAKIBAgDiAHQX9KIhIbIhEpAgA3AgAgCkEQaiARQRBqKQIANwIAIApBCGogEUEIaikCADcCACAQIAdBgAFxQQd2QRhsaiERAkAgDiASQRhsaiIHIA9GDQAgCkFoaiEKIBEgAkcNAQsLIAIhCgsgESAKayIQRQ0AIAcgCiAQ/AoAAAsgFkEBdEEBciEHIA0hCgwACwsLrgwCDX8EfiMAQTBrIgMkAAJAAkACQAJAAkAgACgCDCIEIAFqIgEgBEkNAAJAIAEgACgCBCIFIAVBAWoiBkEDdiIHQQdsIAVBCEkbIgVBAXZNDQACQAJAIAVBAWoiBSABIAUgAUsbIgFBD0kNACABQf////8BSw0DQX8gAUEDdEEHbkF/amd2QQFqIQEMAQtBBEEIQRAgAUEISRsgAUEESRshAQsgA0EgakEQQQggARCjEiADKAIkIQggAygCICIJRQ0FIAMpAighEAJAIAhBCWoiAUUNACAJQf8BIAH8CwALIAMgEEIgiD4CHCADIBCnIgo2AhggAyAINgIUIAMgCTYCECADQQg2AgxBACEHQQAhAQJAIARFDQAgCUEIaiELIAAoAgAiBikDAEJ/hUKAgYKEiJCgwIB/gyEQQQAhASAEIQwgBiEFA0ACQCAQQgBSDQADQCABQQhqIQEgBUEIaiIFKQMAQoCBgoSIkKDAgH+DIhBCgIGChIiQoMCAf1ENAAsgEEKAgYKEiJCgwIB/hSEQCwJAIAkgCCAGIBB6p0EDdiABaiINQQR0ayIOQXBqKQMAIA5BeGooAgAQ7B4iEadxIg5qKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQ8DQCAOIA9qIQ4gD0EIaiEPIAkgDiAIcSIOaikAAEKAgYKEiJCgwIB/gyISUA0ACwsgEEJ/fCETAkAgCSASeqdBA3YgDmogCHEiDmosAABBAEgNACAJKQMAQoCBgoSIkKDAgH+DeqdBA3YhDgsgEyAQgyEQIAkgDmogEUIZiKciDzoAACALIA5BeGogCHFqIA86AAAgCSAOQX9zQQR0aiIOQQhqIAYgDUF/c0EEdGoiDUEIaikAADcAACAOIA0pAAA3AAAgDEF/aiIMDQALIAQhAQsgAyABNgIcIAMgCiABazYCGAJAA0AgB0EQRg0BIAAgB2oiASgCACEFIAEgA0EEaiAHakEMaiIJKAIANgIAIAkgBTYCACAHQQRqIQcMAAsLIAMoAhQiAUUNBCABIAFBBHRBF2pBcHEiBWpBCWoiAUUNBCADKAIQIAVrIAFBCBCzFgwECyAAKAIAIQECQCAHIAZBB3FBAEdqIgdFDQAgASEFA0AgBSAFKQMAIhBCf4VCB4hCgYKEiJCgwIABgyAQQv/+/fv379+//wCEfDcDACAFQQhqIQUgB0F/aiIHDQALCwJAIAZBCEkNACABIAZqIAEpAAA3AAAMAgsCQCAGRQ0AIAFBCGogASAG/AoAAAsgBg0BQQAhAQwCCxDnIQALQQEhDkEAIQlBACEHA0AgByEFIA4hBwJAIAEgBWotAABBgAFHDQAgASAJaiEPIAEgBUF/c0EEdGohC0EAIAVrQQR0IQ0CQANAIAAoAgQiDiABIA1qIghBcGopAwAgCEF4aigCABDsHiISp3EiCCEMAkAgASAIaikAAEKAgYKEiJCgwIB/gyIQQgBSDQBBCCEEIAghDANAIAwgBGohDCAEQQhqIQQgASAMIA5xIgxqKQAAQoCBgoSIkKDAgH+DIhBQDQALCwJAIAEgEHqnQQN2IAxqIA5xIgxqLAAAQQBIDQAgASkDAEKAgYKEiJCgwIB/g3qnQQN2IQwLAkAgDCAIayAFIAhrcyAOcUEISQ0AIAEgDGoiCC0AACEEIAggEkIZiKciCjoAACAAKAIAIgggDEF4aiAOcWpBCGogCjoAACAEQf8BRg0CIAEgDEEEdGshBEFwIQECQANAIAFFDQEgDyABaiIOKAAAIQggDiAEIAFqIgwoAAA2AAAgDCAINgAAIAFBBGohAQwACwsgACgCACEBDAELCyABIAVqIBJCGYinIgg6AAAgACgCACIBIA4gBUF4anFqQQhqIAg6AAAMAQsgCCAFakH/AToAACAIIAAoAgQgBUF4anFqQQhqQf8BOgAAIAEgDEF/c0EEdGoiAUEIaiALQQhqKQAANwAAIAEgCykAADcAACAIIQELIAlBcGohCSAHIAcgBkkiBWohDiAFDQALIAAoAgQiASABQQFqQQN2QQdsIAFBCEkbIQELIAAgASAAKAIMazYCCAtBgYCAgHghCAsgA0EwaiQAIAgLuQwCEH8FfiMAQTBrIgIkAAJAAkACQAJAAkAgACgCDCIDQX9GDQACQCADIAAoAgQiBCAEQQFqIgVBA3YiBkEHbCAEQQhJGyIHQQF2SQ0AAkACQCAHIAMgByADSxsiB0EOSQ0AIAdB/v///wFLDQNBfyAHQQN0QQhqQQduQX9qZ3ZBAWohBwwBC0EEQQhBECAHQQdJGyAHQQNJGyEHCyACQSBqIAcQnBAgAigCJCEEIAIoAiAiCEUNBSAAQRBqIQcgAikCKCESAkAgBEEJaiIGRQ0AIAhB/wEgBvwLAAsgAiASQiCIPgIcIAIgEqciCTYCGCACIAQ2AhQgAiAINgIQIAJCjICAgIABNwIIIAIgBzYCBEEAIQpBACEHAkAgA0UNACAIQXRqIQsgCEEIaiEMIAAoAgAiDUF0aiEOIA0pAwBCf4VCgIGChIiQoMCAf4MhEiABKQMIIRMgASkDACEUQQAhByADIQUgDSEGA0ACQCASQgBSDQADQCAHQQhqIQcgBkEIaiIGKQMAQoCBgoSIkKDAgH+DIhJCgIGChIiQoMCAf1ENAAsgEkKAgYKEiJCgwIB/hSESCwJAIAggBCAUIBMgDUEAIBJ6p0EDdiAHaiIPa0EMbGoiAUF0aigCACABQXhqKAIAENMGpyIQcSIBaikAAEKAgYKEiJCgwIB/gyIVQgBSDQBBCCERA0AgASARaiEBIBFBCGohESAIIAEgBHEiAWopAABCgIGChIiQoMCAf4MiFVANAAsLIBJCf3whFgJAIAggFXqnQQN2IAFqIARxIgFqLAAAQQBIDQAgCCkDAEKAgYKEiJCgwIB/g3qnQQN2IQELIBYgEoMhEiAIIAFqIBBBGXYiEDoAACAMIAFBeGogBHFqIBA6AAAgCyABQXRsaiIBQQhqIA4gD0F0bGoiD0EIaigAADYAACABIA8pAAA3AAAgBUF/aiIFDQALIAMhBwsgAiAHNgIcIAIgCSAHazYCGAJAA0AgCkEQRg0BIAAgCmoiBygCACEGIAcgAkEEaiAKakEMaiIBKAIANgIAIAEgBjYCACAKQQRqIQoMAAsLIAJBBGoQuxoMBAsgACgCACEHAkAgBiAFQQdxQQBHaiIKRQ0AIAchBgNAIAYgBikDACISQn+FQgeIQoGChIiQoMCAAYMgEkL//v379+/fv/8AhHw3AwAgBkEIaiEGIApBf2oiCg0ACwsCQCAFQQhJDQAgByAFaiAHKQAANwAADAILAkAgBUUNACAHQQhqIAcgBfwKAAALIAUNAUEAIQcMAgsQ5yEACyABKQMIIRUgASkDACEWQQEhCEEAIQFBACEKA0AgCiEGIAghCgJAIAcgBmotAABBgAFHDQAgByABaiELIAcgBkF0bGpBdGohDEEAIAZrQQxsIQ0CQANAIAQgFiAVIAcgDWoiCEF0aigCACAIQXhqKAIAENMGpyIQcSIIIQ8CQCAHIAhqKQAAQoCBgoSIkKDAgH+DIhJCAFINAEEIIQ4gCCEPA0AgDyAOaiEPIA5BCGohDiAHIA8gBHEiD2opAABCgIGChIiQoMCAf4MiElANAAsLAkAgByASeqdBA3YgD2ogBHEiD2osAABBAEgNACAHKQMAQoCBgoSIkKDAgH+DeqdBA3YhDwsCQCAPIAhrIAYgCGtzIARxQQhJDQAgByAPaiIILQAAIQ4gCCAQQRl2IhA6AAAgACgCACIIIA9BeGogBHFqQQhqIBA6AAAgByAPQXRsaiEQIA5B/wFGDQJBdCEHAkADQCAHRQ0BIAsgB2oiBCgAACEIIAQgECAHaiIPKAAANgAAIA8gCDYAACAHQQRqIQcMAAsLIAAoAgQhBCAAKAIAIQcMAQsLIAcgBmogEEEZdiIIOgAAIAAoAgAiByAEIAZBeGpxakEIaiAIOgAADAELIAAoAgQhBCAIIAZqQf8BOgAAIAggBCAGQXhqcWpBCGpB/wE6AAAgEEF0aiIHQQhqIAxBCGooAAA2AAAgByAMKQAANwAAIAghBwsgAUF0aiEBIAogCiAFSSIGaiEIIAYNAAsgACgCBCIHIAdBAWpBA3ZBB2wgB0EISRshBwsgACAHIAAoAgxrNgIIC0GBgICAeCEECyACQTBqJAAgBAu5DAIQfwV+IwBBMGsiAiQAAkACQAJAAkACQCAAKAIMIgNBf0YNAAJAIAMgACgCBCIEIARBAWoiBUEDdiIGQQdsIARBCEkbIgdBAXZJDQACQAJAIAcgAyAHIANLGyIHQQ5JDQAgB0H+////AUsNA0F/IAdBA3RBCGpBB25Bf2pndkEBaiEHDAELQQRBCEEQIAdBB0kbIAdBA0kbIQcLIAJBIGogBxCcECACKAIkIQQgAigCICIIRQ0FIABBEGohByACKQIoIRICQCAEQQlqIgZFDQAgCEH/ASAG/AsACyACIBJCIIg+AhwgAiASpyIJNgIYIAIgBDYCFCACIAg2AhAgAkKMgICAgAE3AgggAiAHNgIEQQAhCkEAIQcCQCADRQ0AIAhBdGohCyAIQQhqIQwgACgCACINQXRqIQ4gDSkDAEJ/hUKAgYKEiJCgwIB/gyESIAEpAwghEyABKQMAIRRBACEHIAMhBSANIQYDQAJAIBJCAFINAANAIAdBCGohByAGQQhqIgYpAwBCgIGChIiQoMCAf4MiEkKAgYKEiJCgwIB/UQ0ACyASQoCBgoSIkKDAgH+FIRILAkAgCCAEIBQgEyANQQAgEnqnQQN2IAdqIg9rQQxsaiIBQXRqKAIAIAFBeGooAgAQ1AanIhBxIgFqKQAAQoCBgoSIkKDAgH+DIhVCAFINAEEIIREDQCABIBFqIQEgEUEIaiERIAggASAEcSIBaikAAEKAgYKEiJCgwIB/gyIVUA0ACwsgEkJ/fCEWAkAgCCAVeqdBA3YgAWogBHEiAWosAABBAEgNACAIKQMAQoCBgoSIkKDAgH+DeqdBA3YhAQsgFiASgyESIAggAWogEEEZdiIQOgAAIAwgAUF4aiAEcWogEDoAACALIAFBdGxqIgFBCGogDiAPQXRsaiIPQQhqKAAANgAAIAEgDykAADcAACAFQX9qIgUNAAsgAyEHCyACIAc2AhwgAiAJIAdrNgIYAkADQCAKQRBGDQEgACAKaiIHKAIAIQYgByACQQRqIApqQQxqIgEoAgA2AgAgASAGNgIAIApBBGohCgwACwsgAkEEahC7GgwECyAAKAIAIQcCQCAGIAVBB3FBAEdqIgpFDQAgByEGA0AgBiAGKQMAIhJCf4VCB4hCgYKEiJCgwIABgyASQv/+/fv379+//wCEfDcDACAGQQhqIQYgCkF/aiIKDQALCwJAIAVBCEkNACAHIAVqIAcpAAA3AAAMAgsCQCAFRQ0AIAdBCGogByAF/AoAAAsgBQ0BQQAhBwwCCxDnIQALIAEpAwghFSABKQMAIRZBASEIQQAhAUEAIQoDQCAKIQYgCCEKAkAgByAGai0AAEGAAUcNACAHIAFqIQsgByAGQXRsakF0aiEMQQAgBmtBDGwhDQJAA0AgBCAWIBUgByANaiIIQXRqKAIAIAhBeGooAgAQ1AanIhBxIgghDwJAIAcgCGopAABCgIGChIiQoMCAf4MiEkIAUg0AQQghDiAIIQ8DQCAPIA5qIQ8gDkEIaiEOIAcgDyAEcSIPaikAAEKAgYKEiJCgwIB/gyISUA0ACwsCQCAHIBJ6p0EDdiAPaiAEcSIPaiwAAEEASA0AIAcpAwBCgIGChIiQoMCAf4N6p0EDdiEPCwJAIA8gCGsgBiAIa3MgBHFBCEkNACAHIA9qIggtAAAhDiAIIBBBGXYiEDoAACAAKAIAIgggD0F4aiAEcWpBCGogEDoAACAHIA9BdGxqIRAgDkH/AUYNAkF0IQcCQANAIAdFDQEgCyAHaiIEKAAAIQggBCAQIAdqIg8oAAA2AAAgDyAINgAAIAdBBGohBwwACwsgACgCBCEEIAAoAgAhBwwBCwsgByAGaiAQQRl2Igg6AAAgACgCACIHIAQgBkF4anFqQQhqIAg6AAAMAQsgACgCBCEEIAggBmpB/wE6AAAgCCAEIAZBeGpxakEIakH/AToAACAQQXRqIgdBCGogDEEIaigAADYAACAHIAwpAAA3AAAgCCEHCyABQXRqIQEgCiAKIAVJIgZqIQggBg0ACyAAKAIEIgcgB0EBakEDdkEHbCAHQQhJGyEHCyAAIAcgACgCDGs2AggLQYGAgIB4IQQLIAJBMGokACAEC9oNAQd/IwBB0AJrIgIkACABKALYASEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABIgRBdWoOCAgHBQYKCgoBAAsgBEFjakECSQ0BAkAgBEGUf2oOAwQKAwALIARBzABGDQggBEHVAEcNCUEGIQRBASEFDAoLAkAgAS8BkAFBgcAAcSIFQYDAAEcNACABEKELAkACQCABLQDgAUHRAEcNACABEKELIAFBxOCbARCGDSIFRQ0BQQEhBgwOCwJAIAEvAZABQYDgAHFBgOAARw0AIAEoAtQBIQUgAkG5gYCAeDYCqAIgASADIAUgAkGoAmoQ3iMLAkACQCABKAKIASIFQYAgcQ0AIAEgBUGAIHI2AogBIAJBKGogARDGEiACKAIoIQUgASABKAKIAUH/X3E2AogBIAIoAiwhBAwBCyACQTBqIAEQxhIgAigCNCEEIAIoAjAhBQtBASEGAkAgBUEBcUUNACAEIQUMDgsgAiAENgKAAgJAAkACQCABLQDgAUETRg0AIAEoAtwBIQUgASgC2AEhBCACQYQCaiABENQmIAJBATYCrAIgAkGcv5wBNgKoAiACQgE3ArQCIAJBswc2AsQCIAJBEzoAzwIgAiACQcACajYCsAIgAiACQcgCajYCwAIgAiACQc8CajYCyAIgAkGQAmogAkGoAmoQ/RogAkGkAmogAkGMAmooAgA2AgAgAiACKQKEAjcCnAIgBCAFIAJBkAJqEOAaIQUgAS0A4AFBogFHDQEgASABEJosEKcXDAELIAEQoQsgAkEgaiABEJQCIAIoAiQhByACKAIgQQFxRQ0BIAchBQsgAkGAAmoQ+AYMDgsgASgC1AEhAUEIQcAAEKAsIgVFDQ4gBSABNgIQIAUgAzYCDCAFIAQ2AgggBSAHNgIEIAVBKTYCAAwMCyACQRhqIAEQlAJBASEGIAIoAhwhBSACKAIYQQFxDQwgASgC1AEhBkEIQcAAEKAsIgFFDQ0gASAGNgIMIAEgAzYCCCABIAU2AgQgAUEqNgIAQQAhBiABIQUMDAsgBUUNCCABENgJIgVFDQgCQAJAIAUtAAAiBkG1f2oiBUEfSw0AQQEgBXRBgYCCkHhxDQELIAZBjX9qQf8BcUEuSQ0AIAZBE0YNACAGQbR/akH/AXFBJ0kNACAGQVtqIgVBEksNCUEBIAV0QYOAGnFFDQkLQQEhBiACQeAAaiABQQEQ+RsCQAJAAkAgAigC8AFBgICAgHhqDgICAAELIAIoAmAhBQwNC0EALQCg8Z4BGkGgARB9IgFFDQ0CQEGgAUUNACABIAJB4ABqQaAB/AoAAAtBACEGQQAtAKDxngEaQcAAEH0iBUUNDSAFIAE2AgQgBUEnNgIADAwLQQAtAKDxngEaQcAAEH0iBUUNDCAFQSg2AgBBJEUNCiAFQQRqIAJB4ABqQST8CgAADAoLIAEQoQsgAkHAAGogARCUAkEBIQYgAigCRCEHAkAgAigCQEEBcUUNACAHIQUMCwsgAkE4aiAHEMkDIAIoAjwhCEEAIQYgASAHQQAQ2glBCEHAABCgLCIFRQ0LIAVBAToAESAFIAc2AgwgBSADNgIEIAVBETYCACAFIARBHUc6ABAgBSAINgIIDAoLQQUhBEEAIQUMBwtBBCEEQQAhBQwGC0EBIQRBACEFDAULQQAhBUEAIQQMBAtBAyEEQQAhBQwDC0ECIQRBACEFDAILIAJByABqIAFBACACEKwGIAIoAkwhBSACKAJIIQYMAwsgAkEQaiABEJkCQQEhBiACKAIUIQUgAigCEEEBcQ0CIAUoAgBBHkYNASABLQDhAQ0BIAEtAOABIgRBY2pB/wFxQQJPDQFBACEGIAEgBUEAENoJIAEQoQsgAkEIaiAFEMkDIAEoAtQBIQMgAigCCCEHQQhBwAAQoCwiAUUNAyABQQA6ABEgASAFNgIMIAEgAzYCCCABIAc2AgQgAUERNgIAIAEgBEH/AXFBHUc6ABAgASEFDAILIAEQoQsgASgC2AEhByACQdgAaiABEJQCIAIoAlwhBgJAIAIoAlhBAXFFDQAgASAGEKcXQQhBwAAQoCwiBkUNAyAGIAdBf2oiBzYCCCAGIAc2AgQgBkExNgIACwJAIAVFDQAgBigCAEEaRw0AIAYoAhQhBSAGKAIQIQcgAkGHgYCAeDYCqAIgASAHIAUgAkGoAmoQzg4LIAJB0ABqIAYQyQMgAigCVCEBQQhBwAAQoCwiBUUNAiAFIAQ6ABAgBSADNgIIIAUgBjYCBCAFQRA2AgAgBSABNgIMC0EAIQYLIAAgBjYCACAAIAU2AgQgAkHQAmokAA8LAAueDAIOfwR+IwBBMGsiAyQAAkACQAJAAkACQCAAKAIMIgQgAWoiASAESQ0AAkAgASAAKAIEIgUgBUEBaiIGQQN2IgdBB2wgBUEISRsiBUEBdk0NAAJAAkAgBUEBaiIFIAEgBSABSxsiAUEPSQ0AIAFB/////wFLDQNBfyABQQN0QQduQX9qZ3ZBAWohAQwBC0EEQQhBECABQQhJGyABQQRJGyEBCyADQSBqQRBBCCABEKMSIAMoAiQhCCADKAIgIglFDQUgAykCKCERAkAgCEEJaiIBRQ0AIAlB/wEgAfwLAAsgAyARQiCIPgIcIAMgEaciCjYCGCADIAg2AhQgAyAJNgIQIANBCDYCDEEAIQdBACEBAkAgBEUNACAJQQhqIQsgACgCACIMQXBqIQ0gDCkDAEJ/hUKAgYKEiJCgwIB/gyERQQAhASAEIQYgDCEFA0ACQCARQgBSDQADQCABQQhqIQEgBUEIaiIFKQMAQoCBgoSIkKDAgH+DIhFCgIGChIiQoMCAf1ENAAsgEUKAgYKEiJCgwIB/hSERCwJAIAkgCCANIBF6p0EDdiABaiIOQQR0aykDABDWICISp3EiD2opAABCgIGChIiQoMCAf4MiE0IAUg0AQQghEANAIA8gEGohDyAQQQhqIRAgCSAPIAhxIg9qKQAAQoCBgoSIkKDAgH+DIhNQDQALCyARQn98IRQCQCAJIBN6p0EDdiAPaiAIcSIPaiwAAEEASA0AIAkpAwBCgIGChIiQoMCAf4N6p0EDdiEPCyAUIBGDIREgCSAPaiASQhmIpyIQOgAAIAsgD0F4aiAIcWogEDoAACAJIA9Bf3NBBHRqIg9BCGogDCAOQX9zQQR0aiIOQQhqKQAANwAAIA8gDikAADcAACAGQX9qIgYNAAsgBCEBCyADIAE2AhwgAyAKIAFrNgIYAkADQCAHQRBGDQEgACAHaiIBKAIAIQUgASADQQRqIAdqQQxqIgkoAgA2AgAgCSAFNgIAIAdBBGohBwwACwsgAygCFCIBRQ0EIAEgAUEEdEEXakFwcSIFakEJaiIBRQ0EIAMoAhAgBWsgAUEIELMWDAQLIAAoAgAhAQJAIAcgBkEHcUEAR2oiB0UNACABIQUDQCAFIAUpAwAiEUJ/hUIHiEKBgoSIkKDAgAGDIBFC//79+/fv37//AIR8NwMAIAVBCGohBSAHQX9qIgcNAAsLAkAgBkEISQ0AIAEgBmogASkAADcAAAwCCwJAIAZFDQAgAUEIaiABIAb8CgAACyAGDQFBACEBDAILEOchAAtBASEPQQAhCUEAIQcDQCAHIQUgDyEHAkAgASAFai0AAEGAAUcNACABIAlqIQwgASAFQX9zQQR0aiELQQAgBWtBBHQhEAJAA0AgACgCBCIPIAEgEGpBcGopAwAQ1iAiE6dxIgghDgJAIAEgCGopAABCgIGChIiQoMCAf4MiEUIAUg0AQQghDSAIIQ4DQCAOIA1qIQ4gDUEIaiENIAEgDiAPcSIOaikAAEKAgYKEiJCgwIB/gyIRUA0ACwsCQCABIBF6p0EDdiAOaiAPcSIOaiwAAEEASA0AIAEpAwBCgIGChIiQoMCAf4N6p0EDdiEOCwJAIA4gCGsgBSAIa3MgD3FBCEkNACABIA5qIggtAAAhDSAIIBNCGYinIgQ6AAAgACgCACIIIA5BeGogD3FqQQhqIAQ6AAAgDUH/AUYNAiABIA5BBHRrIQ1BcCEBAkADQCABRQ0BIAwgAWoiDygAACEIIA8gDSABaiIOKAAANgAAIA4gCDYAACABQQRqIQEMAAsLIAAoAgAhAQwBCwsgASAFaiATQhmIpyIIOgAAIAAoAgAiASAPIAVBeGpxakEIaiAIOgAADAELIAggBWpB/wE6AAAgCCAAKAIEIAVBeGpxakEIakH/AToAACABIA5Bf3NBBHRqIgFBCGogC0EIaikAADcAACABIAspAAA3AAAgCCEBCyAJQXBqIQkgByAHIAZJIgVqIQ8gBQ0ACyAAKAIEIgEgAUEBakEDdkEHbCABQQhJGyEBCyAAIAEgACgCDGs2AggLQYGAgIB4IQgLIANBMGokACAIC5QNAgt/AX4jAEHwAGsiBiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADKAIAQX9qQQJJDQAgBiADLQAYIgc6AEQgBiADKAIUIgg2AkAgBiADKAIQNgI8IAYgAygCDCIJNgI4IAYgAygCCCIKNgI0IAZBATYCLCABLQCsDUEBRg0EAkAgASkDAEIChSABKQMIhFANACACKALIBEECRg0GIAFBkAVqIQsgAkGYA2ohDAJAAkAgASgCkAoiDS0A4gINACAGQcgAaiALIAwgBkEsahBtIAYoAkgiDkECRw0BDBQLIA0tAOMCIQ8gBkHIAGogCyAMIAZBLGoQbSAGKAJIIg5BAkYNEyAOQQFxRQ0SIAYoAlAhECAGKAJMIQ0gD0EBcUUNBCAGQeAAaiAGQSxqIA0gECAQIAsgDBDpBiAGKAJgIg5BAkcNAyAGKAJkIQ0MFAsgDkEBcUUNESAGKAJQIRAgBigCTCENDAMLIAZBATYCTCAGQcydgwE2AkggBkIANwJUIAYgBkHsAGo2AlAgBkHIAGpB1J2DARDpIwALAkAgBSABKAKkDSgCxAJBEGooAgBBAXRLDQAgAS0ArA1BAUYNBiABKQMAQgKFIAEpAwiEUA0IIAIoAsgEQQJGDQcgBkEsaiABIAJB2AFqIAMQhQQCQCAGKAIsIg1BAkcNACAGKAIwENMTGiAGQcgAaiABIAIgAxDOBAwQCyAGIAYpAjQ3AlAgBiAGKAIwNgJMIAYgDTYCSAwPCyABKALkCkEDRw0CIAEtAKwNDQ0CQAJAIAEpAwBCAoUgASkDCIRQDQAgAigCyARBAkYNCiAGQSxqIAEgAkHYAWogAxCFBCAGKAIsIg1BAkcNASAGKAIwENMTGgsgBiABIAIgAyAEIAUQxwYgBigCBCENIAYoAgAhAQwTCyANQQFxRQ0PIAYoAjghDCAGKAIwIQ0gAy0AGCEOIAMoAgwhCyADKAIIIQggBiAGKAI0IgM2AmQgBiANNgJgIA0gA0EBaksNCSADIAtLDQkgBiAOOgBEIAYgAzYCQCAGIA02AjwgBiALNgI4IAYgCDYCNCAGIAw2AjAgBkECNgIsIAZBCGogASACIAZBLGogBCAFEMcGQQEhASAGKAIIQQFxRQ0KIAYoAgwhDQwSCyAGKAJoIRAgBigCZCENCyAOQQFxRQ0NAkAgBSABKAKkDSgCxAJBEGooAgBBAXRLDQAgECAISw0KIA1BAXQiAUEBciEDAkAgASAFTw0AIAQgAUECdGogEEEBajYCAAsCQCADIAVPDQAgBCADQQJ0aiAIQQFqNgIAC0EBIQEMEQsgBiAQNgJgIAYgCDYCZCAIIAlLDQogECAIQQFqSw0KIAYgBzoARCAGIAg2AkAgBiAQNgI8IAYgCTYCOCAGIAo2AjQgBiANNgIwIAZBAjYCLCAGQSBqIAEgAiAGQSxqIAQgBRDHBiAGKAIkIQ0gBigCICEBDBALIAZBEGogASACIAMgBCAFEMcGIAYoAhQhDSAGKAIQIQEMDwtBoKacAUEoQZSjgwEQ0h4AC0G0ooMBENIsAAtBoKacAUEoQeSigwEQ0h4AC0GEooMBENIsAAsgBkHIAGogASACIAMQzgQMBgtBhKKDARDSLAALIAZBAjYCMCAGQeDomwE2AiwgBkICNwI4IAZBCzYCVCAGQZIBNgJMIAYgCzYCbCAGIAZByABqNgI0IAYgBkHsAGo2AlAgBiAGQeAAajYCSCAGQSxqQfDomwEQ6SMAC0HcnIMBQRNB8JyDARCyFwALIAZBADYCPCAGQQE2AjAgBkH8lIQBNgIsIAZCBDcCNCAGQSxqQdSkgwEQ6SMACyAGQQI2AjAgBkHg6JsBNgIsIAZCAjcCOCAGQQs2AlQgBkGSATYCTCAGIAk2AmwgBiAGQcgAajYCNCAGIAZB7ABqNgJQIAYgBkHgAGo2AkggBkEsakHw6JsBEOkjAAtBoKacAUEoQeSigwEQ0h4ACyAGKAJIRQ0AQQEhASAGKAJUIg1BAXQiA0EBciECIAYpAkwhEQJAIAMgBU8NACAEIANBAnRqIBGnQQFqNgIACyACIAVPDQNBASEBIAQgAkECdGogEUIgiKdBAWo2AgAMAwtBACEBDAILIAYoAkwhDQsgDRDTExogBkEYaiABIAIgAyAEIAUQxwYgBigCHCENIAYoAhghAQsgACABNgIAIAAgDTYCBCAGQfAAaiQAC60OAQJ/IwBBMGsiAiQAIAEoAgQhAyABKAIAIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4iAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gIQALIAJBAjYCHCACQYjshwE2AhggAkIBNwIkIAJBCzYCFCACQaS/nAE2AhAgAiACQRBqNgIgIAEgAyACQRhqEJUpIQEMIQsgAkEANgIoIAJBATYCHCACQcjshwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMIAsgAkEANgIoIAJBATYCHCACQYzthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHwsgAkEANgIoIAJBATYCHCACQcDthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHgsgAkEANgIoIAJBATYCHCACQeDthwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHQsgAkEANgIoIAJBATYCHCACQYDuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMHAsgAkEANgIoIAJBATYCHCACQaDuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGwsgAkEANgIoIAJBATYCHCACQcTuhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGgsgAkEANgIoIAJBATYCHCACQYDvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGQsgAkEANgIoIAJBATYCHCACQaTvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMGAsgAkEANgIoIAJBATYCHCACQezvhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFwsgAkEANgIoIAJBATYCHCACQZDwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFgsgAkEANgIoIAJBATYCHCACQbjwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFQsgAkEANgIoIAJBATYCHCACQdDwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMFAsgAkEANgIoIAJBATYCHCACQfjwhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEwsgAkEANgIoIAJBATYCHCACQaTxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEgsgAkEANgIoIAJBATYCHCACQcDxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEQsgAkEANgIoIAJBATYCHCACQeTxhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMEAsgAkEANgIoIAJBATYCHCACQYTyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDwsgAkEANgIoIAJBATYCHCACQazyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDgsgAkEANgIoIAJBATYCHCACQdDyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDQsgAkEANgIoIAJBATYCHCACQejyhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMDAsgAkEANgIoIAJBATYCHCACQYDzhwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCwsgAiAAQQRqKAIANgIMIAJBAjYCHCACQcTzhwE2AhggAkIBNwIkIAJBCzYCFCACIAJBEGo2AiAgAiACQQxqNgIQIAEgAyACQRhqEJUpIQEMCgsgAkEANgIoIAJBATYCHCACQZD0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCQsgAkEANgIoIAJBATYCHCACQcj0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMCAsgAkEANgIoIAJBATYCHCACQez0hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBwsgAkEANgIoIAJBATYCHCACQZz1hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBgsgAkEANgIoIAJBATYCHCACQfj1hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBQsgAkEANgIoIAJBATYCHCACQeT2hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMBAsgAkEANgIoIAJBATYCHCACQfD3hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAwsgAkEANgIoIAJBATYCHCACQZj4hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAgsgAkEANgIoIAJBATYCHCACQcD4hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQEMAQsgAkEANgIoIAJBATYCHCACQYz5hwE2AhggAkIENwIgIAEgAyACQRhqEJUpIQELIAJBMGokACABC6YNAgl/AX4jAEHgAWsiAyQAIANCBDcCNCADQgA3AiwgA0KAgICAwAA3AiQgA0EANgJAIAMgATYCPCADQaABakEIaiEEIANBoAFqQQRqIQUgA0HUAGpBBGohBiADQTBqIQcCQANAIAJBBGoiASgCACEIQdgAIQkCQAJAAkACQAJAIAIoAgAODAQEBAQEBAQDAAECAgQLQSghCQwCC0EwIQkMAQtBDCEJCyADQaABaiADQTxqIAggCWoQ7QogAygCoAEiCUEiRg0AAkBBPEUNACAAQQRqIANBoAFqQQRqQTz8CgAACyAAIAk2AgAMAgsgASgCACEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBeWoOBQAFAQYECAsgASABKAIAQYiAxABGIglBAnRqIQEDQAJAAkAgCUEBcUUNACADQaABaiADQTxqIAFBCGoQ7QogAygCoAEiCEEiRg0BIAMpAqwBIQwgAygCqAEhASADKAKkASEJQSxFDQ0gA0HkAGogA0G0AWpBLPwKAAAMDQsCQAJAAkAgASgCAEGAgLx/aiIIQQIgCEEISRsOCAMDAwMDAwABAwsgASgCBEHYAGohCAwBCyABQRBqIQgLIANBoAFqIANBPGogCBDtCiADKAKgASIIQSJGDQAgAykCrAEhDCADKAKoASEBIAMoAqQBIQlBLEUNDCADQeQAaiADQbQBakEs/AoAAAwMCyADQZABaiAJIAEQqw4CQCADKAKQAUEERg0AIAQgAykCkAE3AgAgBEEIaiADQZABakEIaikCADcCACADQQhqIANBkAFqEKAUIAMgATYCpAEgAyAJNgKgASADKAIMIQEgAygCCCEJIAcgA0GgAWpBlIGIARDBFwwBCyADQaABaiAJIAEgA0E8ahCSJQJAIAMoAqABIghBIkYNACADKQKsASEMIAMoAqgBIQEgAygCpAEhCUEsRQ0MIANB5ABqIANBtAFqQSz8CgAADAwLIAMoAjQgAygCOCIJQRhsakFoaiEBA0ACQCAJDQBBACEBDAULIAEoAgAiCEECRg0DIAlBf2ohCSABQQRqKAIAIQogA0GQAWogAUEIahDDEwJAIAMoApABQQRGDQAgAyAJNgI4IARBCGogA0GQAWpBCGopAgA3AgAgBCADKQKQATcCACADIANBkAFqEKAUIAMgCjYCpAEgAyAINgKgASADKAIEIQEgAygC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IQoLIAJBCGpBACkDgIWeASINNwMAIAJBGGogDTcDACACQQApA/iEngEiDTcDACACIA03AxAgBkE4bCEDIAJBEGohCQNAAkACQCAAKAIAQQlHDQAgAEEIaiACEP0DDAELIAAgAhD7AgsgAEE4aiEAIANBSGoiAw0ACwsCQCAFKAIIIghFDQBBACEAIAVBADYCCEEAIQMCQAJAA0ACQCAFKAIEIABqIgQoAgBBBkcNACAEQQRqKAIAIgctAEENAiAHLQBADQAgAkEgaiAHKQMoIAdBOGooAgAQuR8gAiACQSBqELUMIQcCQCACKQMgIg1CA4NCAFINACANpyIGIAYoAgAiC0F/ajYCACALQQFHDQAgBiAGKAIQEMYkCyAHRQ0CCyAAQThqIQAgCCADQQFqIgNHDQALQQAhBgwBCyAEEPEFQQEhBiADQQFqIAhGDQAgAEE4aiEEIANBf3MgCGohB0EBIQYDQAJAAkACQCAFKAIEIgMgBGoiACgCAEEGRw0AIABBBGooAgAiCy0AQQ0BIAstAEANACACQSBqIAspAyggC0E4aigCABC5HyACIAJBIGoQtQwhAwJAIAIpAyAiDUIDg0IAUg0AIA2nIgsgCygCACIMQX9qNgIAIAxBAUcNACALIAsoAhAQxiQLIANFDQEgBSgCBCEDCyADIAZBSGxqIARqIgMgACkDADcDACADQTBqIABBMGopAwA3AwAgA0EoaiAAQShqKQMANwMAIANBIGogAEEgaikDADcDACADQRhqIABBGGopAwA3AwAgA0EQaiAAQRBqKQMANwMAIANBCGogAEEIaikDADcDAAwBCyAAEPEFIAZBAWohBgsgBEE4aiEEIAdBf2oiBw0ACwsgBSAIIAZrNgIICyACELQKIAkQuwwgCg0BIAUoAgghBiAFKAIEIQALIAZFDQAgBkE4bCEFQQAhBANAAkAgACAEaiIDKAIAQQlHDQAgA0EIaigCAEERRw0AIANBEGooAgBBB0cNACADQRRqKAIALQBFQQNGDQAgAyABEKALCyAFIARBOGoiBEcNAAsLIAJBMGokAAvWDQICfwF+IwBB4ABrIgIkAAJAAkACQAJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQXRqDiUAExMEExMTEwEIEwkTEwUMExMTAhMTExMTExMTExMTExMTExMDEwsgAkEIakEEQQFBARCVDyACKAIMIQMgAigCCEEBRg0PIAIoAhAhASAAQQQ2AgggACABNgIEIAAgAzYCACABQfTQpZsHNgAADBMLIAEoAggOAwQRBQQLIAEtABxBAkcNAgwQCyABKAIEIgEoAgAiA0EDRg0GIAMOAwoJCwoLIAEtABxBAkYNDgsgAkEANgIoIAJCgICAgBA3AiAgAkH8rZsBNgIMIAJCoICAgA43AhAgAiACQSBqNgIIIAFBCGogAkEIahDrIg0LIAAgAikCIDcCACAAQQhqIAJBIGpBCGooAgA2AgAMDgsgAkHQAGogASgCKBChAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQayumwE2AgggAkICNwIUIAJBzAStQiCGIAFBEGqthDcDKCACQaAHrUIghiACQcAAaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQ7QkgAigCQCACKAJEENgsDA0LIAJBCGogASgCKBChAgJAAkAgAigCCEGAgICAeEYNACACQTBqQQhqIAJBCGpBCGooAgA2AgAgAiACKQIINwMwDAELIAJBADYCOCACQoCAgIAQNwMwCyACQdAAaiABKAIMEKECAkACQCACKAJQQYCAgIB4Rg0AIAJBwABqQQhqIAJB0ABqQQhqKAIANgIAIAIgAikCUDcDQAwBCyACQQA2AkggAkKAgICAEDcDQAsgAkECNgIMIAJBrK6bATYCCCACQgI3AhQgAkGgB61CIIYiBCACQcAAaq2ENwMoIAIgBCACQTBqrYQ3AyAgAiACQSBqNgIQIAAgAkEIahDtCSACKAJAIAIoAkQQ2CwgAigCMCACKAI0ENgsDAwLAkAgASgCCA0AIAJBATYCDCACQcSumwE2AgggAkIBNwIUIAJBzAStQiCGIAFBEGqthDcDICACIAJBIGo2AhAgACACQQhqEO0JDAwLIAJBIGogASgCDBChAgJAAkAgAigCIEGAgICAeEYNACACQdAAakEIaiACQSBqQQhqKAIANgIAIAIgAikCIDcDUAwBCyACQQA2AlggAkKAgICAEDcDUAsgAkEBNgIMIAJBxK6bATYCCCACQgE3AhQgAkGgB61CIIYgAkHQAGqthDcDQCACIAJBwABqNgIQIAAgAkEIahDtCSACKAJQIAIoAlQQ2CwMCwsgAS0AGEEFRw0JCyABKAIQIQEMAAsLIAEoAggNBiACQQA2AiggAkKAgICAEDcCICACQfytmwE2AgwgAkKggICADjcCECACIAJBIGo2AgggAUEQaiACQQhqEOsiDQUgACACKQIgNwIAIABBCGogAkEgakEIaigCADYCAAwHCyAAQYCAgIB4NgIADAYLIAJB0ABqIAEoAiAQoQICQAJAIAIoAlBBgICAgHhGDQAgAkHAAGpBCGogAkHQAGpBCGooAgA2AgAgAiACKQJQNwNADAELIAJBADYCSCACQoCAgIAQNwNACyACQQI2AgwgAkGsrpsBNgIIIAJCAjcCFCACQcwErUIghiABQQhqrYQ3AyggAkGgB61CIIYgAkHAAGqthDcDICACIAJBIGo2AhAgACACQQhqEO0JIAIoAkAgAigCRBDYLAwFCyACQQhqIAEoAiAQoQICQAJAIAIoAghBgICAgHhGDQAgAkEwakEIaiACQQhqQQhqKAIANgIAIAIgAikCCDcDMAwBCyACQQA2AjggAkKAgICAEDcDMAsgAkHQAGogASgCBBChAgJAAkAgAigCUEGAgICAeEYNACACQcAAakEIaiACQdAAakEIaigCADYCACACIAIpAlA3A0AMAQsgAkEANgJIIAJCgICAgBA3A0ALIAJBAjYCDCACQayumwE2AgggAkICNwIUIAJBoAetQiCGIgQgAkHAAGqthDcDKCACIAQgAkEwaq2ENwMgIAIgAkEgajYCECAAIAJBCGoQ7QkgAigCQCACKAJEENgsIAIoAjAgAigCNBDYLAwECyADIAIoAhBBwLycARCOKQALQYysnAFBNyACQdAAakGUrpsBQZCtnAEQ6hIAC0GMrJwBQTcgAkHQAGpBlK6bAUGQrZwBEOoSAAsgAEGAgICAeDYCAAsgAkHgAGokAAuHDAINfwJ+IwBBwABrIgQkAAJAA0ACQAJAAkACQCABQSFJDQACQCADDQAgACABEJsHDAILIAAgAUEDdiIFQcQBbGohBiAAIAVB8ABsaiEHAkACQCABQcAASQ0AIAAgByAGIAUQ9QwhBQwBCyAAIQUgACgCBCIIIAcoAgQiCUkgACgCACIKIAcoAgAiC0kgCiALRhsiDCAIIAYoAgQiDUkgCiAGKAIAIghJIAogCEYbRw0AIAYgByAMIAkgDUkgCyAISSALIAhGG3MbIQULIANBf2ohAyAFIABrIgdBHG4hBQJAIAJFDQAgAigCBCAAIAdqIgYoAgRJIAIoAgAiCiAGKAIAIgtJIAogC0YbQQFHDQQLIAUgAUkNAgwFCyAAIAEQwQMLIARBwABqJAAPCyAEQSBqQRhqIgsgAEEYaiIMKAIANgIAIARBIGpBEGoiCCAAQRBqIg0pAgA3AwAgBEEgakEIaiIJIABBCGoiDikCADcDACAEIAApAgA3AyAgACAHaiIGQQhqIgcpAgAhESAGQRBqIgUpAgAhEiAGQRhqIgooAgAhDyAAIAYpAgA3AgAgDCAPNgIAIA0gEjcCACAOIBE3AgAgCiALKAIANgIAIAUgCCkDADcCACAHIAkpAwA3AgAgBiAEKQMgNwIAIAsgAEE0aigCADYCACAIIABBLGopAgA3AwAgCSAAQSRqKQIANwMAIAQgACkCHDcDICAEQQA2AhwgBCAAQThqIgY2AhggBCAAQRxqIgc2AhAgACABQRxsIg9qIQogBCAEQSBqNgIUIABBBGohBQJAA0ACQCAGIApJDQAgByAPakFkaiEKA0AgBiAKRg0DIAAoAgAgBSgCACAHIARBEGoQ6wwgBCgCGCEGDAALCyAAKAIAIAUoAgAgByAEQRBqEOsMIAQoAhghBgwACwsgBCAEKAIUNgIYIAAoAgAgBSgCACAHIARBEGoQ6wwgBCgCHCIHIAFPDQIgCyAMKAIANgIAIAggDSkCADcDACAJIA4pAgA3AwAgBCAAKQIANwMgIAAgB0EcbGoiBkEIaiIFKQIAIREgBkEQaiIKKQIAIRIgBkEYaiIPKAIAIRAgACAGKQIANwIAIAwgEDYCACANIBI3AgAgDiARNwIAIA8gCygCADYCACAKIAgpAwA3AgAgBSAJKQMANwIAIAYgBCkDIDcCACAAIAcgAiADEKICIAEgB0F/c2ohASAGQRxqIQAgBiECDAELIARBIGpBGGoiCiAAQRhqIggoAgA2AgAgBEEgakEQaiICIABBEGoiCSkCADcDACAEQSBqQQhqIgsgAEEIaiIMKQIANwMAIAQgACkCADcDICAGQQhqIgcpAgAhESAGQRBqIgUpAgAhEiAGQRhqIg0oAgAhDiAAIAYpAgA3AgAgCCAONgIAIAkgEjcCACAMIBE3AgAgDSAKKAIANgIAIAUgAikDADcCACAHIAspAwA3AgAgBiAEKQMgNwIAIAogAEE0aigCADYCACACIABBLGopAgA3AwAgCyAAQSRqKQIANwMAIAQgACkCHDcDICAEQQA2AhwgBCAAQThqIgY2AhggBCAAQRxqIgU2AhAgACABQRxsaiEHIAQgBEEgajYCFAJAA0ACQCAGIAdJDQADQCAGIAdGDQMgACgCACAAQQRqKAIAIAUgBEEQahDsDCAEKAIYIQYMAAsLIAAoAgAgAEEEaigCACAFIARBEGoQ7AwgBCgCGCEGDAALCyAEIAQoAhQ2AhggACgCACAAQQRqKAIAIAUgBEEQahDsDCAEKAIcIgcgAU8NASAKIAgoAgA2AgAgAiAJKQIANwMAIAsgDCkCADcDACAEIAApAgA3AyAgACAHQRxsaiIGQQhqIgUpAgAhESAGQRBqIg0pAgAhEiAGQRhqIg4oAgAhDyAAIAYpAgA3AgAgCCAPNgIAIAkgEjcCACAMIBE3AgAgDiAKKAIANgIAIA0gAikDADcCACAFIAspAwA3AgAgBiAEKQMgNwIAIARBCGogB0EBaiAAIAEQiCNBACECIAQoAgwhASAEKAIIIQAMAAsLAAv/CwILfwV+IwBBEGsiBCQAIAQQmCAiDzcDACAPQgODIRACQAJAAkACQAJAAkACQAJAAkACQAJAIAEgBBCTDA0AAkAgEEIAUg0AIA+nIgUgBSgCACIGQX9qNgIAIAZBAUcNACAFIAUoAhAQxiQLAkAgASkDACIQQgODIhFCAFINACAQpyIFIAUoAgAiBUEBajYCACAFQX9MDQYLIABBHGogECABKAIIIgcQiQYaIAAoAgQhBgJAAkACQCAAKAIIIggOAgIBAAsCQCABKQMAIg9CA4NCAFINACAPpykDCCEPCyAAKAIQIgkgD6dB3cvdnnlsIA9CIIinakHdy92eeWwgB2pB3cvdnnlsQQ93IgVxIQogBUEZdq1CgYKEiJCgwIABfiESIAAoAgwiC0F8aiEMQQAhDQNAIAsgCmopAAAiEyAShSIPQn+FIA9C//379+/fv/9+fINCgIGChIiQoMCAf4MhDwJAA0AgD1ANASAMIA96p0EDdiAKaiAJcUECdGsoAgAiBSAITw0HIA9Cf3wgD4MhDyABIAYgBUEYbGoiBRCTDEUNACAHIAUoAghHDQAMDwsLIBMgE0IBhoNCgIGChIiQoMCAf4NCAFINAiANQQhqIg0gCmogCXEhCgwACwsgASAGEJMMRQ0AIAcgBigCCEYNCwsgAg0BDAQLIBBCAFINCSAPpyIFIAUoAgAiAUF/ajYCACABQQFHDQkgBSAFKAIQEMYkDAkLIAcQzxchBQJAAkBBACgCwPCeASIGRQ0AIAZBIGoQkRchCCAGQSxqIQEgBkEoaiEGA0AgBUUNAiAFIANGDQIgBSABKAIAIgpPDQQgBigCACAFQQJ0aigCACEFDAALC0H4oZwBQcgAQaCjnAEQmS4ACyAIQQA6AAAgBSADRw0CDAgLIAUgCEGc/ZoBEJEVAAsgBSAKQYz2mAEQkRUACwJAAkAgEUIAUg0AIBCnIgUgBSgCACIBQQFqNgIAIAFBf0wNAiAFKQMIIQ8MAQsgECEPCyAEIBA3AwAgBCAHNgIIIABBDGoiCkEBIAAoAgQiCCAAKAIIIgYQhCcgACgCECIDIA+nQd3L3Z55bCAPQiCIp2pB3cvdnnlsIAdqQd3L3Z55bEEPdyILcSEBIAtBGXYiDq1CgYKEiJCgwIABfiERIAAoAgwhDEEAIQJBACEHA0AgDCABaikAACIQIBGFIg9Cf4UgD0L//fv379+//358g0KAgYKEiJCgwIB/gyEPAkADQCAPUA0BIAooAgAgD3qnQQN2IAFqIANxIglBAnRrQXxqKAIAIgUgBk8NBCAPQn98IA+DIQ8gBCAIIAVBGGxqIgUQkwxFDQAgBCgCCCAFKAIIRw0ACyAAKAIMQQAgCWtBAnRqQXxqKAIAIgUgACgCCCIBTw0EIAQpAwAiD0IDg0IAUg0HIA+nIgUgBSgCACIBQX9qNgIAIAFBAUcNByAFIAUoAhAQxiQMBwsgEEKAgYKEiJCgwIB/gyEPQQEhBQJAAkACQCAHDQAgD0IAUiEFIA96p0EDdiABaiADcSENIA9QDQELIA8gEEIBhoNCAFINAQsgASACQQhqIgJqIANxIQEgBSEHDAELCwJAIAwgDWosAABBAEgNACAMKQMAQoCBgoSIkKDAgH+DeqdBA3YhDQsgACgCDCIFIA1qIgEtAAAhAyAAKAIIIQYgASAOOgAAIAUgACgCECANQXhqcWpBCGogDjoAACAFIA1BAnRrQXxqIAY2AgAgACAAKAIYQQFqNgIYIAAgACgCFCADQQFxazYCFCAEKAIIIQMgBCkDACEPIAAoAggiBSAAKAIARw0EIAAoAhggACgCFGoiAUHVqtUqIAFB1arVKkkbIAVrIgVBAU0NAyAAIAUQjiJBgYCAgHhHDQMMBAsACyAFIAZBnP2aARCRFQALIAUgAUGInJsBEJEVAAsgAEEBEJorCwJAIAAoAggiBSAAKAIARw0AIAAQ+h0LIAAoAgQgBUEYbGoiASALNgIQIAEgAzYCCCABIA83AwAgACAFQQFqNgIICyAEQRBqJAAL0AwBA38CQAJAAkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACICQXRqIgNBByADQSZJGw4mHQABAgMEBQYHCAkKCwwdHQ0ODxARHRISEx0dFBUWFxcZGhsdHB0dCyAAKAIMIgNFDRwgACgCCCEAIANBBHQhAwNAAkAgACgCAEECRg0AIABBDGooAgAgARCkAgsgAEEQaiEAIANBcGoiAw0ADB0LCyAAKAIMIgNFDRsgACgCCCEAIANBDGwhAwNAAkACQCAAKAIAIgINACAAQQRqKAIAIAEQ5AgMAQsgAiABEKQCCyAAQQxqIQAgA0F0aiIDDQAMHAsLIAAoAiAgARDRCw8LIAAoAgQhAAwUCyAAKAIMIQAMEwsgACgCBCABEKQCIAAoAgghAAwSCwJAAkAgAkELRw0AIABBCGohAwJAAkAgACgCBA4DAAEDAAsgAyABENcXIAAoAjghAAwUCyADIAEQ6RogACgCOCEADBMLAkACQAJAAkACQAJAAkACQAJAAkAgAg4LAAECAwQFBgcICQoACyAAQQhqIAEQqSggACgCOCEADBsLIAAoAiggARCkAiAAKAIIQQJJDQggAEEMaiABEPcuIAAoAjghAAwaCyAAKAIIQQFHDQcgACgCDCABEKQCIAAoAjghAAwZCyAAKAIEIAEQpAIgACgCOCEADBgLAkAgACgCBCIEKAIAIgNBA0cNACAEKAIQIAEQpAICQCAEQQxqKAIAIgNFDQAgA0EEdCECIARBCGooAgBBDGohAwNAIAMoAgAgARCkAiADQRBqIQMgAkFwaiICDQALCyAEKAIgIgNFDQYgAyABEMMfIAAoAjghAAwYCyAEKAIgIAEQpAIgA0ECSQ0FIARBBGogARD3LiAAKAI4IQAMFwsgAEEEaiABEKooIAAoAjghAAwWCyAAQQRqIAEQqiggACgCOCEADBULIAAoAgQgARCkAiAAKAI4IQAMFAsgAEEEaiABEKooIAAoAjghAAwTCyAAQQRqIAEQvxsLIAAoAjghAAwRCyAAKAIoIAEQpAIgACgCCEECSQ0VIABBDGogARD3Lg8LIAAoAghBAUcNFCAAQQxqIAEQ9y4PCyAAKAIEIAEQpAIgACgCCCABEKQCIAAoAgwhAAwOCwJAIAAtABhBBUcNACAAKAIQIAEQpAILAkAgACgCDCIDRQ0AIANBBHQhAiAAKAIIQQxqIQMDQCADKAIAIAEQpAIgA0EQaiEDIAJBcGoiAg0ACwsgACgCKCIARQ0SIAAgARDDHw8LIAAoAhAgARCkAgJAIAAoAgRBgICAgHhGDQAgACgCDCIDRQ0AIANBBHQhAiAAKAIIQQxqIQMDQCADKAIAIAEQpAIgA0EQaiEDIAJBcGoiAg0ACwsgACgCICIARQ0RIAAgARDDHw8LIAAoAgwiA0UNECAAKAIIIQAgA0ECdCEDA0AgACgCACABEKQCIABBBGohACADQXxqIgMNAAwRCwsgACgCDCIDRQ0PIAAoAgghACADQQJ0IQMDQCAAKAIAIAEQpAIgAEEEaiEAIANBfGoiAw0ADBALCyAAKAIEIAEQpAICQCAAKAIYIgNFDQAgAyABEMMfCyAAKAIIIgBBCGooAgAiA0UNDiAAQQRqKAIAIQAgA0ECdCEDA0AgACgCACABEKQCIABBBGohACADQXxqIgMNAAwPCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAIAMgARCKCyADQShqIQMgAkFYaiICDQALCwJAAkAgACgCECIDKAIAQYCAgIB4Rw0AIAMoAgQgARCkAgwBCyADIAEQoSALAkAgACgCICIDRQ0AIAMgARCvFgsgACgCJCIARQ0NIAAoAgAgARCvAg8LIAAoAiAgARCaAw8LIAAoAgwiAA0GDAsLIAAoAgQhAAwFCyAALQA0QQJHDQkgAEEgahCOJg8LIAAoAgQgARDlBQ8LIABBBGogARD7Cw8LIABBBGogARCqKA8LIAAoAgQhAAwACwsgAEEEaiABEKooDwsgAEEEaiABEL8bDwsgAEEEaiABEKooDwsCQCAAKAIEIgAoAgBBA0cNACAAQQRqIAEQ2BcPCyAAIAEQkSYLC6wNAQx/IwBBgAJrIgMkAEECIQQCQAJAIAItAJEBQSBxDQAMAQsgASgCDCEFIAEoAgghBiABKAIEIQcgASgCACEBIAIoAogBIQggA0EYaiACEN0BIAIgAigCiAFBAXIQqBICQAJAAkACQAJAAkACQAJAAkACQCABLQAADQAgBygCACIJLQAIIgpBBkYNASAKQQVHDQEgAigC7AEhCyACKALoASEKIANBEGogCSgCACIJEMkDIApBAUcNACALIAMoAhBHDQAgCUGmupwBQQUQoSVFDQAgA0HYAWogAiAGKAIAELsCIAMoAtwBIQoCQCADKALYASIJQYGAgIB4Rw0AIANBAzoAqAEgAyAKNgKkAQwICyADQawBakEgaiADQdgBakEgaikCADcCACADQawBakEYaiADQdgBakEYaikCADcCACADQawBakEQaiADQdgBakEQaikCADcCACADIAMpAuABNwK0ASADIAo2ArABIAMgCTYCrAEgCUGAgICAeEYNAEEBIQQgA0GsAWoQmyIhAQwICyADQQhqIAIQzgcgAygCDCEKIAMoAghBAXENBSACEKELIAItAOABIQkCQAJAAkACQAJAAkAgAS0AACIBDQAgCUUNAQsCQAJAIAlBaWoOBAEDAwYACyAJQbt/akECSQ0FIAlB9QBGDQAgCUGeAUcNAgsCQCAHKAIAIgQtAAgiAUEGRg0AIAFBBUYNBAtBoKacAUEoQaDamwEQ0h4ACyADQdgBaiACIAUtAAAQnS8gAygC3AEhBSADKALYASIJQYCAgIB4Rg0BIAMoAuABIQsgBygCACIBLQAIIQQgAUEGOgAIIARBBkYNBSABKAIEIQwgASgCACEHAkACQCAEQQVHDQAgBygCAEEwRg0BCyACKALUASENIAYoAgAhBiADQdQBakECaiIOIAFBCWoiAUECai0AADoAACADQgA3AvABIANBAzoA7AEgA0EANgLoASADQgA3AvgBIANCADcC4AEgA0KAgICAwAA3AtgBIAMgAS8AADsB1AFBCEHAABCeLCIBRQ0HIAEgBDoAGCABIAw2AhQgASAHNgIQIAEgCzYCDCABIAU2AgggASAJNgIEIAFBFzYCACABIAMvAdQB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IA1BKGogAkEwakEoaikDADcDACANQSBqIAJBMGpBIGopAwA3AwAgDUEYaiACQTBqQRhqKQMANwMAIA1BEGogAkEwakEQaikDADcDACANQQhqIAJBMGpBCGopAwA3AwAgDSACKQMwNwMAQQUhEAwBCyABQSxqKAIAIREgAUEoaigCACESAkACQCABQTBqKQMAIh1QDQAgAUE8aigCACETIAFBOGooAgAhDyABQdQAaigCACEUIAFB0ABqKAIAIRUCQCAdQgODQgBSDQAgHaciECAQKAIAIhBBAWo2AgAgEEF/TA0HCyABQcwAaigCACEWIAFByABqKAIAIRcgAUHAAGopAwAiHqchDgJAIB5CA4NCAFINACAOIA4oAgAiEEEBajYCACAQQX9MDQcLIB5CIIinIRgMAQsgAUHEAGooAgAhGCABQcAAaigCACEOIAFBOGopAwAiHachDwJAIB1CA4NCAFINACAPIA8oAgAiEEEBajYCACAQQX9MDQYLIB1CIIinIRNCACEdC0EEIRACQCANQQRGDQACQAJAAkACQAJAIAEoAgAiEA4EAAECAwALIAkgAUEIahDyAwwDCyABQQhqKAIAIRkgAUEUaigCACEaIAFBEGooAgAhGwJAAkAgAUEEaigCACINQQFHDQAQ+ichASACQTBqIBkQQiABQThqIAJBMGpBOGopAwA3AwAgAUEwaiACQTBqQTBqKQMANwMAIAFBKGogAkEwakEoaikDADcDACABQSBqIAJBMGpBIGopAwA3AwAgAUEYaiACQTBqQRhqKQMANwMAIAFBEGogAkEwakEQaikDADcDACABQQhqIAJBMGpBCGopAwA3AwAgASACKQMwNwMAQQEhDQwBCyABQQxqKAIAIRwgGSEBCyACIBo2AhwgAiAbNgIYIAIgHDYCFCACIAE2AhAgAiANNgIMDAILEP8nIQ0gAkEwaiABQQRqKAIAEO0BAkBBoAFFDQAgDSACQTBqQaAB/AoAAAsgAiANNgIMDAELIAFBEGopAgAhHiABQRhqKQIAIR8gCiABQQRqEJgKIAIgHzcDICACIB43AxggAiABQSBqKQIANwMoCyACQTBqQQhqIAhBCGopAgA3AwAgAkEwakEQaiAIQRBqKQIANwMAIAIgCCkCADcDMCACKAIUIRkgAigCECEaIAIoAgwhGwsgCCACQTBq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bGohAgNAIANB4ABqIAEQ/AEgAkEYaiADQeAAakEYaigCADYCACACQRBqIANB4ABqQRBqKQIANwIAIAJBCGogA0HgAGpBCGopAgA3AgAgAiADKQJgNwIAIAJBHGohAiABQRxqIQEgBEF/aiIEDQALIAUhAgsgAyACNgJcIANBOGogA0HUAGoQ0wEgA0HgAGpBEGogA0E4akEQaikCADcDACADQeAAakEIaiADQThqQQhqKQIANwMAIAMpAjghDCADQQA2AjggAyAMNwNgIANBOGoQ7iogAygCYEEGRg0BIANB4ABqEPYODAULIABBCDYCAAwFCyADKAJkIgZBgICAgHhGDQMgAykDaCEMIAMgBjYCCCADIAw3AgwCQAJAAkAgDEKAgICAIFoNACAMpyECDAELIAxCIIinIQcgA0HtAGohCEEcIQFBASECA0AgAygCECIJIAJNDQQgA0HgAGogAygCDCABaiIKEL0OAkAgAy0AbCIFQQJGDQAgA0EUakECaiAIQQJqLQAAOgAAIAMgCC8AADsBFCADKAJkIQsgAygCYCEEIAVBAXENAyAEIAQoAgAiBUF/ajYCACAFQQFHDQAgBCALEO4SCyABQRxqIQEgByACQQFqIgJHDQALIAMoAgwhAgsgAEEINgIAIANBCGoQyiIgBiACEPYsDAULIAMoAmghByADQThqIAkgAmsiAUEAQQRBHBCoDCADKAI8IQggAygCOEEBRg0CIAMgAjYCECADKAJAIQICQCABQRxsIglFDQAgAiAKIAn8CgAACyADIAE2AkAgAyACNgI8IAMgCDYCOCADQeAAaiADQThqENMBIANBGGogA0EIahDTASADQThqIANB4ABqEL0OAkACQCADLQBEIgJBAkYNACADKAI8IQggAygCOCEBIAJBAXENASADQTRqQQJqIgIgA0EUakECai0AADoAACABIAEoAgAiCUF/ajYCACADIAMvARQ7ATQCQCAJQQFHDQAgASAIEO4SCyAAIAMpAhg3AgAgACAFOgAoIAAgBzYCJCAAIAs2AiAgACAENgIcIAAgAy8BNDsAKSAAQRhqIANBGGpBGGooAgA2AgAgAEEQaiADQRhqQRBqKQIANwIAIABBCGogA0EYakEIaikCADcCACAAQStqIAItAAA6AAAgA0HgAGoQ5CgMBgsgACADKQIYNwIAIAAg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NgLQASADQcACahCzHgJAAkACQAJAIAEtAOABQQFGDQAgASgC3AEhAiABKALYASEFIANB1AFqIAEQ1CYgA0EBNgLEAiADQZy/nAE2AsACIANCATcCzAIgA0GzBzYC9AEgA0EBOgDgASADIANB8AFqNgLIAiADIANB+AFqNgLwASADIANB4AFqNgL4ASADQYACaiADQcACahD9GiADQZQCaiADQdwBaigCADYCACADIAMpAtQBNwKMAiAFIAIgA0GAAmoQ4BohAiABLQDgAUGiAUYNAQwHCyABEKELQQAhAiABLQDgASIFQQlHDQIgA0EJOgDAAiADQQhqIAEgA0HAAmoQ1xEgAygCDCECIAMoAghBAXFFDQEgA0GBgICAeDYCqAEgAyACNgKsAQwHCyABIAEQmiwQpxcMBQsgAS0A4AEhBQsgAyACNgLgAQJAIAVB/wFxQRtGDQAgASgC3AEhAiABKALYASEFIANB5AFqIAEQ1CYgA0EBNgLEAiADQZy/nAE2AsACIANCATcCzAIgA0GzBzYC9AEgA0EbOgD/ASADIANB8AFqNgLIAiADIANB+AFqNgLwASADIANB/wFqNgL4ASADQYACaiADQcACahD9GiADQZQCaiADQewBaigCADYCACADIAMpAuQBNwKMAiAFIAIgA0GAAmoQ4BohAiABLQDgAUGiAUcNAyABIAEQmiwQpxcMAwsgARChCyADQagBakEIaiADQcgBakEIaigCADYCACADIAI2ArgBIAMgBDYCtAEgAyADKQLIASIPNwOoAQJAAkAgD6ciBUGAgICAeGoOAgAKAQsgASADQSBqEMcFDAoLIAMpAqwBIQ8gASABKAKIAUF+cSAIchCoEiADQSBqEJYmIAMgAjYC1AIgAyAENgLQAiADIA83AsQCIAMgBTYCwAIgASgCiAEhAiADIANBHGo2AswCAkAgAkGAAXENACABIAJBgAFyNgKIASAAIANBwAJqIAEQ5BIgASABKAKIAUH/fnE2AogBDAsLIAAgA0HAAmogARDkEgwKCyABIAEQmiwQpxcMBQsACyADQYGAgIB4NgKoASADIAI2AqwBIANB4AFqEKYrDAELIANBgYCAgHg2AqgBIAMgAjYCrAELIANByAFqELYoDAILIAMgBjYCrAEgA0GBgICAeDYCqAEMAQsgA0GBgICAeDYCqAEgAyACNgKsAQsgBBCcLAsgASADQSBqEMcFIANBqAFqQQRyEOkHCyAAQYCAgIB4NgIACyADQYADaiQAC74LAgh/An4jAEGAAWsiAiQAAkACQAJAAkACQAJAAkACQAJAIAEoAgAOBwABAgMEBQYACyABKAIYIQMgASgCFCEEIAEoAhAhBQJAIAEpAwgiCkIDg0IAUg0AIAqnIgYgBigCACIGQQFqNgIAIAZBf0wNCAsgAS0AHCEHQQAhBgJAIAEoAiAiAUUNABD7JyEGIAEpAgQhCyABKAIAIQgQ/CchASACQSBqIAgQdgJAQeAARQ0AIAEgAkEgakHgAPwKAAALIAYgCzcCBCAGIAE2AgALIAAgBjYCICAAIAc6ABwgACADNgIYIAAgBDYCFCAAIAU2AhAgACAKNwMIIABBADYCAAwGCyABKAIUIQMgASgCECEEIAJBCGogAUEEahDFCSABLQAcIQUCQAJAIAEoAhgiBg0AQQAhAQwBCxD7JyEBIAYpAgQhCiAGKAIAIQcQ/CchBiACQSBqIAcQdgJAQeAARQ0AIAYgAkEgakHgAPwKAAALIAEgCjcCBCABIAY2AgALIAAgAikCCDcCBCAAIAU6ABwgACABNgIYIAAgAzYCFCAAIAQ2AhAgAEEBNgIAIABBDGogAkEQaigCADYCAAwFCyABKAIUIQQgASgCECEFIAEoAgwhByABKAIIIQgQ/SchBiACQSBqIAEoAgQQvAIgBkEgaiACQSBqQSBqKQMANwMAIAZBGGogAkEgakEYaikDADcDACAGQRBqIAJBIGpBEGopAwA3AwAgBkEIaiACQSBqQQhqKQMANwMAIAYgAikDIDcDAAJAAkAgASgCGCIDDQBBACEBDAELEPsnIQEgAykCBCEKIAMoAgAhCRD8JyEDIAJBIGogCRB2AkBB4ABFDQAgAyACQSBqQeAA/AoAAAsgASAKNwIEIAEgAzYCAAsgACABNgIYIAAgBDYCFCAAIAU2AhAgACAHNgIMIAAgCDYCCCAAIAY2AgQgAEECNgIADAQLIAEoAhQhAyABKAIQIQQgAkEUaiABQQRqEOACIAEtABwhBQJAAkAgASgCGCIGDQBBACEBDAELEPsnIQEgBikCBCEKIAYoAgAhBxD8JyEGIAJBIGogBxB2AkBB4ABFDQAgBiACQSBqQeAA/AoAAAsgASAKNwIEIAEgBjYCAAsgACACKQIUNwIEIAAgBToAHCAAIAE2AhggACADNgIUIAAgBDYCECAAQQM2AgAgAEEMaiACQRxqKAIANgIADAMLIAEpAgwhChD9JyEGIAJBIGogASgCBBC8AiAGQSBqIAJBIGpBIGoiAykDADcDACAGQRhqIAJBIGpBGGoiBCkDADcDACAGQRBqIAJBIGpBEGoiBSkDADcDACAGQQhqIAJBIGpBCGoiBykDADcDACAGIAIpAyA3AwAgASgCCCEIEPonIQEgAkEgaiAIEEIgAUE4aiACQSBqQThqKQMANwMAIAFBMGogAkEgakEwaikDADcDACABQShqIAJBIGpBKGopAwA3AwAgAUEgaiADKQMANwMAIAFBGGogBCkDADcDACABQRBqIAUpAwA3AwAgAUEIaiAHKQMANwMAIAEgAikDIDcDACAAIAo3AgwgACABNgIIIAAgBjYCBCAAQQQ2AgAMAgsgACABKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAAwBCyABKAIEIQYQ+ichASACQSBqIAYQQiABQThqIAJBIGpBOGopAwA3AwAgAUEwaiACQSBqQTBqKQMANwMAIAFBKGogAkEgakEoaikDADcDACABQSBqIAJBIGpBIGopAwA3AwAgAUEYaiACQSBqQRhqKQMANwMAIAFBEGogAkEgakEQaikDADcDACABQQhqIAJBIGpBCGopAwA3AwAgASACKQMgNwMAIABBBjYCACAAIAE2AgQLIAJBgAFqJAAPCwALhwsCHX8FfiMAQcAAayIBJAAQhighAiAAKAIAIgAoAhQhAyAAKAIQIQQgAC0AUiEFIAAtAFEhBiAALQBQIQcgACgCTCEIIAAoAkghCQJAAkACQCAAKAIAQQFHDQACQCAAKQMIIh5CA4NCAFINACAepyIKIAooAgAiCkEBajYCACAKQX9MDQMLQgEhHyAAKQMYIiBQDQEgIEIDg1BFDQEgIKciCiAKKAIAIgpBAWo2AgAgCkF/Sg0BDAILQgAhHyAANQIYISACQCAAKQMIIh5CA4NCAFINACAepyIKIAooAgAiCkEBajYCACAKQX9MDQILIAAxABxCIIYgIIQhIAsCQAJAAkACQAJAIAAtAEUi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IAMoAtABIQEgBEKx3tWjBzcDaCAEQqHSuQM3A2AgBEH5gICAeDYCWCADIAEgAiAEQdgAahDeI0EBIQZBASEPDAcLIAMoAtQBIQIgAygC0AEhASAEQfqAgIB4NgJYIARCodK5AzcDYCADIAEgAiAEQdgAahDeI0EBIQ8MBgtBASEOIAdBAXENBSADKALUASECIAMoAtABIQEgBEGlgYCAeDYCWCAEQtHGvfO2jh03A2AgAyABIAIgBEHYAGoQ3iMMBQsgBCAQNgJYIAQgA0EXEKYTIAQoAgQhEiAEKAIAQQFxRQ0BIARB2ABqEKgrIBIhAgsgFBDGIQwBCyADKALUASETAkAgDCAEKAIQRw0AIARBEGoQ5R0gBCgCFCEJCyAJIAxBMGxqIgFBADoAHCABQQA2AhggASARNgIUIAEgAjYCECABIBM2AgQgASANNgIAIAEgEjYCJCABIBA2AiAgCi0AACECIAQvAFUhDSABIA5BAXE6ACogASAGQQFxOgApIAEgD0EBcToAKCABIA07AB0gAUEfaiACOgAAIAEgFDcCCCABQS9qIAstAAA6AAAgASAEKABQNgArIAQgDEEBaiIMNgIYIAMtAOABIgJBB0YNAyACQRNGDQYgAygC3AEhAiADKALYASEBIARBHGogAxDUJiAEQQE2AlwgBEGcv5wBNgJYIARCATcCZCAEQbMHNgJEIARBBzoATyAEIARBwABqNgJgIAQgBEHIAGo2AkAgBCAEQc8AajYCSCAEQShqIARB2ABqEP0aIARBPGogBEEkaigCADYCACAEIAQpAhw3AjQgASACIARBKGoQ4BohAiADLQDgAUGiAUcNACADIAMQmiwQpxcLIARBEGoQpCtBASEBDAYLIAMoAtQBIQIgAygC0AEhASAEQaSBgIB4NgJYIARCsd7Vowc3A2AgAyABIAIgBEHYAGoQ3iNBASEGDAALCyADEKELDAALCyAEQdgAakEEciADENQmIARBETYCbCAEQejVmwE2AmggBEGwgICAeDYCWCADKALYASADKALcASAEQdgAahDgGiECQQEhASADLQDgAUGiAUcNASADIAMQmiwQpxcMAQsgBCgCFCEGQQEhAQJAIAQoAhAiDkGAgICAeEcNACAGIQIMAQsgAxChCyADKALUASEBQRRBBBCaKiICIAE2AhAgAiAFNgIMIAIgDDYCCCACIAY2AgQgAiAONgIAQQAhAQsgACACNgIEIAAgATYCACAEQfAAaiQAC7QMAQp/IwBBkAJrIgIkACABKALYASEDIAEQoQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABRQ0AIAEoAtwBIQQgASgC2AEhBSACQSRqIAEQ1CYgAkEBNgLkASACQZy/nAE2AuABIAJCATcC7AEgAkGzBzYCgAEgAkEAOgAwIAIgAkH8AGo2AugBIAIgAkHEAGo2AnwgAiACQTBqNgJEIAJByABqIAJB4AFqEP0aIAJB3ABqIAJBLGooAgA2AgAgAiACKQIkNwJUIAUgBCACQcgAahDgGiEEIAEtAOABQaIBRg0BDAkLIAEoAtQBIQUgASgC0AEhBiABEKELAkACQCABKAKIASIEQYCAgCBxRQ0AIAEgBEH///9fcTYCiAEgAkEYaiABENETIAIoAhghBCABIAEoAogBQYCAgCByNgKIASACKAIcIQcMAQsgAkEQaiABENETIAIoAhQhByACKAIQIQQLAkAgBEEBcUUNACAHKAIEIQEgBygCACEEQQRBBBDLKiIIIAc2AgAgAiAFNgL0ASACIAY2AvABIAIgCDYC5AEgAkEwNgLsASACQfmcnAE2AugBIAJBuIGAgHg2AuABIAQgASACQeABahDgGiEBIABBADYCACAAIAE2AgQMCgsgAiAHNgIwAkAgAS0A4AFBAUYNACABKALcASEEIAEoAtgBIQUgAkE0aiABENQmIAJBATYC5AEgAkGcv5wBNgLgASACQgE3AuwBIAJBswc2AoABIAJBAToAQyACIAJB/ABqNgLoASACIAJBxABqNgJ8IAIgAkHDAGo2AkQgAkHIAGogAkHgAWoQ/RogAkHcAGogAkE8aigCADYCACACIAIpAjQ3AlQgBSAEIAJByABqEOAaIQQgAS0A4AFBogFGDQIMBwsgARChCyACQeABaiABQYCAgKACEMcfIAJBCGogAkHgAWoQ2SEgAigCDCEJIAIoAghBAXENBSACIAk2AkQgAS0AiwFBBHENAyACQQA2AnwgAkH8AGpBCGohCiACQeABakEIaiEGA0ACQCABLQDgASIEQdcARg0AQRMhBgwECyABEKELAkACQAJAIAEtAOABQd4ARg0AIAJB4AFqIAFBgICAoAIQxx8gAigC5AEhBSAC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DDYCMCACIA02AiwCQAJAIAEtAOABQRxGDQAgAkHwAGogARDhAiACKAJ0IQ4CQCACKAJwIg9BB0cNACAAQYCAgIB4NgIAIAAgDjYCBAwCCyACQThqQQhqIAVBCGooAgA2AgAgAiAFKQIANwM4IAIoAogBIRAgAigChAEhESACKAKAASESIAIoAnwhEyACKAJ4IQ0MBAsgASgC2AEhDSABEKELIAEoAtQBIREgAkHwAGogAUEAENECIAIoAnQhDAJAIAIoAnAiCkEHRg0AIAMgBCkDADcDACADQRhqIARBGGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDACACIAw2AkwgAiAKNgJIAkACQCABLQDgASIMQRdHDQAgARChCyACQRhqIAEQwhggAigCHCEQIAIoAhhBAXENASACQRBqIAJByABqEK4PIAIoAhQhDCACKAIQIQogAkH/gICAeDYCcCABIAogDCACQfAAahDeIyABKALUASEKQSgQsCshDAJAQShFDQAgDCACQcgAakEo/AoAAAsgAiAKNgJYIAIgDTYCVCACIBA2AlAgAiAMNgJMIAJBBDYCSCABLQDgASEMC0EAIRACQCABLQCRAUEgcUUNACAMQf8BcUEJRw0AIAJBCGogAUEBIAEoAtgBEIETIAIoAgwhECACKAIIQQFxDQELIAEoAtQBIRNBKBCwKyEOAkBBKEUNACAOIAJByABqQSj8CgAAC0ECIQ8gAS0AkQFBIHFFDQQgAS0A4AFB/wFxQQpHDQQgARChCyABKALUASEMIAEoAtABIQogAkH+gICAeDYCcCABIAogDCACQfAAahDeIwwECyAAQYCAgIB4NgIAIAAgEDYCBCACQcgAahDpFQwBCyAAQYCAgIB4NgIAIAAgDDYCBAsgAkEsahCUKAwFCyAAIAIpAiA3AgAgAEEIaiACQSBqQQhqKAIANgIADAULIA0hEiATIQkgDSEKCyABKALUASEUAkAgCCACKAIgRw0AIAJBIGoQ8R0gAigCJCEHCyAHIAZqIgwgDzYCACAMQRhqIBA2AgAgDEEUaiARNgIAIAxBEGogEjYCACAMQQxqIBM2AgAgDEEIaiANNgIAIAxBBGogDjYCACAMQRxqIAIpAzg3AgAgDEEkaiACQThqQQhqKAIANgIAIAxBLGogFDYCACAMQShqIAs2AgAgDEEwaiACKQIsNwIAIAxBOGogAkEsakEIaigCADYCACACIAhBAWoiCDYCKAJAAkAgAS0A4AEiDEEBRg0AAkAgDEEHRg0AIAEoAtwBIQwgASgC2AEhCCACQZwBaiABENQmIAJBATYCdCACQZy/nAE2AnAgAkIBNwJ8IAJBswc2AsQBIAJBBzoAzwEgAiACQcABajYCeCACIAJByAFqNgLAASACIAJBzwFqNgLIASACQagBaiACQfAAahCTECACQbwBaiACQaQBaigCADYCACACIAIpApwBNwK0ASAIIAwgAkGoAWoQ4BohDCABLQDgAUGiAUYNAgwECyABEKELIA9BAkcNACABLQDgAUH/AXFBAUcNACABKALUASEMIAEoAtABIQ0gAkG6gICAeDYCcCABIA0gDCACQfAAahDeIwsgBkHAAGohBgwBCwsgASABEJosEKcXCyAAQYCAgIB4NgIAIAAgDDYCBAsgAkEgahC6KAsgAkHQAWokAAuKDAEJfyMAQdAAayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIDKAIADgkAAQgCAwQFBgcACyADQQRqIAEQ1AohAAwICyADKAIEIQRBACEAIAJBGGogAygCCCIFQQBBBEEMEKgMIAIoAhwhBiACKAIYQQFGDQkgAigCICEHAkAgBUUNACAHIQAgBSEDA0AgAiAENgJMIAJBATYCHCACQZy/nAE2AhggAkIBNwIkIAJByQE2AkQgAiACQcAAajYCICACIAJBzABqNgJAIAIgAkEYahDtCSAAQQhqIAJBCGooAgA2AgAgACACKQIANwIAIABBDGohACAEQQhqIQQgA0F/aiIDDQALIAUhAAsgAiAHIABB4p6aAUECEJEFIAcgABCmIyAGIAcQ4ywgAkECNgIcIAJBtNaDATYCGCACQgE3AiQgAkHKATYCRCACIAJBwABqNgIgIAIgAjYCQCABKAIAIAEoAgQgAkEYahDfBSEAIAIoAgAgAigCBBDkLAwHCyACIANBCGo2AkwgAygCBCEAIAJBAjYCHCACQdDWgwE2AhggAkICNwIkIAJB+AA2AgwgAkHLATYCBCACIAA2AkAgAiACNgIgIAIgAkHAAGo2AgggAiACQcwAajYCACABKAIAIAEoAgQgAkEYahDfBSEADAYLIAMoAgQh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CyEBDAELIAIgAEEEajYCDCABQdi7nAFBByACQQxqQaIFEP8LIQELIAJBEGokACABC7ELAQ1/IwBBwAFrIgMkAAJAAkACQAJAAkACQAJAAkAgAS0A4AEiBBClFQ0AIARBfmoOAwYDAQILIANBOGogASACELMFAkACQCADLQBMQQJHDQAgACADKAI4NgIEQQchAQwBCyADQfwAaiADQdAAaikDADcCACADQfQAaiADQcgAaikDADcCACADQewAaiADQcAAaikDADcCACADIAMpAzg3AmQCQEEkRQ0AIABBBGogA0HgAGpBJPwKAAALQQAhAQsgACABNgIADAYLIAEoAtgBIQUgARChCyADQQA2AhQgA0KAgICAgAE3AgwgA0E4akEIaiECIANB4ABqQQhqIQZBACEHQQAhCANAAkACQAJAAkACQAJAAkAgAS0A4AEiBEF7ag4DAQACAAsCQCAIQf7/e0sNACAIIAdyRQ0AIANBu4CAgHg2AjggASAIIAcgA0E4ahDeIyABLQDgASEECwJAIARB/wFxIglBHEYNACADQThqIAEQlAggAygCPCEKIAMoAjgiBEEHRg0FIAYgAikDADcDACAGQRhqIAJBGGopAwA3AwAgBkEQaiACQRBqKQMANwMAIAZBCGogAkEIaikDADcDACADIAo2AmQgAyAENgJgIANBDGogA0HgAGpB9LecARD2HgwECyABKALYASEIIAEQoQsgASgC1AEhCyADQThqIAFBABDRAiADKAI8IQogAygCOCIMQQdGDQQgA0EYakEYaiINIAJBGGopAwA3AwAgA0EYakEQaiIOIAJBEGopAwA3AwAgA0EYakEIaiIPIAJBCGopAwA3AwAgAyACKQMANwMYIAEoAtQBIQdBKBCwKyIEIAo2AgQgBCAMNgIAIAQgAykDGDcDCCAEQRBqIA8pAwA3AwAgBEEYaiAOKQMANwMAIARBIGogDSkDADcDACADQQA2AlAgAyALNgJMIAMgCDYCSCADIAc2AkQgAyAINgJAIAMgBDYCPCADQQI2AjggA0EMaiADQThqQYS4nAEQ9h4MAwsgARChCwJAAkAgAS0AkQFBBHENAEEAIQQgAS0AiQFBwABxRQ0DIAEtAOABQf8BcUEKRg0BDAMLQQAhBCABLQDgAUEKRw0CCyABEKELQQEhBAwBCyABEKELIANB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tSIgBigCCCAGKAIMIAIgAyAFEMUlCyALQQJJDQQgCEECSQ0EIAMgDyASIA8gEkkiCxsiD0kNBCAFKAIAIRMgECASQQJ0aiISIBAgCxshCAJAIA9BAnQiD0UNACACIAggD/wKAAALIAIgD2ohDwJAIAsNACACIQsDQCALIA9GDQUgEiAVRg0FIAggEiALIBMoAgAgEigCACALKAIAEN8hIhEbKAIANgIAIBIgEUECdGohEiALIBFBAXNBAnRqIQsgCEEEaiEIDAALCyAUIRIDQCAIQXxqIQggD0F8aiELIBIgCCALIBMoAgAgCygCACAIKAIAEN8hIhEbKAIANgIAIAsgEUECdGohDyAIIBFBAXNBAnRqIgggEEYNAyASQXxqIRIgDyACRw0ADAMLCwJAIAhBAXENACAAIAEgAiADIAUQxSULIAZBgANqJAAPCyAWQQF0IQggDiELDAMLIAIhCwsgDyALayISRQ0AIAggCyAS/AoAAAsgFkEBdEEBciEIIA4hCwwACwsLwAkCF38CfiMAQZABayICJAAgASgCBCEDIAJBMGogASgCCCIEQQhBOBCVDyACKAI0IQUCQAJAIAIoAjBBAUYNACACKAI4IQYCQCAFRQ0AIARBOGwhByACQSVqIQhBACEJIAUhCgNAIAcgCUYNAQJAAkACQAJAIAMgCWoiASgCACILDgMAAQIACyACQQhqIAFBCGoQwwQgAUEoaigCACEBEP0nIQwgAkEwaiABELwCIAxBIGogAkEwakEgaikDADcDACAMQRhqIAJBMGpBGGopAwA3AwAgDEEQaiACQTBqQRBqKQMANwMAIAxBCGogAkEwakEIaikDADcDACAMIAIpAzA3AwAgAigCCCENIAIoAgwhDiACKAIQIQ8gAigCFCEQIAIoAhghESACKAIcIRIgAigCICETIAItACQhFCACQQRqQQJqIAhBAmotAAA6AAAgAiAILwAAOwEEIAIoAiwhFQwCCyABQSBqKAIAIRMgAUEcaigCACESIAFBGGooAgAhESABQQxqKAIAIQ4gAUEIaigCACENAkAgAUEQaikDACIZQgODQgBSDQAgGaciDCAMKAIAIgxBAWo2AgAgDEF/TA0GCyABQSRqLQAAIRRBACEWQQAhDAJAIAFBKGooAgAiD0UNABD7JyEMIA8pAgQhGiAPKAIAIRAQ/Cch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NwIAIAJBDGogA0EMaikCADcCACACIAMpAgQ3AgQgAiAHNgIAIAJBIGogASgCFCIDKQMAIANBEGooAgAQuR8gAikDICEIIAIoAighBSACQTBqIAIQnwUCQCAIQgODIglCAFINACAIpyIDIAMoAgAiA0EBajYCACADQX9MDQILAkAgAikDECIKQgODIgtCAFINACAKpyIDIAMoAgAiA0EBajYCACADQX9MDQILQQAtAKDxngEaQcAAEH0iBkUNASAGQQA6ABwgBiAFNgIYIAZCADcDECAGIAg3AwggBkEaNgIAQQAtAKDxngEaQcAAEH0iAUUNASABQgA3AxggASAKNwIQIAFBADYCCCABQRs2AgAgAUEgakIANwMAQQAtAKDxngEaQcAAEH0iA0UNASADIAIpAzA3AwAgA0E4aiACQTBqQThqKQMANwMAIANBMGogAkEwakEwaikDADcDACADQShqIAJBMGpBKGopAwA3AwAgA0EgaiACQTBqQSBqKQMANwMAIANBGGogAkEwakEYaikDADcDACADQRBqIAJBMGpBEGopAwA3AwAgA0EIaiACQTBqQQhqKQMANwMAAkACQCAHDQAgASEHIAYhBAwBCwJAIAtCAFINACAKpyIHIAcoAgAiB0EBajYCACAHQX9MDQMLAkAgCUIAUg0AIAinIgcgBygCACIHQQFqNgIAIAdBf0wNAwtBAC0AoPGeARpBwAAQfSIERQ0CIARBADoAHCAEIAU2AhggBEIANwMQIAQgCDcDCCAEQRo2AgBBAC0AoPGeARpBwAAQfSIHRQ0CIAdBADoAPCAHIAM2AjggB0IANwMwIAcgBjYCKCAHQgA3AyAgB0IANwMQIAcgATYCDCAHQQI2AgggB0EBNgIAQQAtAKDxngEaQcAAEH0iA0UNAiADQgA3AxggAyAKNwIQIANBADYCCCADQRs2AgAgA0EgakIANwMAC0EALQCg8Z4BGiACKAIcIQEgAigCGCEFQcAAEH0iBkUNASAGQQA6ADwgBiADNgI4IAZCADcDMCAGIAQ2AiggBkIANwMgIAZCADcDECAGIAc2AgwgBkECNgIIIAZBATYCAAJAIAtCAFINACAKpyIDIAMoAgAiB0F/ajYCACAHQQFHDQAgAyADKAIQEMYkCwJAIAlCAFINACAIpyIDIAMoAgAiB0F/ajYCACAHQQFH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Dxs2AgAgB0EEaiEHIA4gD0ECdGohDiARIBAgEk9BAnRqIREMAAsLIBMhDgNAIA4gCkF8aiIKKAIAIhEgB0F8aiIQKAIAIgcgESAHSxs2AgAgCiARIAdJQQJ0aiEKIBAgESAHT0ECdGoiByASRg0DIA5BfGohDiAKIAJHDQAMAwsLAkAgB0EBcQ0AIAAgASACIAMQ5SULIAVBgANqJAAPCyAVQQF0IQcgDSEKDAMLIAIhEQsgCiARayIKRQ0AIAcgESAK/AoAAAsgFUEBdEEBciEHIA0hCgwACwsLqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQyRUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMkVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCSECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQnSIgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCdIgsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCSECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDXESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEPQfEOMLIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahCrKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ3iMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQnSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELooCyAGEKMsCyABEJQoQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC6oKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMkVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDJFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQkhAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsgASgCDCEHIAMgASgCEDYCgAEgAyAHNgJ8IAMgASgCFCIINgJ4AkACQCACKAKIASIEQYCAgAFxDQAgAiAEQYCAgAFyNgKIASADQcAAaiADQfgAaiACEIkVIAIgAigCiAFB////fnE2AogBDAELIANBwABqIANB+ABqIAIQiRULIAMoAkQhBCADKAJAIgVBgICAgHhGDQAgAyADKAJIIgk2AjAgAyAENgIsIAMgBTYCKAJAAkAgAi0A4AFBAUYNACACKALcASEEIAIoAtgBIQUgA0E0aiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgJcIANBAToAZyADIANB2ABqNgKAASADIANB4ABqNgJYIAMgA0HnAGo2AmAgA0HAAGogA0H4AGoQkhAgA0HUAGogA0E8aigCADYCACADIAMpAjQ3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsCQAJAAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBCUYNAQtBACEKDAELIANBCToAeCADIAIgA0H4AGoQ1xEgAygCBCEKIAMoAgBBAXENAQsgAyAKNgJAIANB+ABqIAIgCC0AACAHLQAAIAQgCRD0HxDjCyADKAJ8IQsCQCADKAJ4IgxBgYCAgHhHDQAgA0HAAGoQqysgCyEEDAILIANB6ABqQQhqIg0gA0H4AGpBEGoiDikCADcDACADIAMpAoABNwNoAkAgDEGAgICAeEcNACACLwGQAUGAwABxRQ0AIAlBBnQhBQNAIAVFDQECQCAEKAIAQQRHDQAgBEEQaigCACEJIARBDGooAgAhDyADQamBgIB4NgJ4IAIgDyAJIANB+ABqEN4jCyAEQcAAaiEEIAVBQGohBQwACwsgA0GMAWogAUEIaigCADYCACADQfgAakEIaiIFIANBKGpBCGooAgA2AgAgAyADKQIoNwN4IAMgASkCADcChAEgASgCGCgCACEBIAIoAtQBIQkgBy0AACECIAgtAAAhB0HIAEEEEJ0qIgQgCzYCHCAEIAw2AhggBCAHOgBFIAQgAjoARCAEIAo2AkAgBCAGNgI8QQAhAiAEQQA2AjggBCAJNgI0IAQgATYCMCAEQRBqIA4pAwA3AgAgBEEIaiAFKQMANwIAIAQgAykDeDcCACAEIAMpA2g3AiAgBEEoaiANKQMANwIADAQLIAohBAsgA0EoahC6KAsgBhCjLAsgARCUKEEBIQILIAAgBDYCBCAAIAI2AgAgA0GQAWokAAuqCgENfyMAQZABayIDJABBACEEAkACQAJAIAItAJEBQSBxRQ0AAkACQCACKAKIASIEQYAgcQ0AIAIgBEGAIHI2AogBIANBCGogAhDJFSADKAIIIQUgAiACKAKIAUH/X3E2AogBIAMoAgwhBAwBCyADQRBqIAIQyRUgAygCFCEEIAMoAhAhBQsgBUEBcQ0BCyAEIQYCQAJAIAItAOABRQ0AIAIoAtwBIQQgAigC2AEhBSADQRxqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AiwgA0EAOgBgIAMgA0EoajYCgAEgAyADQdgAajYCKCADIANB4ABqNgJYIANBwABqIANB+ABqEJIQIANB1ABqIANBJGooAgA2AgAgAyADKQIcNwJMIAUgBCADQcAAahDgGiEEIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELIAEoAgwhByADIAEoAhA2AoABIAMgBzYCfCADIAEoAhQiCDYCeAJAAkAgAigCiAEiBEGAgIABcQ0AIAIgBEGAgIABcjYCiAEgA0HAAGogA0H4AGogAhCeIiACIAIoAogBQf///35xNgKIAQwBCyADQcAAaiADQfgAaiACEJ4iCyADKAJEIQQgAygCQCIFQYCAgIB4Rg0AIAMgAygCSCIJNgIwIAMgBDYCLCADIAU2AigCQAJAIAItAOABQQFGDQAgAigC3AEhBCACKALYASEFIANBNGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCXCADQQE6AGcgAyADQdgAajYCgAEgAyADQeAAajYCWCADIANB5wBqNgJgIANBwABqIANB+ABqEJIQIANB1ABqIANBPGooAgA2AgAgAyADKQI0NwJMIAUgBCADQcAAahDgGiEEIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELAkACQAJAAkAgAi0AkQFBIHFFDQAgAi0A4AFB/wFxQQlGDQELQQAhCgwBCyADQQk6AHggAyACIANB+ABqENcRIAMoAgQhCiADKAIAQQFxDQELIAMgCjYCQCADQfgAaiACIAgtAAAgBy0AACAEIAkQ9B8Q4wsgAygCfCELAkAgAygCeCIMQYGAgIB4Rw0AIANBwABqEKsrIAshBAwCCyADQegAakEIaiINIANB+ABqQRBqIg4pAgA3AwAgAyADKQKAATcDaAJAIAxBgICAgHhHDQAgAi8BkAFBgMAAcUUNACAJQQZ0IQUDQCAFRQ0BAkAgBCgCAEEERw0AIARBEGooAgAhCSAEQQxqKAIAIQ8gA0GpgYCAeDYCeCACIA8gCSADQfgAahDeIwsgBEHAAGohBCAFQUBqIQUMAAsLIANBjAFqIAFBCGooAgA2AgAgA0H4AGpBCGoiBSADQShqQQhqKAIANgIAIAMgAykCKDcDeCADIAEpAgA3AoQBIAEoAhgoAgAhASACKALUASEJIActAAAhAiAILQAAIQdByABBBBCdKiIEIAs2AhwgBCAMNgIYIAQgBzoARSAEIAI6AEQgBCAKNgJAIAQgBjYCPEEAIQIgBEEANgI4IAQgCTYCNCAEIAE2AjAgBEEQaiAOKQMANwIAIARBCGogBSkDADcCACAEIAMpA3g3AgAgBCADKQNoNwIgIARBKGogDSkDADcCAAwECyAKIQQLIANBKGoQuigLIAYQoywLIAEQlChBASECCyAAIAQ2AgQgACACNgIAIANBkAFqJAALqgoBDX8jAEGQAWsiAyQAQQAhBAJAAkACQCACLQCRAUEgcUUNAAJAAkAgAigCiAEiBEGAIHENACACIARBgCByNgKIASADQQhqIAIQyRUgAygCCCEFIAIgAigCiAFB/19xNgKIASADKAIMIQQMAQsgA0EQaiACEMkVIAMoAhQhBCADKAIQIQULIAVBAXENAQsgBCEGAkACQCACLQDgAUUNACACKALcASEEIAIoAtgBIQUgA0EcaiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgIsIANBADoAYCADIANBKGo2AoABIAMgA0HYAGo2AiggAyADQeAAajYCWCADQcAAaiADQfgAahCSECADQdQAaiADQSRqKAIANgIAIAMgAykCHDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCyABKAIMIQcgAyABKAIQNgKAASADIAc2AnwgAyABKAIUIgg2AngCQAJAIAIoAogBIgRBgICAAXENACACIARBgICAAXI2AogBIANBwABqIANB+ABqIAIQihUgAiACKAKIAUH///9+cTYCiAEMAQsgA0HAAGogA0H4AGogAhCKFQsgAygCRCEEIAMoAkAiBUGAgICAeEYNACADIAMoAkgiCTYCMCADIAQ2AiwgAyAFNgIoAkACQCACLQDgAUEBRg0AIAIoAtwBIQQgAigC2AEhBSADQTRqIAIQ1CYgA0EBNgJ8IANBnL+cATYCeCADQgE3AoQBIANBswc2AlwgA0EBOgBnIAMgA0HYAGo2AoABIAMgA0HgAGo2AlggAyADQecAajYCYCADQcAAaiADQfgAahCSECADQdQAaiADQTxqKAIANgIAIAMgAykCNDcCTCAFIAQgA0HAAGoQ4BohBCACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwJAAkACQAJAIAItAJEBQSBxRQ0AIAItAOABQf8BcUEJRg0BC0EAIQoMAQsgA0EJOgB4IAMgAiADQfgAahDXESADKAIEIQogAygCAEEBcQ0BCyADIAo2AkAgA0H4AGogAiAILQAAIActAAAgBCAJEPQfEOMLIAMoAnwhCwJAIAMoAngiDEGBgICAeEcNACADQcAAahCrKyALIQQMAgsgA0HoAGpBCGoiDSADQfgAakEQaiIOKQIANwMAIAMgAykCgAE3A2gCQCAMQYCAgIB4Rw0AIAIvAZABQYDAAHFFDQAgCUEGdCEFA0AgBUUNAQJAIAQoAgBBBEcNACAEQRBqKAIAIQkgBEEMaigCACEPIANBqYGAgHg2AnggAiAPIAkgA0H4AGoQ3iMLIARBwABqIQQgBUFAaiEFDAALCyADQYwBaiABQQhqKAIANgIAIANB+ABqQQhqIgUgA0EoakEIaigCADYCACADIAMpAig3A3ggAyABKQIANwKEASABKAIYKAIAIQEgAigC1AEhCSAHLQAAIQIgCC0AACEHQcgAQQQQnSoiBCALNgIcIAQgDDYCGCAEIAc6AEUgBCACOgBEIAQgCjYCQCAEIAY2AjxBACECIARBADYCOCAEIAk2AjQgBCABNgIwIARBEGogDikDADcCACAEQQhqIAUpAwA3AgAgBCADKQN4NwIAIAQgAykDaDcCICAEQShqIA0pAwA3AgAMBAsgCiEECyADQShqELooCyAGEKMsCyABEJQoQQEhAgsgACAENgIEIAAgAjYCACADQZABaiQAC6oKAQ1/IwBBkAFrIgMkAEEAIQQCQAJAAkAgAi0AkQFBIHFFDQACQAJAIAIoAogBIgRBgCBxDQAgAiAEQYAgcjYCiAEgA0EIaiACEMkVIAMoAgghBSACIAIoAogBQf9fcTYCiAEgAygCDCEEDAELIANBEGogAhDJFSADKAIUIQQgAygCECEFCyAFQQFxDQELIAQhBgJAAkAgAi0A4AFFDQAgAigC3AEhBCACKALYASEFIANBHGogAhDUJiADQQE2AnwgA0Gcv5wBNgJ4IANCATcChAEgA0GzBzYCLCADQQA6AGAgAyADQShqNgKAASADIANB2ABqNgIoIAMgA0HgAGo2AlggA0HAAGogA0H4AGoQkhAgA0HUAGogA0EkaigCADYCACADIAMpAhw3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsgASgCDCEHIAMgASgCEDYCgAEgAyAHNgJ8IAMgASgCFCIINgJ4AkACQCACKAKIASIEQYCAgAFxDQAgAiAEQYCAgAFyNgKIASADQcAAaiADQfgAaiACEJ0iIAIgAigCiAFB////fnE2AogBDAELIANBwABqIANB+ABqIAIQnSILIAMoAkQhBCADKAJAIgVBgICAgHhGDQAgAyADKAJIIgk2AjAgAyAENgIsIAMgBTYCKAJAAkAgAi0A4AFBAUYNACACKALcASEEIAIoAtgBIQUgA0E0aiACENQmIANBATYCfCADQZy/nAE2AnggA0IBNwKEASADQbMHNgJcIANBAToAZyADIANB2ABqNgKAASADIANB4ABqNgJYIAMgA0HnAGo2AmAgA0HAAGogA0H4AGoQkhAgA0HUAGogA0E8aigCADYCACADIAMpAjQ3AkwgBSAEIANBwABqEOAaIQQgAi0A4AFBogFHDQEgAiACEJosEKcXDAELIAIQoQsCQAJAAkACQCACLQCRAUEgcUUNACACLQDgAUH/AXFBCUYNAQtBACEKDAELIANBCToAeCADIAIgA0H4AGoQ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IAJBEGoQlSkhAQwLCyACIAAoAgQ2AgggAkEBNgIUIAJB7MabATYCECACQgE3AhwgAkELNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwKCyACIAAoAgQ2AgggAkEBNgIUIAJBjMebATYCECACQgE3AhwgAkELNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwJCyACQQA2AiAgAkEBNgIUIAJBwMebATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQlSkhAQwICyACQQA2AiAgAkEBNgIUIAJB6MebATYCECACQgQ3AhggASgCACABKAIEIAJBEGoQlSkhAQwHCyACIAA2AgggAkEBNgIUIAJBmMibATYCECACQgE3AhwgAkH5ADYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqEJUpIQEMBgsgAkEANgIgIAJBATYCFCACQcTImwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMBQsgAkEANgIgIAJBATYCFCACQfDImwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMBAsgAkEANgIgIAJBATYCFCACQZjJmwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMAwsgAkEANgIgIAJBATYCFCACQbDJmwE2AhAgAkIENwIYIAEoAgAgASgCBCACQRBqEJUpIQEMAgsgAiAALQAIOgAMIAIgACgCBDYCCCACQQE2AhQgAkHYyZsBNgIQIAJCATcCHCACQbIHNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwBCyACIAAoAgQ2AgggAkEBNgIUIAJB/MmbATYCECACQgE3AhwgAkEFNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQsgAkEwaiQAIAELqgkCBH8BfiMAQSBrIgMkACABKAIcIQQgA0EQaiACIAEoAhgiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIHQv8Bg0IEUQ0AIAAgBzcCAAwBCwJAAkACQAJAAkACQAJAAkACQCAFRQ0AIANBEGogAiAFEI4jIAMtABBBBEYN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IAEoAgQQpwEgACADEP0CDAYLIAEoAgghAyAAIAEoAgQQpwEgACADEP0CDAULAkAgASgCBCIDQQJGDQAgASgCCCEEAkAgA0EBcUUNACAAIAQQpwEMAQsgBCAAEJ4gCwJAIAEoAhgiA0UNACAAIAMQpwELAkAgASgCHCIDRQ0AIAAgAxCnAQsgACABKAIMEP0CDAQLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCeIAwCCyADIAAQnyAMAQsgACADEMInCyAAIAEoAgwQpwEgACABKAIQEP0CDAMLIAEoAgghAwJAAkACQAJAIAEoAgQOAwABAgALIAMgABCeIAwCCyADIAAQnyAMAQsgACADEMInCyAAIAEoAgwQpwEgACABKAIQEP0CDAILIAFBCGogABDTBwwCCyAAIAEoAgQQpwELIAEoAgBBEUcNAQsgAkHgAGoQiCIgAkE4akEgaiABQShqIgMpAwA3AwAgAkE4akEYaiABQSBqIgQpAwA3AwAgAkE4akEQaiABQRhqIgUpAwA3AwAgAkE4akEIaiABQRBqIgYpAwA3AwAgASkDCCEMIAEgAikDYDcDCCAGIAJB4ABqQQhqIgcpAwA3AwAgBSACQeAAakEQaiIIKQMANwMAIAQgAkHgAGpBGGoiCSkDADcDACADIAJB4ABqQSBqIgopAwA3AwAgAiAMNwM4IAJBCGogACACQThqQQAQXCABQQhqIQACQAJAAkAgAigCCEFtaiILQQIgC0ECSRsOAwABAgALIAEpAwAhDCABQgE3AwAgAkHgAGpBKGogAykDADcDACAKIAQpAwA3AwAgCSAFKQMANwMAIAggBikDADcDACAHIAApAwA3AwAgAEEANgIAIAIgDDcDYCACQeAAahDtAwwCCyAAEIcFIABBIGogAkEIakEoaikDADcDACAAQRhqIAJBCGpBIGopAwA3AwAgAEEQaiACQQhqQRhqKQMANwMAIABBCGogAkEIakEQaikDADcDACAAIAIpAxA3AwAMAQsgARDtAyADIAJBCGpBKGopAwA3AwAgBCACQQhqQSBqKQMANwMAIAUgAkEIakEYaikDADcDACAGIAJBCGpBEGopAwA3AwAgACACQQhqQQhqKQMANwMAIAEgAikDCDcDAAsgAkGQAWokAAvnCAISfwF+IwBBMGsiASQAAkAC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QAJAAkACQCAEQSlHDQAgA0EoaiABKAIAIgVBEGpB4LyEARDsIyADKAIsIQQgAygCKCIGKAIIIgdFDQEgBiAHQX9qIgc2AghBgICAgHghCCAGKAIEIAdB8ABsaiIHQQRqIQkgBygCACIKQYCAgIB4ag4CAgEDCyADQQA2AqQBIANBNGpB3LyEASADQaQBakGQvYQBELchAAsgA0GkAWogARCnDSAAQRxqIAEoAgQgASgCCBCKFCAAQRY2AgAgACADKQKkATcCKCAAQTBqIANBrAFqKQIANwIAIABBOGogA0GkAWpBEGopAgA3AgAMBAsCQEEkRQ0AIANBgAFqIAlBJPwKAAALAkAgBigCCCIHDQBBgYCAgHghCiADQYGAgIB4NgKkAQwDCyAGIAdBf2oiBzYCCCAGKAIEIAdB8ABsaiEHAkBB8ABFDQAgA0GkAWogB0HwAPwKAAALIAMoAqQBIgpBgoCAgHhIDQIgA0HYAmogA0GMAWopAgA3AwAgA0HgAmogA0GUAWopAgA3AwAgA0HoAmogA0GcAWopAgA3AwAgAyADKQKEATcD0AIgB0EEaiEJIAMoAoABIQggAy0AkAIhBgwBCyAHLQBsIQYLIANBjAFqIAlBCGopAgA3AgAgA0GUAWogCUEQaikCADcCACADQZwBaiAJQRhqKQIANwIAIAMgCjYCgAEgAyAJKQIANwKEAQJAQTxFDQAgA0E4aiAHQSRqQTz8CgAACyAFIAZBAXE6AGQgAiAFKQJQNwIYIAJBIGogBUHYAGoiBigCADYCACABEI0LGiADQfwAaiAGKAIANgIAIAMgBSkCUDcCdAJAAkAgCEGAgICAeEYNACADQbgCaiADQdACakEIaikDADcCACADQcACaiADQeACaigCADYCACADQawCakEgaiACQRhqIgFBCGooAgA2AgAgAyAINgKsAiADIAMpA9ACNwKwAiADIAEpAgA3AsQCAkBBJEUNACADQaQBaiACQST8CgAACyADQSBqIANBpAFqEKARIANBrAJqIAMoAiAgAygCJEHwvIQBEIYfAkACQAJAAkAgAygCtAIOAgIBAAsgA0EIaiADQawCahDTJEEKIQYgAygCDCECDAQLIANBGGogA0GsAmoQ5xsCQCADKAIYIgZBDEYNACADKAIcIQIMAgtB/PmHARDSLAALIANBEGogA0G4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aiEIDCgLIANBEGohByADQQxqIQgMJwsgA0E0aiEHIANBMGohCAwmCyADQSRqIQcgA0EgaiEIDCULIANBJGohByADQSBqIQgMJAsgA0EUaiEHIANBEGohCAwjCyADQSBqIQcgA0EcaiEIDCILIANBGGohByADQRRqIQgMIQsgA0EUaiEHIANBEGohCAwgCyADQRRqIQcgA0EQaiEIDB8LIAMoAggOBxYXGBkaGxwWCyADQSBqIQcgA0EcaiEIDB0LIANBEGohByADQQxqIQgMHAsgA0EYaiEHIANBFGohCAwbCyADKAIgIghBKGohByAIQSRqIQgMGgsgA0EIaiEHIANBBGohCAwZCyADQQhqIQcgA0EEaiEIDBgLIANBDGohByADQQhqIQgMFwsgA0EMaiEHIANBCGohCAwWCyADQRxqIQcgA0EYaiEIDBULIANBLGohByADQShqIQgMFAsgA0EIaiEHIANBBGohCAwTCyADKAIEIghBBGohBwwSCyADQRRqIQcgA0EQaiEIDBELIANBEGohByADQQxqIQgMEAsgA0EMaiEHIANBCGohCAwPCyADQQxqIQcgA0EIaiEIDA4LIANBEGohByADQQxqIQgMDQsgA0EQaiEHIANBDGohCAwMCyADQRBqIQcgA0EMaiEIDAsLIANBFGohByADQRBqIQgMCgsgA0EMaiEHIANBCGohCAwJCyADQQhqIQcgA0EEaiEIDAgLIANBHGohByADQRhqIQgMBwsgA0EQaiEHIANBDGohCAwGCyADQRBqIQcgA0EMaiEIDAULIANBFGohByADQRBqIQgMBAsgA0EUaiEHIANBEGohCAwDCyADQSRqIQcgA0EgaiEIDAILIANBJGohByADQSBqIQgMAQsgA0EIaiEHIANBBGohCAsgCCgCACEIIAFBDGogBygCADYCACABQQhqIAg2AgAgAUEEaiADNgIAIAFBEjYCACAAIAAoAghBAWo2AgggAUEwaiIBIAVHDQALQQELjgkCBn8BfiMAQeAAayIDJAACQAJAAkACQAJAAkAgAigCCCIERQ0AIAEoAggiBUUNAQJAAkACQAJAAkAgBEEBRw0AIAIoAgQiAigCAEEBRw0BIAAgASgCBCAFEOAXIABBFGpBACgC+KCcATYCACAAQQApAvCgnAE3AgwMCgsCQAJAIAUgBEYNACAF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JAAgAiABEPsPIgM2AgQCQAJAAkACQCADQdsARw0AIAJBCGpBCGoiBCABKAIAIgNB2ABqKAIANgIAIAIgAykCUDcDCCADQdAAaiEFAkAgARDUJA0AIAJBzABqIAVBCGooAgA2AgAgAkE4akEIaiIDIAQoAgA2AgAgAiACKQMINwM4IAIgBSkCADcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIAIABBiYDEADYCAAwECyABEPsPIgZB3gBGDQEMAgsgAkEANgI4IAJBBGpB0L2EASACQThqQazIhAEQtyEACyABENQkDQAgAkHMAGogBUEIaigCADYCACACQThqQQhqIgMgAkEIakEIaigCADYCACACIAIpAwg3AzggAiAFKQIANwJEIABBIGogASgCBCABKAIIEIoUIABBBDYCBCAAIAIpAzg3AiwgAEE0aiADKQMANwIAIABBPGogAkHIAGopAwA3AgAgAEGJgMQANgIADAELIAJBNGogBUEIaigCACIDNgIAIAJBKGogAzYCACACQQA2AhwgAkKAgICAwAA3AhQgAiAFKQIAIgg3AiwgAiAINwIgIAJBOGpBCGohAyACQSBqIQQCQAJAA0AgARD7D0EtRw0BIAMgARCnDSACQQA6AFggAkKBgMSA0AU3AjggAkEUaiACQThqEPESIAEQ1CQNAAsgAkE4akEIaiIDIAJBCGpBCGooAgAiBTYCACACQcwAaiAFNgIAIAIgAikDCCIINwM4IAIgCDcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELAkAgAigCHA0AIAEQ+w9B3QBHDQAgAkE4akEIaiIDIAEQpw0gAkEAOgBYIAJCgYDEgNALNwI4IAJBFGogAkE4ahDxEiABENQkDQAgAkHMAGogBUEIaigCADYCACADIAJBCGpBCGooAgA2AgAgAiACKQMINwM4IAIgBSkCADcCRCAAQSBqIAEoAgQgASgCCBCKFCAAQQQ2AgQgACACKQM4NwIsIABBNGogAykDADcCACAAQTxqIAJByABqKQMANwIADAELIAJBkAFqQRRqIAVBCGooAgA2AgAgAkGQ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DAELAkAgBCgCCEEFRg0AIARBCGogARCyKAsCQCAEKAI8IgNFDQAgAyABEKQCCwJAIAQoAkAiA0UNACADKAIAIAEQrwILIAQoAjgiAkUNACAEKAI0IQMgAkEMbCECA0AgAygCACABEKQCIANBDGohAyACQXRqIgINAAsLIARB2ABqIgQgBUcNAAsLAkAgACgCMCIDRQ0AIAMgARCkAgsCQCAAKAI0IgNFDQAgAyABEK8WCwJAIAAoAjgiA0UNACADIAEQwx8LAkAgACgCICIDRQ0AIAAoAhwiBiADQQR0aiEEA0AgBigCDCEDIAYoAgAgARCkAgJAIANFDQAgAygCCCICRQ0AIAMoAgQhAyACQQJ0IQIDQCADKAIAIAEQrwIgA0EEaiEDIAJBfGoiAg0ACwsgBkEQaiIGIARHDQALCwuMCQEJfyMAQYACayICJAAgAiABKALYASIDNgIUAkACQAJAIAEtAOABQc8ARg0AQQghBAwBCyABEKELAkACQCABLQDgAUUNAEEHIQQMAQsgARChCyACQThqIAFBABDRAiACKAI8IQUCQAJAIAIoAjgiBEEHRg0AIAJBoAFqQSBqIAJBOGpBIGopAwA3AwAgAkGgAWpBGGogAkE4akEYaikDADcDACACQaABakEQaiACQThqQRBqKQMANwMAIAIgAikDQDcDqAEgAiAFNgKkASACIAQ2AqABIAEtAOABIQYCQAJAIAEtAJEBQSBxRQ0AIAZB/wFxQQlHDQAgASgC2AEhByABEKELAkACQCABKAKIASIGQYAgcQ0AIAEgBkGAIHI2AogBIAIgARDGEiACKAIAIQggASABKAKIAUH/X3E2AogBIAIoAgQhBgwBCyACQQhqIAEQxhIgAigCDCEGIAIoAgghCAsCQCAIQQFxRQ0AIAYhBQwCCyACQcABaiEIIAIgBjYCOAJAAkACQAJAIAQOBwEAAAACAgIBCyACQbgBaiEICyABKALUASEJQQxBBBDLKiIKIAk2AgggCiAHNgIEIAogBjYCACAIEMkrIAggCjYCAAwBCyACQThqELQGCyABLQDgASEGCyAGQf8BcUEBRg0CIAEoAtwBIQUgASgC2AEhBCACQcwBaiABENQmIAJBATYCPCACQZy/nAE2AjggAkIBNwJEIAJBswc2AvQBIAJBAToA/wEgAiACQfABajYCQCAC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Ig1BBUYNBiAGIAUpAwA3AwAgBkEYaiAFQRhqKQMANwMAIAZBEGogBUEQaikDADcDACAGQQhqIAVBCGopAwA3AwAgAiAMNgJEIAIgDTYCQAwFCyACQegAakEEciABENQmIAJBIDYCfCACQYTgmwE2AnggAkGwgICAeDYCaCABKALYASABKALcASACQegAahDgGiEMIAEtAOABQaIBRw0FIAEQmxIhCyABEKELIAEgCxCnFwwFCyACQegAaiABQQAQ+RsgAigCaCEMIAIoAvgBIg5BgYCAgHhGDQQCQEGMAUUiDw0AIAJBlAJqIAhBjAH8CgAACyACQYgCakEIaiIQIAdBCGooAgA2AgAgAiAHKQIANwOIAiAOQYCAgIB4Rg0BQQhBoAEQoCwiDUUNAiANIAw2AgACQCAPDQAgDUEEaiACQZQCakGMAfwKAAALIA0gDjYCkAEgDSACKQOIAjcClAEgDUGcAWogECgCADYCACACIA02AkQgAkEDNgJADAMLIAJB6ABqIAEQyBEgAikDaCERIAIpA3AhEiABKALYASEMIAEoAtwBIQ4gAkHoAGogARCrAiABIA42AtQBIAEgDDYC0AEgBCACKQJoNwIAIA0gBSgCADYCACACIA42AlwgAiAMNgJYIAIgEjcDUCACIBE3A0ggAkEANgJADAILIAYgAikClAI3AgAgBkEYaiACQZQCakEYaikCADcCACAGQRBqIAJBlAJqQRBqKQIANwIAIAZBCGogAkGUAmpBCGopAgA3AgAgAiAMNgJEIAJBBDYCQAwBCwALAkBBKEUiDA0AIAJBGGogAkHAAGpBKPwKAAALAkAgCyACKAIMRw0AIAJBDGoQ7B0gAigCECEDCwJAIAwNACADIApqIAJBGGpBKPwKAAALIApBKGohCiALQQFqIQsMAQsLIAJBBjYCQCACIAw2AkQgCRC5KAsgACACKQIMNwIAIABBCGogAkEMakEIaigCADYCACACQaADaiQAC7QIAgJ/AX4jAEEwayIDJAAgA0EYaiACIAEoAgBBABCLAgJAAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EANgIMIANBGGogAiADQQxqQcyEnAFBBhCzDQJAIAMtABhBBEYNACADKQMYIgVC/wGDQgRRDQAgACAFNwIADAELIANBGGogAiADQQxqQd2rnAFBARCyDQJAIAMtABhBBEYNACADKQMYIgVC/wGDQgRRDQAgACAFNwIADAELIANBGGogAUEIaiACEGsCQCADLQAYQQRGDQAgAykDGCIFQv8Bg0IEUQ0AIAAgBTcCAAwBCwJAIAEoAjwiBEUNACADQRhqIAIgA0EMakHfq5wBQQEQsg0CQCADLQAYQQRGDQAgAykDGCIFQv8Bg0IEUQ0AIAAgBTcCAAwCCwJAAkACQAJAIAItAE0NACADQRhqIAIQkhEgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFINAQsgA0EANgIYIANBKGogAiADQRhqQaiZnAFBARCyDQJAIAMtAChBBEYNACADKQMoIgVC/wGDQgRSDQMLAkAgAi0ATQ0AIANBKGogAhCMFgJAIAMtAChBBEYNACADKQMoIgVC/wGDQgRSDQQLIAIgAigCLEEBajYCLAsgA0EoaiACIANBGGpBwoScAUEEELMNAkAgAy0AKEEERg0AIAMpAygiBUL/AYNCBFINAwsgA0EoaiACIANBGGpB4KucAUEBELINAkAgAy0AKEEERg0AIAMpAygiBUL/AYNCBFINAwsCQCACLQBNDQAgA0EoaiACEJIRIAMtAChBBEYNACADKQMoIgVC/wGDQgRSDQMLIANBKGogBCACEHsCQCADLQAoQQRGDQAgAykDKCIFQv8Bg0IEUg0DCyACLQBNQQFGDQEgAiACKAIsQX9qNgIsIANBKGogAhCMFiADLQAoQQRGDQEgAykDKCIFQv8Bg0IEUQ0BDAILIAAgBTcCAAwDCyADQShqIAIgA0EYakGpmZwBQQEQsg0gAy0AKEEERg0BIAMpAygiBUL/AYNCBFENAQsgBUL/AYNCBFENACAAIAU3AgAMAQsgA0EYaiACIANBDGpB3ISeAUEBELINAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsCQCABLQA0QQNGDQAgA0EYaiACIANBDGpByIGcAUEBELINAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAgsgA0EYaiABQSBqIAIQ7wcgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EYaiABQThqIAIQnCYCQCADLQAYQQRGDQAgAykDGCIFQv8Bg0IEUQ0AIAAgBTcCAAwBCyAAQQQ6AAALIANBMGokAAu7CAILfwF+IwBBwABrIgIkAEEAIQMCQANAIANB1ABGDQEgACADaiIEKAIAIQUgBCABIANqIgYoAgA2AgAgBiAFNgIAIANBBGohAwwACwsCQCABKAJEIgdFDQAgAEEcaiIIIAcgAEEsaiIJEMEnIAEoAkAhBCACIAdBCEEQEJUPIAIoAgQhCgJAAkACQAJAIAIoAgBBAUYNACACKAIIIQMCQCAKRQ0AIAdBBHQhBiADIQUgCiELA0AgBkUNAQJAIAQpAwAiDUIDg0IAUg0AIA2nIgwgDCgCACIMQQFqNgIAIAxBf0wNBAsgBUEIaiAEKAIINgIAIAUgDTcDACAFQRBqIQUgBkFwaiEGIARBEGohBCALQX9qIgsNAAsLIAIgCjYCCCACIAM2AgAgAiADNgIEIAIgAyAHQQR0aiIENgIMA0AgASADKQMAIANBCGooAgAQnwsgA0EQaiIDIARHDQALIAIgBDYCBCACELUTAkAgAC0AOEEBRw0AIAEoAkQhBCABKAJAIQMgAiABKAI8NgIIIAIgAzYCACACIAM2AgQgBEEEdCEFAkAgBCAAKAI8IAAoAkQiBmtNDQAgAEE8aiAGIARBCEEQENsdIAAoAkQhBgsCQCAFRQ0AIAAoAkAgBkEEdGogAyAF/AoAAAsgACAAKAJEIARqNgJEIAIgAzYCDCACELUTDAULIAggASgCRCIDIAkQwScgAEEMaiADIAAoAgQgACgCCBCEJyADIAAoAgAgACgCCCIEa00NAyAAKAIYIAAoAhRqIgVB1arVKiAFQdWq1SpJGyAEayIEIANNDQIgACAEEI4iQYGAgIB4Rw0CDAMLIAogAigCCEG08poBEI4pCwALIAAgAxCaKwsgAiABKAI8NgIIIAIgASgCQCIDNgIAIAIgAzYCBCACIAMgASgCRCIFQQR0aiIENgIMAkAgBUUNAANAIAAgAykDACADQQhqKAIAQQEQswwgA0EQaiIDIARHDQALIAIgBDYCBAsgAhC1EwsgAkE4aiIFIAFBOGooAgA2AgAgAkEwaiIGIAFBMGopAgA3AwAgAkEoaiILIAFBKGopAgA3AwAgAkEgaiIMIAFBIGopAgA3AwAgAkEYaiIKIAFBGGopAgA3AwAgAkEQaiIIIAFBEGopAgA3AwAgAkEIaiIJIAFBCGopAgA3AwAgAiABKQIANwMAAkAgACgCNCIEIAAoAixHDQAgAEEsahD5HQsgACgCMCAEQTxsaiIDIAIpAwA3AgAgA0E4aiAFKAIANgIAIANBMGogBikDADcCACADQShqIAspAwA3AgAgA0EgaiAMKQMANwIAIANBGGogCikDADcCACADQRBqIAgpAwA3AgAgA0EIaiAJKQMANwIAIAAgBEEBajYCNAJAIAcNACABKAJAIAEoAkQQphggASgCPCABKAJAELYtCyACQcAAaiQAC9kIAQ1/IwBBwABrIgUkAAJAIAMoAggNAAJAIAEgACgC0AIiBk8NAAJAAkACQAJAAkAgACgCzAIgAUEUbGooAgBBfWpBBEkNACAFIAE2AgQgASAEKAIUIgZPDQQCQAJAIAQoAhAgAUECdGoiBygCACIIIAQoAhgiBkkNACAEKAIIIQkMAQsgCCAEKAIIIglPDQQgBCgCBCAIQQJ0aigCACABRg0CCyAFIAY2AgggBiAJTw0CIAQoAgQgBkECdGogATYCACAEIAZBAWo2AhggByAGNgIADAELAkAgAygCAA0AIANBvNmDARCSHAsgAygCBCIKIAE2AgAgBCgCGCEJIAQoAgQhCyAEKAIIIQwgBCgCECENIAQoAhQhDkEBIQ8DQCADIA9Bf2oiDzYCCCAFIAogD0ECdGooAgAiCDYCBAJAAkACQAJAAkACQCAIIA5PDQAgCSAMIAkgDEsbIRADQAJAIA0gCEECdGoiBigCACIBIAlPDQAgASAMTw0DIAsgAUECdGooAgAgCEYNBwsgBSAJNgIIIAkgEEYNAyALIAlBAnRqIAg2AgAgCCAOTw0FIAYgCTYCACAEIAlBAWoiCTYCGCAIIAAoAtACIgFPDQQCQAJAAkACQAJAAkAgACgCzAIgCEEUbGoiASgCAA4JDAwMAAIDAQwMDAsgASgCCCACcUUNCwsgASgCBCEIDAMLIAEoAggiBkUNCSABKAIEIgcoAgAhCAJAIAZBAnQiEUF8aiIBQQJ2IgYgAygCACAPa00NACADIA8gBkEEQQQQxR0gAygCCCEPCyADKAIEIQogEUEERg0BIAogD0ECdGohBiAPIBFBeGpBAnZqQQFqIQ8DQCAGIAcgAWooAgA2AgAgBkEEaiEGIAFBfGoiAQ0ADAILCyABKAIIIQYgASgCBCEIAkAgDyADKAIARw0AIANBzNmDARCSHCADKAIEIQoLIAogD0ECdGogBjYCACAPQQFqIQ8LIAMgDzYCCAsgBSAINgIEIAggDkkNAAsLIAggDkGotIQBEJEVAAsgASAMQbi0hAEQkRUACyAFQQM2AhAgBUHws4QBNgIMIAVCAzcCGCAFQYoBNgI4IAVB+AA2AjAgBUH4ADYCKCAFIAw2AjwgBSAFQSRqNgIUIAUgBUEEajYCNCAFIAVBPGo2AiwgBSAFQQhqNgIkIAVBDGpBiLSEARDpIwALIAggAUHsp4QBEJEVAAsgCCAOQZi0hAEQkRUACyAPDQALCyAFQcAAaiQADwsgBUEDNgIQIAVB8LOEATYCDCAFQgM3AhggBUGKATYCOCAFQfgANgIwIAVB+AA2AiggBSAJNgI8IAUgBUEkajYCFCAFIAVBBGo2AjQgBSAFQTxqNgIsIAUgBUEIajYCJCAFQQxqQYi0hAEQ6SMACyAIIAlBuLSEARCRFQALIAEgBkGotIQBEJEVAAsgASAGQeynhAEQkRUAC0GU2IMBQSJBrNmDARDSHgALogkBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAUF0aiICQQcgAkEmSRtBf2oOJAABAgMEBQYHCAkKCwwNDg8QERITIhQVFhciGBkaGxwdHh8gISILIAAoAggiAiAAKAIMEKseIAAoAgQgAhCbLQ8LIABBBGoQ/CoPCyAAKQMIIAAtABwQ7yggACgCIBDOGw8LIABBBGoQtSwPCyAAQQxqELUsDwsgAEEEahC1LCAAQQhqELUsDwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAQ4MAAECAwQFBgcICQsKCwsgAEEIahDBKwwKCyAAQQhqEJojDAkLIABBCGoQlCcMCAsgAEEEahC1LAwHCyAAQQRqEM4fDAYLIABBBGoQtiwMBQsgAEEEahC2LAwECyAAQQRqELUsDAMLIABBBGoQtiwMAgsgAEEEahDYLQwBCwJAAkAgACgCBA4CAAECCyAAQQhqEKgmDAELIABBCGoQ3icLIABBOGoQtSwPCyAAQQhqEJojDwsgAEEIahCUJw8LIABBBGoQtSwgAEEIahC1LCAAQQxqELUsDwsgAEEEaiECAkAgAC0AGEEFRw0AIABBEGoQtSwLIAIQ/yogACgCKBCELA8LIABBEGoQtSwCQCAAKAIEQYCAgIB4Rg0AIABBBGoQ/yoLIAAoAiAQhCwPCyAAQQRqEJgoDwsgACkDCBDIIQ8LAkACQAJAAkACQCAAKAIIDgYBGBgCAwQACyAAKQMQEMghIAApAxgQyCEPCyAAKQMQIAApAyAQwC4PCyAAKQMgEIMrDwsgACkDGCAAKAIgEI4vDwsgACkDEBDIISAAKQMYEMghDwsgAEEEahCHLA8LIABBBGoQtSwgACgCGBCELCAAKAIIIgAQhywgAEEgQQQQsxYPCyAAKAIIIgIgACgCDBCdJSAAKAIEIAIQoS0CQAJAIAAoAhAiAigCAEGAgICAeEYNACACEMkoDAELIAJBBGoQtSwLIAJBGEEEELMWIAAoAiAQ5yQgAEEkahDCKw8LIAApAwggAC0AHBDvKCAAKAIgIgAQlCggAEEQaiICKAIAIABBFGooAgAQmiUgACgCDCACKAIAEKItIABBMGoQwysgACgCNBDnJCAAKAI4EIQsIAAoAhwiAiAAKAIgEIAQIAAoAhggAhCbLSAAQcAAQQQQsxYPCyAAQQxqEMMrDwsgAEEEahC1LA8LIABBBGoQtSwPCyAAQQhqEPkiDwsgACkDCCAAKQMYEMEuDwsgACgCBCIAQcAAahCxHiAAQYABaiICKAIAIABBhAFqKAIAELQbIAAoAnwgAigCABCiLSAAKAJ4EIQsIABBkAFqEIkrAkAgAC0APEEGRg0AIABBEGoQsR4LIABBoAFBCBCzFg8LIABBBGoQiSsPCyAAQQRqELYsDwsgAEEEahC1LA8LIABBBGoQtSwPCyAAQQRqELYsDwsgAEEEahDYLQ8LIABBBGoQtiwPCyAAKQMIEMghDwsgAEEEahDOHwsLwwgBAn8CQAJAAkACQAJAAkACQAJAIAAoAgAiAkF8aiIDQQQgA0EHSRsOBwABAgMEBQYACwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0ACQAJAAkACQAJAIAMoAgAOBAABAgMACyADQQhqIAEQqSgMAwsgA0EEaiABENcXDAILIANBBGogARDaJQwBCyADQQRqIAEQ6RoLIANBKGohAyACQVhqIgINAAsLAkAgACgCGCIDRQ0AIAMoAgAgARCvAgsgACgCHCIDRQ0GIANBCGooAgAiAkUNBiACQTBsIQIgA0EEaigCAEEkaiEDA0ACQCADQXxqKAIAIgBFDQAgACABEK8CCwJAIAMoAgAiAEUNACAAIAEQrwILIANBMGohAyACQVBqIgINAAwHCwsCQCAAKAIMIgJFDQAgACgCCCEDIAJBKGwhAgNAAkACQAJAAkACQCADKAIADgQAAQIDAAsgA0EIaiABEKkoDAMLIANBBGogARDXFwwCCyADQQRqIAEQ2iUMAQsgA0EEaiABEOkaCyADQShqIQMgAkFYaiICDQALCwJAIAAoAhgiA0UNACADKAIAIAEQrwILIAAoAhwiA0UNBSADQQhqKAIAIgJFDQUgAkEwbCECIANBBGooAgBBJGohAwNAAkAgA0F8aigCACIARQ0AIAAgARCvAgsCQCADKAIAIgBFDQAgACABEK8CCyADQTBqIQMgAkFQaiICDQAMBgsLIAAoAhAgARCkAiAAKAIMIgNFDQQgAygCACABEK8CDwsgACgCBCABEKQCIAAoAhAiA0UNAyADKAIAIAEQrwIPCyAAKAIwIAEQpAICQAJAAkACQCACDgQAAQIDAAsgAEEIaiABEKkoDwsgAEEEaiABENcXDwsgAEEEaiABENolDwsgAEEEaiABEOkaDwsgACgCECABEKQCAkAgACgCDCICRQ0AIAAoAgghAyACQShsIQIDQAJAAkACQAJAAkAgAygCAA4EAAECAwALIANBCGogARCpKAwDCyADQQRqIAEQ1xcMAgsgA0EEaiABENolDAELIANBBGogARDpGgsgA0EoaiEDIAJBWGoiAg0ACwsCQCAAKAIcIgNFDQAgAygCACABEK8CCyAAKAIgIgNFDQEgA0EIaigCACICRQ0BIAJBMGwhAiADQQRqKAIAQSRqIQMDQAJAIANBfGooAgAiAEUNACAAIAEQrwILAkAgAygCACIARQ0AIAAgARCvAgsgA0EwaiEDIAJBUGoiAg0ADAILCwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0ACQAJAAkACQAJAIAMoAgAOBAABAgMACyADQQhqIAEQqSgMAwsgA0EEaiABENcXDAILIANBBGogARDaJQwBCyADQQRqIAEQ6RoLIANBKGohAyACQVhqIgINAAsLIAAoAhAiA0UN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aiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ02AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIADAMLIAEQjQsNAAsgAkGcAWogBUEIaigCACIENgIAIAJBiAFqQQhqIgMgBDYCACACIAUpAgAiCDcClAEgAiAINwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ82AgAgACACKQOIATcCKCAAQTBqIAMpAwA3AgAgAEE4aiACQZgBaikDADcCAAwBCyACKAIEIQQgAkHIAWogARCnDSACQYgBakEQaiIDIAIoAhQgAigCGCAEQYTDhAEQ0SUiBEEQaikCADcDACACQYgBakEIaiIHIARBCGopAgA3AwAgAiAEKQIANwOIASAAQRxqIAEoAgQgASgCCBCKFCAAQQ42AgAgACACKQOIATcCBCAAQQxqIAcpAwA3AgAgAEEUaiADKQMANwIAIAAgAikCyAE3AiggAEEwaiACQcgBakEIaikCADcCACAAQThqIAJByAFqQRBqKQIANwIACyACKAIQIAIoAhQQ9iwLIAJB4AFqJAALswkCCH8CfiMAQaALayIDJAAgA0EDNgIwIANBADsANSADQQA6AB4gA0EAOgAqIANBAToAICADQoKAgIAwNwIUIANBAzYCJCADQQE6ADQgA0EAOgA5IANBgAI7ASwgA0EBOwEoIANBATsBHCADQQJBASACQfUDSRsiBDoAOCADQaADaiADQRRqQRxqIAEgAhCmAgJAAkACQAJAIAMoAqADQQFHDQAgA0EQaiADQb4Dai8BADsBACADIAMpAbYDNwMIIAMtALUDIQEgAy0AtAMhBCADKAKwAyEFIAMoAqwDIQIgAygCqAMhBgwBCyADQcgIaiIBIANBvgNqLwEAOwEAIAMgAykBtgM3A8AIIAMpAqQDIQsgAykCrAMhDCADLwG0AyEFAkBByAJFDQAgA0E8akEcaiADQcADakHIAvwKAAALIANB1gBqIAEvAQA7AQAgAyAFOwFMIAMgDDcCRCADIAs3AjwgAyADKQPACDcBTgJAAkACQAJAAkAgAkH1A0kNACADQaADakECQQEg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eHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahC3HyACIAAoAgwQny0gACgCGCIBIAAoAhwQthAgACgCFCABEKAtDwsgACkDICIDUA0DIANCA4NCAFINAyADpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgACkDECAAKQMgEKoUDwsgACkDGCAAKAIgELQZDwsCQCAALQAcQQJGDQAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACgCKCIARQ0AIAAoAgAiARDSAyABQeAAQQgQsxYgAEEMQQQQsxYPCwvUBwIBfwF+IwBBIGsiAyQAIANBEGogAiABKAIAQQAQiwICQAJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKkUNACADQQA2AhAgA0EIaiACIANBEGpBm/ObAUEFELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKEUNACADQQA2AhAgA0EIaiACIANBEGpBnJacAUECELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELAkAgAS0AKUUNACADQQA2AhAgA0EIaiACIANBEGpBufObAUEDELMNAkAgAy0ACEEERg0AIAMpAwgiBEL/AYNCBFENACAAIAQ3AgAMAgsgA0EQaiACEJIRIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAUEIaiACEIQYAkAgAy0AEEEERg0AIAMpAxAiBEL/AYNCBFENACAAIAQ3AgAMAQsCQCABKAIgRQ0AIANBEGogAhCSEQJAIAMtABBBBEYNACADKQMQIgRC/wGDQgRRDQAgACAENwIADAILIANBADYCECADQQhqIAIgA0EQakG885sBQQcQsw0CQCADLQAIQQRGDQAgAykDCCIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQRBqIAIQkhECQCADLQAQQQRGDQAg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QQEhAiAEQczjlwFBvOOXASADQQFxIgUbQRlBECAFGxCCBg0FCyAAIAM6AARBACECDAELAkAgASgCECIDQQFxDQAgAUKAgICAIDcCGCABIAI2AgwgASADNgIQIAEgAiADaiIFNgIUAkADQCABQQxqEMMDQYCAvH9qDgICAQALCyAAKAIQIgRFDQMgBCgCAEEiIARBBGoiBigCACgCEBEHAA0CIAFCgICAgCA3AhggASAFNgIUIAEgAzYCECABIAI2AgwgAUEoaiEHA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBDGoQwwMiA0GBgMQARg0AIANBgIDEAEYNCiADQSdGDQsCQCADQSFKDQAgA0F3ag4FBwQDAwgCCyADQSJGDQQgA0HcAEcNAkHcACEIQQAhCUECIQpBACELQQAhA0EAIQxB3AAhBQwNCyAEKAIAQSIgBEEEaigCACgCEBEHACECDBILIANFDQMLIANB/wVNDQkgAxD/B0UNCSABQSBqIAMQ9wogASkAIiIOQjCIpyELIA5CEIinIQMgAS0AKyEKIAEtACohDCABLQAhIQggAS0AICEFIA6nIQkMCgtB3AAhBUHuACEIDAQLQdwAIQVBIiEIDAMLQdwAIQVBMCEIQQAhCUECIQpBACELDAMLQdwAIQVB9AAhCAwBC0HcACEFQfIAIQgLQQAhCUECIQpBACELQQAhAwtBACEMDAMLQcSInAFBKyABQSBqQazblwFBnNuXARDqEgALIAQoAgBBJyAGKAIAKAIQEQcADQUMAgtBgAEhBSADENIMDQAgAUEgaiADEPcKIAEpACIiDkIwiKchCyAOQhCIpyEDIAEtACshCiABLQAqIQwgAS0AISEIIAEtACAhBSAOpyEJCyABIAg6ACEgASAFOgAgIAEgC61CMIYgCa1C//8Dg4QgA61CEIaENwEiIAohDSAMIQADQAJAAkAgBUH/AXFBgAFHDQBBACEFIAdBADsBACABQgA3AyBBACENQQAhACADIQJBACEDDAELIABB/wFxIgIgDUH/AXFPDQIgAEEBaiEAIAFBIGogAmotAAAhAgsgBCgCACACIAYoAgAoAhARBwANBAwACwsLAkAgACgCECICRQ0AIAJBvOOXAUEQEIIGDQILQQAhAiAAQQA6AAQLIAAgAjYCAAwCC0EBIQIMAQtBACECCyABQTBqJAAgAgvrBwIHfwF+IwBB8ABrIgMkACADQQhqIAEoAgAiBEHAAGpBuMaEARDsIyADKAIMIQUgAygCCCIGQQA2AgggA0EQakEIaiAEQdgAaigCADYCACADIAQpAlA3AxAgA0HAAGogARCnDSADQSBqQQhqIANB1ABqKAIANgIAIAMgAykCTDcDICAEQdAAaiEEAkACQANAIAEQ1CRFDQEgARD7D0H9AEYNAQJAIAEQ+w8Q4iINACADQcAAaiABEKcNIABBHGogASgCBCABKAIIEIoUIABBCTYCACAAIAMpAkA3AiggAEEwaiADQcgAaikCADcCACAAQThqIANB0ABqKQIANwIADAMLIAYgARD7DxDAFwwACwsCQAJAAkACQCAEKAIAIgcgASgCCCIIRg0AIANBMGpBCGogBEEIaigCADYCACADIAQpAgA3AzAgBigCBCEJIAYoAgghBiADIAEQ+w8iBzYCPCAHQf0ARw0BIAEQ1CQaIAZFDQIgA0HAAGogCSAGQRAQnwggAy0AQA0DIAMoAkQiBkGAsANzQYCAvH9qQYCQvH9JDQMgBkGAgMQARg0DIANB2ABqQQhqIgEgA0EgakEIaigCADYCACADQewAaiAEQQhqKAIANgIAIAAgBjYCBCAAIAMpAyAiCjcCCCAAIAI6ACEgAEEFOgAgIAMgBCkCADcCZCAAQRBqIAEpAwA3AgAgAEEYaiADQdgAakEQaikDADcCACADIAo3A1ggAEEiNgIADAQLIANB1ABqIARBCGooAgA2AgAgA0HAAGpBCGoiBiADQRBqQQhqKAIANgIAIAMgAykDEDcDQCADIAQpAgA3AkwgAEEcaiABKAIEIAcQihQgAEEKNgIAIAAgAykDQDcCKCAAQTBqIAYpAwA3AgAgAEE4aiADQdAAaikDADcCAAwDCyADQQA2AkAgA0E8akHIxoQBIANBwABqQczGhAEQtyEACyADQdQAaiAEQQhqKAIANgIAIANBwABqQQhqIgYgA0EQakEIaigCADYCACADIAMpAxA3A0AgAyAEKQIANwJMIABBHGogASgCBCAIEIoUIABBBzYCACAAIAMpA0A3AiggAEEwaiAGKQMANwIAIABBOGogA0HQAGopAwA3AgAMAQsgA0HAAGpBCGoiBiADQSBqQQhqKAIANgIAIANB1ABqIANB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AiABEKkEDAELAkACQAJAAkACQAJAAkACQAJAAkAgAg4LAAECAwQFBgcICQoACyAAQQhqIAEoAhQQmC8MCQsgASAAQQhqEJ0mDAgLIAEgAEEIahDDKAwHCyAAQQRqIAEQlC8MBgsgAEEEaiABEJQjDAULIABBBGogARCULwwECyAAQQRqIAEQlC8MAwsgAEEEaiABEJQvDAILIABBBGogARCULwwBCyAAQQRqIAEQlC8LIAMgARCULw8LIAEgAEEIahCdJg8LIAEgAEEIahDDKA8LIABBBGogARCULyAAQQhqIAEQlC8gAEEMaiABEJQvDwsgAEEEaiEDAkAgAC0AGEEFRw0AIABBEGogARCULwsgASADEKAfDwsgAEEQaiABEJQvIAAoAgRBgICAgHhGDRMgASAAQQRqEKAfDwsgASAAQQRqEKIfDwsgASgCFCAAQQhqEKsIGg8LIAEgAEEEahCiHw8LIABBBGogARCULyABIAAoAggQoh8PCyAAKAIMQShsIQMgACgCCCECAkADQCADRQ0BIAIgARCOFiADQVhqIQMgAkEoaiECDAALCwJAIAAoAhAiACgCAEGAgICAeEcNACAAQQRqIAEQlC8PCyABIAAQlAcPCyABIABBCGoQlRAPCyAAKAIMRQ0MIABBDGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBIGogASgCFBC0JA8LIAAoAgQgARCTDw8LIABBBGogARD8Ew8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCULw8LIABBBGogARCUIwsLnwcBDH8gAC0AJCECIABBADoAJCAALQAlIQMCQCABKAIwIgRFDQAgACAEEFQLIAAtACYhBSAAQQA6ACYgASgCECEGAkAgASgCFCIHRQ0AIAYgB0HYAGxqIQggBiEJA0ACQAJAAkACQAJAAkACQAJAIAkoAgAiCkF8akEAIApBe2pBCEkbDgkAAQIDBAcHBQYACyAAIAkQkyQCQCAJKAJIIgpFDQAgCSgCRCILIApBBnRqIQwDQAJAAkAgCygCAEEHRg0AIAAvASQhCiAAQQI6ACQgCyAAEL4eIAAgCjsBJAwBCwJAIAsoAjgiDUUNACALKAI0IQogDUEM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AwA3AgAgAkEIaiALKQMANwIAIAIgFTcCACABQYABaiQAIAIPCyAQIAEoAihBtPKaARCOKQALpwcCCn8BfiMAQfAAayICJAACQAJAIAAoAgAiA0EJRw0AIAFBADoAfSAAQQhqIAEQ5AIMAQsCQAJAAkACQAJAAkACQAJAAkAgAw4JAAECAwQFBgcIAAsCQCAAKAIMIgNFDQAgACgCCCEEIANByABsIQUgAUEsaiEGIAFBgAFqIQdBACEIA0ACQAJAAkACQCAEIAhqIgMpAwBCfXwiDKdBAWpBACAMQgJUGw4DAAECAAsgA0EgaiIJKQMAIANBMGoiCigCACABEOoeAkAgAykDACIMQgJRDQAgDKdBAXENACADQQhqKQMAIANBGGooAgAgARDqHgsgAkEIaiAJKQMAIAooAgAQuR8gBiACKQMIIAIoAhBBARCzDCABIAkpAwAgCigCABDVEQwCCyADQSBqIgsoAgAiCSEKAkAgAS0AkAENACAJIQogCUUNACACQQhqIANBEGopAwAgCRC5HyAHIAIpAwggAigCEBCJBhogCygCACEKCyACQQhqIANBEGoiAykDACAKELkfIAYgAikDCCACKAIQQQEQswwgASADKQMAIAkQ1REMAQsgA0EgaiILKAIAIgkhCgJAIAEtAJABDQAgCSEKIAlFDQAgAkEIaiADQRBqKQMAIAkQuR8gByACKQMIIAIoAhAQiQYaIAsoAgAhCgsgAkEIaiADQRBqIgMpAwAgChC5HyAGIAIpAwggAigCEEEBELMMIAEgAykDACAJENURCyAFIAhByABqIghHDQALCyAAKAIcIgNFDQggAyABEPYYDAgLIABBCGogARDMBAwHCyAAQQRqIQMCQCAAKAIYDQAgAyABEP8IDAcLIAEtAJABIQggAUEBOgCQASADIAEQ/wggASAIOgCQAQwGCwJAAkACQAJAIAAoAggOAwABCQALIAFBLGoiAyAAQRBqELwSIAAtACRBAkcNASACQQhqIAMQgg0MAgsgAUEsaiAAQRBqIgMQmx8gASADENoFDAcLIAEgACkDECIMIAAoAiAiCBDVESACQQhqIAMQgg0gAS0AkAENACAIRQ0AIAJB4ABqIAwgCBC5HyABQYABaiACKQNgIAIoAmgQiQYaCyAAKAIoIAEQrwYgAyACQQhqEKYDDAULIAEgACgC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AgA3AgAgDkFoQQAgDRtqIQ4gD0FoQQAgCyAMTxtqIQ8gBSADIAlPQRhsaiEFIAcgCkEYbGohByAEQX9qIQQgBkFoaiEGIABBGGohAAwACwsQ4SEACyAIQQFqIQgMAAsLIAJBkAlqJAAL7gYCCX8BfiMAQfAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4DAAECAAsgAUEIaiAAEKgoIAAgASgCKBDCJwwCCyAALQCcASEDIABBADoAnAECQCABKAIwIgRFDQAgACAEEKcBCyAAIAM6AJwBIAAoAgANAgwDCyAAIAEoAgQQwicLIAAoAgBFDQEgA0EBRw0BCyAAIAFBEGoiAxCqBSIERQ0AIAEoAjAhBSABQQA2AjACQAJAIAUNACAEIQAMAQsQ+ichACACQTBqIAQQQiAAQThqIAJBMGpBOGopAwA3AwAgAEEwaiACQTBqQTBqKQMANwMAIABBKGogAkEwakEoaiIGKQMANwMAIABBIGogAkEwakEgaiIHKQMANwMAIABBGGogAkEwakEYaiIIKQMANwMAIABBEGogAkEwakEQaiIJKQMANwMAIABBCGogAkEwakEIaiIKKQMANwMAIAAgAikDMDcDACACIAAQoREgAigCAEEMRg0CIAYgAkEoaikDADcDACAHIAJBIGopAwA3AwAgCCACQRhqKQMANwMAIAkgAkEQaikDADcDACAKIAJBCGopAwA3AwAgAiACKQMANwMwQQAtAKDxngEaQcAAEH0iAEUNAyAAIAIpAzA3AwAgAEEAOgA8IAAgBTYCOCAAQgA3AzAgAEEoaiACQTBqQShqKQMANwMAIABBIGogAkEwakEgaikDADcDACAAQRhqIAJBMGpBGGopAwA3AwAgAEEQaiACQTBqQRBqKQMANwMAIABBCGogAkEwakEIaikDADcDACAEEM4BIARBwABBCBCzFgsgAkEwakEYaiADQRhqKQMANwMAIAJBMGpBEGogA0EQaikDADcDACACQTBqQQhqIANBCGopAwA3AwAgAUIANwMYIAMpAwAhCyABQgE3AxAgAUEdakIANwAAIAFBADYCKCACIAs3AzAgAiACQTBqELYZQQAtAKDxngEaIAIpAwAhCyACKAIMIQQgAigCCCEFQSgQfSIDRQ0CIAMgADYCBCADQQY2AgBCAUEAELQYIAEgAzYC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EOARIAAgASAEKAIAIAQoAgQQ4yUNAwsgEw0BDAALCwsgBEGAAWokACAKIAdHC/MGAQ5/IwBBkAFrIgMkACABKALYASEEIANBADYCJCADQoCAgIDAADcCHCADQdAAaiABIAIQqA8gAygCUCEFAkACQAJAAkAgAy0AaCIGQQJGDQAgA0EwakEQaiIHIANB0ABqQRRqKAIANgIAIANBMGpBCGoiCCADQdAAakEMaikCADcDACADIAMpAlQ3AzAgAyADKABpNgIoIAMgA0HQAGpBHGooAAA2ACtBCEEgEKAsIglFDQMgCSAFNgIAIAkgAykDMDcCBCAJIAY6ABggCSADKAIoNgAZIAlBHGogAygAKzYAACAJQQxqIAgpAwA3AgAgCUEUaiAHKAIANgIAIAMgCTYCSCADQQE2AkQgA0HQAGpBBHIhCkEAIQggA0HpAGoiC0EDaiEMQQQhDUEAIQdBASEJA0AgAyAJNgJMIAZBAXENAgJAAkAgASgCiAEiCUHAAHENACABIAlBwAByNgKIASADIAEQ/wkgAygCACEJIAEgASgCiAFBv39xNgKIASADKAIEIQUMAQsgA0EIaiABEP8JIAMoAgwhBSADKAIIIQkLAkAgCUEBcQ0AAkAgByADKAIcRw0AIANBHGpBuOKbARD1HSADKAIgIQ0LIA0gCGogBTYCACADIAdBAWoiBzYCJCADQdAAaiABIAIQtgYgAygCUCEFIAMtAGgiBkECRg0AIANB+ABqQRBqIg4gCkEQaigCADYCACADQfgAakEIaiIPIApBCGopAgA3AwAgAyAKKQIANwN4IAMgCygAADYCcCADIAwoAAA2AHMCQCADKAJMIhAgAygCREcNACADQcQAakHI4psBEOkdCyADKAJIIBBBBXRqIgkgBTYCACAJIAMpA3g3AgQgCSAGOgAYIAkgAygCcDYAGSAJQQxqIA8pAwA3AgAgCUEUaiAOKAIANgIAIAlBHGogAygAczYAACAIQQRqIQggEEEBaiEJDAELCyADQcQAahCNKAsgA0EcahCYKEGAgICAeCEJDAELIANBEGpBCGoiBiADQcQAakEIaigCADYCACADIAMpAkQ3AxAgAygCICEFIAMoAhwiCUGAgICAeEYNACAAIAMpAxA3AgwgAEEUaiAGKAIANgIAIAAgBDYCGCAAIAc2AgggACABKALU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IQQgAi0APiEFIAIoAjAhBiADQTBqIAJBLGooAgA2AgAgAyACKQIkNwMoIAItAD8hByACLQBAIQggAi0APSEJIAMgAi0AQToAJiADIAItAEI6ACcgASgCiAEhCiADIANBJ2o2AjwgAyADQSZqNgI4IAMgA0EgajYCNAJAAkAgCkGAgIAQcQ0AIAEgCkGAgIAQcjYCiAEgA0EQaiADQShqIAEQlQ4gAygCECELIAEgASgCiAFB////b3E2AogBIAMoAhQhCgwBCyADQRhqIANBKGogARCVDiADKAIcIQogAygCGCELCwJAAkAgC0EBcUUNACAAQQ02AgAgACAKNgIEIAIQjycMAQsCQAJAAkACQCAJDgMDAAEDCyABLQCRAUEgcUUNAiABLQCSAUH/AXENAgwBCyABLQCRAUEgcUUNASABLQCSAUH/AXENAQsgA0EIaiACENYhIAMoAgwhCyADKAIIIQwgA0GAgYCAeDYCKCABIAwgCyADQShqEN4jCwJAAkACQCACKAIAQQVGDQAgASgC1AEhCyADKAIgIQwgBUEBcQ0BDAILIAJBCGohCyABKALUASENIAIoAhQhAiADKAIgIQwCQCAEQf8BcUEDRg0AIANBtYGAgHg2AiggASAMIAIgDCACSRsgDCACIAwgAksbIANBKGoQ3iMLIANBKGpBDGogC0EIaigCADYCACAAQQY2AgAgACAIOgApIAAgBzoAKCAAIAU6ACcgACAJOgAlIAAgBDoAJCAAIAo2AiAgACANNgIcIAAgDDYCGCAAIAI2AhQgACAGQQBHOgAmIAMgCykCADcCLCAAIAMpAig3AgQgAEEMaiADQShqQQhqKQIANwIADAILIAooAhhBgICAgHhGDQAgA0GhgYCAeDYCKCABIAwgCyADQShqEN4jCyAAQQU2AgAgA0HEAGogAkEYaikCADcCACADQTxqIAJBEGopAgA3AgAgA0E0aiACQQhqKQIANwIAIAMgAikCADcCLAJAQSRFDQAgAEEEaiADQShqQST8CgAACyAAIAQ6ADkgACAJOgA4IAAgCDoANyAAIAc6ADYgACAFOgA1IAAgBkEARzoANCAAIAo2AjAgACALNgIsIAAgDDYCKAsgA0HQAGokAAuJBwIIfwF+IwBBwAFrIgMkACADQZABakEIaiEEIANB4ABqQQhqIQUgACgCACEGAkACQANAAkACQAJAAkACQCACLQDgASIHQdQARg0AIAdBzgBHDQELIANBADYCJCADQoCAgICAATcCHCACKALYASEIIAIQoQsgB0HOAEYNASAGQQFxRQ0CIAIoAtwBIQcgAigC2AEhCSAAKQIEIQsgA0G5gICAeDYCYCADIAs3AmQgCSAHIANB4ABqEOAaIQogAi0A4AFBogFHDQUgAiACEJosEKcXDAULQQAhCgwFCwJAAkAgAigCiAEiB0HAAHENACACIAdBwAByNgKIASADQQhqIAIQ/wkgAygCCCEHIAIgAigCiAFBv39xNgKIASADKAIMIQoMAQsgA0EQaiACEP8JIAMoAhQhCiADKAIQIQcLIAdBAXFFDQEMAwsgACAINgIEQQEhBiAAQQE2AgAgACACKALUATYCCEEAIQoLIAMgCjYCKAJAAkAgAi0A4AFBCUYNACACKALcASEHIAIoAtgBIQkgA0EsaiACENQmIANBATYCZCADQZy/nAE2AmAgA0IBNwJsIANBswc2AlQgA0EJOgBfIAMgA0HQAGo2AmggAyADQdgAajYCUCADIANB3wBqNgJYIANBOGogA0HgAGoQ/RogA0HMAGogA0E0aigCADYCACADIAMpAiw3AkQgCSAHIANBOGoQ4BohCiACLQDgAUGiAUcNASACIAIQmiwQpxcMAQsgAhChCwNAAkACQCACLQDgASIHQQNGDQAgB0HUAEYNACAHQc4ARw0BCyACKALUASEJAkAgASgCCCIHIAEoAgBHDQAgARDnHQsgASAHQQFqNgIIIAEoAgQgB0EYbGoiByADKQIcNwIAIAcgCjYCFCAHIAk2AhAgByAINgIMIAdBCGogA0EcakEIaigCADYCAAwDCwJAAkAgAigCiAEiB0GAgICAAnFFDQAgAiAHQf////99cTYCiAEgA0HgAGogAhC2LyACIAIoAogBQYCAgIACcjYCiAEMAQsgA0HgAGogAhC2LwsgAygCZCEHAkAgAygCYCIJQRNHDQAgByEKDAILAkBBKEUNACAEIAVBKPwKAAALIAMgBzYClAEgAyAJNgKQASADQRxqIANBkAFqQeienAEQ+B4MAAsLCyADQShqEMcrCyADQRxqEMkoCyADQcABaiQAIAoL3gYBCH8jAEGAAWsiAiQAAkACQCABKAIIDQAgASgCBCIDQQAQ8CIgASgCACADEJ8tDAELAkACQAJAAkACQCAAKAIgQYCAgIB4Rg0AIAJBCGpBCGogAUEIaigCADYCACACQQA7ARQgAiABKQIANwMIQQBBBBCfLQJAIAAoAigiA0UNACAAKAIkIQEgA0EwbCEDA0AgASACQQhqEJoEIAFBMGohASADQVBqIgMNAAsgAi0AFUEBcQ0ECyACKAIQIQMgAkEANgIQIAIoAgghBCACKAIMIQEgAkKAgICAwAA3AwggAkEcaiAAQSBqQQBBABDYEyACIAEgA0ECdGo2AjwgAiAENgI4IAIgATYCNCACIAE2AjACQCACKAIcIgEgAigCICIERg0AIAJBwABqQQRyIgBBKGohBSAAQSBqIQYgAEEYaiEHIABBEGohCCAAQQhqIQkDQCABKAIAIgNBE0YNASAFIAFBLGooAgA2AgAgBiABQSRqKQIANwIAIAcgAUEcaikCADcCACAIIAFBFGopAgA3AgAgCSABQQxqKQIANwIAIAAgAUEEaikCADcCACACIAM2AkAgAkHAAGoQhQIgAUEwaiIBIARHDQALCyACQRxqQRRqIQEgAkKIgICAgAE3AhwgAigCJCEDAkAgAigCLA0AIAMgAUGYsJsBEIgDDAMLIAMgAigCKCABEIwDRQ0CAkAgAigCPCIAIAIoAjQiA0cNACADIQAMAgsgAkEcaiAAIANrQQJ2EMIUIAIoAiQgAigCKCABEIwDRQ0CIAIoAjwhAyACKAI0IQAMAQtBqLCbAUEeQbSxmwEQshcACyACQcAAaiADIABrQQJ2QQhBMBCVDyACKAJEIQMgAigCQEEBRg0CIAJBADYCfCACIAIoAkg2AnggAiADNgJ0IAJB9ABqIAFB4OmbARCIAyACIAIoAnQ2AkggAiACKAJ4IgM2AkAgAiADNgJEIAIgAyACKAJ8IgBBMGxqNgJMAkAgAEUNACACQRxqIAAQwhQgAigCJCACKAIoIAJBwABqELIIGgsgAkHAAGoQsx0LIAJBHGoQugsgARCGHQsgAigCDCACKAIQEPAiIAIoAgggAigCDBCfLQwBCyADIAIoAkhB4OmbARCOKQALIAJBgAFqJAALyAYCBn8BfiMAQSBrIgIkAEEALQCg8Z4BGgJAQcAAEH0iA0UNACADQQA2AgggA0IMNwMAAkACQAJAAkACQAJAAkACQCAAKAIADgUAAgMBBAALIAApAxAhCCAAKAIMIQQgACgCCCEFQQAhBgwGCyAAKAIMIQQgACgCCCEFIAAoAgQhB0ECIQYMBAsgAkEEakEUaiAAQRhqKQIANwIAIAJBEGogAEEQaikCADcCAEEAIQRBAC0AoPGeARogAiAAKQIINwIIQcAAEH0iB0UNBSAHQQA2AgggB0EbNgIAIAcgAikCBDcCDCAHQRRqIAJBDGopAgA3AgAgB0EcaiACQQRqQRBqKQIANwIAIAdBJGogAkEEakEYaigCADYCAAwCCyACQQRqQRRqIABBGGopAgA3AgAgAkEQaiAAQRBqKQIANwIAQQAhBEEALQCg8Z4BGiACIAApAgg3AghBwAAQfSIHRQ0EIAdBAzYCCCAHQRs2AgAgByACKQIENwIMIAdBFGogAkEMaikCADcCACAHQRxqIAJBBGpBEGopAgA3AgAgB0EkaiACQQRqQRhqKAIANgIADAELIAJBBGpBFGogAEEYaikCADcCACACQRBqIABBEGopAgA3AgBBACEEQQAtAKDxngEaIAIgACkCCDcCCEHAABB9IgdFDQMgB0EENgIIIAdBGzYCACAHIAIpAgQ3AgwgB0EUaiACQQxqKQIANwIAIAdBHGogAkEEakEQaikCADcCACAHQSRqIAJBBGpBGGooAgA2AgALQQIhBkEAIQULC0EALQCg8Z4BGkHAABB9IgBFDQAgACABKQMANwMAIABBOGogAUE4aikDADcDACAAQTBqIAFBMGopAwA3AwAgAEEoaiABQShqKQMANwMAIABBIGogAUEgaikDADcDACAAQRhqIAFBGGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDAEEALQCg8Z4BGkHAABB9IgFFDQAgAUEAOgA8IAEgADYCOCABQgA3AzAgASADNgIoIAFCADcDICABIAg3AhggASAENgIUIAEgBTYCECABIAc2AgwgASAGNgIIIAFBATYCACACQSBqJAAgAQ8LAAvdBgIOfwN+IwBB8ABrIgIkACABKALYASEDIAEQmwEgAkHQAGogARDPCgJAAkACQAJAAkACQAJAIAItAGRBAkcNACACKAJQIQEMAQsgAikDWCEQIAIpA1AhESABLQDgAUEJRw0CIAEQoQsgARCbASACQdAAaiABEM8KIAItAGRBAkcNASAC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ARCkBCAAKAIUIgANCAwKCyABIAAoAhAQngMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEJ4DCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQngMMCAsgAEEIaiABEIwHDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOQaDAILIAIgARDmGgwBCyACIAEQog4LIAEgACgCDBCeAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEOQaDAILIAIgARDmGgwBCyACIAEQog4LIAEgACgCDBCeAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxCeAwwBCyADIAEQ5BoLAkAgACgCGCICRQ0AIAEgAhCeAwsCQCAAKAIcIgJFDQAgASACEJ4DCyAAKAIMIQAMAgsgASAAKAIEEJ4DIAAoAgghAAwBCyABIAAoAgQQngMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCkBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCiDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKQEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEJ4DC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQggMgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQggMPCyAAKAIoIQAMCQsgACgCBCABEIIDIAAoAgggARClBCAAKAIUIgANCAwKCyAAKAIQIAEQggMgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEIIDCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQggMMCAsgAEEIaiABEKkBDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPIaDAILIAIgARDzGgwBCyACIAEQpA4LIAAoAgwgARCCAyAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPIaDAILIAIgARDzGgwBCyACIAEQpA4LIAAoAgwgARCCAyAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARCCAwwBCyADIAEQ8hoLAkAgACgCGCICRQ0AIAIgARCCAwsCQCAAKAIcIgJFDQAgAiABEIIDCyAAKAIMIQAMAgsgACgCBCABEIIDIAAoAgghAAwBCyAAKAIEIAEQggMgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARClBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCkDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpQQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKUEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEIIDC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ADA8LCyAAKAIEIAEQpAIgACgCCCEADAsLIAAoAgwiAEUNDCAAIAEQpAIPCyAAKAIoIQAMCQsgACgCBCABEKQCIAAoAgggARCmBCAAKAIUIgANCAwKCyAAKAIQIAEQpAIgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgACABEKQCCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyAAKAIEIAEQpAIMCAsgAEEIaiABEKACDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQigsLIAAoAgwgARCkAiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPAaDAILIAIgARDxGgwBCyACIAEQigsLIAAoAgwgARCkAiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAMgARCkAgwBCyADIAEQ8BoLAkAgACgCGCICRQ0AIAIgARCkAgsCQCAAKAIcIgJFDQAgAiABEKQCCyAAKAIMIQAMAgsgACgCBCABEKQCIAAoAgghAAwBCyAAKAIEIAEQpAIgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCmBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARCKCwsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpgQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKYEIABBMGohACACQVBqIgINAAsLDwsgACgCBCABEKQCC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ0QEgACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ0QEPCyAAKAIoIQAMCQsgASAAKAIEENEBIAAoAgggARCnBCAAKAIUIgANCAwKCyABIAAoAhAQ0QEgACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAENEBCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ0QEMCAsgAEEIaiABEI0HDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEO4aDAILIAIgARDvGgwBCyACIAEQpQ4LIAEgACgCDBDRASAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEO4aDAILIAIgARDvGgwBCyACIAEQpQ4LIAEgACgCDBDRASAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxDRAQwBCyADIAEQ7hoLAkAgACgCGCICRQ0AIAEgAhDRAQsCQCAAKAIcIgJFDQAgASACENEBCyAAKAIMIQAMAgsgASAAKAIEENEBIAAoAgghAAwBCyABIAAoAgQQ0QEgACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCnBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARClDgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQpwQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEENEBC/MGAQN/AkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFEA4MCwoJCAcGAAsgACgCDCICRQ0OIAAoAgghACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ADA8LCyABIAAoAgQQ9hogACgCCCEADAsLIAAoAgwiAEUNDCABIAAQ9hoPCyAAKAIoIQAMCQsgASAAKAIEEPYaIAAoAgggARCoBCAAKAIUIgANCAwKCyABIAAoAhAQ9hogACgCDCICRQ0JIAAoAggiAyACQRhsaiEEA0ACQCADKAIUIgBFDQAgASAAEPYaCwJAIANBCGooAgAiAkUNACADQQRqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLIANBGGoiAyAERg0KDAALCyABIAAoAgQQ9hoMCAsgAEEIaiABEPoCDwsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPkaDAILIAIgARD6GgwBCyACIAEQ8goLIAEgACgCDBD2GiAAKAIQIQAMBAsgACgCCCECAkACQAJAAkAgACgCBA4DAAECAAsgAiABEPkaDAILIAIgARD6GgwBCyACIAEQ8goLIAEgACgCDBD2GiAAKAIQIQAMAwsCQCAAKAIEIgJBAkYNACAAKAIIIQMCQCACQQFxRQ0AIAEgAxD2GgwBCyADIAEQ+RoLAkAgACgCGCICRQ0AIAEgAhD2GgsCQCAAKAIcIgJFDQAgASACEPYaCyAAKAIMIQAMAgsgASAAKAIEEPYaIAAoAgghAAwBCyABIAAoAgQQ9hogACgCCCEADAALCwJAIAAoAgQiA0HQAGooAgAiAkUNACADQcwAaigCACEAIAJBMGwhAgNAIAAgARCoBCAAQTBqIQAgAkFQaiICDQALCwJAAkACQCADKAIAQXlqDgIBAgALIAMgARDyCgsgA0EwaigCACICRQ0AIANBLGooAgAhACACQTBsIQIDQCAAIAEQqAQgAEEwaiEAIAJBUGoiAg0ACwsgAygCYEGAgICAeEYNACADQegAaigCACICRQ0AIANB5ABqKAIAIQAgAkEwbCECA0AgACABEKgEIABBMGohACACQVBqIgINAAsLDwsgASAAKAIEEPYaC8AGAhN/AX4jAEHQAGsiAiQAIAAoAghBOGwhAyACQRhqQQRqIQQgASgCFCEFIAAoAgQhBkEAIQcDQAJAAkACQAJAIAMgB0YNAAJAAkACQAJAIAYgB2oiACgCAA4DAAECAAsgASAAQQhqEMooIABBKGooAgAgARCOFgwCCyAAQTBqKAIAIghFDQEgCCABEPgDDAELIABBBGogARCGMAsgACgCAEEBRw0DIAIgAEEQaiIIELQVAkAgBSACEKsIDQAgAiAIEJMMDQIgCCkDACEVIAhCATcDACACQRhqQRhqIgkgCEEYaikDADcDACACQRhqQRBqIgogCEEQaikDADcDACACQRhqQQhqIgsgCEEIaikDADcDACAAQRhqIgxCADcDACAAQR1qQgA3AAAgAEEoaiINQQA2AgAgAiAVNwMYIAJBOGogAkEYahC2GSACKQM4IRUgAigCRCEOIAIoAkAhDyAAQTBqIhAoAgAhESAQQQA2AgACQCARRQ0AIABBCGoiEigCACETIABBDGooAgAhFCAEQRBqIAJBEGopAwA3AgAgBEEIaiACQQhqKQMANwIAIAQgAikDADcCAEEIQSgQqiwiEEUNBCAQQQA2AgAgECACKQIYNwIEIBBBADYCICAQQQxqIAspAgA3AgAgEEEUaiAKKQIANwIAIBBBHGogCSgCADYCAEEIQSgQqiwiCUUNBCAJIBQ2AhAgCSATNgIMIAkgETYCCCAJIBA2AgQgCUEENgIAIAAQox8gEkEANgIAIABBADYCACAIIBU3AgAgDSAJNgIAIABBHGogDjYCACAMIA82AgAMBQsgBCACKQMANwIAIARBEGogAkEQaikDADcCACAEQQhqIAJBCGopAwA3AgBBCEEoEKosIhBFDQMgEEEANgIAIBAgAikCGDcCBCAQQQA2AiAgEEEMaiALKQIANwIAIBBBFGogCikCADcCACAQQRxqIAkoAgA2AgAgABCjHyAAQQhqQQA2AgAgAEEANgIAIAggFTcCACANIBA2AgAgAEEcaiAONgIAIAwgDzYCAAwECyACKQMAEMYhDAMLIAJB0ABqJAAPCyACKQMAEMYhDAELAAsgB0E4aiEHDAALC+AGAgV/AX4jAEGQAWsiASQAAkACQAJAAkACQAJAIAAoAgAOCAUFBQUAAQIDBQsgACgCDCICKAIAIAJBDGooAgAQtiNFDQQMAwsgACgCBCICKAIAIAJBDGooAgAQtiNFDQMMAgsgACgCDA0BDAILIAAoAgxFDQELQRxBBBCnJyECELkaIQMgAEEYaiIEKAIAIQUgBCADNgIAIAApAgAhBiAAQQA2AgAgAiAGNwIAIAJBCGogAEEIaikCADcCACACQRBqIABBEGopAgA3AgAgAkEYaiAFNgIAQQEhACABQQE2AhQgASACNgIQIAFBATYCDCABQdQAakEEaiECA0ACQAJAAkACQAJAAkAgAEUNACABIABBf2oiADYCFCABQThqQQhqIgMgASgCECAAQRxsaiIAQQxqKQIANwMAIAFBOGpBEGoiBCAAQRRqKQIANwMAIAEgACkCBDcDOCAAKAIAIgBBCEYNACACIAEpAzg3AgAgAkEIaiADKQMANwIAIAJBEGogBCkDADcCACABIAA2AlQgAA4IBQUFBQECAwQFCyABQQxqEPIqDAYLIAEoAmAhABC5GiEDIAFB8ABqQRhqIABBGGoiBCgCADYCACABQfAAakEQaiAAQRBqKQIANwMAIAFB8ABqQQhqIABBCGopAgA3AwAgBCADNgIAIAApAgAhBiAAQQA2AgAgASAGNwNwIAFBDGogAUHwAGpBsNCEARDPFAwDCyABKAJYIQAQuRohAyABQfAAakEYaiAAQRhqIgQoAgA2AgAgAUHwAGpBEGogAEEQaikCADcDACABQfAAakEIaiAAQQhqKQIANwMAIAQgAzYCACAAKQIAIQYgAEEANgIAIAEgBjcDcCABQQxqIAFB8ABqQcDQhAEQzxQMAgsgASgCYCEAIAFBADYCYCABQQA2AoABIAEgADYCfCABIAI2AnggASABKAJcIgM2AnAgASADIABBHGxqNgJ0IAFBDGogAUHwAGpB0NCEARCvCAwBCyABKAJgIQAgAUEANgJgIAFBADYCgAEgASAANgJ8IAEgAjYCeCABIAEoAlwiAzYCcCABIAMgAEEcbGo2AnQgAUEMaiABQfAAakHg0IQBEK8ICyABQdQAahDuKiABKAIUIQAMAAsLIAFBkAFqJAAL+AYBA38CQAJAA0AgAC0AAA0CAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIADhMAEBABAgMQEAQFBgcICQoLDA0PAAsgASgCDCICRQ0PIAEoAgghASACQTBsIQIDQCAAIAEQqwQgAUEwaiEBIAJBUGoiAg0ADBALCwJAIAAtAAENACAAIAEoAgQQmSsgASgCCCEBDA0LIABBAToAAA8LIAEoAgwiAUUNDSAAIAEQmSsPCyABKAIoIQEMCgsgACABKAIEEJkrIAAgASgCCBCrBCABKAIUIgENCQwLCyAAIAEoAhAQmSsgASgCDCICRQ0KIAEoAggiAyACQRhsaiEEA0ACQCADKAIUIgFFDQAgACABEJkrCwJAIAMoAggiAkUNACADKAIEIQEgAkEwbCECA0AgACABEKsEIAFBMGohASACQVBqIgINAAsLIANBGGoiAyAERw0ADAsLCyAAIAEoAgQQmSsPCwJAIAEoAgQiAygCUCICRQ0AIAMoAkwhASACQTBsIQIDQCAAIAEQqwQgAUEwaiEBIAJBUGoiAg0ACwsCQAJAAkAgAygCAEF5ag4CAQIACyADIAAQoQ4LIAMoAjAiAkUNACADKAIsIQEgAkEwbCECA0AgACABEKsEIAFBMGohASACQVBqIgINAAsLIAMoAmBBgICAgHhGDQggAygCaCICRQ0IIAMoAmQhASACQTBsIQIDQCAAIAEQqwQgAUEwaiEBIAJBUGoiAg0ADAkLCyABKAIIIQIgACABKAIEEJkrIAIhAQwFCyABKAIIIQIgACABKAIEEJkrIAIhAQwECwJAIAEoAgQiAkECRg0AIAEoAgghAwJAIAJBAXFFDQAgACADEJkrDAELIAMgABDiGgsCQCABKAIYIgJFDQAgACACEJkrCwJAIAEoAhwiAkUNACAAIAIQmSsLIAEoAgwhAQwDCyABKAIIIQICQAJAAkACQCABKAIEDgMAAQIACyACIAAQ4hoMAgsgAiAAEOMaDAELIAIgABChDgsgACABKAIMEJkrIAEoAhAhAQwCCyABKAIIIQICQAJAAkACQCABKAIEDgMAAQIACyACIAAQ4hoMAgsgAiAAEOMaDAELIAIgABChDgsgACABKAIMEJkrIAEoAhAhAQwBCwsgAUEIaiAAEIsHDwsgACABKAIEEJkrCwvZBgIIfwJ+IwBBsAFrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4LCQABAgMEBQYHCAkJCyAAIAFBCGoQlCIMCAsgASgCCEEBRw0HIAAgASgCDBCnAQwHCyAAIAEoAgQQpwEMBgsCQCABKAIEIgQoAgBBA0cNACAAIAQoAhAQpwEgBCgCDCIFRQ0GIAVBBHQhBSAEKAIIQQxqIQQDQCAAIAQoAgAQpwEgBEEQaiEEIAVBcGoiBQ0ADAcLCyAAIAQQlCIMBQsgACABKAIEEKcBDAQLIAAgASgCBBCnAQwDCyAAIAEoAgQQpwEMAgsgACABKAIEEKcBDAELIAAgASgCBBCnAQsCQAJAAkAgACgCAEUNACADDQAgASgCGCEDIAEoAhQhBiABKAIQIQcCQCABKQMIIgpCA4NCAFINACAKpyIEIAQoAgAiBEEBajYCACAEQX9MDQILIAEtABwhCAJAAkAgASgCICIFDQBBACEEDAELEPsnIQQgBSkCBCELIAUoAgAhCRD8JyEFIAJB0ABqIAkQdgJAQeAARQ0AIAUgAkHQAGpB4AD8CgAACyAEIAs3AgQgBCAFNgIACyACIAQ2AmggAiAIOgBkIAIgAzYCYCACIAY2AlwgAiAHNgJYIAIgCjcDUCACQQhqIAJB0ABqELYZAkAgACACQQhqEKoFIgBFDQAgAkHQAGogABCnBSACKAJQQQtGDQMgAkEgakEoaiIAIAJB0ABqQShqKQMANwMAIAJBIGpBIGoiBCACQdAAakEgaikDADcDACACQSBqQRhqIgUgAkHQAGpBGGopAwA3AwAgAkEgakEQaiIDIAJB0ABqQRBqKQMANwMAIAJBIGpBCGoiBiACQdAAakEIaikDADcDACACIAIpA1A3AyAgARDtByABQShqIAApAwA3AwAgAUEgaiAEKQMANwMAIAFBGGogBSkDADcDACABQRBqIAMpAwA3AwAgAUEIaiAGKQMANwMAIAEgAikDIDcDAAsgAikDCCIKQgODQgBSDQAgCqciASABKAIAIgBBf2o2AgAgAEEBRw0AIAEgASgCEBDGJAsgAkGwAWokAA8LAAsgAiACKAJUNgIgQcSInAFBKyACQSBqQcCsmwFB4KybARDqEgALogYCBX8BfiMAQSBrIgYkACAGQRBqIAEgAiAFQZACIAUQzB4CQAJAIAYtABBBBUYNACAAIAYpAxA3AgAMAQtBBSAGKAIUEL4oAkAgBUUNACAGQQE6AAYgBkEAOgAHIARBMGohBCAFIQdBACEIQQAhCQNAAkACQAJAAkAgB0UNACAEQXxqKAIAIQogBkEQaiABIANBkAIgCCAJIAZBB2ogBkEGahCtBQJAIAYtABBBBEYNACAGKQMQIgtC/wGDQgRSDQMLIAZBEGogASAEQXhqKAIAIghBABCLAgJAAkACQCAGLQAQQQRGDQAgBikDECILQv8Bg0IEUg0BCwJAIAhFDQAgBkEQaiABIAgQkCMgBi0AEEEERg0AIAYpAxAiC0L/AYNCBFINAQsgBkEQaiAEQVBqIAEQxgYCQCAGLQAQQQRGDQAgBikDECILQv8Bg0IEUg0BCyAEKAIARQ0BAkAgAS0ATQ0AIAZBEGogARCTESAGLQAQQQRGDQAgBikDECILQv8Bg0IEUg0BCyAGQQA2AhAgBkEIaiABIAZBEGpB3KucAUEBELUNAkAgBi0ACEEERg0AIAYpAwgiC0L/AYNCBFINAQsCQCABLQBNDQAgBkEQaiABEJMRIAYtABBBBEYNACAGKQMQIgtC/wGDQgRSDQELIAZBEGogBCABEM4tIAYtABBBBEYNASAGKQMQIgtC/wGDQgRRDQELIAtC/wGDQgRSDQMLIAYtAAYNASAGQQE6AAYMAwsgBkEQaiABIAIgA0GQAiAIIAkQjQIgBi0AEEEERg0EIAYpAxAiC0L/AYNCBFINAQwECyABKAJERQ0BIAZBEGogASAKQQAQ8AMgBi0AEEEERg0BIAYpAxAiC0L/AYNCBFENAQsgACALNwIADAMLAkAgBi0AB0UNACABIAEoAixBf2o2AiwgBkEAOgAHCyAHQX9qIQcgBEE4aiEEQQEhCCAKIQkMAAsLIAZBEGogASADIAVFQZACENsTAkAgBi0AEEEERg0AIAYpAxAiC0L/AYNCBFENACAAIAs3AgAMAQsgAEEEOgAACyAGQSBqJAALzgYBC38jAEHAAGsiAiQAAkACQCAALQD/ASIDQf8BRg0AIAJBADYCOEEBIQQgAkEBNgIsIAJBlLKAATYCKCACQgQ3AjAgASgCACIFIAEoAgQiBiACQShqEJUpDQEgA0EBaiEHIAJBDWohAyACQRJqIQhBACEJA0ACQAJAAkAgCSAHRg0AIAIgCToAByAJDQEMAgsgAkEANgI4IAJBATYCLCACQcDPgwE2AiggAkIENwIwIAUgBiACQShqEJUpIQQMBAsgAkEANgI4QQEhBCACQQE2AiwgAkGcsoABNgIoIAJCBDcCMCAFIAYgAkEoahCVKQ0DCyACQQI2AiwgAkHQz4MBNgIoIAJCATcCNCACQSo2AhwgAiACQRhqNgIwIAIgAkEHajYCGEEBIQQgBSAGIAJBKGoQlSkNAiAJQQFqIQkgAi0AByEBIAJBgID8BzYADSACIAE6AAwgAiAANgIIAkADQCACIAMQ3hcCQAJAIAItAABFDQAgAi0ADCACKAIIIAItAAEiAUH/AXEiCmotAABHDQIgASELAkACQCACLwEQIAgtAABBEHRyIgxBAXFFDQAgDEEIdiELIAxBEHYiDEEBaiAKRw0BCyACIAE6ABIgAiALOgARIAJBAToAEAwDCyACIAE6ABIgAiABOgARIAJBAToAEAwBCyACLwEQIQEgAkEAOgAQIAEgCC0AACIMQRB0ciIBQQFxRQ0CIAFBCHYhCwsgAiALOgAWIAIgDDoAFwJAIAtB/wFxIAxGDQAgAkECNgIsIAJB4M+DATYCKCACQgI3AjQgAkEqNgIkIAJBKjYCHCACIAJBGGo2AjAgAiACQRdqNgIgIAIgAkEWajYCGCAFIAYgAkEoahCVKUUNAQwFCyACQQE2AiwgAkGcv5wBNgIoIAJCATcCNCACQSo2AhwgAiACQRhqNgIwIAIgAkEWajYCGCAFIAYgAkEoahCVKUUNAAwECwsgAkEANgI4QQEhBCACQQE2AiwgAkGksoABNgIoIAJCBDcCMCAFIAYgAkEoahCVKUUNAAwCCwsgAkEANgI4IAJBATYCLCACQdCygAE2AiggAkIENwIwIAEoAgAgASgCBCACQShqEJUpIQQLIAJBwABqJAAgBAuhBgIEfwF+IwBBIGsiByQAIAdBGGogASACIAUgBiAFEMweAkACQCAHLQAYQQVGDQAgACAHKQMYNwIADAELQQUgBygCHBC+KAJAAkACQAJAAkAgBUUNACAHQQE6ABYCQAJAIAZBA3ENACAGQYABcUUNASABLQBNDQEgB0EYaiABEJERIActABhBBEYNASAHKQMYIgtC/wGDQgRRDQEgACALNwIADAcLAkAgAS0ATQ0AIAdBGGogARCMFiAHLQAYQQRGDQAgBykDGCILQv8Bg0IEUg0DCyAHQQA6ABYLIAZBwABxRQ0DIAEtAE1BAUcNAgwDCwJAIAZBAXFFDQAgAS0ATQ0EIAdBGGogARCMFiAHLQAYQQRGDQQgBykDGCILQv8Bg0IEUQ0EIAAgCzcCAAwFCyAGQYABcUUNAyABLQBNDQMgB0EYaiABEJERIActABhBBEYNAyAHKQMYIgtC/wGDQgRRDQMgACALNwIADAQLIAAgCzcCAAwDCyABIAEoAixBAWo2AiwLIAdBADoAFyAFIQhBACEJQQAhCgNAAkACQAJAAkAgCEUNACAHQRhqIAEgAyAGIAkgCiAHQRdqIAdBFmoQrQUCQCAHLQAYQQRGDQAgBykDGCILQv8Bg0IEUg0DCyAHQRhqIAQoAgAiCSABEE4CQCAHLQAYQQRGDQAgBykDGCILQv8Bg0IEUg0DCyAHLQAWDQEgB0EBOgAWDAMLIAdBGGogASACIAMgBiAJIAoQjQIgBy0AGEEERg0EIAcpAxgiC0L/AYNCBFINAQwECyABKAJERQ0BIAdBCGogCRC3ECAHQRhqIAEgBygCDEEAEPADIActABhBBEYNASAHKQMYIgtC/wGDQgRRDQELIAAgCzcCAAwDCwJAIActABdFDQAgASABKAIsQX9qNgIsIAdBADoAFwsgByAJELcQIAhBf2ohCCAEQQRqIQRBASEJIAcoAgQhCgwACwsgB0EYaiABIAMgBUUgBhDbEwJAIActABhBBEYNACAHKQMYIgtC/wGDQgRRDQAgACALNwIADAELIABBBDoAAAsgB0EgaiQAC+4GAgh/AX4jAEHwAGsiAiQAIAEoAtgBIQMgARChCyABQdgBaiEEAkACQAJAIAEtAOABIgVBHEcNACABEKELIAJBCGogARD/CSACKAIMIQUCQCACKAIIQQFxRQ0AIABBBTYCACAAIAU2AgQMAwsgAiAFNgIoIAJB8d6bATYCLAJAIAEtAOABQQNGDQAgASgC3AEhBCABKALYASEFIAJBNGogARDUJiACQQE2AlwgAkGcv5wBNgJYIAJCATcCZCACQbMHNgIgIAIgAkEcajYCYCACIAJBLGo2AhwgAkHAAGogAkHYAGoQkhAgAkHUAGogAkE8aigCADYCACACIAIpAjQ3AkwgBSAEIAJBwABqEOAaIQQCQCABLQDgAUGiAUcNACABIAEQmiwQpxcLIABBBTYCACAAIAQ2AgQgAkEoahC3AwwDCyABKALYASEGIAEoAtwBIQcgAkHYAGogARCrAiABIAc2AtQBIAEgBjYC0AEgBCACKQJYNwIAIARBCGogAkHYAGpBCGooAgA2AgBBAiEBIAMhBgwBCwJAAkACQCAFQQNGDQAgAkEQaiABEP8JQQEhBSACKAIUIQYgAigCEEEBcQ0CIAIgBjYCICACQQE2AhwgAS0A4AEhByACQfHemwE2AigCQCAHQQNHDQAMAgsgASgC3AEhBCABKALYASEFIAJBNGogARDUJiACQQE2AlwgAkGcv5wBNgJYIAJCATcCZCACQbMHNgIwIAIgAkEsajYCYCACIAJBKGo2AiwgAkHAAGogAkHYAGoQkhAgAkHUAGogAkE8aigCADYCACACIAIpAjQ3AkwgBSAEIAJBwABqEOAaIQQCQCABLQDgAUGiAUcNACABIAEQmiwQpxcLIABBBTYCACAAIAQ2AgQgAkEgahC3AwwEC0EAIQUgAkEANgIcIAIgBCgCACIGNgIkIAIgBjYCICACQfHemwE2AiggBiEHCyABKALYASEIIAEoAtwBIQkgAkHYAGogARCrAiABIAk2AtQBIAEgCDYC0AEgBCACKQJYNwIAIARBCGogAkHYAGpBCGooAgA2AgAgCa1CIIYgA62EIQpBASEBDAELIABBBTYCACAAIAY2AgQMAQsgACAKNwMQIAAgBzYCDCAAIAY2AgggACAFNgIEIAAgATYCAAsgAkHwAGokAAuABwIHfwF+IwBBwABrIgIkACAAKAIAIQNBASEAIAEoAgBBqJmcAUEBIAEoAgQoAgwRCwAhBCACQQE6ABMgAkEAOwARIAIgBDoAECACIAE2AgwCQAJAAkACQCADKAIMIgVFDQAgAkETaiEGIAMoAgAiAEEIaiEBIAApAwBCf4VCgIGChIiQoMCAf4MhCUEAIQMDQCADIQcCQCAJQgBSDQADQCAAQaB/aiEAIAEpAwAhCSABQQhqIgMhASAJQoCBgoSIkKDAgH+DIglCgIGChIiQoMCAf1ENAAsgCUKAgYKEiJCgwIB/hSEJIAMhAQsgAiAAQQAgCXqnQQN2a0EMbGoiA0F0ajYCFCACIANBfGo2AhhBASEDIARBAXEhCEEBIQQCQCAIDQACQAJAAkACQAJAAkAgAi0AEg0AAkAgAigCDCIILQAKQYABcQ0AIAdBAXENAgwDCwJAIAdBAXENAEEBIQQgCCgCAEG4k5wBQQEgCCgCBCgCDBELAA0HCyACQQE6ABMgAiAGNgIkIAJB8JiBATYCLCACIAgpAgA3AhwgAiAIKQIINwIwIAIgAkEcajYCKCACQRRqIAJBKGoQuCYNBCACQRxqQfjImAFBAhC+BQ0EDAMLIAJBADYCOCACQQE2AiwgAkHYmYEBNgIoIAJCBDcCMCACQShqQYCagQEQ6SMAC0EBIQQgCCgCAEHinpoBQQIgCCgCBCgCDBELAA0EC0EBIQQgAkEUaiAIELgmDQNBASEEIAgoAgBB+MiYAUECIAgoAgQoAgwRCwANAwsgAkEAOgAQIAJBAToAEgJAIAIoAgwiCC0ACkGAAXENAEEBIQQgAkEYaiAIEPQhDQMMAgsgAiAGNgIkIAJB8JiBATYCLCACIAgpAgA3AhwgAiAIKQIINwIwIAIgAkEcajYCKCACQRhqIAJBKGoQ9CENACACKAIoQYuZgQFBAiACKAIsKAIMEQsARQ0BC0EBIQQMAQtBACEEIAJBADoAEgsgCUJ/fCAJgyEJIAJBAToAESACIAQ6ABAgBUF/aiIFDQALQQEhACAEDQIgAigCDCEBDAELIAQNAQsgAi0AEg0BIAEoAgBBqZmcAUEBIAEoAgQoAgwRCwAhAAsgAkHAAGokACAADwsgAkEANgI4IAJBATYCLCACQcCagQE2AiggAkIENwIwIAJBKGpByJqBARDpIwALnAYCBH8BfiMAQSBrIgckACAHQRhqIAEgAiAFIAYgBRDMHgJAAkAgBy0AGEEFRg0AIAAgBykDGDcCAAwBC0EFIAcoAhwQvigCQAJAAkACQAJAIAVFDQAgB0EBOgAWAkACQCAGQQNxDQAgBkGAAXFFDQEgAS0ATQ0BIAdBGGogARCRESAHLQAYQQRGDQEgBykDGCILQv8Bg0IEUQ0BIAAgCzcCAAwHCwJAIAEtAE0NACAHQRhqIAEQjBYgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFINAwsgB0EAOgAWCyAGQcAAcUUNAyABLQBNQQFHDQIMAwsCQCAGQQFxRQ0AIAEtAE0NBCAHQRhqIAEQjBYgBy0AGEEERg0EIAcpAxgiC0L/AYNCBFENBCAAIAs3AgAMBQsgBkGAAXFFDQMgAS0ATQ0DIAdBGGogARCRESAHLQAYQQRGDQMgBykDGCILQv8Bg0IEUQ0DIAAgCzcCAAwECyAAIAs3AgAMAwsgASABKAIsQQFqNgIsCyAHQQA6ABcgBSEIQQAhCUEAIQoDQAJAAkACQAJAIAhFDQAgB0EYaiABIAMgBiAJIAogB0EXaiAHQRZqEK0FAkAgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFINAwsgB0EYaiAEIAEQSQJAIActABhBBEYNACAHKQMYIgtC/wGDQgRSDQMLIActABYNASAHQQE6ABYMAwsgB0EYaiABIAIgAyAGIAkgChCNAiAHLQAYQQRGDQQgBykDGCILQv8Bg0IEUg0BDAQLIAEoAkRFDQEgB0EIaiAEEM0FIAdBGGogASAHKAIMQQAQ8AMgBy0AGEEERg0BIAcpAxgiC0L/AYNCBFENAQsgACALNwIADAMLAkAgBy0AF0UNACABIAEoAixBf2o2AiwgB0EAOgAXCyAIQX9qIQggByAEEM0FIARBMGohBEEBIQkgBygCBCEKDAALCyAHQRhqIAEgAyAFRSAGENsTAkAgBy0AGEEERg0AIAcpAxgiC0L/AYNCBFENACAAIAs3AgAMAQsgAEEEOgAACyAHQSBqJAALkgcBBX8jAEGAAWsiBCQAQQAhBUEAIQYCQCABEIsnDQAgASgCiAEhBwJAIAEQ2AkiCA0AQQAhBUEAIQYMAQtBACEFQQAhBiAILQAAIggQpRVFDQBBACEFQQAhBgJAAkACQAJAAkACQAJAAkACQAJAIAhBtH9qDkkHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCAoKCgoKCgoKCgoKCgoKBgkJCQkJCQkJCQkJCgkJCQABCQkJCQkJCQkJCQIDBAUJCQkICQtBACEFQQAhBiAHQQhxRQ0IDAkLQQAhBUEAIQYgB0EIcUUNBwwIC0EAIQVBACEGIAdBCHFFDQYMBwtBACEFQQAhBiAHQQhxRQ0FDAYLQQAhBUEAIQYgB0EIcUUNBAwFC0EAIQVBACEGIAdBCHFFDQMMBAtBACEFQQAhBiAHQYACcQ0DDAELQQAhBUEAIQYgB0GABXENAgtBACEFQQAhBiAHQQhxDQELIAEQoQsgBEEANgIMIARCgICAgIABNwIEIARByABqQQhqIQggBEEQakEIaiEHAkACQAJAA0AgAS0A4AFBBkYNASAEQRBqIAFBAEEAEOkEIAQoAhQhBSAEKAIQIgZBB0YNAwJAQTBFDQAgCCAHQTD8CgAACyAEIAU2AkwgBCAGNgJIIARBBGogBEHIAGpB2J6cARD3HiABLQDgAUEHRw0CIAEQoQsMAAsLIAEoAtQBIQUgASgC0AEhBiAEQfaAgIB4NgIQIAEgBiAFIARBEGoQ3iMLAkAgAS0AkQFBAnENACABKALUASEFIARBhICAgHg2AhAgASACIAUgBEEQahDeIwsCQCABLQCLAUEQcQ0AIAEoAtQBIQUgBEGCgICAeDYCECABIAIgBSAEQRBqEN4jCyAEKAIMQThsIQYgBCgCCCEFA0ACQAJAAkAgBkUNACAFKAIADQEMAgsgARDIEiIFDQMgASgC1AEhAUEYQQQQyyoiBSADOgAUIAUgATYCECAFIAI2AgwgBUEIaiAEQQRqQQhqKAIANgIAIAUgBCkCBDcCAEEAIQYMBAsgASgC1AEhCCAEQYWAgIB4NgIQIAEgAiAIIARBEGoQ3iMLAkAgBSgCMA0AIAEoAtQBIQggBEGGgICAeDYCECABIAIgCCAEQRBqEN4jCyAFQThqIQUgBkFIaiEGDAALCyAEQQRqEMcoQQEhBgsgACAFNgIEIAAgBjYCACAEQYABaiQAC+cGAgZ/BX4jAEGgAWsiAyQAIAG9IQkCQAJAIAGZRAAAAAAAAPB/Yg0AQQMhBAwBCwJAIAlCgICAgICAgPj/AIMiCkKAgICAgICA+P8AUg0AQQIhBAwBCyAJQv////////8HgyILQoCAgICAgIAIhCAJQgGGQv7///////8PgyAJQjSIp0H/D3EiBRsiDEIBgyENAkAgCkIAUg0AAkAgC1BFDQBBBCEEDAILIAVBzXdqIQUgDadBAXMhBEIBIQoMAQtCgICAgICAgCAgDEIBhiAMQoCAgICAgIAIUSIGGyEMQgJCASAGGyEKIA2nQQFzIQRBy3dBzHcgBhsgBWohBQsgAyAFOwGIASADIAo3A4ABIANCATcDeCADIAw3A3AgAyAEOgCKAQJAAkACQAJAAkACQAJAIARBfmoiBEUNAEEBIQVByvObAUHJ85sBIAlCAFMiBhtByvObAUEBIAYbIAIbIQZBASAJQj+IpyACGyECIARBAyAEQQNJG0F/ag4DAQIDAQsgA0EDNgIgIANBiKqbATYCHCADQQI7ARhBASEGQQAhAkEBIQUMAwsgA0EDNgIgIANBpuaXATYCHCADQQI7ARgMAgsgA0EDNgIgIANBsZWBATYCHCADQQI7ARgMAQsgA0HgAGogA0HwAGogA0EHahD+AQJAAkAgAygCYEUNACADQZABakEIaiADQeAAakEIaigCADYCACADIAMpAmA3A5ABDAELIANBkAFqIANB8ABqIANBB2oQeAsgAygClAEiBUUNASADKAKQASIHLQAAQTBNDQIgAy4BmAEhCCADIAc2AhwgA0ECOwEYIANBATYCIAJAAkAgBUEBRw0AIANBJGohBEEDIQUMAQsgA0E8aiEEIANBAjsBMCADQciBnAE2AiggA0ECOwEkIAMgBUF/ajYCOCADQQE2AiwgAyAHQQFqNgI0QQUhBQsgBEEBOwEMIARBAjsBACAEQQEgCGsgCEF/aiAIQQFIIggbOwEOIARBAkEBIAgbNgIIIARBsIiZAUGwlYEBIAgbNgIECyADIAU2AmwgAyACNgJkIAMgBjYCYCADIANBGGo2AmggACADQeAAahDIBSEEIANBoAFqJAAgBA8LQaiTgQFBIUGQlYEBENIeAAtB4JSBAUEfQaCVgQEQ0h4AC7EGAgl/AX4jAEHwAGsiAiQAIAJBADYCGCACQoCAgIAQNwIQIAEoAhghAyABKAIcIQQgAkEANgJEIAJBADsBQCACIAQ2AjwgAkEANgI4IAJBAToANCACQQo2AjAgAiAENgIsIAJBADYCKCACIAQ2AiQgAiADNgIgIAJBCjYCHCABKAIgIgVBAmpBBCAFGyEGIAEoAgQhByABKAIIIQgCQAJAA0AgAkEIaiACQRxqEJMHIAIoAggiBEUNAiACKAIMIQMgAiACKAJEIgFBAWoiCTYCRAJAAkAgBQ0AIAJBEGpB4IecAUHkh5wBEMMgDAELIAIgCTYCVCACQdgAaiACQdQAahDlEyAFIAIoAmAiCUkNAiACQeQAakEgIAUgCWsQoBUgAkHkAGogAigCXCAJEPgrIAJByABqQQhqIgkgAkHkAGpBCGooAgA2AgAgAiACKQJkNwNIIAJB2ABqEPgsIAJBEGogAigCTCAJKAIAEPgrIAJByABqEPgsIAJBEGpB+MiYAUH6yJgBEMMgCyACQRBqIAQgAxD4KyACQRBqQQoQkAoCQCABIAhPDQAgByABQQxsaiIEQQhqIgMoAgBFDQEgAkEANgJsIAJCgICAgBA3AmQgBiEBAkADQCABRQ0BIAJB5ABqQSAQkAogAUF/aiEBDAALCyAEQQRqKAIAIgQgAygCAEEYbGohCkEAIQEDQAJAAkAgBCAKRg0AIAEgBCgCCEF/aiIDIAEgA0sbIgMgAWshAQJAA0AgAUUNASACQeQAakEgEJAKIAFBf2ohAQwACwtBACAEKAIUIgEgBCgCCGsiCSAJIAFLGyIBQQEgAUEBSxsiCSEBA0AgAUUNAiACQeQAakHeABCQCiABQX9qIQEMAAsLIAIpAmghCyACKAJkIgFBgICAgHhGDQMgAiABNgJkIAIgCzcCaCACQRBqIAunIAtCIIinEPgrIAJBEGpBChCQCiACQeQAahD4LAwDCyAJIANqIQEgBEEYaiEEDAALCwsgASAIQcj+hwEQkRUAC0HY/ocBENIsAAsgACACKQIQNwIAIABBCGogAkEQakEIaigCADYCACACQfAAaiQAC5kGAgd/AX4jAEEwayICJAAgACkCaCEJIABCgICAgIABNwNoQQghAyACQQhqQQhqIgQgAEHwAGoiBSgCADYCAEEAIQYgBUEANgIAIAIgCTcDCCAAQegAaiEHAkACQAJAIAEoAggiBQ0AIAcgAikDCDcCACAHQQhqIAQoAgA2AgBBACEGDAELIAEoAgQhAwJAAkADQAJAAkACQCADKAIAQQlHDQAgA0EIaigCACEEIAAgAxCTAyAEQQFHDQEMAgsgACADEJMDCyADKAIAQQlHDQAgA0EIaigCAEEBRg0CCyADQThqIQMgBSAGQQFqIgZHDQALQQAhCAwBCyADEPEFQQEhCCAGQQFqIAVGDQAgA0E4aiEDIAZBf3MgBWohBEEBIQgDQAJAAkACQAJAIAMoAgBBCUcNACADQQhqKAIAIQYgACADEJMDIAZBAUcNAQwCCyAAIAMQkwMLIAMoAgBBCUcNACADQQhqKAIAQQFHDQAgAxDxBSAIQQFqIQgMAQsgAyAIQUhsaiIGIAMpAwA3AwAgBkEwaiADQTBqKQMANwMAIAZBKGogA0EoaikDADcDACAGQSBqIANBIGopAwA3AwAgBkEYaiADQRhqKQMANwMAIAZBEGogA0EQaikDADcDACAGQQhqIANBCGopAwA3AwALIANBOGohAyAEQX9qIgQNAAsLIAEgBSAIayIFNgIIIAAoAmwhAyAAKAJoIQYgByACKQMINwIAIAAoAnAhACAHQQhqIAJBCGpBCGooAgA2AgAgAEUNACACIAY2AhwgAiADNgIYIAIgAzYCFCACIAMgAEEEdGo2AiAgAkEkaiACQRRqEMsIQQAtAKDxngEaAkBBHBB9IgNFDQAgAyACKQIkNwIAIANCADcCDCADQRJqQgA3AQAgA0EIaiACQSRqQQhqKAIANgIAAkAgBSABKAIARw0AIAFB8J6bARDjHQsgASAFQQFqNgIIIAEoAgQgBUE4bGoiBiADNgIUIAZBAjYCECAGQRE2AgggBkEJNgIAQQBBCBCjLQwCCwALIAYgAxC2LQsgAkEwaiQAC8QGAQ9/IwBBIGsiAiQAAkAgACgCCCIDRQ0AIAEoAggiBEUNACABKAIEIQVBACEGQQAhBwNAAkACQCAHIANPDQAgBiAESQ0BCyADIAcgAyAHSxshBANAAkAgBCAHRw0AIAJBDGogACADEK0cIAJBDGoQoBYgACAALQAMIAEtAAxxOgAMDAQLIAAgACgCBCAAKAIIIAdBiOaHARDSJSIGLQAAIAYtAAFBmOaHARCLHyAHQQFqIQcMAAsLAkACQAJAIAUgBCAGQajmhwEQ0iUtAAEgACgCBCIIIAAoAggiCSAHQbjmhwEQ0iUtAABJDQACQCAIIAkgB0HI5ocBENIlLQABIAUgBCAGQdjmhwEQ0iUtAABJDQAgCCAJIAdB6OaHARDSJSEKAkAgBSAEIAZB+OaHARDSJSILLQAAIgwgCi0AACINIAwgDUsbIAstAAEiCyAKLQABIgogCyAKSRtLDQAgCCAJIAdBiOeHARDSJSIILQABIQwgCC0AACENA0ACQCAEIAZHDQAgBCEGDAULIAUgBCAGQZjnhwEQ0iUiCC0AACIKIA1B/wFxIgkgCiAJSxsgCC0AASIKIAxB/wFxIgggCiAISRtLDQQgBSAEIAZBqOeHARDSJSIKLQABIQsCQCAKLQAAIg4gCUsiCg0AIAkgC0H/AXEiD0sNACAIIA9NDQYLAkAgDiAJIAobIAtB/wFxIg8gCCAPIAhJIhAbSw0AAkACQAJAAkAgCg0AIA8gCE8NAQtBACEMIAoNAQwCC0Goy4QBQShB0MuEARDSHgALIAkgDhCoJ0H/AXEiDSAJIA1LGyEMIAkgDSAJIA1JGyENCwJAIBBFDQAgCxC8JkH/AXEiCSAIIAkgCEsbIQsgCSAIIAkgCEkbIQkCQCAKRQ0AIAAgDSAMQbjnhwEQix8LIAshDCAJIQ0MAQsgCkUNBgsgBSAEIAZByOeHARDSJS0AASAISw0EIAZBAWohBgwACwtB6OeHAUHJAEG06IcBENIeAAsgACAIIAkgB0HE6IcBENIlIggtAAAgCC0AAUHU6IcBEIsfDAILIAZBAWohBgwCCyAAIA0gDEHY54cBEIsfCyAHQQFqIQcMAAsLIAJBIGokAAuzBgIHfwF+IwBBsAFrIgQkAAJAIAEQ+w9BP0YNACABEPsPQSpGDQAgARD7D0ErRg0AQfTAhAFB0ABBxMGEARDSHgALIARBEGpBCGogASgCACIFQdgAaigCADYCACAEIAUpAlA3AxAgBEEIaiACEOcbIAVB0ABqIQUCQAJAAkACQAJAAkAgBCgCCCIGQQxGDQAgBCAEKAIMIgc2AiQgBCAGNgIgIAZBAkkNAkEBIQggARCNCw0BDAQLIARBPGogBUEIaigCACIGNgIAIARBKGpBCGoiAyAGNgIAIAQgBSkCACILNwI0IAQgCzcDKCAAQRxqIAEoAgQgASgCCBCKFCAAQRs2AgAgACAEKQMoNwIoIABBMGogAykDADcCACAAQThqIARBOGopAwA3AgAMAgsgARD7D0E/Rw0CIAEQjQsaQQAhCAwCCyAEQTxqIAVBCGooAgAiBjYCACAEQShqQQhqIgMgBjYCACAEIAUpAgAiCzcCNCAEIAs3AyggAEEcaiABKAIEIAEoAggQihQgAEEbNgIAIAAgBCkDKDcCKCAAQTBqIAMpAwA3AgAgAEE4aiAEQThqKQMANwIAIARBIGoQ5gsLIAIQ5yoMAQsgBEHwAGpBFGogBUEIaiIBKAIANgIAIARB8ABqQQhqIgkgBiAHEL4WIgpBCGooAgA2AgAgBCAFKQIANwJ8IAQgCikCADcDcCAEQShqQQhqIgogBEEQakEIaigCADYCACAEQShqQRRqIAEoAgA2AgAgBEGIAWpBCGogA0EIaigCADYCACAEIAUpAgA3AjQgBEGIAWpBFGogCikDADcCACAEQaQBaiAEQShqQRBqKQMANwIAIAQgBCkDEDcClAEgBCADKQIANwOIAUEIEPEnIgEgBzYCBCABIAY2AgAgBEHYAGogCSkDADcCACAEQeAAaiAEQfAAakEQaikDADcCACAEIAQpA3A3AlACQEEkRSIFDQAgBEEoaiAEQYgBakEk/AoAAAsgBCABNgJMIAQgCDoAaCACQQggBEEoahD0JkHkwIQBEIYfAkAgBQ0AIABBBGogAkEk/AoAAAsgAEEiNgIACyAEQbABaiQAC6sHAgF/AXwjAEEwayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQAADhIAAQIDBAUGBwgJCgsMDQ4PEBEACyACIAAtAAE6AAggAkECNgIUIAJBxLqYATYCECACQgE3AhwgAkHVADYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAgAgASgCBCACQRBqEJUpIQEMEQsgAiAAKQMINwMIIAJBAjYCFCACQeC6mAE2AhAgAkIBNwIcIAJB1gA2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCVKSEBDBALIAIgACkDCDcDCCACQQI2AhQgAkHgupgBNgIQIAJCATcCHCACQdcANgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwPCyAAKwMIIQMgAkECNgIUIAJBgLuYATYCECACQgE3AhwgAkHYADYCDCACIAM5AyggAiACQQhqNgIYIAIgAkEoajYCCCABKAIAIAEoAgQgAkEQahCVKSEBDA4LIAIgACgCBDYCCCACQQI2AhQgAkGcu5gBNgIQIAJCATcCHCACQQU2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIAIAEoAgQgAkEQahCVKSEBDA0LIAIgACkCBDcCCCACQQE2AhQgAkG0u5gBNgIQIAJCATcCHCACQcoANgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCACABKAIEIAJBEGoQlSkhAQwMCyABKAIAQbG6mAFBCiABKAIEKAIMEQsAIQEMCwsgASgCAEG8u5gBQQogASgCBCgCDBELACEBDAoLIAEoAgBBxruYAUEMIAEoAgQoAgwRCwAhAQwJCyABKAIAQdK7mAFBDiABKAIEKAIMEQsAIQEMCAsgASgCAEHgu5gBQQggASgCBCgCDBELACEBDAcLIAEoAgBBmbWbAUEDIAEoAgQoAgwRCwAhAQwGCyABKAIAQaDzmwFBBCABKAIEKAIMEQsAIQEMBQsgASgCAEHou5gBQQwgASgCBCgCDBELACEBDAQLIAEoAgBB9LuYAUEPIAEoAgQoAgwRCwAhAQwDCyABKAIAQYO8mAFBDSABKAIEKAIMEQsAIQEMAgsgASgCAEGQvJgBQQ4gASgCBCgCDBELACEBDAELIAEoAgAgACgCBCAAKAIIIAEoAgQoAgwRCwAhAQsgAkEwaiQAIAELxAYBDn8jAEEgayIBJAAgAC0AACECIAFBGGohA0EAIQQDQCAEQQlLIQUCQANAAkAgAkEBcQ0AIAJB/wFxIQYgACACQQFyIAAtAAAiAiACIAZGIgYbOgAAIAZFDQEgAUEgaiQADwsCQCACQQJxDQACQCAFDQAgBEEBaiEEDAMLIAJB/wFxIQYgACACQQJyIAAtAAAiAiACIAZGGzoAACACIAZHDQELCwJAAkACQEEAKAKA7J4BDQBBAEEAKAL4654BQQFqIgc2AvjrngEgB0EDbCEEAkADQAJAQQAoAvzrngEiCA0AEI0bIQgLIAgoAgQiAiAETw0BIAJBBnQhBiAIKAIAIQICQANAIAZFDQEgAiACKAIAIgVBASAFGzYCAAJAIAVFDQAgAhCtFQsgAkHAAGohAiAGQUBqIQYMAAsLAkBBACgC/OueASAIRg0AIAgoAgRBBnQhAiAIKAIAIQYDQCACRQ0CIAJBQGohAiAGEKEkIAZBwABqIQYMAAsLCyAHIAgQwAchCSAIKAIAIgIgCCgCBEEGdGohCgJAA0AgAiAKRg0BIAJBwABqIQtBACAJKAIIa0EfcSEMIAkoAgAhDSAJKAIEIQ4gAigCBCECA0ACQCACDQAgCyECDAILIAIoAgBBufPd8XlsIAx2IgYgDk8NBSACKAIEIQUgDSAGQQZ0aiIGQQhqIQQCQAJAIAYoAggiB0UNACAHIAI2AgQMAQsgBiACNgIECyAEIAI2AgAgAkEANgIEIAUhAgwACwsLQQAgCTYC/OueASAIKAIEQQZ0IQIgCCgCACEGA0AgAkUNASACQUBqIQIgBhChJCAGQcAAaiEGDAALCyADQQA6AABBAEIANwKE7J4BQQBCADcCjOyeASABQQhqQQhqQgA3AwBBACgCgOyeASECQQBBATYCgOyeAUEAIAMoAgA2ApTsngEgAUIANwMIIAJFDQBBAEEAKAL4654BQX9qNgL4654BCyAAELASIQIgAC0AAEEDRg0BIAIQoSRBACEEDAILIAYgDkHgkYMBEJEVAAtBACAANgKE7J4BQQBBADYCiOyeAUEAQQA6AJTsngFBAEEANgKQ7J4BEOshAAsgAC0AACECDAALC/0GAgd/An4jAEHQAGsiAyQAIANBOGogARDcDiADKAJAIQQCQAJAIAMpAzgiCkIAUg0AQQEhBQwBCyADIAMoAkQ2AiQgAyAENgIgIAMgCjcDGCADQRBqIANBGGoQ8RUCQAJAIAMoAhAiBCADKAIUIgVBq/SbAUEGEOMlDQAgBCAFQZWrnAFBBBDjJQ0AIAQgBUGS9JsBQQYQ4yUNACAEIAVBmPSbAUEGEOMlDQAgBCAFQYj0mwFBAxDjJQ0AIAQgBUGL9JsBQQcQ4yUNACAEIAVBnvSbAUEHEOMlDQAgBCAFQaX0mwFBBhDjJQ0AIAQgBUGx9JsBQQYQ4yUNACAEIAVBt/SbAUEEEOMlDQAgBCAFQcT0mwFBBRDjJQ0AIAQgBUHJ9JsBQQkQ4yVFDQELIAMoAiQhBCADKAIgIQUgA0GtgYCAeDYCOCABIAUgBCADQThqEN4jC0EBIQUgA0EIaiABQQFBABCpGiADKAIMIQYCQAJAAkAgAygCCEEBcUUNACAGIQQMAQsCQAJAAkAgAS0A4AFB2QBGDQAgA0EANgI0IANCgICAgMAANwIsDAELIAEQoQsgA0E4aiABEMQEIAMoAjwhBCADKAI4IgdBgICAgHhGDQEgAyADKAJANgI0IAMgBDYCMCADIAc2AiwgAS0A4AFB2QBHDQAgASgC3AEhBCABKALYASEHIANBlYGAgHg2AjggASAHIAQgA0E4ahDeIwNAIAEtAOABIgRBAkYNASAEQaMBRg0BIAEQoQsMAAsLIAEoAtgBIQcCQAJAIAEoAogBIgRBgCBxDQAgASAEQYAgcjYCiAEgA0E4aiABEIIBIAEgASgCiAFB/19xNgKIAQwBCyADQThqIAEQggELIAMoAjwhBCADKAI4IghBgICAgHhHDQIgA0EsahC1KAsgBhCZLAsgAykDGBDGIQwBCyADKAJAIQUgASgC1AEhCSADKQMYIQogAykDICELQcgAQQgQmioiASAJNgI0IAEgBzYCMCABIAU2AiwgASAENgIoIAEgCDYCJCABIAY2AiBBACEFIAFBADoAHCABQQA2AhggASALNwMQIAEgCjcDCCABIAk2AgQgASACNgIAIAFBADoARCABIAMpAiw3AjggAUHAAGogA0EsakEIaigCADYCACABIQQLIAAgBDYCBCAAIAU2AgAgA0HQAGokAAuLBgIDfwF+IwBBIGsiBCQAIARBEGogASACKAIYIgUoAiRBABCLAgJAAkAgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFENACAAIAc3AgAMAQsCQAJAAkACQCAFKAIkIgZFDQAgBEEQaiABIAYQjiMgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFINAQsgAi0AHA0BDAILIAAgBzcCAAwCCyAEQQA2AhAgBEEIaiABIARBEGpBqpmcAUEHELANAkAgBC0ACEEERg0AIAQpAwgiB0L/AYNCBFENACAAIAc3AgAMAgsgBEEQaiABEJERIAQtABBBBEYNACAEKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkAgAw0AIAVBCGooAgBBDGwhAyAFQQRqKAIAIQYDQCADRQ0BIARBEGogBiABELYHAkACQCAELQAQQQRGDQAgBCkDECIHQv8Bg0IEUg0BCyAGQQxqIQYgA0F0aiEDDAELCyAAIAc3AgAMAQsCQCAFLQA8RQ0AIARBADYCECAEQQhqIAEgBEEQakGdn5wBQQgQsA0CQCAELQAIQQRGDQAgBCkDCCIHQv8Bg0IEUQ0AIAAgBzcCAAwCCyAEQRBqIAEQkREgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFENACAAIAc3AgAMAQsgBEEANgIQIARBCGogASAEQRBqQYDpmwFBBRCwDQJAIAQtAAhBBEYNACAEKQMIIgdC/wGDQgRRDQAgACAHNwIADAELIARBEGogARCREQJAIAQtABBBBEYNACAEKQMQIgdC/wGDQgRRDQAgACAHNwIADAELIARBEGogAiABEIQYAkAgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFENACAAIAc3AgAMAQsgBEEQaiAFQTRqIAEQmyYCQCAELQAQQQRGDQAgBCkDECIHQv8Bg0IEUQ0AIAAgBzcCAAwBCyAEQRBqIAEgBRBKAkAgBC0AEEEERg0AIAQpAxAiB0L/AYNCBFENACAAIAc3AgAMAQsgAEEEOgAACyAEQSBqJAALhgYBCX8jAEHgAGsiCCQAAkACQCACDQBBACEGDAELQQAhCSAIQQA2AhQgCEKAgICAEDcCDCAEIANqIQogAEEEaiELIAUgBkEFdGohDCAIQcgAakEEaiINQQhqIQ4CQANAIAUiBiAMRg0BIAZBIGohBSADIAQgBkEMaigCACIPIAZBEGooAgAiEBCIGEUNAAJAAkAgDyADTyAQIA9qIg8gCk1xDQAgDyADSQ0AIA8gCk0NAQsgCCALNgJIIA0gBikAFDcAACAOIAZBHGovAAA7AAAgCEEwaiAIQcgAahDeEyAIQQxqIAgoAjQgCCgCOBDUKyAJQQFqIQkgCEEwahDNLAwBCwtBACACIAlrIgUgBSACSxshBQJAIAdB/wFxIgNBAkYNACAIIABBJGo2AkggCEHUAGoiBCAGQRxqIgwvAAA7AQAgCCAGKQAUNwJMIAhBMGogCEHIAGoQ3hMgCEEMaiAIKAI0IAgoAjgQ1CsgCEEwahDNLCAIQTBqIAAoAgAQsRcgCEEkaiAIKAI0IAgoAjhBAUECIANBAUYbIAVqEJUKIAggCEEkajYCSCAEIAwvAAA7AQAgCCAGKQAUNwJMIAhBGGogCEHIAGoQ3xMgCEEMaiAIKAIcIAgoAiAQ1CsgBSAJakEDaiEJIAhBGGoQzSwgCEEkahDNLCAIQTBqEM0sDAELIAVBAmohBgJAA0AgBkUNASAIQQxqQSAQsBcgBkF/aiEGDAALCyAFIAlqQQNqIQkLAkBBACACQQNqIgYgCWsiBSAFIAZLGyIGQYCABE8NACAIIAY7AVwgCEEANgJYIAhBBjYCVCAIQZy/nAE2AlAgCEEENgJMIAhBAjYCRCAIQbDEgAE2AkAgCEECNgI0IAhBnKubATYCMCAIQQM2AjwgCCAIQQxqNgJIIAggCEHIAGo2AjggASAIQTBqEI8pIQYgCEEMahDNLAwBCyAIQQA2AlggCEEBNgJMIAhB8MiAATYCSCAIQgQ3AlAgCEHIAGpBoMSAARDpIwALIAhB4ABqJAAgBgueBgEEfwJAAkACQAJAAkADQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4UDw8AAQIDCAQICAUGBwgICQsMDQ4PCwJAIAAoAgRBgICAgHhGDQAgAEEEaiABEIshIAEgAEEcahD7KCAAQRBqIAEQmy8PCyAAQQhqIAEQiyEgASAAQSBqEPsoIABBFGogARCbLw8LIABBEGogARCbJCABIABBKGoQ/CgPCyAAQdgAaiECIABBEGohAwJAAkAgAC0AREEERg0AIAMgARDGCgwBCyADIAEQmyQLIAEgAhD8KA8LIAAoAgxBOGwhBCAAKAIIIQVBACEAA0AgBCAARg0MAkACQAJAAkACQAJAAkACQCAFIABqIgIoAgBBfGoiA0EEIANBB0kbDgcAAQIDBAUGAAsgAkEEaiABEIshIAEgAkEYahCuKiABIAJBHGoQ+ygMBgsgAkEEaiABEIshIAEgAkEYahCuKiABIAJBHGoQ+ygMBQsgAkEQaigCACABEPgDIAEgAkEMahCuKgwECyACQQRqKAIAIAEQ+AMgASACQRBqEK4qDAMLIAJBMGooAgAgARD4AyACIAEQ0QoMAgsgAkEQaigCACABEPgDIAJBBGogARCLISABIAJBHGoQriogASACQSBqEPsoDAELIAJBBGogARCvKgsgAEE4aiEADAALCyAAKAIMQThsIQIgACgCCCEAA0AgAkUNCwJAIAAoAgBBB0YNACAAIAEQjhYLIABBMGogARC+BCACQUhqIQIgAEE4aiEADAALCyAAQQhqIAEQiiEPCyAAQQRqIAEQvgQgAEEIaiABEL4EIABBDGogARC+BCAAQRBqIQAMAwsgAEEQaiABEPUkDwsgAEEEaiEADAELIABBBGogARC+BCAAQQhqIQAMAAsLIABBEGogARD1JCABIABBwABqELAqIAEgAEHEAGoQsCoPCyAAKAIIQYSAgIB4SA0CIABBCGogARCKIQ8LIABBKGohAgJAIAAtABxBAkYNACABKAIUIABBCGoQqwgaCyABIAIQrioPCyAAQQhqIAEQxgoLC+AGAgd/AX4jAEHwAGsiAyQAIAEoAtgBIQRBACEFAkACQAJAIAINACABLQDgASIGIQUCQCAGQfMARw0AIAEQoQsgAS0A4AEhBQsCQCAFQf8BcUHjAEYNACABKALcASECIAEoAtgBIQYgA0EYaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0HjADoAbyADIANB4ABqNgJQIAMgA0HoAGo2AmAgAyADQe8AajYCaCADQTBqIANByABqEP0aIANBxABqIANBIGooAgA2AgAgAyADKQIYNwI8IAYgAiADQTBqEOAaIQIgAS0A4AFBogFHDQIgASABEJosEKcXDAILIAEQoQsgBkHzAEYhBQsgA0EQaiABQQBBARCpGiADKAIUIQYCQCADKAIQQQFxRQ0AIABBgYCAgHg2AgAgACAGNgIEDAILAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQUgA0EkaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBSACIANBMGoQ4BohAiABLQDgAUGiAUYNAQwDCyABEKELIANByABqIAEQswMgAygCTCEHIAMoAkgiCEGAgICAeEYNASADIAMoAlAiCTYCOCADIAc2AjQgAyAINgIw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EGoQ9igLIABCADcCAAwBCyAAIAc2AgAgACAINgIECyAFQcABaiQAC4sGAwt/An4BfCMAQcAAayICJAACQAJAAkACQAJAAkACQAJAIAEoAgAiAw4FAAECBAMACyABKAIUIQQgASgCECEFAkAgASkDCCINQgODQgBSDQAgDaciASABKAIAIgFBAWo2AgAgAUF/TA0GCyAAIAQ2AhQgACAFNgIQIAAgDTcDCAwECyABKAIUIQQgASgCECEFAkAgASkDCCIOQgODQgBSDQAgDqciBiAGKAIAIgZBAWo2AgAgBkF/TA0FCwJAIAEpAxgiDVANACANQgODUEUNACANpyIBIAEoAgAiAUEBajYCACABQX9MDQULIAAgDTcDGCAAIAQ2AhQgACAFNgIQIAAgDjcDCAwDCyABKwMQIQ8gASgCDCEEIAEoAgghBQJAIAEpAxgiDVANACANQgODUEUNACANpyIBIAEoAgAiAUEBajYCACABQX9MDQQLIAAgDTcDGCAAIA85AxAgACAENgIMIAAgBTYCCAwCCyABKAIYIQUgASgCDCEHIAEoAgghCBD+JyEEIAVBBGooAgAhCSAFLQAMIQogAiAFQQhqKAIAIgVBAEEEQQQQrAwgAigCBCELIAIoAgBBAUYNAyACKAIIIQYCQCAFQQJ0IgxFDQAgBiAJIAz8CgAACyAEIAo6AAwgBCAFNgIIIAQgBjYCBCAEIAs2AgACQCABKQMQIg1QDQAgDUIDg1BFDQAgDaciASABKAIAIgFBAWo2AgAgAUF/TA0DCyAAIAQ2AhggACANNwMQIAAgBzYCDCAAIAg2AggMAQsgASkDCCENIAEoAgQhBBD6JyEBIAIgBBBCIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwAgACANNwMIIAAgATYCBAsgACADNgIAIAJBwABqJAAPCwALIAsgAigCCEHAvJwBEI4pAAukBgIJfwF+IwBB8ABrIgIkAEEAIQMgAkEANgIgIAJCgICAgMAANwIYQQQhBEEMIQUDQAJAAkACQCABLQDgASIGQQJGDQAgBkHZAEYNACAG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KQJENwJcIAUgBiADQdAAahDgGiEGIAItAOABQaIBRw0BIAIgAhCaLBCnFwwBCyACEKELIAMgAhDGEiADKAIEIQkgAygCAEEBcUUNASAJIQYLIANBwABqEI8GDAELIAIoAtQBIQJB4ABBCBCdKiIGIAI2AhggBiABNgIUIAYgCTYCECAGIAg2AgwgBiAHNgIIIAYgBTYCBCAGQQs2AgBBACEEDAMLIANBMGoQjwYLIANBLGoQjwYMAQsgBSEGCyAAIAY2AgQgACAENgIAIANBkAFqJAAL4QUCB38BfkEAIQICQCABKAIIIgMgASgCBCIETw0AIAEoAgAgA2otAABB9QBHDQBBASECIAEgA0EBaiIDNgIICwJAAkAgAyAETw0AIAEoAgAiBSADai0AAEFQaiIGQf8BcSIHQQpJDQELIABBADYCACAAQQA6AAQPCyABIANBAWoiAzYCCAJAAkACQCAHDQBBACEHDAELIAZB/wFxIQcDQAJAIAQgA0cNACAEIQMMAwsgBSADai0AAEFQakH/AXEiBkEJSw0BIAEgA0EBaiIDNgIIAkAgB61CCn4iCUIgiKcNACAJpyIIIAZqIgcgCE8NAQsLIABBADYCACAAQQA6AAQPCyADIARPDQAgBSADai0AAEHfAEcNACABIANBAWoiAzYCCAsCQCADIAdqIgYgA08NACAAQQA2AgAgAEEAOgAEDwsgASAGNgIIAkACQAJAAkAgBiAESw0AIANFDQEgAyAETw0BIAUgA2osAABBv39KDQEMAgsgAEEANgIAIABBADoABA8LAkAgBkUNACAGIARPDQAgBSAGaiwAAEG/f0wNAQsgBSADaiEGIAINASAAQgE3AgggACAHNgIEIAAgBjYCAA8LIAUgBCADIAZB/OKXARDjKgALIAUgA2pBf2ohBCAHIQECQANAAkAgASIDDQBBACEBQQEhAyAGIQQMAgsgA0F/aiEBIAQgA2otAABB3wBHDQALAkACQCABRQ0AAkACQCABIAdJDQAgASAHRw0BIAMNAkEAIQgMAwsgBiABaiwAAEG/f0oNAQsgBiAHQQAgAUGM45cBEOMqAAsCQAJAIAMgB0kNACAHIQggAyAHRw0BDAILIAYgA2osAABBv39MDQAgAyEIDAELIAYgByADIAdBnOOXARDjKgALIAYgCGohBCAHIAhrIQcgBiED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ACAAKAIkIgNFDQAgAUEAIAMQ9QU2AiwLIAFBGGohAwJAIAAtAD0iBA0AAkAgASgCIA0AIABBADoAPQwBCyAAIAEoAhwiBSgCACAFQQRqKAIAEMIaOgA9CyAAIAMQwAogACAEOgA9CyACQcAAaiQAC6wGAQV/IwBB8ABrIgMkACABKALYASEEAkACQAJAAkACQCACRQ0AAkAgAS0A4AFB4wBGDQAgASgC3AEhAiADQRhqIAEQ1CYgA0EBNgJMIANBnL+cATYCSCADQgE3AlQgA0GzBzYCZCADQeMAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EgaigCADYCACADIAMpAhg3AjwgBCACIANBMGoQ4BohAiABLQDgAUGiAUYNAgwECyABEKELCyADQRBqIAFBAEEBEKkaIAMoAhQhBSADKAIQQQFxRQ0BIABBAjYCACAAIAU2AgQMAwsgASABEJosEKcXDAELAkACQAJAAkACQCABLQDgAUUNACABKALcASECIAEoAtgBIQQgA0EkaiABENQmIANBATYCTCADQZy/nAE2AkggA0IBNwJUIANBswc2AmQgA0EAOgBvIAMgA0HgAGo2AlAgAyADQegAajYCYCADIANB7wBqNgJoIANBMGogA0HIAGoQ/RogA0HEAGogA0EsaigCADYCACADIAMpAiQ3AjwgBCACIANBMGoQ4BohAiABLQDgAUGiAUYNAQwDCyABEKELIANByABqIAEQswMgAygCTCEGIAMoAkgiB0GAgICAeEYNASADIAMoAlA2AjggAyAGNgI0IAMgBzYCMAJAAkACQAJAIAEtAOABQQlGDQBBACEGDAELIANBCToAYCADQQhqIAEgA0HgAGoQ1xEgAygCDCEGIAMoAghBAXENAQsgAyAGNgJIAkAgARCMJyIHRQ0AIABBAjYCACAAIAc2AgQgA0HIAGoQpisMAgsgACADKQIwNwIEIAAgBTYCHCAAIAY2AhggACAENgIQIAAgAjYCACAAIAEoAtQBNgIUIABBDGogA0E4aigCADYCAAwHCyAAQQI2AgAgACAGNgIECyADQTBqEPgqDAMLIAEgARCaLBCnFwwBCyAAQQI2AgAgACAGNgIEDAELIABBAjYCACAAIAI2AgQLIAUQmSwM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EFQNACADQShGDQQgASAHpzYCACADQQFqIQMLIAAgAzYCoAEgAA8LIANBKEHosYEBEOEsAAtBKEEoQeixgQEQkRUACyADQShB6LGBARDhLAALQShBKEHosYEBEJEVAAsCQAJAAkAgAUEIcUUNACAAKAKgASIDQSlPDQECQAJAIAMNAEEAIQMMAQsgACADQQJ0IgVqIQRCACEHIAAhAgNAIAIgAjUCAELh6xd+IAd8Igg+AgAgAkEEaiECIAhCIIghByAFQXxqIgUNAAsgCEKAgICAEFQNACADQShGDQMgBCAHpzYCACADQQFqIQMLIAAgAzYCoAELAkAgAUEQcUUNACAAQbSCgQFBAhDTBBoLAkAgAUEgcUUNACAAQbyCgQFBAxDTBBoLAkAgAUHAAHFFDQAgAEHIgoEBQQUQ0wQaCwJAIAFBgAFxRQ0AIABB3IKBAUEKENMEGgsCQCABQYACcUUNACAAQYSDgQFBExDTBBoLIAAgARCjAxogAA8LIANBKEHosYEBEOEsAAtBKEEoQeixgQEQkRUAC5gGAQV/IABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAAkAgAkEBcQ0AIAJBAnFFDQEgASgCACICIABqIQACQCABIAJrIgFBACgCgPCeAUcNACADKAIEQQNxQQNHDQFBACAANgL4754BIAMgAygCBEF+cTYCBCABIABBAXI2AgQgAyAANgIADwsgASACEPgHCwJAAkACQAJAAkACQCADKAIEIgJBAnENACADQQAoAoTwngFGDQIgA0EAKAKA8J4BRg0DIAMgAkF4cSICEPgHIAEgAiAAaiIAQQFyNgIEIAEgAGogADYCACABQQAoAoDwngFHDQFBACAANgL4754BDwsgAyACQX5xNgIEIAEgAEEBcjYCBCABIABqIAA2AgALIABBgAJJDQIgASAAEJQJQQAhAUEAQQAoApjwngFBf2oiADYCmPCeASAADQQCQEEAKALg7Z4BIgBFDQBBACEBA0AgAUEBaiEBIAAoAggiAA0ACwtBACABQf8fIAFB/x9LGzYCmPCeAQ8LQQAgATYChPCeAUEAQQAoAvzvngEgAGoiADYC/O+eASABIABBAXI2AgQCQCABQQAoAoDwngFHDQBBAEEANgL4754BQQBBADYCgPCeAQsgAEEAKAKQ8J4BIgRNDQNBACgChPCe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AAtBBCECAkACQCAFQQRPDQBBACECQgAhBwwBCyABIARqNQAAIQcLAkAgAkEBciAFTw0AIAEgBGogAmozAAAgAkEDdK2GIAeEIQcgAkECciECCwJAIAIgBU8NACABIAIgBGpqMQAAIAJBA3SthiAHhCEHCyAAIAc3AzALIAAgBTYCPAu4BQIHfwF+IwBBMGsiAiQAIAApAmghCSAAQoCAgICAATcDaEEIIQMgAkEIakEIaiIEIABB8ABqIgUoAgA2AgBBACEGIAVBADYCACACIAk3AwggAEHoAGohBwJAAkACQCABKAIIIggNACAHIAIpAwg3AgAgB0EIaiAEKAIANgIAQQAhBQwBCyABKAIEIQMCQAJAA0AgAygCACEEIAAgAxD9AiAGQQFqIQUCQCAEQQFGDQAgAygCAEEBRg0CCyADQTBqIQMgBSEGIAggBUcNAAtBACEEDAELIAMQlwQCQCAFIAhHDQBBASEEDAELIANBMGohAyAGQX9zIAhqIQZBASEEA0AgAygCACEFIAAgAxD9AgJAAkAgBUEBRg0AIAMoAgBBAUcNACADEJcEIARBAWohBAwBCyADIARBUGxqIgUgAykDADcDACAFQShqIANBKGopAwA3AwAgBUEgaiADQSBqKQMANwMAIAVBGGogA0EYaikDADcDACAFQRBqIANBEGopAwA3AwAgBUEIaiADQQhqKQMANwMACyADQTBqIQMgBkF/aiIGDQALCyABIAggBGsiBjYCCCAAKAJsIQMgACgCaCEFIAcgAikDCDcCACAAKAJwIQAgB0EIaiACQQhqQQhqKAIANgIAIABFDQAgAiAFNgIcIAIgAzYCGCACIAM2AhQgAiADIABBBHRqNgIgIAJBJGogAkEUahDLCEEALQCg8Z4BGgJAQRwQfSIDRQ0AIAMgAikCJDcCACADQgA3AgwgA0ESakIANwEAIANBCGogAkEkakEIaigCADYCAAJAIAYgASgCAEcNACABQZSgmwEQ9B0LIAEgBkEBajYCCCABKAIEIAZBMGxqIgUgAzYCDCAFQQI2AgggBUERNgIAQQBBCBCjLQwCCwALIAUgAxC2LQsgAkEwaiQAC+oFAQt/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIUIQIgA0EANgIUAkAgAkUNACABQQhqIAIRAwACQCAAKAIE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AiAgBUEAOgAcIAVBADYCGCAFIAk2AhQgBSABNgIQIAUgDDcDCCAFQRI2AgAgAigC1AEhAkEMQQQQmioiASACNgIIIAEgBzYCBCABIAU2AgAMAgsgDBDGISAKIQELQQEhBAsgACABNgIEIAAgBDYCACADQeAAaiQAC6kFAQx/IwBBMGsiAyQAAkAgASgCeCACRg0AIAEgAjYCeCABIAEoAnAiBCABKAJ0ajYCbCABIAQgAiABKAJ8a2o2AmgLIAEQiQEgASgCeCEFAkACQAJAAkAgASgCbCABKAJoIgJHDQAgBSEGDAELAkACQAJAIAItAAAiBEE+Rw0AQRMhBwwBCyAEQS9HDQFBECEHCyABIAVBAWoiBjYCeCABIAJBAWo2AmgMAgsgAUEAOgCTASADQQRqIAEgBEECdEHcopoBaigCABEGAAJAIAMtAARBAXFFDQAgAygCCCECIANBCDYCGCADIAI2AhwgASADQRhqEJQFIAEoAnghBkGiASEHDAILIAEoAnghBiADLQAFIgdBowFHDQELIAEtACghAkGjASEHDAELIAYhAgJAIAEoAjBBgICAgHhGDQAgASgCRCEEIAFBADYCRCADQQA2AhQgAyABQTxqNgIMIAMgBDYCECADIAEoAkAiAjYCBCADIAIgBEEYbCIIaiIJNgIIAkAgBEUNACABQTBqIQogASgCOCILQQV0IQwDQCADQRhqQRBqIg0gAkEQaikDADcDACADQRhqQQhqIg4gAkEIaikDADcDACADIAIpAwA3AxgCQCALIAooAgBHDQAgCkGImpoBEOkdCyACQRhqIQIgASgCNCAMaiIEIAMpAxg3AwAgBEEQaiANKQMANwMAIARBCGogDikDADcDACAEQRxqQQA6AAAgBEEYaiAFNgIAIAEgC0EBaiILNgI4IAxBIGohDCAIQWhqIggNAAsgAyAJNgIECyADQQRqEMkJIAEoAnghAgsgASACNgIkIAEgBzoAKyABIAEtACgiAjoAKQsgACACOgAJIAAgBzoACCAAIAY2AgQgACAFNgIAIAEgABD0DiADQTBqJAALkgUCBH8BfiMAQSBrIgMkACADQRBqIAIgASgCGCIEKAIkQQAQiwICQAJAIAMtABBBBEYNACADKQMQIgdC/wGDQgRRDQAgACAHNwIADAELAkACQAJAAkACQCAEKAIkIgVF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IgRBBiAEQQlJGw4JAAECAwQFBgcIAAsgA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0GTAjYCDCADIAApAgg3AiggAyADQQhqNgIYIAMgA0EoajYCCCABIAIgA0EQahCVKSEADAgLIAMgAEEEajYCCCADQQI2AhQgA0GE65gBNgIQIANCATcCHCADQfkANgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQlSkhAAwHCyADQQA2AiAgA0EBNgIUIANBqOuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwGCyADQQA2AiAgA0EBNgIUIANBuOuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwFCyADQQA2AiAgA0EBNgIUIANB1OuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwECyADQQA2AiAgA0EBNgIUIANB9OuYATYCECADQgQ3AhggASACIANBEGoQlSkhAAwDCyADIAA2AgggA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0GUAjYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEJUpIQAMAgsgAyAAQQRqNgIIIANBAjYCFCADQfzrmAE2AhAgA0IBNwIcIANB+QA2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahCVKSEADAELIAMgAEEEajYCCCADQQE2AhQgA0Gcv5wBNgIQIANCATcCHCADQfkANgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQlSkhAAsgA0EwaiQAIAAL3gQBFn8jAEHgAGsiAiQAIAEoAgQhAyACIAEoAggiBEEEQRAQlQ8gAigCBCEFAkACQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACADIARBBHRqIQdBACEIIAUhCQNAIAMgB0YNASADKAIIIQogAygCBCELIAMoAgAhARD6JyEMIAIgARBCIAxBOGogAkE4aikDADcDACAMQTBqIAJBMGopAwA3AwAgDEEoaiACQShqKQMANwMAIAxBIGogAkEgaikDADcDACAMQRhqIAJBGGopAwA3AwAgDEEQaiACQRBqKQMANwMAIAxBCGogAkEIaikDADcDACAMIAIpAwA3AwACQAJAIAMoAgwiDQ0AQQAhDgwBCxCAKCEOIA0oAgQh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CyAAQQo2AgAgACABKQIENwIEIAEQ+goMAwsgAkEQaiABQRRqKQIANwMAIAJBGGogAUEcaikCADcDACACIAEpAgw3AwggASgCJCEFIAEoAgghAUEAIQMLIAAgATYCCCAAIAQ2AgQgACADNgIAIAAgAikDCDcCDCAAIAU2AiQgAEEUaiACQRBqKQMANwIAIABBHGogAkEYaikDADcCAAwBCyACQSBqIAEoAgQQpwUgAigCJCEBAkAgAigCICIDQQtGDQAgAkEQaiACQSBqQRRqKQIAIgY3AwAgAkEYaiACQSBqQRxqKQIAIgc3AwAgAiACKQIsIgg3AwggAigCRCEEIAIpA0ghCSAAIAIoAig2AgggACABNgIEIAAgAzYCACAAIAg3AgwgAEEUaiAGNwIAIABBHGogBzcCACAAIAk3AyggACAENgIkDAELIAAgATYCDCAAQQY2AgggAEEMNgIACyACQdAAaiQAC9kEAQh/IwBBEGsiAyQAIAMgATYCBCADIAA2AgAgA0KggICADjcCCAJAAkACQAJAAkAgAigCECIERQ0AIAIoAhQiAQ0BDAILIAIoAgwiAEUNASACKAIIIgEgAEEDdGohBSAAQX9qQf////8BcUEBaiEGIAIoAgAhAANAAkAgAEEEaigCACIHRQ0AIAMoAgAgACgCACAHIAMoAgQoAgwRCwBFDQBBASEBDAULAkAgASgCACADIAFBBGooAgARBwBFDQBBASEBDAULIABBCGohACABQQhqIgEgBUYNAwwACwsgAUEYbCEIIAFBf2pB/////wFxQQFqIQYgAigCCCEJIAIoAgAhAEEAIQcDQAJAIABBBGooAgAiAUUNACADKAIAIAAoAgAgASADKAIEKAIMEQsARQ0AQQEhAQwEC0EAIQVBACEKAkACQAJAIAQgB2oiAUEIai8BAA4DAAECAAsgAUEKai8BACEKDAELIAkgAUEMaigCAEEDdGovAQQhCgsCQAJAAkAgAS8BAA4DAAECAAsgAUECai8BACEFDAELIAkgAUEEaigCAEEDdGovAQQhBQsgAyAFOwEOIAMgCjsBDCADIAFBFGooAgA2AggCQCAJIAFBEGooAgBBA3RqIgEoAgAgAyABKAIEEQcARQ0AQQEhAQwECyAAQQhqIQAgCCAHQRhqIgdGDQIMAAsLQQAhBgsCQCAGIAIoAgRP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DgsgAEEEahCMKAwNCyAAQQRqEKAGDAwLIABBCGoiASgCACAAQQxqKAIAELocIAAoAgQgASgCABCjLQwLCyAAQQRqEKAGDAoLIABBBGoQoAYMCQsgAEEIahD5KgwICyAAQQRqEKAGIABBCGoQoAYgAEEMahCgBiAAQRBqEKAGDAcLIABBEGoQsScMBgsgAEEEahCgBgwFCyAAQQRqEKAGDAQLIABBBGoQoAYgAEEIahCgBgwDCyAAQRBqELEnIABBwABqEPoqIABBxABqEPoqDAILAkACQAJAAkAgACgCCEGAgICAeHMiAUEEIAFBBEkbDgQBAgUDAAsgAEEIahD5KiAAQRRqEI0oDAQLIAApAyAQ+yoMAwsgACkDECAAQSBqKQMAEKYuDAILIABBGGopAwAgAEEgaigCABDEJgwBCwJAIAAtABxBAkYNACAAKQMIEMYhCyAAQShqEPcqCyAAQeAAQQgQsxYLnAQBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhMADw8BAgMPDwQFBgcICQoLDA0OAAsgAEEEaiABEIghDwsgAEEEaiABEJMvIABBCGogARChLw8LIABBDGogARDAKg8LIABBKGogARChLw8LIABBBGogARCTLyAAQQhqIAEQoS8gACgCFEUNCiAAQRRqIAEQoS8PCyAAQRBqIAEQky8gACgCDEEYbCECIAAoAgghAANAIAJFDQogAEEUaiABEMAqIAAgARCIISACQWhqIQIgAEEYaiEADAALCyAAQQRqIAEQky8PCyAAKAIEIgBByABqIAEQiCEgAEHgAGohAgJAAkACQCAAKAIAQXlqDgIBAgALIAAgARCuGgsgAEEoaiABEIghCyACKAIAQYCAgIB4Rg0HIAIgARCIIQ8LIABBBGogARCTLyAAQQhqIAEQoS8PCyAAQQRqIAEQky8gAEEIaiABEKEvDwsCQCAAKAIEIgJBAkYNACAAQQhqIQMCQCACQQFxRQ0AIAMgARCTLwwBCyADIAEQoi8LIABBGGogARDAKiAAQRxqIAEQwCogAEEMaiABEKEvDwsgAEEEaiABEKkiIABBDGogARCTLyAAQRBqIAEQoS8PCyAAQQRqIAEQqSIgAEEMaiABEJMvIABBEGogARChLw8LIABBCGogARBxDwsgAEEEaiABEJMv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QQA2AgALIAJB0ABqIQIgA0Gwf2oiAw0ACwsgACgCHCICRQ0GIAIgARD3GA8LAkACQCAAKAIIDgMAAQcACwJAIAAtACRBAkYNACAAQQA2AiALIAAoAiggARDcBA8LAkAgAC0AJEECRg0AIABBADYCIAsgACgCKCABEJoNDwsgACgCBCABEL4DDwsgACgCECICRQ0DIAIgARD3GA8LIAAoAgRBADYCOA8LIAAoAgQgARC+Aw8LIABBADYCIAsLmwQBB38jAEEwayICJAACQCABKAIAQQdHDQACQCABKAIEIgMtAEVBA0YNACADQSBqIAAQhBsLIAMtAFENACADKQMAQgBSDQAgAygCSCEEAkACQAJAAkAgAy0AUA0AIARBf2oiASAAKAIEIgVPDQEgACgCACABai0AAEHtAEcNBAwDCwJAIAAoAgwiBg0AQQAhAQwCCyAAKAIIIQdBACEAIAYhAQJAA0ACQCABQQFLDQACQCAHIABBDGxqKAIAIgEgBEYNACAAIAEgBElqIQEMBQsgAEEBaiIBIAZPDQIgByABQQxsaiIBLQAIQYYBRg0GIAEoAgAhBAwFCyAAIAFBAXYiBSAAaiIIIAcgCEEMbGooAgAgBEsbIQAgASAFayEBDAALCyABIAZBvJScARCRFQALIAEgBUGclJwBEJEVAAsgAiABNgIgQcSInAFBKyACQSBqQbSInAFBrJScARDqEgALQQAoArjwngEiAEUNACACQRRqIAAgBCADKAIUIgEgBCABSRsgBCABIAQgAUsbQZaxnAFBOxD/ECACQQhqQRFBwLycARC7GSACKAIIIQAgAigCDCIBQQApANGxnAE3AAAgAUEIakEAKQDZsZwBNwAAIAFBEGpBAC0A4bGcAToAACACQRE2AiwgAiABNgIoIAIgADYCJCACQQA2AiAgAkEUaiACQSBqEOsfIgEQ9gEgARCqDgsgAkEwaiQAC6MEAQR/IwBB0ABrIgYkACAGIAM2AgQgBiACNgIAIAZBKGpBCGogBEEIaigCADYCACAGIAQpAgA3AyggASgCiAEhBCAGIAZBBGo2AjggBiAGNgI0AkACQCAEQYCACHENACABIARBgIAIcjYCiAEgBkEIaiAGQShqIAEQqyogASABKAKIAUH//3dxNgKIAQwBCyAGQQhqIAZBKGogARCrKgsgBigCCCEHAkAC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QAJAAkACQAJAAkACQCABKAIADggAAQIDBAUGBwALIAAgASgCIBDDAQwHCyABKAIgIAAQ8wsMBgsgASgCBCAAEOcSDAULIAEoAgQgABDnEgwECyABQQRqIAAQiAgMAwsgACABKAIEIgEoAgAiAyABQQRqKAIAIgEQyh8gACADIAEQhBAMAgtBACgCuPCeASIARQ0BIAJBJGogACABKAIEIgFBGGooAgAgAUEcaigCAEHqspwBQTMQ/xAgAkEQakERQcC8nAEQuxkgAigCECEAIAIoAhQiAUEAKQDRsZwBNwAAIAFBCGpBACkA2bGcATcAACABQRBqQQAtAOGxnAE6AAAgAkERNgI8IAIgATYCOCACIAA2AjQgAkEANgIwIAJBJGogAkEwahDrHyIBEPYBIAEQqg4MAQtBACgCuPCeASIARQ0AIAJBJGogACABKAIEIgFByABqKAIAIAFBzABqKAIAQZ2znAFBxAAQ/xAgAkEYakERQcC8nAEQuxkgAigCGCEAIAIoAhwiAUEAKQDRsZwBNwAAIAFBCGpBACkA2bGcATcAACABQRBqQQAtAOGxnAE6AAAgAkERNgI8IAIgATYCOCACIAA2AjQgAkEANgIwIAJBJGogAkEwahDrHyIBEPYBIAEQqg4LIAJBwABqJAAL7AQCBn8CfiMAQfABayICJAACQEEALQDY8J4BDQBBABCiFQtBAEEAKQPg8J4BIghCAXw3A+DwngFBACkD6PCeASEJIAEoAoAFKALQAiEDIAJCBDcC5AEgAkIANwLcASACQoCAgIDAADcC1AECQCADQX9MDQAgAkHsAWoiBEEANgIAIAJB1AFqIAMQiCUgAkHgAWoiBSADEIglIAJB0ABqIAQoAgA2AgAgAkHIAGogAkHkAWoiBikCADcDACACQcAAaiACQdQBakEIaiIHKQIANwMAIAIgAikC1AE3AzggBEEANgIAIAZCBDcCACAHQgA3AgAgAkKAgICAwAA3AtQBIAJB1AFqIAMQiCUgBSADEIglIAJB7ABqIAQoAgA2AgAgAkHkAGogBikCADcCACACQdwAaiAHKQIANwIAIAJBCGpBCGpBACkDgIWeATcDACACIAIpAtQBNwJUIAJBADYCtAEgAkKAgICAEDcCrAEgAkEANgKcASACQoCAgIDAADcClAEgAkIENwKMASACQgA3AoQB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AgAgABCeLSABKAI8QRRBBBCzFgsCQCABKAJAIgBFDQAgACgCACICELQCIAJB4ABBCBCzFiAAQQxBBBCzFgsgAUHIAEEEELMWC5kEAwZ/An4BfCMAQTBrIgIkACACIAFB4AFqNgIMIAEoAtgBIQMCQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAOABIgRB5ABGDQAgBEHaAEYNASAEQeoARg0BAkAgBEFAag4DCQMEAAsgBEHefmoOAgQGBQsgARChCyABKALUASEEQQIhBUIAIQgMCAsgBEHqAEYhBiABEKELIAEoAtQBIQRBASEFQgAhCAwHCyACQRBqIAEQjxEgAikDGCIJQoCAgIBwgyEIIAIrAxAhCiABKALUASIGQQh2IQEgCachB0EDIQUgAyEEDAYLIAJBEGogARCQESACKwMYIQogAigCECEHIAEoAtQBIgZBCHYhAUEEIQVCACEIIAMhBAwFCyABEJosIQEMAgsgAkEBNgIUIAJBqICcATYCECACQgE3AhwgAkGzBzYCLCACIAJBKGo2AhggAiACQQxqNgIoIAJBEGpBsICcARDpIwALIAEoAoABEN8jIQELIABBBzYCACAAIAE2AgQMAgsgAkEQaiABEP4aIAIpAyAiCUKAgICAcIMhCCACLwAVIAItABdBEHRyIQEgAisDGCEKIAItABQhBiACKAIQIQQgCachB0EAIQULIAAgATsADSAAIAo5AxAgACAGOgAMIAAgBDYCCCAAIAM2AgQgACAFNgIAIABBD2ogAUEQdjoAACAAIAggB62ENwMYCyACQTBqJAAL8gMCA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEJIjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBEGogASACEN0tIAMtABBBBEYNASADKQMQIgZC/wGDQgRRDQEgACAGNwIADAILIAAgBjcCAAwBCwJAAkACQCACLQBNDQAgA0EQaiACEJQRIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakHcq5wBQQEQtw0CQCADLQAIQQRGDQAgAykDCCIG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IgY2AgggACgCFCEHIAAoAhAhCCACIAAoAgwiATYCACACIAYgAUECdCIJajYCECACIAI2AhggBiEKAkAgAUUNACAGIQEgBiEKA0AgASgCACEEAkACQCADQQFqIgMgAigCGCgCAEYNACAEIAIoAhwQ5gYiBEUNAQsgCiAENgIAIApBBGohCiACKAIUQQFqIQMLIAFBBGohASACIAM2AhQgCUF8aiIJDQALIAIgATYCCAsgCiAGayIDQQJ2IQEgAkEEahDsFiACQQRqEIYdAkACQCADQQhJDQBBAC0AoPGeARpBwAAQfSIDDQEACwJAAkAgCiAGRw0AQQAhAwwBCyAGKAIAIQNBACEBCyAGIAEQ8CIgBSAGEJ8tDAQLIAMgBzYCFCADIAg2AhAgAyABNgIMIAMgBjYCCCADIAU2AgQgA0EZNgIADAMLIAEtAAANASABQQE6AAALIAAhAwwCC0EAIQMCQCAEQXBqDgoBAAAAAAAAAAABAAsgABDIAQsgAEHAAEEIELMWCyACQSBqJAAgAwvcAwEFfyMAQYABayICJAACQAJAAkAgAS0AFEECRg0AIABBGjYCACAAIAEpAwA3AwggAEEYaiABQRBqKQMANwMAIABBEGogAUEIaikDADcDAAwBCyACQQhqIAEoAgAiA0EgaikDADcDACACQRBqIANBKGopAwA3AwAgAkEYakEIaiIEIANBCGopAwA3AwAgAiADKQMYNwMAIAIgAykDADcDGCADKAIUIQUgAygCECEGIAJBKGogAhDnBkEALQCg8Z4BGkHAABB9IgFFDQEgASACKQMoNwMAIAFBOGogAkEoakE4aikDADcDACABQTBqIAJBKGpBMGopAwA3AwAgAUEoaiACQShqQShqKQMANwMAIAFBIGogAkEoakEgaikDADcDACABQRhqIAJBKGpBGGopAwA3AwAgAUEQaiACQShqQRBqKQMANwMAIAFBCGogAkEoakEIaikDADcDACACQfgAaiAEKQMANwIAIABBADYCCCAAIAE2AiggACAFNgIkIAAgBjYCICAAQRQ2AgAgAiACKQMYNwJwIAAgAikCbDcCDCAAQRRqIAJB7ABqQQhqKQIANwIAIABBHGogAkHsAGpBEGooAgA2AgAgA0EwQQgQsxYLIAJBgAFqJAAPCwALhgQBBH8jAEHAAGsiAiQAAkACQAJA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DQAgC0UNBSAKIAxqIAUgBCAFEOslRQ0ACyABKAIcIQkgASAHNgIcIAcgCWshBwwCCyABIAk2AgwLIAFBAToAJQJAAkAgAS0AJEEBRw0AIAEoAiAhBSABKAIcIQkMAQsgASgCICIFIAEoAhwiCUYNAgsgBSAJayEHCyACQQo2AhwgAkEIaiACQRxqIAogCWoiAyAHENkkIAIoAggiCUUNACACKAIMIQcgAkENNgIcIAIgAkEcaiAJIAcQ2SQgAigCBCAHIAIoAgAiBRshByAFIAkgBRshAwsgACAHNgIEIAAgAzYCACACQSBqJAAPCyAFQQRBsLCcARDhLAAL0QMCCn8BfiMAQaABayICJAAgAiABKAIIIgNBCEEwQez1mwEQsBogASgCACEEIAIoAgAhBSACKAIEIQYgAUEANgIAIAEoAgQhByABQQg2AgQgAUEANgIIIAJBADYCFCACIAY2AhAgAiAFNgIMIAIgByADQTBsIghqIgk2AiQgAiAENgIgIAIgBzYCGCACQShqQQRyIQogACkCDCEMIAAoAhQhC0EAIQBBACEEIAchAwJAA0AgCCAARg0BAkAgAygCACIFQRNGDQAgAiAFNgIoAkBBLEUNACAKIANBBGpBLPwKAAALIAIgDDcCZCACIAs2AmwgAkEANgJgIAJCgICAgIABNwJYIAJBKGogAkHYAGoQ6gUCQEEwRSIFDQAgAkHwAGogAkEoakEw/AoAAAsCQCAEIAIoAgxHDQAgAkEMakH89ZsBEPQdIAIoAhAhBgsCQCAFDQAgBiAAaiACQfAAakEw/AoAAAsgA0EwaiEDIAIgBEEBaiIENgIUIABBMGohACACQdgAahDIKAwBCwsgByAAakEwaiEJCyACIAk2AhwgAkEYahCzHSABEMkoIAFBCGogAkEMakEIaigCADYCACABIAIpAgw3AgAgAkGgAWokAAvYAwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhIBERECAwQFBgcICQoLDA0ODxAACyAAQQRqENQDDwsgAEEEahDJKAwPCyAAQQRqENQDIABBCGoQtioPCyAAQQxqELcrDwsgACkDEBDGISAAQShqELYqDwsgACkDECAALQAkEO0oDwsgACkDECAALQAkEO0oDwsgAEEEahDUAyAAQQhqELYq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aiIHIANBCGoiCCgCADYCACABIAMpAgA3AwggAUEANgIcIAFCgICAgBA3AhQgABCNCxoDQAJAAkAgAygCACAGRg0AIAAQ+w8hCSAAEI0LGiAJQQpHDQELIAUgAykCADcCACABQcgAakEIaiIJIAcoAgA2AgAgBUEIaiAIKAIANgIAIAQgASkDCDcCACABQSBqQQhqIAFBFGpBCGooAgA2AgAgBEEIaiAJKQMANwIAIARBEGogAUHIAGpBEGopAwA3AgAgASABKQIUNwMgIAEgAkHkuoQBEOwjIAEoAgQhBwJAIAEoAgAiCSgCCCIIIAkoAgBHDQAgCRClHAsCQEEkRQ0AIAkoAgQgCEEkbGogAUEgakEk/AoAAAsgCSAIQQFqNgIIIAcgBygCAEEBajYCAAwCCyABQRRqIAkQwBcMAAsLCyABQeAAaiQAC+MDAQV/IwBBwABrIgAkAAJAAkACQEEALQDY654BQQJHDQBBACgC3OueASEBQQBBADYC3OueASABRQ0BIABBKGogAREDACAAQRBqQRBqIgIgAEEoakEQaigCADYCACAAQRBqQQhqIgMgAEEoakEIaikCADcDACAAQQxqQQJqIgQgAEE/ai0AADoAACAAIAApAig3AxAgACAALwA9OwEMIAAtADwhAQJAAkBBAC0A2OueAUECRw0AQQAgACkDEDcCxOueAUEAIAE6ANjrngFBACAALwEMOwDZ654BQQAgAigCADYC1OueAUEAIAMpAwA3AszrngFBACAELQAAOgDb654BDAELIAFB/wFxQQJHDQMLIABBAjoAPCAAQShqEJ8jCyAAQcAAaiQADwsgAEEANgI4IABBATYCLCAAQbCMngE2AiggAEIENwIwIABBKGpBmI2eARDpIwALIABBP2ogAEEOai0AADoAACAAQShqQQhqIABBEGpBCGopAwA3AwAgAEEoakEQaiAAQRBqQRBqKAIANgIAIAAgAC8BDDsAPSAAIAApAxA3AyggACABOgA8IABBKGoQnyMgAEEANgI4IABBATYCLCAAQbiNngE2AiggAEIENwIwIABBKGpBwI2eARDpIwALnAMCCX8EfiMAQTBrIgIkACABQQF2IAFqIQMCQANAIANFDQECQAJAIANBf2oiAyABSQ0AIAMgAWshBAwBCyAAIANBHGxqIgVBCGoiBCkCACELIAVB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AAAgAyEBCyACKAIEIQMgACABOgAAIAAgAzYCBCACQSBqJAALogMCCn8BfiMAQeAAayIDJAACQCABKAIMIgQgASgCBCIFa0EEdiIGIAAoAgAgACgCCCIHa00NACAAIAcgBkEIQdgAENsdIAAoAgghBwsCQCAFIARGDQAgACgCBCAHQdgAbGohBiADQQhqQShqIQggA0E8aiEJIANBxQBqIgpBBGohCwNAIAEgBUEQaiIMNgIEIAUpAwAhDSAJQgA3AgAgCUEIakEAOgAAIApBADYAACALQQA7AAAgA0IANwMYIANCATcDECADQQA2AjAgA0IANwMoIANBADYCCCADQQM6AEsgA0IENwI0IANB0ABqQQhqIgUgCEEIaigCADYCACADIAgpAwA3A1AgA0EIahC0DiAGQShqQgA3AgAgBkEYakIANwIAIAZBEGogDTcCACAGQQhqQQA2AgAgBkEHNgIAIAZBMGogAykDUDcCACAGQThqIAUoAgA2AgAgBkE8akIANwIAIAZBwwBqQgA3AAAgBkHLAGpBAzoAACAGQdgAaiEGIAdBAWohByAMIQUgDCAERw0ACwsgACAHNgIIIANB4ABqJAALrAMCA38BfiMAQSBrIgMkACABKAIIIQQgA0EQaiACIAEoAgQiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEJIjIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakGEnJwBQQEQtw0gAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogASACEM4tAkAgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFENACAAIAY3AgAMAQsgAigCACEBIAJBADYCAAJAIAItADwNACACKAIEIQUgAigCKCACKAIQIAIoAhQQjgkCQCACKAI4RQ0AIAJBADYCNCACIAIoAjBBAWo2AjALIAJBAToAPCABRQ0AIAIgBRDFBQsCQAJAIARFDQAgA0EQaiACIAQQkiMgAy0AEEEERg0AIAMpAxAiBkL/AYNCBFINAQsgAEEEOgAADAELIAAgBjcCAAsgA0EgaiQAC/QDAQJ/AkACQAJAAkAC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KAIAIgNFDQAgBEEIaigCACEBIANBKGwhAwNAIAEgABDHByABQShqIQEgA0FYaiIDDQALCyAEQShqIgQgBUcNAAsLIAItADxBBkYNASAAIAJBEGoQsQoPCyABKAIMIgNFDQAgASgCCCEBIANBKGwhAwNAIAEgABDPCSABQShqIQEgA0FYaiIDDQALCwvzAgELfyAAQRhBJCAAKAIoIAAoAhxJIAAoAiQiAiAAKAIYIgNJIAIgA0YbIgMbaiIEIAAgACgCECAAKAIESSAAKAIMIgIgACgCACIFSSACIAVGGyIFQQFzQQxsaiICIABBJEEYIAMbaiIDIAMoAgQgACAFQQxsaiIAKAIESSADKAIAIgUgACgCACIGSSAFIAZGGyIHGyAEKAIEIAIoAgRJIAQoAgAiBSACKAIAIgZJIAUgBkYbIggbIgUoAgQhCSAAIAMgAiAIGyAHGyIGKAIEIQogBSgCACELIAYoAgAhDCABQQhqIAMgACAHGyIAQQhqKAIANgIAIAEgACkCADcCACABIAUgBiAJIApJIAsgDEkgCyAMRhsiABsiAykCADcCDCABQRRqIANBCGooAgA2AgAgAUEgaiAGIAUgABsiAEEIaigCADYCACABIAApAgA3AhggASACIAQgCBsiACkCADcCJCABQSxqIABBCGooAgA2AgALpwMBBH8jAEEgayIDJAACQAJAIAItAAwiBEEBRw0AIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgAMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFDgMBAAIBCyADIAIQ7SYgACADKQIANwIAIANBAiADLQAMazoADCAAQQhqIANBCGopAgA3AgAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggiAhDCIEH/AXEOAgIDAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIAMgAigCBCACKAIIEPQKIAAgBSADQRRqEN8XDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiAGIAIgAxDDBSAAQQIgBWsgA0EUahDfFwwDCyAAQQhqQQApAoyZggE3AgAgAEEAKQKEmYIBNwIADAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiADIAYg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AwsgAygCKCADKAIEIAMoAghBkeqZAUEpENkOGgwBCyADKAIoIAMoAgQgAygCCEHb6ZkBQTYQ2Q4aCyAAIAMpAiQ3AgAgAEEIaiADQSRqQQhqKAIANgIAAkAgAygCGCIAQYCAgIB4Rg0AIAAgARDfLwsgAxDdBwwBCyABEMwuCyADQTBqJAALgwMBBX8jAEHQAGsiAyQAIAEoAgwoAgAhBCABKAIULQAAIQUgASgCGC0AACEGIAEoAhAhByADQTBqQQhqIAFBCGooAgA2AgAgAyAHNgJAIAMgBjoALyADIAU6AC4gAyAENgIoIAMgASkCADcDMCACKAKIASIEQYABcSEBIAMgA0EvajYCTCADIANBKGo2AkggAyADQS5qNgJEIAMgA0EvajYCPAJAAkAgBQ0AAkAgAUUNACACIARB/35xNgKIASADQSBqIANBMGogAhCrDyADKAIgIQEgAiACKAKIAUGAAXI2AogBIAMoAiQhAgwCCyADQRhqIANBMGogAhCrDyADKAIcIQIgAygCGCEBDAELAkAgAQ0AIAIgBEGAAXI2AogBIANBCGogA0EwaiACEKwPIAMoAgghASACIAIoAogBQf9+cTYCiAEgAygCDCECDAELIANBEGogA0EwaiACEKwPIAMoAhQhAiADKAIQIQELIAAgAjYCBCAAIAE2AgAgA0HQAGokAAuDAwEFfyMAQdAAayIDJAAgASgCDCgCACEEIAEoAhQtAAAhBSABKAIYLQAAIQYgASgCECEHIANBMGpBCGogAUEIaigCADYCACADIAc2AkAgAyAGOgAvIAMgBToALiADIAQ2AiggAyABKQIANwMwIAIoAogBIgRBgAFxIQEgAyADQS9qNgJMIAMgA0EoajYCSCADIANBLmo2AkQgAyADQS9qNgI8AkACQCAFDQACQCABRQ0AIAIgBEH/fnE2AogBIANBIGogA0EwaiACEKoPIAMoAiAhASACIAIoAogBQYABcjYCiAEgAygCJCECDAILIANBGGogA0EwaiACEKoPIAMoAhwhAiADKAIYIQEMAQsCQCABDQAgAiAEQYABcjYCiAEgA0EIaiADQTBqIAIQrQ8gAygCCCEBIAIgAigCiAFB/35xNgKIASADKAIMIQIMAQsgA0EQaiADQTBqIAIQrQ8gAygCFCECIAMoAhAhAQsgACACNgIEIAAg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AgBBiO6YAUEOIAEoAgQoAgwRCwAhAQwECyABKAIAQZbumAFBESABKAIEKAIMEQsAIQEMAwsgASgCAEGn7pgBQQcgASgCBCgCDBELACEBDAILIAIgAzYCDCABQa7umAFBBSACQQxqQZICEP8LIQEMAQsgASgCAEGz7pgBQQkgASgCBCgCDBELACEBCyACQRBqJAAgAQuCAwINfwF+IwBB4ABrIgEkABCFKCECIAAoAhghAyAAKAIUIQQgACgCECEFIAAoAgQhBiAAKAIAIQcCQAJAIAApAwgiDkIDg0IAUg0AIA6nIgggCCgCACIIQQFqNgIAIAhBf0wNAQsgAC0ARCEJIAAtABwhCgJAAkAgACgCICILDQBBACEIDAELEIAoIQggCygCDCEMIAsoAhAhDSABIAsQ4QYgCEEQaiANNgIAIAggASkCADcCACABIAw2AgwgCEEIaiABQQhqKQIANwIACyABQThqIABBOGoQ0QUgACgCMCELIAAoAjQhDCABQcwAaiAAQSRqEJcBIAFBNGogDDYCACABIAs2AlggAUEsaiABQdQAaikCADcCACABIAk6AEQgASAKOgAcIAEgAzYCGCABIAQ2AhQgASAFNgIQIAEgDjcDCCABIAY2AgQgASAHNgIAIAEgCDYCICABIAEpAkw3AiQCQEHIAEUNACACIAFByAD8CgAACyABQeAAaiQAIAIPCwAL0wQCBH8BfiMAQRBrIgEkACABQQhBCEHAABCjEiABKAIEIQICQAJAIAEoAgAiAw0AIAE1AgghBQwBCyABKQIIIQUgAkEJaiIERQ0AIANB/wEgBPwLAAsgAUEIaiIEIAU3AgAgASACNgIEIAEgAzYCACABQtHEyauW7BoQwgYgAULBxoWb1wwQwgYgAULRxoWjt4waEMIGIAFC0caxi7buHBDCBiABQtHGvfO2jh0QwgYgARDsHxDCBiABEO0fEMIGIAFC8ciVs5asnbb0ABDCBiABQuHIlePWjN0yEMIGIAFCoci9AxDCBiABQsHKsZvXDBDCBiABQsHKuavXDRDCBiABQuHK4YP3zZw6EMIGIAFC8crho9fMm7LzABDCBiABQtHMheO2rhkQwgYgAULxzKXzloybtvkAEMIGIAFCscy9kwcQwgYgARDuHxDCBiABQqHSmQMQwgYgAULh0rWD982cOhDCBiABQqHS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rYQ3AzggByAHQThqNgJgIAdB2ABqIAYQ6SMAC4YDAQR/IwBBIGsiBCQAAkACQCABKAIgDQAgAUF/NgIgIAIgASgCPCIFTw0BIAEoAlghBkEEIQcCQAJAAkACQAJAAkACQAJAIAEoAjggAkEEdGoiAigCAA4KBQUABQQEAQIGBgULIARBADYCGCAEQQE2AgwgBEHwgYQBNgIIIARCBDcCECAEQQhqQfiBhAEQ6SMACwJAIAIoAgwiByACKAIERw0AIAJBBGpBiIKEARCSHAsgAigCCCAHQQJ0aiADNgIAIAIgB0EBajYCDAwBCwJAIAIoAgwiByACKAIERw0AIAJBBGpBmIKEARCSHAsgAigCCCAHQQJ0aiADNgIAIAIgB0EBajYCDAsgASAGQQRqIgI2AlggASgCLEEBRw0CIAVBBHQgAmogASgCMCICTQ0CIAAgAjYCBCAAQSc2AgAMAwtBDCEHCyACIAdqIAM2AgALIABBKjYCAAsgASABKAIgQQFqNgIgIARBIGokAA8LQdyfhAEQ0hoACyACIAVBvIGEARCRFQALgAMBBH8CQAJAAkACQAJAAkACQCAAKAIADgcAAQIDBQQGAAsgACkDCCAAKAIYIAEQgiMPCwJAIAAoAgwiAkUNACAAKAIIIQMgAkEobCECA0ACQCADKAIAQQdGDQAgAyABELYICyADQShqIQMgAkFYaiICDQALCyAAKAIYIgNFDQIgAygCACABEKgBDwsgACgCBCABELYIIAAoAhgiA0UNASADKAIAIAEQqAEPCwJAIAAoAgwiA0UNACAAKAIIIQQgA0E4bCEFQQAhAwNAAkACQAJAAkAgBCADaiICKAIADgMAAQIACyACQQhqIAEQrCggAkEoaigCACABELYIDAILIAEgAkEQaikDACACQSBqKAIAEIUjDAELIAJBBGooAgAgARC2CCACQRhqKAIAIgJFDQAgAigCACABEKgBCyAFIANBOGoiA0cNAAsLIAAoAhgiA0UNACADKAIAIAEQqAELDwsgACgCBCABELYIIAAoAgggARClAQ8LIAAoAgQgARClAQuHAwEFfyMAQcABayIBJABBACECAkAgAC0AkQFBIHFFDQAgACgCiAEhAyABQRBqIAAQ3QEgACADQQFyEKgSAkACQAJAIAAtAOABQT5GDQBBACECIAFBCGogAEEAQQEQ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CGoQkS4MAQsgA0EIakG8h4gBQZwGEI0NCyADQThqIAEoAgQgASgCCCACIANBCGoQ1BMgA0EoakEIaiIBIANBOGpBDGopAgA3AwAgAyADKQI8NwMoAkAgAygCOCIEQYCAgIB4Rg0AIAAgAykCTDcCFCAAQSRqIANBOGpBJGooAgA2AgAgAEEcaiADQThqQRxqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAQLIANBGGpBCGogASkDADcDACADIAMpAyg3AxggAi0AGQ0BDAILQeDuhAFBKEGI74QBENIeAAsgA0EYahCDCgsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC+kCAQZ/IwBBEGsiASQAAkACQAJAAkAgACgCACICRQ0AQQAhAwNAAkAgACgCCCIEIAAoAgQiBU8NACACIARqLQAAQcUARw0AIAAgBEEBajYCCAwCCwJAAkACQAJAIANFDQAgACgCECIGRQ0AIAZB4p6aAUECEIIGDQcgACgCACICRQ0BIAAoAgghBCAAKAIEIQULIAQgBU8NAAJAIAIgBGotAABBtX9qDgICAAELIAAgBEEBajYCCCABIAAQgwggAS0AAA0FIAAgASkDCBDcDQ0GDAILIAAQ/wINBQwBC0EBIQIgACAEQQFqNgIIIABBABCMAg0FCyADQX9qIQMgACgCACICDQALC0EAIQIMAgsgAS0AASEEAkAgACgCECIDRQ0AQQEhAiADQczjlwFBvOOXASAEQQFxIgUbQRlBECAFGxCCBg0CCyAAIAQ6AARBACECIABBADYCAAwBC0EBIQILIAFBEGokACACC+ICAgR/AX4jAEHAAGsiAiQAIAIgATYCDAJAAkACQCABRQ0AIAIgACgCAEEIakH885gBEOwjIAIoAgQhAyACQShqIAIoAgAgARDyCSACQShqEJwPIQQQ1SAhBiACQgA3AxggAkEBOgAgIAIgBjcDECAEKAIIQRhsIQEgBCgCBCEAA0AgAUUNAiABQWhqIQEgACACQRBqEJMMIQUgAEEYaiEAIAVFDQALIAIpAxAiBkIDg0IAUg0CIAanIgEgASgCACIAQX9qNgIAIABBAUcNAiABIAEoAhAQxiQMAgsgAkIANwI0IAJCgYCAgMAANwIsIAJBxPSY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DAELIAEgAhDdEgsgAUEoaiEBIABBWGoiAA0ACwsgAy0APEEGRg0BIANBEGoQnxoPCyABKAIMIgBFDQAgAEEobCEAIAEoAghBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQvgMMAwsgASgCACACEL4DDAILIAIgASgCABDNCQwBCyABIAIQ+AsLIAFBKGohASAAQVhqIgANAAsLC8sCAgJ/An4CQAJAAkACQCAAKQMAIgNCfnwiBEICIARCAlQbpw4CAQIACyAAQQhqIQECQAJAIANCAFINACABKQMAIgRCA4NCAFINASAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIAEQyBMLIAApAyAiBEICUQ0CIABBKGohAAJAIARCAFINACAAKQMAIgRCA4NCAFINAyAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQMgACAAKAIQEMYkDwsgABDIEw8LIABBEGohAQJAIAAoAggNACABKQMAIgRCA4NCAFINAiAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQIgACAAKAIQEMYkDwsgARDIEw8LIAApAwgiBEIDg0IAUg0AIASnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC/YCAQJ/IAAoAgAhAgJAAkACQAJAAkAgASgCAA4FBAABAgMECyABKAIEQQFHDQMgASgCCCACEKQCDwsgASgCBCACEKQCDwsgASgCBCIDQcAAaiACEM4KAkAgAygCmAEiAUUNACABQShsIQAgAygClAFBBGohAQNAAkACQAJAAkACQCABQXxqKAIADgUEAAECAwQLIAEoAgBBAUcNAyABQQRqKAIAIAIQpAIMAwsgASgCACACEKQCDAILIAEgAhDEDwwBCyABIAIQ3xILIAFBKGohASAAQVhqIgANAAsLIAMtADxBBkYNASADQRBqEKcoDwsgASgCDCIARQ0AIABBKGwhACABKAIIQQRqIQEDQAJAAkACQAJAAkAgAUF8aigCAA4FBAABAgMECyABKAIAQQFHDQMgAUEEaigCACACEKQCDAMLIAEoAgAgAhCkAgwCCyACIAEoAgAQ0gkMAQsgASACEPsLCyABQShqIQEgAEFYaiIADQALCwv2AgECfyAA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IAEgASgCiAFBgAFyNgKIASAGKAIkIQEMAgsgBkEYaiAGQTBqIAEQqQ8gBigCHCEBIAYoAhghAgwBCwJAIAINACABIANBgAFyNgKIASAGQQhqIAZBMGogARCvDyAGKAIIIQIgASABKAKIAUH/fnE2AogBIAYoAgwhAQwBCyAGQRBqIAZBMGogARCvDyAGKAIUIQEgBigCECECCyAAIAI2AgAgACABNgIEIAZB0ABqJAALzQICA38BfiMAQSBrIgMkACABKAIMIQQgA0EQaiACIAEoAggiBUEAEIsCAkACQCADLQAQQQRGDQAgAykDECIGQv8Bg0IEUQ0AIAAgBjcCAAwBCwJAAkACQCAFRQ0AIANBEGogAiAFEI4jIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIANBADYCECADQQhqIAIgA0EQakG4g5wBQQEQsQ0gAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBEGogAiAFIAFBABDiBgJAIAMtABBBBEYNACADKQMQIgZC/wGDQgRRDQAgACAGNwIADAELAkACQCAERQ0AIANBEGogAiAEEI4jIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwBCyAAIAY3AgALIANBIGokAAvKAgIIfwF+IwBBwABrIgIkACABKAIEIQMgAiABKAIIIgRBCEHAABCVDyACKAIEIQUCQCACKAIAQQFGDQAgAigCCCEGAkAgBUUNACAEQQZ0IQcgAkEwaiEIIAYhASAFIQkDQCAHRQ0BIAMpAyghCiAIIANBMGoQ7QggAiADELwCIAFBKGogCjcDACACQShqIAo3AwAgASACKQMANwMAIAFBCGogAkEIaikDADcDACABQRBqIAJBEGopAwA3AwAgAUEYaiACQRhqKQMANwMAIAFBIGogAkEgaikDADcDACABQTBqIAgpAwA3AwAgAUE4aiACQThqKQMANwMAIAFBwABqIQEgB0FAaiEHIANBwABqIQMgCUF/aiIJDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQcAAaiQADwsgBSACKAIIQbTymgEQjikAC+ACAQR/IAAtACYhAiAAQQA6ACYCQCABKAIIIgNFDQAgASgCBCEBIANBDGwhAwNAAkACQCABKAIADQACQAJAAkACQAJAIAFBBGooAgAiBCgCAEF7aiIFQQQgBUEGSRsOBgYAAQIDBAYLIARBCGogABC/JwJAIAQoAghBA0cNACAEKAIMIgUoAgBBGUcNACAAIAUQxwELIAAgBCgCKCIEEFQgBCgCAEEZRw0FIAAgBBDHAQwFCyAAIAQoAigQVAwECyAAIARBCGoQkyQgBCgCKEGAgICAeEYNAyAAIARBKGoQmxsMAwsgACAEEJMkAkAgBCgCIEEHRg0AIARBIGogABCjDAsgBCgCaCAAEKMMIAQoAkhBgICAgHhGDQIgACAEQcgAahCbGwwCCyAAIARBCGoQkyQgBCgCKCAAEO0NDAELIAAgARDPJgsgAUEMaiEBIANBdGoiAw0ACwsgACACOgAmC9ICAgl/An4CQAJAIAAoAjQiAUUNACAAQRxqIQIgACgCMCIDIAFBPGxqIQQgAEEsaiEFA0AgAxCECSADKAIcIgYpAwAhCiACIAMoAigiB0EBakEBdiAHIAAoAigbIAUQwScgA0E8aiEDIAZBCGohASAKQn+FQoCBgoSIkKDAgH+DIQoCQANAAkAgCkIAUg0AIAdFDQIDQCAGQYB/aiEGIAEpAwAhCiABQQhqIgghASAKQoCBgoSIkKDAgH+DIgpCgIGChIiQoMCAf1ENAAsgCkKAgYKEiJCgwIB/hSEKIAghAQsgBiAKeqdBAXRB8AFxayIIQXhqKAIAIQkCQCAIQXBqKQMAIgtCA4NCAFINACALpyIIIAgoAgAiCEEBajYCACAIQX9MDQULIApCf3wgCoMhCiACIAsgCRCJBhogB0F/aiEHDAALCyADIARHDQALCw8LAAvNAgICfwJ+AkACQAJAAkACQAJAIAAoAgAOBgEFBQIDBAALAkAgACkDCCIDQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsgACkDECIDQgODQgBSDQQgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0EIAAgACgCEBDGJA8LIAApAwggACkDGBCqFAwDCyAAKQMYIgNQDQIgA0IDg0IAUg0CIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNAiAAIAAoAhAQxiQPCyAAKQMQIAAoAhgQtBkPCyAAKQMQIQMCQCAAKQMIIgRCA4NCAFINACAEpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCyADQgODQgBSDQAgA6ciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJA8LC7gCAQV/IwBBIGshAgJAIAEoAgQiAyABQWhqKAIASSABKAIAIgQgAUFkaigCACIFSSAEIAVGG0EBRw0AIAJBCGpBEGogAUEYaigCADYCACACQRBqIAFBEGopAgA3AwAgAiABKQIINwMIIAFBSGohBQJAAkADQCAFIgFB0ABqIAFBNGooAgA2AgAgAUHIAGogAUEsaikCADcCACABQcAAaiABQSRqKQIANwIAIAFBOGogAUEcaiIFKQIANwIAIAUgAEYNASABQWRqIQUgAyABQQRqKAIASSAEIAEoAgAiBkkgBCAGRhsNAAsgAUEcaiEFDAELIAFBHGohBQsgAUEcaiAENgIAIAUgAzYCBCAFIAIpAwg3AgggBUEQaiACQRBqKQMANwIAIAVBGGogAkEIakEQaigCADYCAAsLwAIBBX8jAEEwayICJABBCiEDAkACQANAAkAgAEGPzgBLDQAgAEHjAEsNAiAAIQQMAwsgAkEIaiADaiIEQXxqIAAgAEGQzgBuIgVBkM4AbGsiAEH//wNxQeQAbiIGQQF0Qdz8mAFqLwAAOwAAIARBfmogACAGQeQAbGtB//8DcUEBdEHc/JgBai8AADsAACADQXxqIQMgBSEADAALCyACQQhqIANBfmoiA2ogACAAQf//A3FB5ABuIgRB5ABsa0H//wNxQQF0Qdz8mAFqLwAAOwAACwJAAkAgBEEKSQ0AIAJBCGogA0F+aiIAaiAEQQF0Qdz8mAFqLwAAOwAADAELIAJBCGogA0F/aiIAaiAEQTByOgAACyABKAIAIAJBCGogAGpBCiAAaxCOCSACQQQ6AAAgAhDRJiEAIAJBMGokACAAC8gCAQN/IwBBEGsiBSQAAkACQCACQX9MDQACQAJAIAINAEEBIQYMAQtBAC0AoPGeARogAhB9IgZFDQILAkAgAkUNACAGIAEgAvwKAAALIAUgAjYCDCAFIAY2AgggBSACNgIEQQAhBwJAIAJFDQAgBiACakF/aiIBRQ0AIAEtAABBL0chBwsCQAJAAkAgBEUNAEEAIQEgAy0AAEEvRg0BCwJAIAcNACACIQEMAgsgBUEEaiACQQEQ6AwgBSgCCCIGIAUoAgwiAmpBLzoAACACQQFqIQEgBSgCBCECCyAFIAE2AgwLAkAgBCACIAFrTQ0AIAVBBGogASAEEOgMIAUoAgghBiAFKAIMIQELAkAgBEUNACAGIAFqIAMgBPwKAAALIABBCGogASAEajYCACAAIAUpAgQ3AgAgBUEQaiQADwtBwLycARDiIQsAC8sCAgJ/AX4jAEEgayIDJAACQAJAAkACQCABKAIEIgRFDQAgA0EYaiACIAQQjiMgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFINAQsgA0EANgIMIANBGGogAiADQQxqQeGrnAEQvA0gAy0AGEEERg0BIAMpAxgiBUL/AYNCBFENASAAIAU3AgAMAgsgACAFNwIADAELIANBGGogASACEM4tAkAgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFENACAAIAU3AgAMAQsgA0EYaiACIANBDGpB4qucARC8DQJAIAMtABhBBEYNACADKQMYIgVC/wGDQgRRDQAgACAFNwIADAELAkACQCABKAIIIgFFDQAgA0EYaiACIAEQjiMgAy0AGEEERg0AIAMpAxgiBUL/AYNCBFINAQsgAEEEOgAADAELIAAgBTcCAAsgA0EgaiQAC74CAgZ/AX4jAEEwayIEJAAgBCACNgIYIAQgATcDECABIAIQ7B4hASAEIARBEGo2AiQgAEEBIABBEGoQ0ScgBCAANgIsIAQgBEEkajYCKCAEQQhqIAAoAgAgACgCBCABIARBKGpBvQcQ3wkgACgCACECIAQoAgwhBQJAAkAgBCgCCEEBcUUNACACIAVqIgYtAAAhByAEKQMQIQogBCgCGCEIIAYgAUIZiKciCToAACACIAAoAgQgBUF4anFqQQhqIAk6AAAgACAAKAIMQQFqNgIMIAAgACgCCCAHQQFxazYCCCACQQAgBWtBGGxqIgBBeGogAzcDACAAQXBqIAg2AgAgAEFoaiAKNwMAQgAhAQwBCyACQQAgBWtBGGxqQXhqIgApAwAhASAAIAM3AwAgBCkDEBDVIQsgBEEwaiQAIAEL3AIBA38jAEEwayIEJAACQAJAAkACQCADKAIQIgUgAygCFCIGSw0AAkAgAygCAEF/akECSQ0AIARBDGogASADKAIIIAMoAgwgBSAGEIMOQQAhAwJAIAQoAgxBAUcNACAEKAIQIgMgBCgCFCIBSw0DIABBADYCDCAAIAE2AgggACADNgIEQQEhAwsgACADNgIADAQLIARBDGogASADKAIIIAMoAgwgBSAGEKEUQQAhAwJAIAQoAgxBAUcNACAEKAIQIgMgBCgCFCIBSw0DIABBADYCDCAAIAE2AgggACADNgIEQQEhAwsgACADNgIADAMLIABBADYCAAwCCyAEQQA2AiggBEEBNgIcIARB/JSEATYCGCAEQgQ3AiAgBEEYakHUpIMBEOkjAAsgBEEANgIoIARBATYCHCAEQfyUhAE2AhggBEIENwIgIARBGGpB1KSDARDpIwALIARBMGokAAvcAgEDfyMAQTBrIgQkAAJAAkACQAJAIAMoAhAiBSADKAIUIgZLDQACQCADKAIAQX9qQQJJDQAgBEEMaiABIAMoAgggAygCDCAFIAYQzAhBACEDAkAgBCgCDEEBRw0AIAQoAhAiAyAEKAIUIgFLDQMgAEEANgIMIAAgATYCCCAAIAM2AgRBASEDCyAAIAM2AgAMBAsgBEEMaiABIAMoAgggAygCDCAFIAYQ/QlBACEDAkAgBCgCDEEBRw0AIAQoAhAiAyAEKAIUIgFLDQMgAEEANgIMIAAgATYCCCAAIAM2AgRBASEDCyAAIAM2AgAMAwsgAEEANgIADAILIARBADYCKCAEQQE2AhwgBEH8lIQBNgIYIARCBDcCICAEQRhqQdSkgwEQ6SMACyAEQQA2AiggBEEBNgIcIARB/JSEATYCGCAEQgQ3AiAgBEEYakHUpIMBEOkjAAsgBEEwaiQAC7kCAgN/AX4jAEEgayIGJAACQAJAAkAgAiADaiIDIAJPDQBBACECDAELQQAhAiAEIAVqQX9qQQAgBGtxrSADIAEoAgAiB0EBdCIIIAMgCEsbIgNBBCADQQRLGyIIrX4iCUIgiKcNACAJpyIDQYCAgIB4IARrSw0BAkACQCAHDQBBACECIAZBHGohBQwBCyAGIAQ2AhwgByAFbCECIAEoAgQhByAGQRhqIQULIAUgAjYCAAJAAkAgBigCHEUNAAJAIAYoAhgiAg0AIAZBEGogBCADQQAQwCAgBigCECEFDAILIAcgAiAEIAMQ9AMhBQwBCyAGQQhqIAQgAxDYHyAGKAIIIQULIAQhAiAFRQ0BIAEgCDYCACABIAU2AgRBgYCAgHghAgsLIAAgAzYCBCAAIAI2AgAgBkEgaiQAC8ECAQd/IwBBIGsiAyQAAkACQCACIAAoAgAiBCAAKAIIIgVrSw0AIAUgAmohBiAAKAIEIQQMAQsCQAJAAkAgBSACaiIGIAVPDQBBACEHDAELQQAhBwJAIAYgBEEBdCIIIAYgCEsbIghBCCAIQQhLGyIIQQBODQAMAQsCQAJAIAQNAEEAIQQgA0EcaiEHDAELIANBATYCHCAAKAIEIQkgA0EYaiEHCyAHIAQ2AgACQAJAIAMoAhxFDQACQCADKAIYIgQNACADQRBqIAgQ6CYgAygCECEEDAILIAkgBEEBIAgQ9AMhBAwBCyADQQhqIAgQ6CYgAygCCCEECyAEDQFBASEHCyAHIAhBxISeARCOKQALIAAgCDYCACAAIAQ2AgQLAkAgAkUNACAEIAVqIAEgAvwKAAALIAAgBjYCCCADQSBqJAALgwMBAX8jAEGQAWsiAiQAIAJBsNyDATYCiAEgAkHg24MBNgKAASACQeDbgwE2AnggAkHg24MBNgJwIAJBkNyDATYCaCACQZDcgwE2AmAgAkHg24MBNgJYIAJB4NuDATYCUCACQaDcgwE2AkggAkGQ3IMBNgJAIAJBkNyDATYCOCACQYDcgwE2AjAgAkHw24MBNgIoIAJB4NuDATYCICACQeDbgwE2AhggAkHQ24MBNgIQIAIgADYCRCACIABBwQBqNgJ8IAIgAEHAAGo2AnQgAiAAQT9qNgJsIAIgAEEgajYCZCACIABBGGo2AlwgAiAAQT5qNgJUIAIgAEE9ajYCTCACIABBEGo2AjwgAiAAQQhqNgI0IAIgAEHCAGo2AiwgAiAAQShqNgIkIAIgAEE8ajYCHCACIABBO2o2AhQgAiAAQTpqNgIMIAIgAEE4ajYCjAEgAiACQYwBajYChAEgAUH0t4QBQQZB3N2DAUEQIAJBDGpBEBCoCiEAIAJBkAFqJAAgAAvdAgEEfyMAQeAAayICJAAgAkEYaiABQQAQ7AgCQAJAAkACQAJAIAIoAhgiA0EqRg0AAkBBPEUNACAAQQRqIAJBGGpBBHJBPPwKAAALIAAgAzYCAAwBCyACIAEoAgQiAygCHCIENgJcIARBAUcNASADKAIYIgQtAAwNAiADQQA2AhwgBCgCACIFQYCAgIB4Rg0DIAIgBTYCDCACIAQpAgQ3AhAgAkEYaiABKAIAIAMgAkEMahDrBSACKAIcIQMCQCACKAIYIgRBKkYNAAJAQThFDQAgAEEIaiACQRhqQQhqQTj8CgAACyAAIAM2AgQgACAENgIADAELIAAgAzYCBCAAQSo2AgAgACABKAIINgIICyACQeAAaiQADwsgAkEANgIYQQAgAkHcAGpB8NGbASACQRhqQeCjhAEQlSEAC0GEo4QBQTlBwKOEARDSHgALQeihhAFBD0HQo4QBELIXAAvEAgIDfwF+IwBBEGsiAyQAIAEoAiwhBCADQQhqIAIgASgCKCIFQQAQiwICQAJAIAMtAAhBBEYNACADKQMIIgZC/wGDQgRRDQAgACAGNwIADAELAkACQAJAIAVFDQAgA0EIaiACIAUQjiMgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFINAQsgA0EIaiACIAUgBCABKAI0IAEoAjgQ2AUgAy0ACEEERg0BIAMpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgACAGNwIADAELIANBCGogASACEMYGAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAIARFDQAgA0EIaiACIAQQjiMgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFINAQsgAEEEOgAADAELIAAgBjcCAAsgA0EQaiQAC6ACAQl/IAIgAUECdEF8aiIEaiEFIAAgBGohBiAAIAFBAXYiB0ECdGoiBEF8aiEIAkADQAJAIAcNACAIQQRqIQcCQCABQQFxRQ0AIAIgACAEIAAgB0kiCBsoAgA2AgAgBCAAIAdPQQJ0aiEEIAAgCEECdGohAAsCQCAAIAdHDQAgBCAGQQRqRg0DCxDhIQALIAAoAgAhCSAEKAIAIQogAiAKIAkgAygCACAKIAkQ3yEiCxs2AgAgBigCACEJIAgoAgAhCiAFIAogCSADKAIAIAkgChDfISIMGzYCACAEIAtBAnRqIQQgACALQQFzQQJ0aiEAIAggDEECdCIJayEIIAkgBmpBfGohBiAHQX9qIQcgBUF8aiEFIAJBBGohAgwACwsL1AIBBX8gACgCCCIBIAAoAgwQqyMgACgCBCABEPUsIAAoAhwhAiAAKAIYIgMhAQJAA0AgAkUNAQJAAkAgASgCAEGAgICAeEYNACABEOcqIAFBJGoQ3x4MAQsgAUEEahDnKgsgAkF/aiECIAFB8ABqIQEMAAsLIAAoAhQgA0EEQfAAEJwWIAAoAiwhAkEAIQMgACgCKCIEIQECQANAIAJFDQECQAJAIAEoAgBBiYDEAEYNACABQfQAahDwKiABIQUMAQsgBCADQZgBbGpBBGohBQsgBRD6IyADQQFqIQMgAkF/aiECIAFBmAFqIQEMAAsLIAAoAiQgBEEEQZgBEJwWIAAoAjwhAiAAKAI4IgMhAQJAA0AgAkUNASABKAIAIAFBBGooAgAQhy0gAkF/aiECIAFBKGohAQwACwsgACgCNCADQQRBKBCcFiAAKAJEIAAoAkgQ5CwLvwIBBH9BHyECAkAgAUH///8HSw0AIAFBBiABQQh2ZyICa3ZBAXEgAkEBdGtBPmohAgsgAEIANwIQIAAgAjYCHCACQQJ0QdjsngFqIQMCQEEAKAL0754BQQEgAnQiBHENACADIAA2AgAgACADNgIYIAAgADYCDCAAIAA2AghBAEEAKAL0754BIARyNgL0754BDwsCQAJAAkAgAygCACIEKAIEQXhxIAFHDQAgBCECDAELIAFBAEEZIAJBAXZrIAJBH0YbdCEDA0AgBCADQR12QQRxaiIFKAIQIgJFDQIgA0EBdCEDIAIhBCACKAIEQXhxIAFHDQALCyACKAIIIgMgADYCDCACIAA2AgggAEEANgIYIAAgAjYCDCAAIAM2AggPCyAFQRBqIAA2AgAgACAENgIYIAAgADYCDCAAIAA2AggLvgIBCX8jAEHAAGsiAiQAIAEoAgQhAyACIAEoAggiBEEEQQQQlQ8gAigCBCEFAkAgAigCAEEBRg0AIAIoAgghBgJAIAVFDQAgBEECdCEHIAYhCCAFIQkDQCAHRQ0BIAMoAgAhChD6JyEBIAIgChBCIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwAgCCABNgIAIAhBBGohCCAHQXxqIQcgA0EEaiEDIAlBf2oiCQ0ACwsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkHAAGokAA8LIAUgAigCCEG08poBEI4pAAu0AgEIfyMAQTBrIgQkAEEAIQUgBEEANgIsIAMgBEEsahDmDSAEIAI2AiAgBCACNgIYIAQgATYCFCAEQQE6ACggBCADNgIQIAQgBCgCLCIGNgIkIARBJGohByAGQf8BcSEIAkACQANAIAIgBUkNASABIAVqIQkCQAJAIAIgBWsiCkEHSw0AQQAhC0EAIQMDQAJAIAogA0cNACAKIQMMAwsCQCAJIANqLQAAIAhHDQBBASELDAMLIANBAWohAwwACwsgBEEIaiAGIAkgChCzCSAEKAIMIQMgBCgCCCELCyALQQFxRQ0BIAQgAyAFaiIDQQFqIgU2AhwgBUUNACAFIAJLDQBBASEKIAEgA2pBASAHQQEQ6yVFDQAMAgsLQQAhCgsgACADNgIEIAAgCjYCACAEQTBqJAAL0AIBBH8gACgCACIBQcAAahDUFCABQYABaigCACEAAkAgASgChAEiAkUNAANAAkACQCAAKAIAQQVGDQAgABChCQwBCyAAQQRqKAIAIgMQkgEgA0HAAEEIELMWCyAAQdgAaiEAIAJBf2oiAg0ACyABQYABaigCACEACyABKAJ8IAAQoi0CQCABKAJ4IgRFDQAgBEEEaigCACEAAkAgBCgCCCICRQ0AA0AgACgCACIDELQCIANB4ABBCBCzFiAAQQRqIQAgAkF/aiICDQALIARBBGooAgAhAAsgBCgCACAAEJ8tIARBFEEEELMWCyABQZQBaigCACEAAkAgASgCmAEiAkUNAANAIAAQ6gwgAEEoaiEAIAJBf2oiAg0ACyABQZQBaigCACEACyABKAKQASAAEKEtAkAgAS0APEEGRg0AIAFBEGoQ1BQLIAFBoAFBCBCzFgvVAgECfwJAAkACQAJAAkACQCAAKAIAIgJBe2oiA0EEIANBBkkbDgYFAAECAwQFCwJAIAAoAghBA0cNACAAKAIMIAEQggMLIAAoAiggARCCAw8LIAAoAiggARCCAw8LAkAgACgCCEEDRw0AIAAoAgwgARCCAwsgACgCKEGAgICAeEYNAiAAKAIwIgNFDQIgACgCLCEAIANBMGwhAwNAIAAgARClBCAAQTBqIQAgA0FQaiIDDQAMAwsLIABBIGohAwJAIAJBA0cNACAAKAIEIAEQggMLAkAgAygCAEEHRg0AIAMgARCkDgsgACgCaCABEKQOIAAoAkhBgICAgHhGDQEgACgCUCIDRQ0BIAAoAkwhACADQTBsIQMDQCAAIAEQpQQgAEEwaiEAIANBUGoiAw0ADAILCwJAIAAoAghBA0cNACAAKAIMIAEQggMLIAAoAiggARCeDQsL1QIBAn8CQAJAAkACQAJAAkAgACgCACICQXtqIgNBBCADQQZJGw4GBQABAgMEBQsCQCAAKAIIQQNHDQAgASAAKAIMENEBCyABIAAoAigQ0QEPCyABIAAoAigQ0QEPCwJAIAAoAghBA0cNACABIAAoAgwQ0QELIAAoAihBgICAgHhGDQIgACgCMCIDRQ0CIAAoAiwhACADQTBsIQMDQCAAIAEQpwQgAEEwaiEAIANBUGoiAw0ADAMLCyAAQSBqIQMCQCACQQNHDQAgASAAKAIEENEBCwJAIAMoAgBBB0YNACADIAEQpQ4LIAAoAmggARClDiAAKAJIQYCAgIB4Rg0BIAAoAlAiA0UNASAAKAJMIQAgA0EwbCEDA0AgACABEKcEIABBMGohACADQVBqIgMNAAwCCwsCQCAAKAIIQQNHDQAgASAAKAIMENEBCyAAKAIoIAEQnw0LC8sCAQR/IwBBMGsiAiQAAkACQAJAIAEQyS8NACACQRxqIAEQ6gkCQCACKAIcQYCAgIB4Rg0AIAJBEGpBCGogAkEcakEIaigCADYCACACIAIpAhw3AxAgAkEIaiACQRBqQZTwhAEQohQCQAJAIAIoAgwiA0UNACACKAIIIgQgAxCAEiEFIAAgAzYCCCAAIAQ2AgRBASEDDAELQQAhAxC5GiEFCyAAIAU2AhggACADNgIADAILIAAgARCgCTYCGCAAQQI2AgAgAEEUaiABQRBqKAIANgIAIABBDGogAUEIaikCADcCACAAIAEpAgA3AgQMAgsgAkEgahDJIyACQQE2AhwgACACQRxqEKAJNgIYIABBAjYCACAAQRRqIAJBLGooAgA2AgAgAEEMaiACQSRqKQIANwIAIAAgAikCHDcCBAsgARDQJAsgAkEwaiQAC7ECAQV/AkAgACgCCCICRQ0AIAAoAgQhA0EAIQQgAS0AAEEBcSEFAkACQANAIARBAWohBiADIAUQswpFDQEgA0E4aiEDIAYhBCACIAZHDQALQQAhBQwBCyADEPEFAkAgBiACRw0AQQEhBQwBCyADQThqIQMgBEF/cyACaiEEQQEhBQNAAkACQCADIAEtAAAQswoNACADEPEFIAVBAWohBQwBCyADIAVBSGxqIgYgAykDADcDACAGQTBqIANBMGopAwA3AwAgBkEoaiADQShqKQMANwMAIAZBIGogA0EgaikDADcDACAGQRhqIANBGGopAwA3AwAgBkEQaiADQRBqKQMANwMAIAZBCGogA0EIaikDADcDAAsgA0E4aiEDIARBf2oiBA0ACwsgACACIAVrNgIICwvMAgIIfwJ+IAAoAhAhAyAAKAIMIQQgACgCCCEFAkACQCAAKQMAIgtCA4NCAFINACALpyIGIAYoAgAiBkEBajYCACAGQX9MDQELIAAtABQhBgJAIAFBFGooAgAgABCrCA0AIAAoAhAhByAAKAIMIQEgACgCCCEIAkAgACkDACIMQgODQgBSDQAgDKciCSAJKAIAIglBAWo2AgAgCUF/TA0CCyAALQAUIQoCQCACKAIIIgkgAigCAEcNACACQdz2mwEQ5B0LIAIoAgQgCUHQAGxqIgBBADoASCAAIAE2AkQgACAINgJAIAAgBjoAPCAAIAM2AjggACAENgI0IAAgBTYCMCAAIAs3AyggAEIANwMgIAAgCjoAHCAAIAc2AhggACABNgIUIAAgCDYCECAAIAw3AwggAEIANwMAIAIgCUEBajYCCA8LIAsQxiEPCwALwAICBX8CfiMAQSBrIgIkAAJAAkACQCABDgIAAgELIABBADYCCAwBCwJAAkAgAWlBAUYNACAAKAIIQQJ0IQMgAa0hByAAKAIEIQFCACEIA0AgA0UNAiABIAE1AgAgB34gCHwiCD4CACADQXxqIQMgAUEEaiEBIAhCIIghCAwACwsgACgCBCEDIAAoAggiBCEFAkAgACgCACIGQYCAgIB4Rw0AIAMoAgghBQsCQAJAIAVFDQAgAiAENgIcIAIgAzYCGCACIAY2AhQgAkEIaiACQRRqQQAgAWgQpgcMAQsgAiAENgIcIAIgAzYCGCACIAY2AhQgAkEIaiACQRRqEMsdC0EAQQQQ9CwgAEEIaiACQQhqQQhqKAIANgIAIAAgAikCCDcCAAwBCyAIUA0AIAAgCKdB6J2CARClIQsgAkEgaiQAC8UCAQR/IwBBMGsiBiQAQQAhBwJAIAMoAhAiCCADKAIUIglLDQAgAUEEaiEHAkACQAJAIAMoAgBBf2pBAkkNACAGQQxqIAcgAygCCCADKAIMIAggCRDuBSAGKAIMQQFHDQEgBigCECIDIAYoAhQiAU0NAiAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakHUpIMBEOkjAAsgBkEMaiAHIAMoAgggAygCDCAIIAMQuxYgBigCDEEBRw0AIAYoAhAiAyAGKAIUIgFNDQEgBkEANgIoIAZBATYCHCAGQfyUhAE2AhggBkIENwIgIAZBGGpB1KSDARDpIwALQQAhBwwBC0EBIQcgBUUNACAEIANBAWo2AgAgBUEBRg0AQQEhByAEIAFBAWo2AgQLIABBADYCBCAAIAc2AgAgBkEwaiQAC8UCAQR/IwBBMGsiBiQAQQAhBwJAIAMoAhAiCCADKAIUIglLDQAgAUEEaiEHAkACQAJAIAMoAgBBf2pBAkkNACAGQQxqIAcgAygCCCADKAIMIAggCRCLDCAGKAIMQQFHDQEgBigCECIDIAYoAhQiAU0NAiAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakHUpIMBEOkjAAsgBkEMaiAHIAMoAgggAygCDCAIIAkQjAwgBigCDEEBRw0AIAYoAhAiAyAGKAIUIgFNDQEgBkEANgIoIAZBATYCHCAGQfyUhAE2AhggBkIENwIgIAZBGGpB1KSDARDpIwALQQAhBwwBC0EBIQcgBUUNACAEIANBAWo2AgAgBUEBRg0AQQEhByAEIAFBAWo2AgQLIABBADYCBCAAIAc2AgAgBkEwaiQAC78CAQZ/IAAoAgwhAQJAAkAgACgCAA0AQQAhAgJAAkAgAQ0AQQAhAUEAIQMMAQtBASEDAkAgACgCCCgCACIEQYABTw0AQQEhBQwBC0ECIQUgBEGAEEkNAEEDQQQgBEGAgARJGyEFCwJAAkAgAQ0ADAELIAAoAgggAUEDdGoiAEF4akUNAEEBIQICQCAAQXxqKAIAIgBBgAFPDQBBASEEDAELQQIhBCAAQYAQSQ0AQQNBBCAAQYCABEkbIQQLQQEhBgwBC0EBIQQgACgCCCABELkhIQZBASEFIAFBAEciAiEDC0E0QQQQpyciAEIANwIUIABBATYCECAAIAQ2AgwgACACNgIIIAAgBTYCBCAAIAM2AgAgAEEAOwAxIAAgBjoAMCAAQRxqQgA3AgAgAEEkakIANwIAIABBLGpBADYCACAAC8sCAgN/AX4CQAJAIAApAzBCAFINACAAKQM4IgRCA4NCAFINASAEpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIABBMGoQkhQLAkAgACgCACIBQQRGDQACQAJAAkACQCABDgQBAgMAAQsgACgCCCEDAkAgACgCDCICRQ0AIAMhAQNAIAEQ6gwgAUEoaiEBIAJBf2oiAg0ACwsgACgCBCADEKEtDwsgAEEIahCCDA8LIAAoAgRFDQEgACgCCCIBEJIBIAFBwABBCBCzFg8LIAAoAgQiAEHAAGoQjg0gAEGUAWooAgAhAQJAIAAoApgBIgJFDQADQCABEOoMIAFBKGohASACQX9qIgINAAsgAEGUAWooAgAhAQsgACgCkAEgARChLQJAIAAtADxBBkYNACAAQRBqENQUCyAAQaABQQgQsxYLC9ECAgd/AX4jAEEgayIBJABB3AAhAkEAIQNBASEEQQEhBQJAA0ACQAJAIAQNACADQQJHDQEMAwsgBEECIANrTw0CIAMgBGohA0EAIQQLIAJBAXQgA0G8gZkBai0AAGohAiAFQQF0IQUgA0EBaiEDDAALC0G8gZkBQQIQlyEhCCABQRhqQbyBmQFBAkEAEIQLIAEoAhwhBCABKAIYIQMgAUEQakG8gZkBQQJBARCECyABQQhqQbyBmQFBAiAEIAEoAhQgAyABKAIQIgZLIgcbIAMgBiAHGyIDEOUIIAEoAgghBCAAQQI2AkAgASgCDCEGIABBvIGZATYCPCAAQQA2AjggAEEpNgIwIAAgBTYCLCAAIAI2AiggAEGAAjsBICAAQYGAgOAFNgIcIABBKDYCGCAAIAM2AhAgACAINwMIIAAgBjYCBCAAIAQ2AgAgAUEgaiQAC8AEAQF+QgAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH/AXFBjX9qDi4AAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLgsQ9h8PC0KxwrnLBw8LQqHCzQMPC0Lxws2b18ycuvMADwtC4cLNm9fMnDoPC0LRws3L5+0YDwtC4cSlu5bNmzoPC0LxxL37xq3ZsO4ADwsQ9x8PC0LxyJWbxq2YueUADwtCwcq5q9cNDwtCwczJ+9YNDwtCsc6VowcPC0LhzrH7pqyYNg8LEPgfDwsQ+R8PCxD6Hw8LQqHSzQMPC0LR1pXL980ZDwsQ+x8PC0LR3JWz18wcDwtC4dzV66asmTkPC0Lh3onT1uyYOg8LQqHemQMPC0Kx3tWjBw8LEPwfDwtC8eCFm7at2LPlAA8LQvHgycvmrpi65QAPCxD9Hw8LQuHg1ZPGrdoxDwsQ/h8PC0Lx5JWL166aueUADwtCseaVowcPC0Lh5tGLxq7aMQ8LQuHm0ZOXzdszDwtC4ebl66bsmzYPC0LB6OWD1wwPCxD/Hw8LQuHqucuWrt0yDwtC8eq52+bt27vuAA8LQtHqzcvm7RkPCxCAIA8LQtHSubPWzBwPCxCBIA8LQsHalaOXDA8LQuHohZP3rJk6IQELIAELyQIBAn8CQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEEBRw0DIAAoAgggARClAQ8LIAAoAgQgARClAQ8LIAAoAgQiAkHAAGoQrSgCQCACQYQBaigCACIDRQ0AIAJBgAFqKAIAIQAgA0HYAGwhAwNAAkACQAJAIAAoAgBBfGoOAgIAAQsgAEEEaigCACABEKUBDAELIAEgABDBBwsgAEHYAGohACADQah/aiIDDQALCwJAIAIoAngiAEUNACAAIAEQxB8LAkAgAkGYAWooAgAiA0UNACACQZQBaigCACEAIANBKGwhAwNAIAAgARCkCSAAQShqIQAgA0FYaiIDDQALCyACLQA8QQZGDQEgAkEQahCtKA8LIAAoAgwiA0UNACAAKAIIIQAgA0EobCEDA0AgACABEK0HIABBKGohACADQVhqIgMNAAsLC70CAgF/AX4jAEEgayIDJAAgA0EYaiACIAEoAghBABCLAgJAAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EANgIMIANBGGogAiADQQxqQcyBnAFBARCyDQJAIAMtABhBBEYNACADKQMYIgRC/wGDQgRRDQAgACAENwIADAELIANBGGogAUEEaiACENAtAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiACIANBDGpBy4GcAUEBELINAkAgAy0AGEEERg0AIAMpAxgiBEL/AYNCBFENACAAIAQ3AgAMAQsgA0EYaiABIAIQzi0CQCADLQAYQQRGDQAgAykDGCIEQv8Bg0IEUQ0AIAAgBDcCAAwBCyAAQQQ6AAALIANBIGokAAvNAgELfyMAQTBrIgIkACABQbQDaiEDIAEoAsgDIQQgASgCxAMhBSABKAKQBiEGIAEoAowGIQdBACEIQQAhCQJAAkADQCACQRBqIAMgByAJIAoQohsgAigCFCEKIAIoAhAhCSACQQhqIAMgBiAIIAsQohsgAigCCCEIIAlBAXFFDQEgCEEBcUUNAiACKAIMIQsgBSAEIApB8I6AARDAJSgAASEMIAUgBCALQYCPgAEQwCUgDDYAAQwACwsgCEEBcQ0AIAJBGGogAyAHIAYQsgkCQAJAIAIoAhgiCEEDRg0AIAAgAikCHDcCBCAAQRRqIAJBGGpBFGooAgA2AgAgAEEMaiACQRhqQQxqKQIANwIADAELIAEoArgDIAEoArwDIAZB4I6AARC/JUEANgIMCyAAIAg2AgAgAkEwaiQADwtBoKacAUEoQZCPgAEQ0h4AC5ACAQp/IAIgAUECdEF8aiIDaiEEIAAgA2ohBSAAIAFBAXYiBkECdGoiB0F8aiEIAkADQAJAIAYNACAIQQRqIQMCQCABQQFxRQ0AIAIgACAHIAAgA0kiCRsoAgA2AgAgByAAIANPQQJ0aiEHIAAgCUECdGohAAsCQCAAIANHDQAgByAFQQRqRg0DCxDhIQALIAIgBygCACIKIAAoAgAiCyAKIAtJIgwbNgIAIAQgBSgCACIDIAgoAgAiCSADIAlLGzYCACAGQX9qIQYgBEF8aiEEIAJBBGohAiAIQXxBACADIAlJG2ohCCAFQXxBACADIAlPG2ohBSAAIAogC09BAnRqIQAgByAMQQJ0aiEHDAALCwu+AgEFfyAAKAKgDSgCVCEBQQAhAkEAIQMCQCAALQCsCkECRg0AIAAoAqAKIAAoAqQKIgQoAghBf2pBeHFqQQhqIAQoAhgRBAAhAwsCQCAAKAKoDSIERQ0AIAQoAtACQRRsIAQoAtwCQQJ0aiAEKALEAiICKAIQQQN0aiACKAIcQQV0aiACKAIoQQxsaiACKAIsaiAEKALAAmpBiANqIQILQQAhBQJAIAAoAuQKQQNGDQAgACgChAtBAnQgACgC+ApBA3RqIQULAkAgAC0ArA1BAUcNAEGgppwBQShBiOuDARDSHgALIAFBNGwgA2ogACgCpA0iACgC0AJBFGxqIAAoAtwCQQJ0aiAAKALEAiIEKAIQQQN0aiAEKAIcQQV0aiAEKAIoQQxsaiAEKAIsaiAAKALAAmogAmogBWpBvANqC80CAQR/IwBBIGsiAiQAAkACQAJAAkACQCAAKAIADQAgACgCECIADQEMAwsgAkEQaiAAEKwLAkAgAigCECIDDQAgAi0AFCEBAkAgACgCECIERQ0AQQEhAyAEQczjlwFBvOOXASABQQFxIgUbQRlBECAFGxCCBg0FCyAAIAE6AARBACEDIABBADYCAAwECyACQRBqIAMgAigCFCIEEMUHAkACQCACKAIQQQFHDQAgACgCECIARQ0EIAIpAxhBASAAENUHDQEMAwsgACgCECIARQ0DIABB0KucAUECEIIGDQAgACADIAQQggZFDQILQQEhAwwDCyAAQaeZnAFBARCCBiEDDAILIAAtAApBgAFxDQAgAkEIaiABEJYbAkAgAigCCCIDRQ0AIAAgAyACKAIMEIIGIQMMAgtBxOSXARDSLAALQQAhAwsgAkEgaiQAIAMLsQIBA38gACgCCCECAkACQCABQYABTw0AQQEhAwwBCwJAIAFBgBBPDQBBAiEDDAELQQNBBCABQYCABEkbIQMLIAIhBAJAIAMgACgCACACa00NACAAIAIgAxDkDCAAKAIIIQQLIAAoAgQgBGohBAJAAkACQCABQYABSQ0AIAFBgBBJDQECQCABQYCABEkNACAEIAFBP3FBgAFyOgADIAQgAUESdkHwAXI6AAAgBCABQQZ2QT9xQYABcjoAAiAEIAFBDHZBP3FBgAFyOgABDAMLIAQgAUE/cUGAAXI6AAIgBCABQQx2QeABcjoAACAEIAFBBnZBP3FBgAFyOgABDAILIAQgAToAAAwBCyAEIAFBP3FBgAFyOgABIAQgAUEGdkHAAXI6AAALIAAgAyACajYCCEEAC8ACAgl/An4CQCABRQ0AQQAhAgNAAkAgACACQQV0aiIDKAIEIgRFDQACQCADKAIMIgVFDQAgAygCACIGQQhqIQcgBikDAEJ/hUKAgYKEiJCgwIB/gyELA0ACQCALQgBSDQADQCAGQaB/aiEGIAcpAwAhCyAHQQhqIgghByALQoCBgoSIkKDAgH+DIgtCgIGChIiQoMCAf1ENAAsgC0KAgYKEiJCgwIB/hSELIAghBwsgBkEAIAt6p0EDdmtBDGxqIglBdGoiCigCACIIIAgoAgAiCEF/ajYCACALQn98IQwCQCAIQQFHDQAgCigCACAJQXhqKAIAEIEfCyAMIAuDIQsgBUF/aiIFDQALCyAEIARBDGxBE2pBeHEiB2pBCWoiBkUNACADKAIAIAdrIAZBCBCzFgsgAkEBaiICIAFHDQALCwu/AgEEfyMAQTBrIgUkACAFIAQ2AgwgBSACNgIIAkACQAJAIAJB////P3EiBiABKAJ8IgJPDQAgBkF/IAAoAoQFdEF/cyIHcQ0AIARB////P3EiCCACTw0BIAggB3ENAQJAAkAgA0EBcUUNACADQRB2IQMMAQsgACADQQh2Qf8BcWotAOACIQMLIAMgBmoiBiACTw0CIAEoAnggBkECdGogBDYCACAFQTBqJAAPCyAFQQE2AhQgBUGQh4QBNgIQIAVCATcCHCAFQd0BNgIsIAUgBUEoajYCGCAFIAVBCGo2AiggBUEQakGYh4QBEOkjAAsgBUEBNgIUIAVBvIeEATYCECAFQgE3AhwgBUHdATYCLCAFIAVBKGo2AhggBSAFQQxqNgIoIAVBEGpBxIeEARDpIwALIAYgAkHUh4QBEJEVAAvgAgIDfwJ+IwBBIGsiAiQAAkACQAJAIAEoAgAiAy0AZUUNACABEPsPQTBJDQEgARD7D0E4Tw0BIAMpAlQhBSADKAJQIQQDQCABEI0LRQ0DIAEQ+w9BMEkNAyABEPsPQTdLDQMgAygCUCAEa0EDSQ0ADAMLC0Hsw4QBQSVBlMSEARDSHgALQaTEhAFBOkHgxIQBENIeAAsgAykCVCEGIAJBCGogASgCBCABKAIIIAQgAygCUCIBQfDEhAEQ4BEgAkEUaiACKAIIIAIoAgxBCBCfCAJAAkAgAi0AFEEBRg0AIAIoAhgiA0GAsANzQYCAvH9qQf+PvH9NDQEgAEEDOgAcIAAgBjcCFCAAIAE2AhAgACAFNwIIIAAgBDYCBCAAIAM2AgAgAkEgaiQADwsgAiACLQAVOgAfQYDFhAFBEiACQR9qQaC4hAFBlMWEARDqEgALQaTFhAFBFEG4xYQBELIXAAvrAgEDfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAQQAgACgCACIDQXlqIgQgBCADSxsOCQABAgMEBQYHCAALIAIgADYCDCABQd+7nAFBBCACQQxqQfcAEP8LIQAMCAsgAiAAQQRqNgIMIAFBvOKHAUEHIAJBDGpBPxD/CyEADAcLIAIgAEEEajYCDCABQcPihwFBDCACQQxqQfcBEP8LIQAMBgsgAiAAQQRqNgIMIAFBz+KHAUEKIAJBDGpB+AEQ/wshAAwFCyABKAIAQdnihwFBCiABKAIEKAIMEQsAIQAMBAsgAiAAQQRqNgIMIAFB4+KHAUEFQejihwFBCSACQQxqQfkBELkOIQAMAwsgASgCAEHx4ocBQQYgASgCBCgCDBELACEADAILIAEoAgBB9+KHAUELIAEoAgQoAgwRCwAhAAwBCyABKAIAQYLjhwFBESABKAIEKAIMEQsAIQALIAJBEGokACAAC60CAgN/AX4CQAJAAkACQAJAAkACQAJAAkAgAg4CAAECCyAAQQA6AAFBASEBDAcLQQEhAyABLQAAQVVqDgMEAQQBCwJAIAEtAABBK0cNACACQX9qIQMgAUEBaiEBIAJBCkkNAQwCCyACIQMgAkEJTw0BC0EAIQIDQCADRQ0CIAEtAABBUGoiBEEJSw0DIAFBAWohASADQX9qIQMgBCACQQpsaiECDAALC0EAIQIDQCADRQ0BIAEtAABBUGoiBEEJSw0CIAKtQgp+IgZCIIinQQBHDQMgAUEBaiEBIANBf2ohAyAEIAanIgVqIgIgBU8NAAsgAEECOgABQQEhAQwDCyAAIAI2AgRBACEBDAILQQEhASAAQQE6AAEMAQsgAEECOgABQQEhAQsgACABOgAAC8sCAQZ/AkAgACgCCCIBRQ0AIAAoAgQhAkEAIQMDQAJAAkACQAJAAkAgAiADQShsaiIEKAIADgQBAgMAAQsgBEEEahDnESAEKAIEIARBCGooAgAQoy0gBCgCGCIARQ0DIAAoAgAiBRC0AiAFQeAAQQgQsxYgAEEMQQQQsxYMAwsgBEEIahDAFgwCCyAEQQhqIgYoAgAhAAJAIAQoAgwiBUUNAANAAkAgACgCAEEHRg0AIAAQrAcLIABBKGohACAFQX9qIgUNAAsgBigCACEACyAEKAIEIAAQoS0gBCgCGCIARQ0BIAAoAgAiBRC0AiAFQeAAQQgQsxYgAEEMQQQQsxYMAQsgBCgCBCIAEKwHIABBKEEIELMWIAQoAhgiAEUNACAAKAIAIgUQtAIgBUHgAEEIELMWIABBDEEEELMWCyADQQFqIgMgAUcNAAsLC8ICAQR/IwBBMGsiAiQAIAJBCGogARCUAiACKAIMIQMCQAJAAkAgAigCCEEBcUUNACACIAM2AhQCQAJAAkAgAS0A4AEiBEHgAEYNACAEQaIBRw0BIAEQmiwhAyACQRRqELcHDAQLIAEtAIgBQcAAcQ0BCyAEQXNqQf8BcUEKSQ0AIARB4QBGDQAgBEFRakH/AXFBDU8NAgsgASgC3AEhBCABKALYASEFIAJBi4GAgHg2AhggASAFIAQgAkEYahDeIyADKAIEIQQgAygCACEFAkBBCEHAABD/KyIDRQ0AIAMgBDYCCCADIAU2AgQgA0ExNgIAIAJBFGoQtwcMAQsAC0EAIQQgAygCAEEeRg0BIAIgASADQQAQ4Q0gAigCBCEDIAIoAgAhBAwBC0EBIQQLIAAgBDYCACAAIAM2AgQgAkEwaiQAC+cCAQZ/IwBBEGsiBCQAIAEoAgQiBSABKAIIIgYgA0G0iIABEL8lQQhqIQcgASgCLCEIIAEoAighCQJAAkADQAJAIAkgCCAHKAIAIgdBxIiAARDBJSgCBA0AIAUgBiACQdSIgAEQvyVBCGohBSABQSRqIQYDQAJAIAUoAgAiBQ0AIABBAzYCAAwFCyAEIAgQpCMgBCgCAA0DIAQoAgQhAiAGIAkgCCAFQeSIgAEQwSUoAgBB9IiAARD6HgJAAkAgB0UNACABKAIoIgkgASgCLCIIIAdBhImAARDBJSACNgIEDAELIAEoAgQgASgCCCADQZSJgAEQvyUgAjYCCCABKAIsIQggASgCKCEJCyAJIAggBUGkiYABEMElQQRqIQUgAiEHDAALCyAJIAggB0G0iYABEMElQQRqIQcMAAsLIAAgBCkDCDcDECAAQv7///8HNwMIIAAgAjYCBCAAQQA2AgALIARBEGokAAulAgEFfwJAAkACQAJAIAJBA2pBfHEgAmsiBEUNAEEAIQUgAUH/AXEhBkEBIQcDQCACIAVqLQAAIAZGDQQgBCAFQQFqIgVHDQALIAQgA0F4aiIISw0CDAELIANBeGohCEEAIQQLIAFB/wFxQYGChAhsIQUDQEGAgoQIIAIgBGoiBigCACAFcyIHayAHckGAgoQIIAZBBGooAgAgBXMiBmsgBnJxQYCBgoR4cUGAgYKEeEcNASAEQQhqIgQgCE0NAAsLAkAgAyAERg0AIAMgBGshByACIARqIQJBACEFIAFB/wFxIQYCQANAIAIgBWotAAAgBkYNASAHIAVBAWoiBUYNAgwACwsgBSAEaiEFQQEhBwwBC0EAIQcLIAAgBTYCBCAAIAc2AgAL+wIBAX8jAEHQAGsiASQAIABBADoAHiAAQfoBNgIYIABBADsBHCAAQYKEiBA2ABEgAEIANwJUIABCgICAgMAANwJMIABCBDcCRCAAQgA3AjwgAEKAgICAwAA3AjQgAEEANgIkIABBCjoAFyAAQQE6ABAgAEEKOgBeIABBADYCLCAAQRVqQYIEOwAAIABB3ABqQQA7AQAgAUIBNwJIIAFCADcCQCABQgQ3AjggAUIANwIwIAFCBDcCECABQgA3AgggAUKAgICAwAA3AgAgAUIENwIoIAFCADcCICABQoCAgIDAADcCGCABEI8KAkBB0ABFDQAgAEGIAWogAUHQAPwKAAALIABB6Ac2AugBIABBADsB7AEgAEIENwLgASAAQgA3AtgBIABCADcCgAEgAEKAgICAwAA3AnggAEEAOwF0IABBkM4ANgJwIABCBDcCaCAAQgA3AmAgAEEANgIgIABBgoSIGDYBCiAAQQA6AAggAEECNgIAIAFB0ABqJAAL2QIBAn8CQAJAIAAoAgAiAkELRw0AAkACQCAAKAIEDgMAAQMACyAAKAIQIgNFDQIgACgCDCECIANBKGwhAwNAAkAgAigCAEEHRg0AIAIgARCiDgsgAkEoaiECIANBWGoiAw0ADAMLCyAAKAIQIgNFDQEgACgCDCECIANBOGwhAwNAIAIgARC9HiACQThqIQIgA0FIaiIDDQAMAgsLAkACQAJAAkACQAJAAkACQAJAIAIOCwkAAQIDBAUGBwgJCQsgASAAKAIoEJ4DIAAoAghBAkkNCCAAQQxqIAEQ6S4MCAsgACgCCEEBRw0HIAEgACgCDBCeAwwHCyABIAAoAgQQngMMBgsgACgCBCABEOwTDAULIAEgACgCBBCeAwwECyABIAAoAgQQngMMAwsgASAAKAIEEJ4DDAILIAEgACgCBBCeAwwBCyABIAAoAgQQngMLIAEgACgCOBCeAwvhAgEEfyAAKAIIIQEgACgCBCECA0ACQAJAIAFFDQAgAhCUKiACQRRqKAIAIgBFDQEgAEEIahC7IyAAQSBqELYlIABBLGoQlCogAEE4ahC2JQJAIAAoAkRBgICAgHhGDQAgAEHEAGoQtgkgACgCRCAAQcgAaigCABC7LQsCQCAAKAJQQYCAgIB4Rg0AIABB0ABqEKArCyAAQdwAahCUKiAAQegAahCUKgJAIAAoAnQiA0GAgICAeEYNACADIABB+ABqKAIAELwtCwJAIAAoAoABIgNBgICAgHhGDQAgAyAAQYQBaigCABCuLQsCQCAAKAKMASIDQYCAgIB4Rg0AIAAoApABIgQgACgClAEQtCUgAyAEEL0tCwJAIAAoApgBIgNBgICAgHhGDQAgACgCnAEiBCAAKAKgARCOECADIAQQvS0LIABB6AFBCBCzFgwBCw8LIAFBf2ohASACQRhqIQIMAAsL8wIBBn8jAEEgayIBJABBIBDsJyICQgA3AhQgAkKAgICAwAA3AgwgAkIBNwIEIAJBHGpBADoAAAJAAkACQEEAKAKg4J4BDQBBACgCqOCeASEDQQBBADYCqOCeASADRQ0BIAMRAQAhBAJAQQAoAqDgngEiAw0AIANBACgCpOCeARDuK0EAIAQ2AqTgngFBAEEBNgKg4J4BCyADDQILQQAoAqTgngEQMCIDEDkiBBAgIQUgBBDcKiADENwqQYABEDohBCACQQI2AgBBBBDsJyIDIAI2AgAgAxC3LyEGIABB8IueATYCCCAAIAM2AgQgACAGNgIMIAAgBUEBRjoAFCAAIAQ2AhAgACACNgIAIAFBIGokAA8LIAFBADYCGCABQQE2AgwgAUGwjJ4BNgIIIAFCBDcCECABQQhqQZiNngEQ6SMACyAEENwqIAFBADYCGCABQQE2AgwgAUG4jZ4BNgIIIAFCBDcCECABQQhqQcCNngEQ6SMAC74CAQR/IwBBMGsiBiQAQQAhBwJAIAMoAhAiCCADKAIUIglLDQACQAJAAkAgAygCAEF/akECSQ0AIAZBDGogASADKAIIIAMoAgwgCCAJEIMOIAYoAgxBAUcNASAGKAIQIgMgBigCFCIBTQ0CIAZBADYCKCAGQQE2AhwgBkH8lIQBNgIYIAZCBDcCICAGQRhqQdSkgwEQ6SMACyAGQQxqIAEgAygCCCADKAIMIAggCRChFCAGKAIMQQFHDQAgBigCECIDIAYoAhQiAU0NASAGQQA2AiggBkEBNgIcIAZB/JSEATYCGCAGQgQ3AiAgBkEYakHUpIMBEOkjAAtBACEHDAELQQEhByAFRQ0AIAQgA0EBajYCACAFQQFGDQBBASEHIAQgAUEBajYCBAsgAEEANgIEIAAgBzYCACAGQTBqJAALvgIBBH8jAEEwayIGJABBACEHAkAgAygCECIIIAMoAhQiCUsNAAJAAkACQCADKAIAQX9qQQJJDQAgBkEMaiABIAMoAgggAygCDCAIIAkQzAggBigCDEEBRw0BIAYoAhAiAyAGKAIUIgFNDQIgBkEANgIoIAZBATYCHCAGQfyUhAE2AhggBkIENwIgIAZBGGpB1KSDARDpIwALIAZBDGogASADKAIIIAMoAgwgCCAJEP0JIAYoAgxBAUcNACAGKAIQIgMgBigCFCIBTQ0BIAZBADYCKCAGQQE2AhwgBkH8lIQBNgIYIAZCBDcCICAGQRhqQdSkgwEQ6SMAC0EAIQcMAQtBASEHIAVFDQAgBCADQQFqNgIAIAVBAUYNAEEBIQcgBCABQQFqNgIECyAAQQA2AgQgACAHNgIAIAZBMGokAAuwAgEEfyMAQSBrIgMkAAJAAkACQAJAIAAoAggiBCABSQ0AIAAoAighBSAAKAIEIQYgAyACNgIEIAQgAUYNASAEIAFrIQACQAJAIAYgAUECdGoiBC0AACIBQf8BRg0AIAEgAUECdmogAUEDcUEAR2pBAmohAQwBCyAFQQJqIQELIAEgAE8NAgJAAkAgBCABQQJ0aigCACIGQX9MDQACQCACIAFqQQFqIgEgAE8NACAEIAFBAnRqKAIAIQEMAgsgASAAQay1gwEQkRUACyACDQQgBkH/////B3EhAQsgA0EgaiQAIAEPCyABIARB9L2DARDgLAALQQBBAEHMtYMBEJEVAAsgASAAQZy1gwEQkRUACyADQQA2AghBAEH485gBIANBBGogA0EIakG8tYMBEJUhAAvGAgINfwF+IwBB4ABrIgEkABCBKCECIAAoAhghAyAAKAIUIQQgACgCECEFIAAtACghBiAAKAIEIQcgACgCACEIAkACQCAAKQMIIg5CA4NCAFINACAOpyIJIAkoAgAiCUEBajYCACAJQX9MDQELIAAtABwhCgJAAkAgACgCICILDQBBACEJDAELEIAoIQkgCygCDCEMIAsoAhAhDSABIAsQ4QYgCUEQaiANNgIAIAkgASkCADcCACABIAw2AgwgCUEIaiABQQhqKQIANwIACyAAKAIkIQsQ/CchACABIAsQdgJAQeAARQ0AIAAgAUHgAPwKAAALIAIgBjoAKCACIAA2AiQgAiAJNgIgIAIgCjoAHCACIAM2AhggAiAENgIUIAIgBTYCECACIA43AwggAiAHNgIEIAIgCDYCACABQeAAaiQAIAIPCwALsgICBX8DfiMAQSBrIgUkAAJAAkACQAJAAkAgAyAERg0AIAMgAk8NASAEIAJPDQIgASADQRRsaiICKQIAIQogASAEQRRsaiIBQRBqIgYoAgAhByABQQhqIggpAgAhCyACIAEpAgA3AgAgAkEIaiIJKQIAIQwgCSALNwIAIAJBEGoiAigCACEJIAIgBzYCACABIAo3AgAgCCAMNwIAIAYgCTYCACADIAAoAgwiAnYiASAAKAIIIgNPDQMgBCACdiIEIANPDQQgACgCBCIDIAFBAnRqIgAoAgAhAiAAIAMgBEECdGoiAygCADYCACADIAI2AgALIAVBIGokAA8LIAMgAkH4goABEJEVAAsgBCACQfiCgAEQkRUACyABIANB4KyAARCRFQALIAQgA0HgrIABEJEVAAvYAgEEfyMAQSBrIgUkAEEBIQYCQCAALQAEDQAgAC0ABSEHAkAgACgCACIILQAKQYABcQ0AQQEhBiAIKAIAQeKemgFBvOSXASAHQQFxIgcbQQJBAyAHGyAIKAIEKAIMEQsADQEgCCgCACABIAIgCCgCBCgCDBELAA0BIAgoAgBB+MiYAUECIAgoAgQoAgwRCwANASADIAggBBEHACEGDAELQQEhBgJAIAdBAXENACAIKAIAQYiZgQFBAyAIKAIEKAIMEQsADQELQQEhBiAFQQE6AA8gBUHwmIEBNgIUIAUgCCkCADcCACAFIAgpAgg3AhggBSAFQQ9qNgIIIAUgBTYCECAFIAEgAhC+BQ0AIAVB+MiYAUECEL4FDQAgAyAFQRBqIAQRBwANACAFKAIQQYuZgQFBAiAFKAIUKAIMEQsAIQYLIABBAToABSAAIAY6AAQgBUEgaiQAIAALvQIBC38jAEEgayIBJAACQAJAAkAgAC0AEA4EAQIAAQELIAFBATYCCCABQbi9gAE2AgQgAUIANwIQIAEgAUEcajYCDCABQQRqQZy+gAEQ6SMACyAAKAIIIQIgACgCBCEDQQAhBAJAA0AgBCACRg0BIAMgBEEMbGoiBUEEaiIGKAIAQSRqIQcgBUEIaigCACEIAkADQCAIRQ0BAkAgB0F8aigCACIJQYCAgIB4Rg0AIAkgBygCABDPLAsCQCAHQWxqKAIAIglBAkYNACAHQXRqKAIAIQogB0FwaigCACELAkAgCQ0AIAsgChDPLAwBCyALIApBAkECEJMVCyAIQX9qIQggB0EsaiEHDAALCyAFKAIAIAYoAgBBBEEsEJMVIARBAWohBAwACwsgACgCACADQQRBDBCTFQsgAUEgaiQAC9QCAQF/IwBBEGsiAiQAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4IAAECAwQFBgcACyACIABBCGo2AgwgAUGqnpsBQQUgAkEMakHDAxD/CyEADAcLIAIgAEEIajYCDCABQa+emwFBAiACQQxqQcQDEP8LIQAMBgsgAiAAQQRqNgIMIAFBsZ6bAUEDIAJBDGpBxQMQ/wshAAwFCyACIABBBGo2AgwgAUG0npsBQQUgAkEMakHGAxD/CyEADAQLIAIgAEEEajYCDCABQbmemwFBCyACQQxqQccDEP8LIQAMAwsgAiAAQQRqNgIMIAFBxJ6bAUELIAJBDGpByAMQ/wshAAwCCyACIABBBGo2AgwgAUHPnpsBQQYgAkEMakHJAxD/CyEADAELIAIgAEEEajYCDCABQdWemwFBCCACQQxqQcoDEP8LIQALIAJBEGokACAAC74CAgJ/AX4jAEHAAGsiASQAAkACQAJAAkAgAC0ALEF9aiICQQEgAkH/AXFBA0kbQf8BcQ4DAAECAAsgACkDACIDQgODQgBSDQIgA6ciACAAKAIAIgBBAWo2AgAgAEF/Sg0CAAsgAEEYahCQDSEDIAFBzAQ2AjQgASAANgIwIAFBzAQ2AiwgASADNwM4IAFBAjYCFCABQZSbmQE2AhAgAUICNwIcIAEgAUE4ajYCKCABIAFBKGo2AhggAUEEaiABQRBqEIsQIAEpAzgQxiEgAUEEahD4JiEDDAELIAFBAjYCFCABQaSbmQE2AhAgAUICNwIcIAFBzAQ2AjQgAUHMBDYCLCABIAA2AiggASAAQRBqNgIwIAEgAUEoajYCGCABQQRqIAFBEGoQixAgAUEEahD4JiEDCyABQcAAaiQAIAML1AIBAX8jAEEQayICJAACQAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIADggAAQIDBAUGBwALIAIgAEEIajYCDCABQaqemwFBBSACQQxqQeIGEP8LIQAMBwsgAiAAQQhqNgIMIAFBr56bAUECIAJBDGpB4wYQ/wshAAwGCyACIABBBGo2AgwgAUGxnpsBQQMgAkEMakHkBhD/CyEADAULIAIgAEEEajYCDCABQbSemwFBBSACQQxqQeUGEP8LIQAMBAsgAiAAQQRqNgIMIAFBuZ6bAUELIAJBDGpB5gYQ/wshAAwDCyACIABBBGo2AgwgAUHEnpsBQQsgAkEMakHnBhD/CyEADAILIAIgAEEEajYCDCABQc+emwFBBiACQQxqQegGEP8LIQAMAQsgAiAAQQRqNgIMIAFB1Z6bAUEIIAJBDGpB6QYQ/wshAAsgAkEQaiQAIAALxwIBBH8gAUHAAGogABDECgJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBCAJwwDCyAAIAMoAgQQgCcMAgsgAygCBCICQcAAaiAAEMQKIAJBkAFqIAAQ+RIgAi0APEEGRg0BIAAgAkEQahD1CQwBCyADKAIMIgJFDQAgAkEobCEFIAMoAghBBGohAgNAAkACQAJAAkACQCACQXxqKAIADgUEAAECAwQLIAIoAgBBAUcNAyAAIAJBBGooAgAQgCcMAwsgACACKAIAEIAnDAILIAAgAigCABDCCQwBCyACIAAQ7wsLIAJBKGohAiAFQVhqIgUNAAsLIANBKGoiAyAERw0ACwsCQCABLQA8QQZGDQAgACABQRBqEPUJCwvHAgEEfyABQcAAaiAAEKkLAkAgASgCmAEiAkUNACABKAKUASIDIAJBKGxqIQQDQAJAAkACQAJAAkAgAygCAA4FBAABAgMECyADKAIEQQFHDQMgACADKAIIEKcBDAMLIAAgAygCBBCnAQwCCyADKAIEIgJBwABqIAAQqQsgAkGQAWogABD8EiACLQA8QQZGDQEgACACQRBqEPQMDAELIAMoAgwiAkUNACACQShsIQUgAygCCEEEaiECA0ACQAJAAkACQAJAIAJBfGooAgAOBQQAAQIDBAsgAigCAEEBRw0DIAAgAkEEaigCABCnAQwDCyAAIAIoAgAQpwEMAgsgACACKAIAEMMJDAELIAIgABDwCwsgAkEoaiECIAVBWGoiBQ0ACwsgA0EoaiIDIARHDQALCwJAIAEtADxBBkYNACAAIAFBEGoQ9AwLC9UCAgN/An4jAEEwayICJAACQAJAAkACQAJAIAApAwAiBUKAgICAgIB/UQ0AAkAgBUIqiCIGQv///wFRDQBBASEAIAJBATYCDCACQZy/nAE2AgggAkIBNwIUIAJBCzYCLCACIAY+AiAgAiACQShqNgIQIAIgAkEgajYCKCABKAIAIgMgASgCBCIEIAJBCGoQ3wUNBSAFQv///////wCDIgVQRQ0CDAQLIAVC////////AIMiBVANAyABKAIEIQQgASgCACEDDAILIAEoAgBBmLCDAUEDIAEoAgQoAgwRCwAhAAwDC0EBIQAgA0GZq5wBQQEgBCgCDBELAA0CCyACQQE2AgwgAkGcv5wBNgIIIAJCATcCFCACQbIBNgIkIAIgBTcDKCACIAJBIGo2AhAgAiACQShqNgIgIAMgBCACQQhqEN8FIQAMAQtBACEACyACQTBqJAAgAAulAgEHfyMAQTBrIgIkACABKAIEIQMgAkEIaiABKAIIIgRBCEEoEJUPIAIoAgwhBQJAIAIoAghBAUYNACACKAIQIQYCQCAFRQ0AIARBKGwhByAGIQEgBSEIA0AgB0UNAQJAAkAgAygCAEEHRg0AIAJBCGogAxC8AgwBCyACQQc2AggLIANBKGohAyABIAIpAwg3AwAgAUEgaiACQQhqQSBqKQMANwMAIAFBGGogAkEIakEYaikDADcDACABQRBqIAJBCGpBEGopAwA3AwAgAUEIaiACQQhqQQhqKQMANwMAIAFBKGohASAHQVhqIQcgCEF/aiIIDQALCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQTBqJAAPCyAFIAIoAhBBtPKaARCOKQALvwICBH8BfgJAAkAgACgCAEEHRw0AIAAoAjQhAQJAIAAoAjgiAkUNACABIQMDQCADKAIAIgQQkgEgBEHAAEEIELMWIANBDGohAyACQX9qIgINAAsLIAAoAjAgARCcLQJAIAAtABxBAkYNAAJAIAApAwgiBUIDg0IAUg0AIAWnIgMgAygCACICQX9qNgIAIAJBAUcNACADIAMoAhAQxiQLIAAoAiAiA0UNAiADKAIAIgIQtAIgAkHgAEEIELMWIANBDEEEELMWDwsgACgCCCIDEKwHIANBKEEIELMWIAAoAgwiAxCSASADQcAAQQgQsxYPCyAAKAI0IQECQCAAKAI4IgJFDQAgASEDA0AgAygCACIEEJIBIARBwABBCBCzFiADQQxqIQMgAkF/aiICDQALCyAAKAIwIAEQnC0gABCsBwsLsAIBA38jAEEwayIDJABBACEEIANBADYCLCADQQA2AhggAyABNgIkIAMgASACajYCKEEAIQUDQCADQRBqIANBGGoQqxQCQAJAAkAgAygCFCIBRQ0AIAMoAhAhAiABLQAAQXZqDgQCAwMBAwsgACAENgIEIAAgBTYCACADQTBqJAAPCwJAAkAgAygCGEEBRw0AIAMoAiAhAQwBCwJAAkAgAygCJCIBIAMoAihHDQBBACEBDAELIAMgAUEBajYCJCADIAMoAiwiBEEBajYCLAsgAyABNgIgIAMgBDYCHCADQQE2AhgLIAVBAWohBQJAAkAgAUUNACABLQAAQQpGDQELIAJBAWohBAwCCyACQQJqIQQgA0EIaiADQRhqEKsUDAELIAJBAWohBCAFQQFqIQUMAAsL1QIBAn8gABDPBiAAQQRqIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LAQIDBAUGBwgJCgsACyABKAIAIgAQ5yogAEEkQQQQsxYPCyABKAIAEI4uDwsgASgCACIAKAIAIABBBGooAgAQ9iwgAEE8QQQQsxYPCyABKAIAQSBBBBCzFg8LIAEoAgAQji4PCyABKAIAQRxBBBCzFg8LIAEoAgAiABDoGyAAQThBBBCzFg8LIAEoAgBBHEEEELMWDwsgARDQKQ8LIAEoAgAiAEEkahDRKSAAQcQAQQQQsxYPCwJAAkACQCABKAIAIgAoAgAiAkGAgICAeHMiAUEBIAFBA0kbDgICAQALIAAoAgQgAEEIaigCABD2LAwBCyACIABBBGooAgAQhy0LIABBLGoQ0SkgAEHIAEEEELMWDwsgASgCACIAEOcqIABBJEEEELMWC6YCAgV/AX4gACgCBCEBIAAoAgAhAiAAQoiAgICAATcCACABIAJrQRhuIQMCQAJAAkAgASACRw0AIAAoAhAiAkUNASAAKAIMIgQgACgCCCIDKAIIIgFGDQIgAkEYbCIARQ0CIAMoAgQiBSABQRhsaiAFIARBGGxqIAD8CgAADAILA0ACQCACKQMAIgZCA4NCAFINACAGpyIBIAEoAgAiBEF/ajYCACAEQQFHDQAgASABKAIQEMYkCyACQRhqIQIgA0F/aiIDDQALIAAoAhAiAkUNAAJAIAAoAgwiBCAAKAIIIgMoAggiAUYNACACQRhsIgBFDQAgAygCBCIFIAFBGGxqIAUgBEEYbGogAPwKAAALIAMgASACajYCCAsPCyADIAEgAmo2AggLuQIBAn8CQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEEBRw0DIAEgACgCCBCQIA8LIAEgACgCBBCQIA8LIAAoAgQiAkHAAGogARCqFgJAIAJBhAFqKAIAIgNFDQAgAkGAAWooAgAhACADQdgAbCEDA0ACQAJAAkAgACgCAEF8ag4CAgABCyABIABBBGooAgAQkCAMAQsgASAAENYHCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgAkGYAWooAgAiA0UNACACQZQBaigCACEAIANBKGwhAwNAIAAgARDKCSAAQShqIQAgA0FYaiIDDQALCyACLQA8QQZGDQEgAkEQaiABEKoWDwsgACgCDCIDRQ0AIAAoAgghACADQShsIQMDQCAAIAEQxgcgAEEoaiEAIANBWGoiAw0ACwsLvwIBBH8gAUHAAGogABCoCwJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBBUDAMLIAAgAygCBBBUDAILIAMoAgQiAkHAAGogABCoCyACQZABaiAAEPcSIAItADxBBkYNASACQRBqEKcoDAELIAMoAgwiAkUNACACQShsIQUgAygCCEEEaiECA0ACQAJAAkACQAJAIAJBfGooAgAOBQQAAQIDBAsgAigCAEEBRw0DIAAgAkEEaigCABBUDAMLIAAgAigCABBUDAILIAAgAigCABDLCQwBCyACIAAQ+QsLIAJBKGohAiAFQVhqIgUNAAsLIANBKGoiAyAERw0ACwsCQCABLQA8QQZGDQAgAUEQahCnKAsLwwIBBH8gAUHAAGogABCuCwJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBCeAwwDCyAAIAMoAgQQngMMAgsgAygCBCICQcAAaiAAEK4LIAJBkAFqIAAQ9hIgAi0APEEGRg0BIAJBEGoQpygMAQsgAygCDCICRQ0AIAJBKGwhBSADKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgACACQQRqKAIAEJ4DDAMLIAAgAigCABCeAwwCCyAAIAIoAgAQzAkMAQsgAiAAEPoLCyACQShqIQIgBUFYaiIFDQALCyADQShqIgMgBEcNAAsLAkAgAS0APEEGRg0AIAFBEGoQpygLC8MCAQR/IAFBwABqIAAQrwsCQCABKAKYASICRQ0AIAEoApQBIgMgAkEobGohBANAAkACQAJAAkACQCADKAIADgUEAAECAwQLIAMoAgRBAUcNAyADKAIIIAAQvgMMAwsgAygCBCAAEL4DDAILIAMoAgQiAkHAAGogABCvCyACQZABaiAAEPgSIAItADxBBkYNASACQRBqEJ8aDAELIAMoAgwiAkUNACACQShsIQUgAygCCEEEaiECA0ACQAJAAkACQAJAIAJBfGooAgAOBQQAAQIDBAsgAigCAEEBRw0DIAJBBGooAgAgABC+AwwDCyACKAIAIAAQvgMMAgsgACACKAIAEM0JDAELIAIgABD4CwsgAkEoaiECIAVBWGoiBQ0ACwsgA0EoaiIDIARHDQALCwJAIAEtADxBBkYNACABQRBqEJ8aCwvPAgEBfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAAkACQCAAKAIADggAAQIDBAUGBwALIAIgAEEIajYCDCABQaqemwFBBSACQQxqQcMDEP8LIQAMBwsgAiAAQQhqNgIMIAFBr56bAUECIAJBDGpBxAMQ/wshAAwGCyACIABBBGo2AgwgAUGxnpsBQQMgAkEMakHFAxD/CyEADAULIAIgAEEEajYCDCABQbSemwFBBSACQQxqQcYDEP8LIQAMBAsgAiAAQQRqNgIMIAFBuZ6bAUELIAJBDGpBxwMQ/wshAAwDCyACIABBBGo2AgwgAUHEnpsBQQsgAkEMakHIAxD/CyEADAILIAIgAEEEajYCDCABQc+emwFBBiACQQxqQckDEP8LIQAMAQsgAiAAQQRqNgIMIAFB1Z6bAUEIIAJBDGpBygMQ/wshAAsgAkEQaiQAIAALuQIBAn8CQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgACgCBEEBRw0DIAAoAgggARD5Ag8LIAAoAgQgARD5Ag8LIAEgACgCBCICQcAAahCxCgJAIAJBhAFqKAIAIgNFDQAgAkGAAWooAgAhACADQdgAbCEDA0ACQAJAAkAgACgCAEF8ag4CAgABCyAAQQRqKAIAIAEQ+QIMAQsgASAAENgHCyAAQdgAaiEAIANBqH9qIgMNAAsLAkAgAkGYAWooAgAiA0UNACACQZQBaigCACEAIANBKGwhAwNAIAAgARDPCSAAQShqIQAgA0FYaiIDDQALCyACLQA8QQZGDQEgASACQRBqELEKDwsgACgCDCIDRQ0AIAAoAgghACADQShsIQMDQCAAIAEQxwcgAEEoaiEAIANBWGoiAw0ACwsLwwIBBH8gAUHAAGogABCLCwJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBDmAQwDCyAAIAMoAgQQ5gEMAgsgAygCBCICQcAAaiAAEIsLIAJBkAFqIAAQ/RIgAi0APEEGRg0BIAJBEGoQoxoMAQsgAygCDCICRQ0AIAJBKGwhBSADKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgACACQQRqKAIAEOYBDAMLIAAgAigCABDmAQwCCyAAIAIoAgAQ0AkMAQsgAiAAEPwLCyACQShqIQIgBUFYaiIFDQALCyADQShqIgMgBEcNAAsLAkAgAS0APEEGRg0AIAFBEGoQoxoLC8MCAQR/IAFBwABqIAAQsAsCQCABKAKYASICRQ0AIAEoApQBIgMgAkEobGohBANAAkACQAJAAkACQCADKAIADgUEAAECAwQLIAMoAgRBAUcNAyAAIAMoAggQ0QEMAwsgACADKAIEENEBDAILIAMoAgQiAkHAAGogABCwCyACQZABaiAAEP4SIAItADxBBkYNASACQRBqEKcoDAELIAMoAgwiAkUNACACQShsIQUgAygCCEEEaiECA0ACQAJAAkACQAJAIAJBfGooAgAOBQQAAQIDBAsgAigCAEEBRw0DIAAgAkEEaigCABDRAQwDCyAAIAIoAgAQ0QEMAgsgACACKAIAENEJDAELIAIgABD9CwsgAkEoaiECIAVBWGoiBQ0ACwsgA0EoaiIDIARHDQALCwJAIAEtADxBBkYNACABQRBqEKcoCwvDAgEEfyABQcAAaiAAEM4KAkAgASgCmAEiAkUNACABKAKUASIDIAJBKGxqIQQDQAJAAkACQAJAAkAgAygCAA4FBAABAgMECyADKAIEQQFHDQMgAygCCCAAEKQCDAMLIAMoAgQgABCkAgwCCyADKAIEIgJBwABqIAAQzgogAkGQAWogABD7EiACLQA8QQZGDQEgAkEQahCnKAwBCyADKAIMIgJFDQAgAkEobCEFIAMoAghBBGohAgNAAkACQAJAAkACQCACQXxqKAIADgUEAAECAwQLIAIoAgBBAUcNAyACQQRqKAIAIAAQpAIMAwsgAigCACAAEKQCDAILIAAgAigCABDSCQwBCyACIAAQ+wsLIAJBKGohAiAFQVhqIgUNAAsLIANBKGoiAyAERw0ACwsCQCABLQA8QQZGDQAgAUEQahCnKAsLwwIBBH8gAUHAAGogABCxCwJAIAEoApgBIgJFDQAgASgClAEiAyACQShsaiEEA0ACQAJAAkACQAJAIAMoAgAOBQQAAQIDBAsgAygCBEEBRw0DIAAgAygCCBCqAQwDCyAAIAMoAgQQqgEMAgsgAygCBCICQcAAaiAAELELIAJBkAFqIAAQ/xIgAi0APEEGRg0BIAJBEGoQpygMAQsgAygCDCICRQ0AIAJBKGwhBSADKAIIQQRqIQIDQAJAAkACQAJAAkAgAkF8aigCAA4FBAABAgMECyACKAIAQQFHDQMgACACQQRqKAIAEKoBDAMLIAAgAigCABCqAQwCCyAAIAIoAgAQ0wkMAQsgAiAAEP4LCyACQShqIQIgBUFYaiIFDQALCyADQShqIgMgBEcNAAsLAkAgAS0APEEGRg0AIAFBEGoQpygLC+ACAQJ/IwBBsAVrIgMkAAJAAkACQCABLQAlRQ0AIAIoAjhB5QBPDQAgA0HIAmogAS0AGCABLQAZIAIQlQEgAygCyAJBAUYNAEHkAhDrJyIBQoGAgIAQNwIAAkBB3AJFDQAgAUEIaiADQcgCakEEckHcAvwKAAALIABBAjoACCAAQfS1gAE2AgQgACABNgIADAELIAMgASgCACABLQAMIAIQngECQCADKAIAQYCAgIB4Rw0AAkBB5AJFIgQNACADQcgCaiACQeQC/AoAAAtB7AIQ6yciAUKBgICAEDcCAAJAIAQNACABQQhqIANByAJqQeQC/AoAAAsgAEEAOgAIIABBxLeAATYCBCAAIAE2AgAMAgtB0AIQ6yciAUKBgICAEDcCAAJAQcgCRQ0AIAFBCGogA0HIAvwKAAALIABBAToACCAAQdy2gAE2AgQgACABNgIACyACENMeCyADQbAFaiQAC7ECAQp/IwBBEGsiBCQAIAAgA0H/AXEiBWpByABqIQYgACgCICEHIAAoAhwhCCAAKAIIIQkgACgCBCEKA38CQAJAAkACQAJAAkACQCAKIAkgAkHkkYQBEL8lKAIEIgNFDQAgCCAHIAMgBi0AAGpB9JGEARC+JSEDDAELIARBCGogACACEK4mIAQoAgwhAyAEKAIIIQsDQCADRQ0CIAMgCygCFCIMTw0FIAsoAhAgA0EJbGoiDCgABSEDIAUgDC0AACINSw0ACyAFIA1HDQEgDEEBaiEDCyADKAAAIQMgAQ0BIANBAUcNAQwECyABRQ0DQQAhAwwBCyADQQAgA0EBRxshAwsgBEEQaiQAIAMPCyADIAxB1JGEARCRFQALIAogCSACQay4gAEQvyUoAgwhAgwACwugAgEDfyMAQYABayICJAAgACgCACEAAkACQAJAIAEoAggiA0GAgIAQcQ0AIANBgICAIHENASAAKAIAQQEgARDrByEADAILIAAoAgAhAEGBASEDA0AgAiADakF+aiAAQQ9xIgRBMHIgBEHXAGogBEEKSRs6AAAgA0F/aiEDIABBD0shBCAAQQR2IQAgBA0ACyABQQFB0KucAUECIAIgA2pBf2pBgQEgA2sQ3AUhAAwBCyAAKAIAIQBBgQEhAwNAIAIgA2pBfmogAEEPcSIEQTByIARBN2ogBEEKSRs6AAAgA0F/aiEDIABBD0shBCAAQQR2IQAgBA0ACyABQQFB0KucAUECIAIgA2pBf2pBgQEgA2sQ3AUhAAsgAkGAAWokACAAC7ICAgJ/AX4jAEHAAGsiAiQAAkACQAJAAkACQAJAIAEoAgAOBAABAgMACwJAIAEpAwgiBEIDg0IAUg0AIASnIgEgASgCACIBQQFqNgIAIAFBf0wNBQsgAEEANgIAIAAgBDcDCAwDCyAAIAEpAwA3AwAgAEEIaiABQQhqKQMANwMADAILIAEoAgQhAxD6JyEBIAIgAxBCIAFBOGogAkE4aikDADcDACABQTBqIAJBMGopAwA3AwAgAUEoaiACQShqKQMANwMAIAFBIGogAkEgaikDADcDACABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwAgAEECNgIAIAAgATYCBAwBCyAAQQM2AgALIAJBwABqJAAPCwALrAICA38BfiMAQdAAayIBJABBCiECAkACQCAAKAKoAUEKRg0AIABByAFqIQAMAQsgAEGoAWohAyAAKQMIIQQgAEEJNgIIIAFBEGogAEEYaikDADcDACABQQhqIABBEGopAwA3AwAgASAENwMAIAFBHGogABCPFwJAIAEtACVBAkYNACAAKAIIIQIgAEEJNgIIIAFBKGpBHGogAUEcakEIaigCADYCACABQShqQQhqIABBFGopAgA3AwAgAUEoakEQaiAAQRxqKAIANgIAIAEgASkCHDcCPCABIAApAgw3AygLIAMQnCogACACNgKoAQJAQSRFDQAgAEGsAWogAUEoakEk/AoAAAsgACABEL8dQQAgAEHIAWogACgCqAFBCkYbIQALIAFB0ABqJAAgAAu7AgIHfwF+IwBBIGsiAyQAIANBEGogARDcDiADKAIYIQQCQAJAIAMpAxAiCkIAUg0AQQEhBQwBCyADKAIcIQZBASEFIANBCGogAUEBQQAQqRogAygCDCEHAkACQAJAIAMoAghBAXFFDQAgByEEDAELIAMgAUEXQdyrnAFBARDHECADKAIEIQgCQAJAIAMoAgBBAXFFDQAgCCEEDAELIAMgCDYCECABEMgSIglFDQIgA0EQahD4BiAJIQQLIAcQmSwLIAoQxiEMAQsgASgC1AEhCUEAIQVBMEEIEJoqIgFBADoAKCABIAg2AiQgASAHNgIgIAFBADoAHCABQQA2AhggASAGNgIUIAEgBDYCECABIAo3AwggASAJNgIEIAEgAjYCACABIQQLIAAgBDYCBCAAIAU2AgAgA0EgaiQAC8ECAQN/IwBBMGsiAyQAAkAgASAAKAKIAUEIcUEDdhCHEg0AIANBEGogARDJAyADKAIUIQQgAygCECEFIANBqoGAgHg2AhggACAFIAQgA0EYahDeIwsCQCAALwGQ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AEEQayICJAACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAA4HAAECAwQFBgALIAIgAEEIajYCDCABQZicmwFBAyACQQxqQcIGEP8LIQEMBgsgAiAAQQRqNgIMIAFBm5ybAUEEIAJBDGpByAYQ/wshAQwFCyACIABBBGo2AgwgAUGww5sBQQQgAkEMakGLBxD/CyEBDAQLIAIgAEEIajYCDCABQZ+cmwFBAyACQQxqQccGEP8LIQEMAwsgAiAAQQhqNgIMIAFBopybAUEGIAJBDGpByQYQ/wshAQwCCyACIABBCGo2AgwgAUGonJsBQQUgAkEMakGMBxD/CyEBDAELIAIgAEEIajYCDCABQa2cmwFBByACQQxqQYYGEP8LIQELIAJBEGokACABC6kCAQR/IAEgABD1CQJAIAAoAkQiAkUNACAAKAJAIgMgAkHYAGxqIQQDQAJAAkACQCADKAIAIgJBfGoOAgIAAQsgASADKAIEEIAnDAELAkACQAJAIAIOBAMAAQIDCyADKAIEQQFHDQIgASADKAIIEIAnDAILIAMoAgQgARDgBQwBCyADKAIMIgJFDQAgAkEobCEFIAMoAghBBGohAgNAAkACQAJAAkACQCACQXxqKAIADgUEAAECAwQLIAIoAgBBAUcNAyABIAJBBGooAgAQgCcMAwsgASACKAIAEIAnDAILIAEgAigCABDCCQwBCyACIAEQ7wsLIAJBKGohAiAFQVhqIgUNAAsLIANB2ABqIgMgBEcNAAsLAkAgACgCOCICRQ0AIAEgAhCMEwsLqAIBA38jAEEgayIDJAAgASgCBCEEIAEoAgAhBQJAAkAgASgCCC0AAA0AIAUtAAAhASAELQAAIQQCQCACKAKIASIFQYACcUUNACACIAVB/31xNgKIASADQRhqIAEgBCACELYOIAMoAhghASACIAIoAogBQYACcjYCiAEgAygCHCECDAILIANBEGogASAEIAIQtg4gAygCFCECIAMoAhAhAQwBCwJAIAIoAogBIgFBgAJxDQAgAiABQYACcjYCiAEgAyAFLQAAIAQtAAAgAhC2DiADKAIAIQEgAiACKAKIAUH/fXE2AogBIAMoAgQhAgwBCyADQQhqIAUtAAAgBC0AACACELYOIAMoAgwhAiADKAIIIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC58CAQN/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AAAgASAJOgAAIARBAWohBCADIQEMAQsLIAMgBUHwrpwBEJEVAAsgACACKQIENwIAIABBCGogAkEEakEIaigCADYCACACQRBqJAALoAIBAX8jAEEwayICJAAgAiAANgIMIAIgATYCCAJAIAAoAiBBAUcNACAAKAIoIgEgASgCACIBQX9qNgIAIAFBAUcNACAAKAIoIAAoAiwQgR8LIABBADYCICAAIAIpAhA3AiQgAEEsaiACQRhqKAIANgIAIAJBCGoQlAQCQCACKAIIKAKABSgC0AIiAUF/Sg0AIAJBATYCFCACQcCyhAE2AhAgAkIBNwIcIAJB+AA2AiwgAkGYsoQBNgIoIAIgAkEoajYCGCACQRBqQbizhAEQ6SMACyAAQQA2AkggAEEwaiABEIglIABBPGogARCIJSAAQQA2AmQgAEHMAGogARCIJSAAQdgAaiABEIglIABBADYCsAEgAEEANgJsIAJBMGokAAuhAgEDfyMAQcAAayICJAAgACgCACEDAkACQCAALQAEIgQgAC0ABSIARg0AIAIgBDoAOiACIAA6ADsgAkEDNgIMIAJB/NeDATYCCCACQgM3AhQgAkH4ADYCNCACQbEBNgIsIAJBsQE2AiQgAiADNgI8IAIgAkEgajYCECACIAJBPGo2AjAgAiACQTtqNgIoIAIgAkE6ajYCICABKAIAIAEoAgQgAkEIahDfBSEADAELIAIgBDoAOyACQQI2AiQgAkHQ1oMBNgIgIAJCAjcCLCACQfgANgIUIAJBsQE2AgwgAiADNgI8IAIgAkEIajYCKCACIAJBPGo2AhAgAiACQTtqNgIIIAEoAgAgASgCBCACQSBqEN8FIQALIAJBwABqJAAgAAuJAgIDfwF+IAIgAigCOCABajYCOAJAAkACQCACKAI8IgMNAEEAIQQMAQsgACABQQBBCCADayIEIAEgBCABSRsQghIhBiACIAIpAzAgBiADQQN0QThxrYaEIgY3AzACQCABIARJDQAgAiACKQMYIAaFNwMYIAIQ/Q0gAkEANgI8IAIgAikDACACKQMwhTcDAAwBCyADIAFqIQMMAQsgASAEayIFQXhxIQMCQANAIAQgA08NASACIAIpAxggACAEaikAACIGhTcDGCACEP0NIAIgBiACKQMAhTcDACAEQQhqIQQMAAsLIAIgACABIAQgBUEHcSID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ASgC3AIiBU8NAiABKALYAiACQQJ0aiAENgIAAkAgASgC0AIiBSABKALIAkcNACABQcgCakHwq4MBEJIcCyAAIAQ2AgQgAEEwNgIAIAEgBUEBajYC0AIgASgCzAIgBUECdGogAjYCAAwDCyACIARB0KuDARCRFQALIABBMDYCACAAIAQ2AgQMAQsgAiAFQeCrgwEQkRUACyADQcAAaiQAC7YCAQF/IwBB8ABrIgIkACAAKAIAKAIAIQAgAkHctoMBNgJoIAJBvLaDATYCYCACIABBMWo2AlwgAkGctoMBNgJYIAIgAEEQajYCVCACQcy2gwE2AlAgAiAAQSxqNgJMIAJBvLaDATYCSCACIABBMGo2AkQgAkGstoMBNgJAIAIgAEEoajYCPCACQay2gwE2AjggAiAAQSRqNgI0IAJBrLaDATYCMCACIABBIGo2AiwgAkGstoMBNgIoIAIgAEEcajYCJCACQay2gwE2AiAgAiAAQRhqNgIcIAJBnLaDATYCGCACIABBCGo2AhQgAkGctoMBNgIQIAIgADYCDCACIABBMmo2AmwgAiACQewAajYCZCABQYC5gwFBC0GguIMBQQwgAkEMakEMEKgKIQAgAkHwAGokACAAC4QCAgN/AX4jAEHAAGsiAiQAIAJBIGpBGGogAUEQaikCADcCACACQSBqQRBqIAFBCGopAgA3AgAgAiABKQIANwIoIAJBCGpBA0EEQQhB4OmbARCxGSACQQA2AhggAiACKQMINwMQIAJBEGpBAxCTJSACKAIYIgFBA2ohAyACKAIUIAFBA3RqIQRBaCEBAkADQCABRQ0BIAQgAWpBGGogAkEgaiABakEgaikCADcCACABQQhqIQEMAAsLIAIpAxAhBSACQSBqQQhqIgEgAzYCACACIANFOgAsIAIgBTcDICACQSBqEPsFIABBCGogASkDADcCACAAIAIpAyA3AgAgAkHAAGokAAvJAgEBfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEF0aiIDQQcgA0EmSRsOJgkMDAAICQsBDQ0MAwQMDAIDCwQFCQkICAoGCQcMCwgICwsLDAgJCQsgACgCICIAIAI2AjQgACABNgIwDwsgACACNgI0IAAgATYCMA8LIAAoAggOBwcICAkJCgoHCyAAIAI2AiAgACABNgIcDwsgACAC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JAALkQIBCX8jAEEQayIDJAAgAi0ADCEEIAEtAAwhBSACKAIEIQYgAigCACEHIAEoAgQhCCABKAIAIQkCQAJAAkACQCABKAIIIgpFDQAgAigCCCILDQELIANBCGpBACgC+KCcATYCACADQQApAvCgnAE3AwAMAQsCQCALQQFHDQAgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADIAYoAgAQnQkgBiEIIAchCQwCCwJAIApBAUcNACADQQhqIAJBCGooAgA2AgAgAyACKQIANwMAIAMgCCgCABCdCQwCCyADIAggCiAGIAsQrhILIAcgBhD0LAsgCSAIEPQsIAAgBSAEENkbQf8BcSADEN8XIANBEGokAAuKAgEEfyMAQTBrIgMkAEEAIQQCQAJAIAIoAhAiBSACKAIUIgZLDQACQCACKAIAQX9qQQJJDQAgA0EMaiAAIAIoAgggAigCDCAFIAYQgw5BACEEIAMoAgxBAUcNAUEBIQQgAygCECADKAIUTQ0BIANBADYCKCADQQE2AhwgA0H8lIQBNgIYIANCBDcCICADQRhqQdSkgwEQ6SMACyADQQxqIAAgAigCCCACKAIMIAUgBhChFEEAIQQgAygCDEEBRw0AQQEhBCADKAIQIAMoAhRLDQELIANBMGokACAEDwsgA0EANgIoIANBATYCHCADQfyUhAE2AhggA0IENwIgIANBGGpB1KSDARDpIwALigIBBH8jAEEwayIDJABBACEEAkACQCACKAIQIgUgAigCFCIGSw0AAkAgAigCAEF/akECSQ0AIANBDGogACACKAIIIAIoAgwgBSAGEMwIQQAhBCADKAIMQQFHDQFBASEEIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANB/JSEATYCGCADQgQ3AiAgA0EYakHUpIMBEOkjAAsgA0EMaiAAIAIoAgggAigCDCAFIAYQ/QlBACEEIAMoAgxBAUcNAEEBIQQgAygCECADKAIUSw0BCyADQTBqJAAgBA8LIANBADYCKCADQQE2AhwgA0H8lIQBNgIYIANCBDcCICADQRhqQdSkgwEQ6SMAC/QBAQl/IAEoAggiA0EcbCEEQQAhBSACLQAYQf8BcSIGQQdHIQcgASgCBCIIIQkCQAJAA0AgBEUNAQJAIAktABgiCkEHRyAHcw0AQQEhCyAKQQdGDQMg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JSgAASACRw0AIAogCSAAQeCPgAEQwCVBADYAASAERQ0AIAggByAEIAYgCiAJIABB8I+AARDAJS0AAGotAABqQYCQgAEQviVBADYCAAwACwsgAUEQaiQAC4wCAQR/IwBBIGsiAyQAQQEhBAJAIAAtAAQNACAALQAFIQUCQAJAIAAoAgAiBi0ACkGAAXENAEEBIQQgBUEBcUUNASAGKAIAQeKemgFBAiAGKAIEKAIMEQsARQ0BDAILQQEhBAJAIAVBAXENACAGKAIAQbiTnAFBASAGKAIEKAIMEQsADQILQQEhBCADQQE6AA8gA0HwmIEBNgIUIAMgBikCADcCACADIAYpAgg3AhggAyADQQ9qNgIIIAMgAzYCECABIANBEGogAhEHAA0BIAMoAhBBi5mBAUECIAMoAhQoAgwRCwAhBAwBCyABIAYgAhEHACEECyAAQQE6AAUgACAEOgAEIANBIGokACAAC+YBAQN/AkAgA0EISQ0AIAAgACADQQN2IgNBBXQiBGogACADQThsIgVqIAMQxAshACABIAEgBGogASAFaiADEMQLIQEgAiACIARqIAIgBWogAxDECyECCwJAAkAgACgCACIDIAEoAgAiBUYNACADIAVJIQQMAQsgACgCBCABKAIESSEECwJAAkAgAyACKAIAIgZGDQAgAyAGSSEDDAELIAAoAgQgAigCBEkhAwsCQCAEIANHDQACQAJAIAUgBkYNACAFIAZJIQAMAQsgASgCBCACKAIESSEACyACIAEgBCAAcxshAAsgAAvmAQEDfwJAIANBCEkNACAAIAAgA0F4cSIEaiAAIANBA3YiA0EObCIFaiADEMULIQAgASABIARqIAEgBWogAxDFCyEBIAIgAiAEaiACIAVqIAMQxQshAgsCQAJAIAAtAAAiAyABLQAAIgVGDQAgAyAFSSEEDAELIAAtAAEgAS0AAUkhBAsCQAJAIAMgAi0AACIGRg0AIAMgBkkhAwwBCyAALQABIAItAAFJIQMLAkAgBCADRw0AAkACQCAFIAZGDQAgBSAGSSEADAELIAEtAAEgAi0AAUkhAAsgAiABIAQgAHMbIQALIAALjwIBAX8jAEHgAGsiAiQAIAAoAgAhACACQQA2AkwgAkKAgICAEDcCRCACQdC9mAE2AlQgAkKggICADjcCWCACIAJBxABqNgJQAkAgACAC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AxAgASAGNwMAIAAgAjYCHCAAIAQ2AhggAEEBNgIUIAAgATYCECAAQoCAgIAQNwIIIABCgICAgMAANwIAIAEgAkF/ajYCDCABIARBAWo2AggLIANBIGokAAvgAQEGfyMAQSBrIgEkAEEAIQICQAJAAkAgACgCACIDQQF0QQEgAxsiBEH/////A00NAAwBCyAEQQQgBEEESxsiBUECdCIEQfz///8HSw0AAkACQCADDQAgAUEUakEEaiECQQAhAwwBCyABQRxqIQIgAUEENgIYIAEgACgCBDYCFCADQQJ0IQMLIAIgAzYCACABQQhqIAQgAUEUahCaESABKAIIQQFHDQEgASgCECEGIAEoAgwhAgsgAiAGQYCKngEQjikACyABKAIMIQMgACAFNgIAIAAgAzYCBCABQSBqJAAL3wEBBX8jAEEQayICJAAgARATIgMQHyEEIAJBCGoQxyQgAigCDCAEIAIoAghBAXEiBRshBAJAAkAgBUUNACAAQQM6AAQgACAENgIADAELAkACQCAEECBBAUcNACACIAQgARDYGyACKAIEIQECQAJAAkAgAigCAEEBcUUNACAAQQM6AAQMAQsgARAXQQFHDQEgARAhIgUQICEGIAUQ3CogBkEBRw0BIABBADoABAsgACABNgIADAILIABBAjoABCABENwqDAELIABBAjoABAsgBBDcKgsgAxDcKiACQRBqJAALyAEBBn8gACgCACIDQQRqIAMvATIiBEEBaiIFIAAoAggiBiABELUaIAZBAWohACADQTRqIQcCQCAEQQJqIgEgBkECaiIITQ0AIAQgBmtBAnQiBEUNACAHIAhBAnRqIAcgAEECdGogBPwKAAALIAcgAEECdGogAjYCACADIAU7ATIgASAAIAEgAEsbIQQgBkECdCADakE4aiEGAkADQCAEIABGDQEgBigCACIBIAA7ATAgASADNgIAIAZBBGohBiAAQQFqIQAMAAsLC9oBAgF/AX4jAEEQayIFJAACQAJAAkAgAyAEakF/akEAIANrca0gAa1+IgZCIIinDQAgBqciBEGAgICAeCADa00NAQsgAEEANgIEQQEhAwwBCwJAIAQNACAAIAM2AghBACEDIABBADYCBAwBCwJAAkAgAkUNACAFIAMgBEEBEMAgIAUoAgAhAgwBCyAFQQhqIAMgBBDYHyAFKAIIIQIL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NgIEIANBCGogA0EEaiACEJ8ZIAMtAAhBBEYNAiADKQMIIgVC/wGDQgRRDQIgACAFNwIADAQLIANBCGogBCgCACACEPQHIAMtAAhBBEYNASADKQMIIgVC/wGDQgRRDQEgACAFNwIADAMLIANBCGogBCgCACACEMYGIAMtAAhBBEYNACADKQMIIgVC/wGDQgRSDQELIABBBDoAAAwBCyAAIAU3AgALIANBEGokAAvSAQEDfyMAQSBrIgIkACABKAKQBiEDIAJBCGogAUG0A2oiBCABKAKMBkEBEIUIAkACQCACKAIIIgFBA0YNACAAIAIpAgw3AgQgAEEUaiACQQhqQRRqKAIANgIAIABBDGogAkEIakEMaikCADcCAAwBCyACQQhqIAQgA0EBEIUIAkAgAigCCCIBQQNGDQAgACACKQIMNwIEIABBFGogAkEIakEUaigCADYCACAAQQxqIAJBCGpBDGopAgA3AgAMAQtBAyEBCyAAIAE2AgAgAkEgaiQAC/sBAQJ/IwBBMGsiAiQAAkACQCAAKQMAQv///////////wCDQoCAgICAgID4/wBTDQAgAkEBNgIUIAJBnL+cATYCECACQgE3AhwgAkH9ATYCLCACIAA2AiggAiACQShqNgIYIAEoAgAgASgCBCACQRBqEJUpIQMMAQsgAkEAOgAMIAIgATYCCEEBIQMgAkEBNgIUIAJBnL+cATYCECACQgE3AhwgAkH9ATYCLCACIAA2AiggAiACQShqNgIYIAJBCGogAkEQahDbKQ0AAkAgAi0ADA0AIAEoAgBBy72YAUECIAEoAgQoAgwRCwANAQtBACEDCyACQTBqJAAgAwvTAQICfwF+IAFBFGwhAQJAA0AgAUUNASAAKAIMIABBEGooAgAgAhD9KyACIAAoAgQgACgCCBD5CiACIAIoAjhBAWo2AjggAkL/ASACKAI8IgNBA3RBOHGthiACKQMwhCIFNwMwAkACQEEIIANrIgRBAUsNACACIAIpAxggBYU3AxggAhD9DSACKQMwIQUgAkL/ASAEQQN0rYg3AzAgAiAFIAIpAwCFNwMAIANBeWohAwwBCyADQQFqIQMLIABBFGohACACIAM2AjwgAUFsaiEBDAALCwvjAQIHfwJ+IwBB4ABrIgIkACABKAIQIQMgASgCDCEEIAEoAgghBQJAAkAgASkDACIJ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IQIMAQsgASgCBCICQcwAaiEBIAJByABqIQILIAAgASgCADYCBCAAIAIoAgA2AgAL4AEBAX8jAEEQayITJAAgACgCACABIAIgACgCBCgCDBELACECIBNBADoADSATIAI6AAwgEyAANgIIIBNBCGogAyAEIAUgBhC9CSAHIAggCSAKEL0JIAsgDCANIA4QvQkgDyAQIBEgEhC9CSESIBMtAA0iAiATLQAMIgFyIQACQCACQQFHDQAgAUEBcQ0AAkAgEigCACIALQAKQYABcQ0AIAAoAgBBv+SXAUECIAAoAgQoAgwRCwAhAAwBCyAAKAIAQamZnAFBASAAKAIEKAIMEQsAIQALIBNBEGokACAAQQFxC84BAQN/IwBBIGsiAyQAAkACQAJAIAEgAmoiAiABTw0AQQAhBAwBC0EAIQQCQCACIAAoAgAiBUEBdCIBIAIgAUsbIgFBCCABQQhLGyIBQQBODQAMAQtBACECAkAgBUUNACADIAU2AhwgAyAAKAIENgIUQQEhAgsgAyACNgIYIANBCGogASADQRRqEJYXIAMoAghBAUcNASADKAIQIQAgAygCDCEECyAEIABBhLmAARCOKQALIAMoAgwhAiAAIAE2AgAgACACNgIEIANBIGokAAvPAQEKfyMAQRBrIgIkACAALQAMIQMgAkEEaiAAKAIEIAAoAghBChCxASACKAIIIgQgAigCDCIFaiEGIAVBAXYhByAFQQJJIQhBfyEAIAQhCQJAA0AgByAAakF/Rg0BAkAgCA0AIAktAAAhCiAJIAYgAGoiCy0AADoAACALIAo6AAAgAEF/aiEAIAlBAWohCQwBCwsgACAHQfCunAEQkRUACyACKAIEIQAgASADQf8BcUEAR0EBQQAgBCAFENwFIQkgACAEENgsIAJBEGokACAJC/IBAQJ/IAAQqgQCQAJAAkACQAJAAkACQCAAKAIADggGAQIGAwQFAAYLIABBBGoQyiIgACgCBCAAKAIIEPYsDAULIAAoAggiAUUNBCAAKAIEIAFBARCzFgwECyAAKAIMIQEgACgCCCECAkAgACgCBA0AIAIgARD3LAwECyACIAEQgi0MAwsgACgCDCIBEOYMIAFBHEEEELMWDAILAkAgACgCDCIBRQ0AIAAoAhAiAkUNACABIAJBARCzFgsgACgCBCIBEOYMIAFBHEEEELMWDAEL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IgQ2AhggAEF4aikDACEFIABBaGopAwAQyCEgBRDIIQwACwsgAUEYQQggAkEBahDaESADIAEoAghrIAEoAgAgASgCBBCTKQsgAUEgaiQAC84BAgJ/AX4jAEEQayIDJAACQAJAAkAgAkEPSQ0AIAJB/////wFLDQJBfyACQQN0QQduQX9qZ3ZBAWohAgwBC0EEQQhBECACQQhJGyACQQRJGyECCyADIAFBCCACEKMSIAMoAgQhAgJAAkAgAygCACIBDQAgACADKAIINgIIIAAgAjYCBCAAQQA2AgAMAQsgAykCCCEFAkAgAkEJaiIERQ0AIAFB/wEgBPwLAAsgACAFNwIIIAAgAjYCBCAAIAE2AgALIANBEGokAA8LEOchAAvCAQEFfwJAIAEoAgQiAiABQXhqKAIASSABKAIAIgMgAUF0aigCACIESSADIARGG0EBRw0AIAFBaGohBCABKAIIIQUCQAJAA0AgBCIBQSBqIAFBFGooAgA2AgAgAUEYaiABQQxqIgQpAgA3AgAgBCAARg0BIAFBdGohBCACIAFBBGooAgBJIAMgASgCACIGSSADIAZGGw0ACyABQQxqIQQMAQsgAUEMaiEECyABQQxqIAM2AgAgBCAFNgIIIAQgAjYCBAsLuQEBBX8CQCADQQhJDQAgACAAIANBA3YiA0EwbCIEaiAAIANB1ABsIgVqIAMQ+gwhACABIAEgBGogASAFaiADEPoMIQEgAiACIARqIAIgBWogAxD6DCECCwJAIAAoAgQiBSABKAIEIgZJIAAoAgAiAyABKAIAIgRJIAMgBEYbIgcgBSACKAIEIghJIAMgAigCACIFSSADIAVGG0cNACACIAEgByAGIAhJIAQgBUkgBCAFRhtzGyEACyAAC8wBAQJ/IwBB8ABrIgckACAHQQhqIAJBiK+cARC7GUEAIQggB0EANgIcIAcgBykDCDcCFCAHQSBqIAEgAiADIAQQ0wIgBSAGaiEDAkADQCAHQeQAaiAHQSBqEMgHIAcoAmRBAUcNASABIAhqIQQgBygCbCEIIAdBFGogBCABIAcoAmhqELogIAdBFGogBSADELogDAALCyAHQRRqIAEgCGogASACahC6ICAAQQhqIAdBFGpBCGooAgA2AgAgACAHKQIUNwIAIAdB8ABqJAAL0QECA38BfiMAQYABayICJAACQCABKQII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QQI6ACQgBCABEL4eIAEgBToAJSABIAY6ACQgBEHAAGohBCADQUBqIgMNAAsLIABBGGohBSABIAI6ACYCQCAAKAIUIgNFDQAgACgCECEEIANBDGwhAwNAIAEgBCgCABBUIARBDGohBCADQXRqIgMNAAsLAkAgBSgCAEGAgICAeEYNACABIAUQmxsLC8wBAQJ/IAFBwABqEK0oAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABClAQwBCyAAIAMQwQcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAJ4IgNFDQAgAyAAEMQfCwJAIAEoApgBIgJFDQAgASgClAEhAyACQShsIQIDQCADIAAQpAkgA0EoaiEDIAJBWGoiAg0ACwsCQCABLQA8QQZGDQAgAUEQahCtKAsLwAEBB38jAEHgAGshAwJAIAAoAggiBCABRg0AIAAoAgQiBSABQdgAbGohBiAFIARB2ABsaiEEIAIoAgQhASACKAIMIQcDQCABIAdGDQEgAiABQdgAaiIFNgIEIAEoAgAiCEENRg0BAkBB1ABFIgkNACADQQxqIAFBBGpB1AD8CgAACyAEIAg2AgACQCAJDQAgBEEEaiADQQxqQdQA/AoAAAsgACAAKAIIQQFqNgIIIAUhASAEQdgAaiIEIAZHDQALCwvPAQEDfyAAQcAAahC3JCAAQZABaiECIAAoAoQBQdgAbCEDIAAoAoABIQQCQANAIANFDQECQAJAAkACQAJAIAQoAgAOBgQBAgMEAAQLIARBBGogARCVLwwDCyAEQQRqIAEQ2ScMAgsgBEEEaiABEJ4vDAELIARBBGogARD4EwsgBEHYAGohBCADQah/aiEDDAALCwJAIAAoAngiBEUNACABIARBDGooAgAgBEEQaigCABCgJgsgAiABEPgTAkAgAC0APEEGRg0AIABBEGoQtyQLC7oBAQJ/IAAgAC0ADSABLQANIgIgAkEDRhs6AA0gACAALQAMIAEtAAwiAiACQQJGGzoADCAAIAAtAAsgAS0ACyICIAJBAkYbOgALIAAgAC0ACiABLQAKIgIgAkECRhs6AAogACABQQlqIABBCWogAS0ACCICGy0AADoACSAAIAAoAgAgASgCACIDIANBAkYiAxs2AgAgACACIAAtAAhyQQFxOgAIIAAgAEEEaiABQQRqIAMbKAIANgIEIAALuQEBAn8CQAJAAkAgACgCCCICIAFJDQAgAiABRg0BIAIgAWshAgJAAkAgACgCBCABQQJ0aiIDLQAAIgFB/wFGDQAgASABQQJ2aiABQQNxQQBHakECaiIBIAJJDQEgASACQdy1gwEQkRUACyAAKAIoQQJqIgEgAk8NAwsgAyABQQJ0aigCACIBQQEgAUF/ShsPCyABIAJBhL6DARDgLAALQQBBAEHMtYMBEJEVAAsgASACQey1gwEQkRUAC80BAQV/IAAoAgQhAQJAIAAoAggiAkUNACABIQMDQAJAAkACQAJAIAMoAgAOAgECAAsgA0EEaigCACIEEKwHIARBKEEIELMWIANBGGooAgAiBEUNAiAEKAIAIgUQtAIgBUHgAEEIELMWIARBDEEEELMWDAILIANBCGoQ3g0MAQsgA0EIahCyEwsgA0E4aiEDIAJBf2oiAg0ACwsgACgCACABEKMtAkAgACgCFCIDRQ0AIAMoAgAiAhC0AiACQeAAQQgQsxYgA0EMQQQQsxYLC8sBAQN/IwBB0ABrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCUCECIANBADYCUAJAIAJFDQAgAUEIaiACEQMAAkAgACgCBCICKAIAIgMoAjgiAEECRg0AIABFDQAgAygCQCIARQ0AIAMoAjwgAEEBELMWIAIoAgAhAwsCQEHIAEUNACADIAFBCGpByAD8CgAACyABQdAAaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsIyeATYCCCABQgQ3AhAgAUEIakGov5wBEOkjAAvOAQEBfwJAIAAoAgAiAkEJRw0AIABBCGogARCaBA8LAkACQAJAAkACQAJAAkACQCACDgkAAQIDBAUHBgcACwJAIAAoAgwiAkUNACACQcgAbCECA0AgAkG4f2oiAg0ACwsgACgCHCIARQ0GIAAgARCWGQ8LIABBCGogARCeBw8LIAAoAhwiAEUNBCAAIAEQlhkPCyAAKAIIDQMgACgCKCABEI8HDwsgASAAKAIEEKoBDwsgACgCECIARQ0BIAAgARCWGQ8LIAEgACgCBBCqAQsL2QEBA38jAEEgayIDJAACQAJAIAEoAogBIgRBgISQgAFxQYCEkIABRg0AIAEgBEGAhJCAAXI2AogBIANBCGogARCaLyABIAEoAogBIARB//vv/35ycTYCiAEMAQsgA0EIaiABEJovCyADKAIMIQQCQAJAIAMoAggiBUGAgICAeEcNAEENIQEMAQsgACADKQIQNwIMIABBFGogA0EYaikCADcCACAAIAI2AhwgACAENgIIIAAgASgC1AE2AiBBCyEBIAUhBAsgACABNgIAIAAgBDYCBCADQSBqJAALygEBAX8jAEEQayILJAAgACgCACABIAIgACgCBCgCDBELACECIAtBADoADSALIAI6AAwgCyAANgIIIAtBCGogAyAEIAUgBhC9CSAHIAggCSAKEL0JIQogCy0ADSICIAstAAwiAXIhAAJAIAJBAUcNACABQQFxDQACQCAKKAIAIgAtAApBgAFxDQAgACgCAEG/5JcBQQIgACgCBCgCDBELACEADAELIAAoAgBBqZmcAUEBIAAoAgQoAgwRCwAhAAsgC0EQaiQAIABBAXELuQECAn8BfiMAQRBrIgQkAAJAAkACQCACIANqQX9qQQAgAmtxrSABrX4iBkIgiKcNACAGpyIDQYCAgIB4IAJrTQ0BCyAAQQA2AgRBASECDAELAkAgAw0AIAAgAjYCCEEAIQIgAEEANgIEDAELIARBCGogAiADEMQkAkAgBCgCCCIFRQ0AIAAgBTYCCCAAIAE2AgRBACECDAELIAAgAzYCCCAAIAI2AgRBASECCyAAIAI2AgAgBEEQaiQAC8ABAQR/IwBBMGsiAyQAQQAhBAJAIAIoAhAiBSACKAIUIgZLDQAgAEEEaiEAAkAgAigCAEF/akECSQ0AIANBDGogACACKAIIIAIoAgwgBSAGEOUGIAMoAgwiBEEBRw0BIAMoAhAgAygCFE0NASADQQA2AiggA0EBNgIcIANB/JSEATYCGCADQgQ3AiAgA0EYakHUpIMBEOkjAAsgBSACKAIMTw0AIAAtAAAgAigCCCAFai0AAEYhBAsgA0EwaiQAIAQLyAEBBH8jAEHQAGsiAiQAIAJBNGpBGGoiA0EANgIAIAJBNGpBEGoiBEIENwIAIAJBNGpBCGoiBUIANwIAIAJCgICAgMAANwI0IAJBNGpBABCIJSACQcAAakEAEIglIAJBGGogAygCADYCACACQRBqIAQpAgA3AwAgAkEIaiAFKQIANwMAIAIgAikCNDcDACACQQA2AiwgAkIA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AxC0AiADQeAAQQgQsxYLIAFBMGohASACQX9qIgINAAsgACgCBCEBCyAAKAIAIAEQni0LtQECAn8BfiMAQcAAayICJAAgASkCBCEEEPonIQMgAiABKAIAEEIgA0E4aiACQThqKQMANwMAIANBMGogAkEwaikDADcDACADQShqIAJBKGopAwA3AwAgA0EgaiACQSBqKQMANwMAIANBGGogAkEYaikDADcDACADQRBqIAJBEGopAwA3AwAgA0EIaiACQQhqKQMANwMAIAMgAikDADcDACAAIAM2AgAgACAENwIEIAJBwABqJAALrQEBAn8CQAJAIAFBA0sNACAAQX9qIQADQAJAIAENAEEBDwsgACABaiECIAFBf2ohASACLAAAQX9KDQALQQAhAwwBC0EAIQMgACgAAEGAgYKEeHENAEEEIABBA2pBfHEiAiAAayACIABGGyECIAFBfGohAQNAAkAgAiABSQ0AIAAgAWooAABBgIGChHhxRQ8LIAAgAmooAgBBgIGChHhxDQEgAkEEaiECDAALCyADC6sBAQF/AkACQAJAAkAgAA4DAAECAAtBASEAIAFBCGooAgAiAkUNAiABQQRqKAIAIAJBOGxqIgFBSGoiAkUNAgJAIAFBeGooAgAiAUUNACABEKIQDwsgAhDyHw8LQQEhACABQQhqKAIAIgJFDQEgAUEEaigCACACQThsaiIBQUhqIgJFDQECQCABQXhqKAIAIgFFDQAgARCiEA8LIAIQ8h8PCyABEPIfIQALIAALvwEBBX8gACgCBCECAkACQAJAAkAgACgCAA4DAAECAAsgAiABEJEPDwsgAigCCCIDRQ0BIAIoAgQiACADQThsaiEDIAFBLGohBCABLQB5IQUgAS0AKCEGA0AgAUEBOgB5IAFBAToAKCAAIAEQkgsCQCAAQTBqKAIAIgJFDQAgAUEAOgB5IAFBADoAKCAEIAIQwh8gAiABEIcCCyABIAY6ACggASAFOgB5IABBOGoiACADRw0ADAILCyACIAEQkgsLC78BAgF/AX4CQAJAAkACQAJAAkAgACgCAA4EAQIDBAALIAApAxAgACgCGBC0GQ8LIAApAwgiAkIDg0IAUg0DIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNAyAAIAAoAhAQxiQPCyAAKQMIIAApAxgQqhQPCyAAKQMYIgJQDQEg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ACIFRQ0AIAUoAgAgARCoAQsgBCACQThqIgJHDQALCwJAIAAoAhQiAkUNACACKAIAIAEQqAELC9sBAQJ/AkACQCAAKAIAIgFBCUcNACAAQQhqELAkIQIMAQtBASECAkACQAJAAkACQAJAAkACQCABDgkAAQIDCAQFCAcACyAALQAgQQFzIQIMBwsCQAJAIAAoAggOCAgACAgHBwgBCAsgACgCKCgCGEGAgICAeEchAgwHCyAAKAIMEI8TIQIMBgsgAC0AIEEBcyECDAULIAAoAggOAwQCAwQLIAAtABRBAXMhAgwDCyAAKAIELQBBQQFzIQIMAgsgACgCKCgCGEGAgICAeEchAgwBC0EAIQILIAJBAXELzAEBBX8jAEGgAWsiAiQAAkACQCABvUL///////////8Ag0L/////////9/8AVQ0AIAJBEGohAyABIAJBEGoQ+wEhBAwBCyACQQhqIAEQtB8gAigCDCEEIAIoAgghAwsgAkGUAWogBEEBQQEQlQ8gAigCmAEhBQJAIAIoApQBQQFGDQAgAigCnAEhBgJAIARFDQAgBiADIAT8CgAACyAAIAQ2AgggACAGNgIEIAAgBTYCACACQaABaiQADwsgBSACKAKcAUHAvJwBEI4pAAu8AQECfyAAIAFBwABqELEKAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABD5AgwBCyAAIAMQ2AcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAKYASICRQ0AIAEoApQBIQMgAkEobCECA0AgAyAAEM8JIANBKGohAyACQVhqIgINAAsLAkAgAS0APEEGRg0AIAAgAUEQahCxCgsLugECAX8BfgJAAkACQAJAAkACQCAAKAIADgQBAgMEAAsgACkDECAAKAIYELQZDwsgACkDCCICQgODQgBSDQMgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0DIAAgACgCEBDGJA8LIABBCGoQyBMPCyAAKQMYIgJQDQEgAkIDg0IAUg0BIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKAIEIgAQsAEgAEHAAEEIELMWCwu3AQEBfwJAIAAoAogBIgRBAXENACABIAIgAxDgGiEDAkAgBEEIcQ0A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AgAgAiABKQIENwIMIAIgAzYCCAJAAkAgA0GAgICAeEcNACAAIAItAAw6AAEgAkEIahDSFUEAIQEMAQsgACACQQhqIAJBH2pBwMyAARDFIzYCBEEBIQELIAAgAToAAAwBC0HQ04ABQRAQnxQhASAAQQE6AAAgACABNgIECyACQSBqJAALoAEBA38gAkEDcSEDIAAgAkEMcSIEaiEFIAEgBGohBAN/AkACQAJAAkAgAkEDSw0AQQEhAgJAIANBAU0NACAFLwAAIAQvAABHDQIgA0F+aiEDIARBAmohBCAFQQJqIQULIANFDQIgBS0AACAELQAARg8LIAAoAAAgASgAAEYNAgtBACECCyACDwsgAkF8aiECIAFBBGohASAAQQRqIQAMAAsLpgEBBH8CQAJAIABB/wFLDQBBASEBIABB3wFxQb9/akH/AXFBGkkNASAAQd8ARg0BIABBUGpB/wFxQQpJDQELQZwGIQFBACECAkADQCABQQJJDQEgAiABQQF2IgMgAmoiBCAEQQN0QbyHiAFqKAIAIABLGyECIAEgA2shAQwACwsgAkEDdCIBQbyHiAFqKAIAIABNIAAgAUHAh4gBaigCAE1xIQELIAELsgEBA38jAEHAAGsiAyQAAkACQCABKAIAIgQoAlwiBUF/Rg0AIABBIjYCACAAIAVBAWoiATYCBCAEIAE2AlwMAQsgA0EcaiABKAIEIAEoAggQihQgA0E4aiACQRBqKQIANwIAIANBMGogAkEIaikCADcCACADIAIpAgA3AiggAygCBCEBAkBBOEUNACAAQQhqIANBCGpBOPwKAAALIAAgATYCBCAAQQA2AgALIANBwABqJAALzQEBAX8jAEEgayICJAACQAJAAkACQAJAAkACQAJAAkAgASgCAA4IAAECAwQFBgcACyABQQE6ACQMBwsgAUEBOgAkDAYLIAEoAgRBAToAGAwFCyACQQE2AgggAkGUnJkBNgIEIAJCADcCECACIAJBHGo2AgwgAkEEakGcnJkBEOkjAAsgASgCBEEBOgBEDAMLIAEoAgRBAToAKAwCCyABKAIEQQE6ACwMAQsgASgCBEEBOgBQCwJAQShFDQAgACABQSj8CgAACyACQSBqJAALtgECA38CfiMAQRBrIgIkAAJAAkAgAC0AJUECRg0AIAIgACkDCCAAKAIYELkfIAIpAwAhBSABKAIYIQMgASACKAIINgIYIAEpAxAhBiABIAU3AxAgACgCICABEOYOAkAgASkDECIFUA0AIAVCA4NCAFINACAFpyIAIAAoAgAiBEF/ajYCACAEQQFHDQAgACAAKAIQEMYkCyABIAM2AhggASAGNwMQDAELIAEgABC2BAsgAkEQaiQAC7gBAQJ/IAFBwABqEK0oAkAgASgChAEiAkUNACABKAKAASEDIAJB2ABsIQIDQAJAAkACQCADKAIAQXxqDgICAAELIANBBGooAgAgABCCAwwBCyAAIAMQ6AcLIANB2ABqIQMgAkGof2oiAg0ACwsCQCABKAKYASICRQ0AIAEoApQBIQMgAkEobCECA0AgAyAAEOAJIANBKGohAyACQVhqIgINAAsLAkAgAS0APEEGRg0AIAFBEGoQrSgLC+wBAQF/QQAhAgJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQf8BcUG0f2oOSQALCwsLCwsLCwsLCwsLCwsLCwsLCwsBCwsLCwsLCwsLCwsLCwsCCgoKCgoKCgoKCgoLCgoKCQMKCgoKCgoKCgoKBAUGBwoKCgEKCyABQYAFcUUNBwwKCyABQQhxQQN2DwsgAUGAAnENCCABQQhxQQN2DwsgAUEIcQ0HDAYLIAFBCHENBgwFCyABQQhxDQUMBAsgAUEIcQ0EDAMLIAFBCHENAwwCCyABQQhxQQN2IQIMAQsgAUEIcQ0BCyACDwtBAQvDAQECfyABKAIEIQMgASgCACEEAkAgASgCCC0AAA0AIAQtAAAhASADLQAAIQMCQCACKAKIASIEQYACcUUNACACIARB/31xNgKIASAAIAEgAyACEKsaIAIgAigCiAFBgAJyNgKIAQ8LIAAgASADIAIQqxoPCwJAIAIoAogBIgFBgAJxDQAgAiABQYACcjYCiAEgACAELQAAIAMtAAAgAhCrGiACIAIoAogBQf99cTYCiAEPCyAAIAQtAAAgAy0AACACEKsaC7oBAQJ/IwBBIGsiAyQAIANBEGpBDGogAUEMaigCADYCACADIAEoAgA2AhAgAyABKQIENwIUAkACQCACKAKIASIBQYCcgIACcSIERQ0AIAIgAUH/4///fXE2AogBIANBCGogA0EQaiACEPILIAMoAgghASACIAIoAogBIARyNgKIASADKAIMIQIMAQsgAyADQRBqIAIQ8gsgAygCBCECIAMoAgAhAQsgACACNgIEIAAgATYCACADQSBqJAALzQEBAX8jAEHAAGsiAiQAIAJByIOEATYCOCACQazugwE2AjAgAkHgi4QBNgIoIAJB0IuEATYCICACQcjpgwE2AhggAkGc7oMBNgIQIAJBjO6DATYCCCACIAA2AgQgAiAAQeAEajYCLCACIABB4AJqNgIkIAIgAEHgAGo2AhwgAiAAQYQFajYCFCACIABBgAVqNgIMIAIgAEGIBWo2AjwgAiACQTxqNgI0IAFB5IyEAUEDQayMhAFBByACQQRqQQcQqAohACACQcAAaiQAIAALwAECAX8BfiMAQYACayIEJAAgBEEQaiADEJkPIARB7ABqIAEgBEEQahD1BiAEQQhqIAFBIGpB5L+EARDsIyAEIAI6AMQBIARBiYDEADYCaCAEKAIMIQMgBCgCCCAEQegAakH0v4QBEOIeIAMgAygCAEEBajYCACAAQQA2AgggAEKAgICAwAA3AgAgAEEgaiABQdgAaigCACIDNgIAIAAgASkCUCIFNwIYIAAgBTcCDCAAQRRqIAM2AgAgBEGAAmokAAuiAQECfwJAAkAgAEEASA0AIAAhAgwBCyABQS06AABBACAAayECIAFBAWohAQsCQCACQeMASg0AAkAgAkEJSg0AIAEgAkEwajoAACAAQR92QQFqDwsgASACQQF0Qdz8mAFqLwAAOwAAIABBH3ZBAnIPCyABIAJB5ABuIgNBMGo6AAAgASACIANB5ABsa0EBdEHc/JgBai8AADsAASAAQR92QQNqC7UBAQN/IwBBIGsiASQAIAAoAgAiAigCACEDIAJBADYCACADKAIUIQIgA0EANgIUAkAgAkUNACABQQhqIAIRAwACQCAAKAIEIgAoAgAiAygCAEUNACADEMwKIAAoAgAhAwsgAyABKQIINwIAIANBCGogAUEIakEIaikCADcCACABQSBqJABBAQ8LIAFBADYCGCABQQE2AgwgAUGwjJ4BNgIIIAFCBDcCECABQQhqQai/nAEQ6SMAC8cBAQF/IwBBwABrIgIkACACQdydmQE2AjggAkHMnZkBNgIwIAJBnJ2ZATYCKCACQZydmQE2AiAgAkGcnZkBNgIYIAJBvJ2ZATYCECACQcSSmwE2AgggAiAANgIEIAIgAEEgajYCLCACIABBKmo2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ASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEO4CIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC7EBAQJ/IwBBIGsiAyQAAkACQCABKAIcLQAADQAgA0EYaiACIAEQlBMgAygCHCECIAMoAhghAQwBCwJAIAIoAogBIgRBgAJxDQAgAiAEQYACcjYCiAEgA0EIaiABIAIQ8QIgAygCCCEBIAIgAigCiAFB/31xNgKIASADKAIMIQIMAQsgA0EQaiABIAIQ8QIgAygCFCECIAMoAhAhAQsgACABNgIAIAAgAjYCBCADQSBqJAALsQEBAn8jAEEgayIDJAACQAJAIAEoAhwtAAANACADQRhqIAIgARCTEyADKAIcIQIgAygCGCEBDAELAkAgAigCiAEiBEGAAnENACACIARBgAJyNgKIASADQQhqIAEgAhDwAiADKAIIIQEgAiACKAKIAUH/fXE2AogBIAMoAgwhAgwBCyADQRBqIAEgAhDwAiADKAIUIQIgAygCECEBCyAAIAE2AgAgACACNgIEIANBIGokAAu7AQECfyMAQRBrIgIkAAJAAkACQAJAAkACQAJAIAEoAgAOBwACAQIDBAUACyACIAFBCGoQtRkgAigCBCEDIAIoAgAhAQwFCyABKAIMIQMgASgCCCEBDAQLIAEoAhQhAyABKAIQIQEMAwsgASgCECEDIAEoAgwhAQwCCyABKAIIIQMgASgCBCEBDAELIAJBCGogASgCBBDJAyACKAIMIQMgAigCCCEBCyAAIAE2AgAgACADNgIEIAJBEGokAAuxAQECfyMAQSBrIgMkAAJAAkAgASgCGC0AAA0AIANBGGogAiABEJITIAMoAhwhAiADKAIYIQEMAQsCQCACKAKIASIEQYACcQ0AIAIgBEGAAnI2AogBIANBCGogASACEPgCIAMoAgghASACIAIoAogBQf99cTYCiAEgAygCDCECDAELIANBEGogASACEPgCIAMoAhQhAiADKAIQIQELIAAgATYCACAAIAI2AgQgA0EgaiQAC6oBAQV/IwBBIGsiAiQAIAJBGGoiAyABQTRqKAIANgIAIAJBEGoiBCABQSxqKQIANwMAIAJBCGoiBSABQSRqKQIANwMAIAIgASkCHDcDAEEcQQQQ3SciBkEYaiADKAIANgIA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NgIQIAIgADYCDCACIABBJGo2AjwgAiACQTxqNgI0IAFBiJGbAUEPQdiQmwFBBiACQQxqQQYQqAohACACQcAAaiQAIAALwQEBAX8jAEHAAGsiAiQAIAAoAgAoAgAhACACQeyPmwE2AjggAkHcj5sBNgIwIAIgADYCLCACQcCJmwE2AiggAiAAQdIAajYCJCACQcCJmwE2AiAgAiAAQdEAajYCHCACQcCJmwE2AhggAiAAQdAAajYCFCACQcSSmwE2AhAgAiAAQcgAajYCDCACIABBIGo2AjwgAiACQTxqNgI0IAFBrJCbAUEMQfyPmwFBBiACQQxqQQYQqAohACACQcAAaiQAIAALsAEBAn8gACgCACICQcAAaiABEK4LAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQngMMAwsgASAAKAIAEJ4DDAILIAAgARDBDwwBCyAAIAEQ2xILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQpygLC64BAQJ/IAAoAgAiAkHAAGogARCoCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEFQMAwsgASAAKAIAEFQMAgsgACABEMIPDAELIAAgARDcEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCnKAsLsAEBAn8gACgCACICQcAAaiABEK8LAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyAAQQRqKAIAIAEQvgMMAwsgACgCACABEL4DDAILIAAgARDDDwwBCyAAIAEQ3RILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQnxoLC7ABAQJ/IAAoAgAiAkHAAGogARDOCgJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgAEEEaigCACABEKQCDAMLIAAoAgAgARCkAgwCCyAAIAEQxA8MAQsgACABEN8SCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEKcoCwuwAQECfyAAKAIAIgJBwABqIAEQiwsCQCACKAKYASIARQ0AIABBKGwhAyACKAKUAUEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABDmAQwDCyABIAAoAgAQ5gEMAgsgACABEMUPDAELIAAgARDhEgsgAEEoaiEAIANBWGoiAw0ACwsCQCACLQA8QQZGDQAgAkEQahCjGgsLsAEBAn8gACgCACICQcAAaiABELALAkAgAigCmAEiAEUNACAAQShsIQMgAigClAFBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQ0QEMAwsgASAAKAIAENEBDAILIAAgARDGDwwBCyAAIAEQ4hILIABBKGohACADQVhqIgMNAAsLAkAgAi0APEEGRg0AIAJBEGoQpygLC7ABAQJ/IAAoAgAiAkHAAGogARCxCwJAIAIoApgBIgBFDQAgAEEobCEDIAIoApQBQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEKoBDAMLIAEgACgCABCqAQwCCyAAIAEQxw8MAQsgACABEOMSCyAAQShqIQAgA0FYaiIDDQALCwJAIAItADxBBkYNACACQRBqEKcoCwueAQEDfyMAQSBrIgIkAAJAAkAgASgCBCIDIAEoAgAiBCgCFE8NACABIANBAWo2AgQgAkEIakEEciAEKAIQIANBBHRqIgFBBGooAgAgAUEIaigCABDZEyAAQQhqIAJBCGpBCGopAwA3AwAgAEEQaiACQQhqQRBqKQMANwMAIAJBAzoACCAAIAIpAwg3AwAMAQsgAEEGOgAACyACQSBqJAALnQEBAX8jAEEgayIBJAAgAUEEakEUaiAAQRBqKQIANwIAIAFBBGpBDGogAEEIaikCADcCACABIAApAgA3AggCQEEIQcAAEP8rIgANAAALIABBGjYCACAAIAEpAgQ3AgQgAEEMaiABQQRqQQhqKQIANwIAIABBFGogAUEEakEQaikCADcCACAAQRxqIAFBHGooAgA2AgAgAUEgaiQAIAALtgEBAn8jAEEwayICJAACQAJAAkAgAS0A4AFB2wBGDQBBgICAgHghAwwBCyABEKELIAJBGGogAUEAEI4IIAIoAhwhAQJAIAIoAhgiA0GAgICAeEYNACACQRBqIAJBKGopAgA3AwAgAiACKQIgNwMIDAELIABBgYCAgHg2AgAgACABNgIEDAELIAAgATYCBCAAIAM2AgAgACACKQMINwIIIABBEGogAkEQaikDADcCAAsgAkEwaiQAC6ABAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EDdCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBOxDDCxogAUF4aiEBIABBCGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6kBAQR/IwBBEGsiASQAQYCAxAAhAgJAIAAoAgAoAlAiAyAAKAIIIgRGDQAgACgCBCECAkACQCAAEPsPIgBBgAFPDQBBASEADAELAkAgAEGAEE8NAEECIQAMAQtBA0EEIABBgIAESRshAAsgASACIAQgACADakGEu4QBEL4aIAEgASgCACIANgIIIAEgACABKAIEajYCDCABQQhqEOUfIQILIAFBEGokACACC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EcbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB9wAQwwsaIAFBZGohASAAQRxqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQu6AQEBfyMAQcAAayICJAAgACgCACEAIAJBpOOHATYCOCACQZTjhwE2AjAgAiAAQQRqNgIsIAJBlOOHATYCKCACIABBA2o2AiQgAkGU44cBNgIgIAIgAEECajYCHCACQZTjhwE2AhggAiAAQQFqNgIUIAJBlOOHATYCECACIAA2AgwgAiAAQQVqNgI8IAIgAkE8ajYCNCABQajkhwFBBUH444cBQQYgAkEMakEGEKgKIQAgAkHAAGokACAAC6kBAgJ/AX4jAEEQayICJAAgASgCCCEDIAIgARCDCAJAAkAgAi0AAEEBRw0AIAItAAEhASAAQQA2AgAgACABOgAEDAELAkAgAikDCCIEIANBf2qtWg0AAkAgASgCDEEBaiIDQfQDSw0AIAAgAzYCDCAAIAQ+AgggACABKQIANwIADAILIABBADYCACAAQQE6AAQMAQsgAEEANgIAIABBADoABAsgAkEQaiQAC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EUbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpBigIQwwsaIAFBbGohASAAQRRqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQujAQIDfwF+AkAgACgCCCIBRQ0AIAAoAgRBJGohAANAAkAgAEFkaikDACIEQgODQgBSDQAgBKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCAAQXxqKAIAIgJFDQAgAhC0AiACQeAAQQgQsxYLAkAgACgCACICRQ0AIAIQtAIgAkHgAEEIELMWCyAAQTBqIQAgAUF/aiIBDQALCwuqAQIBfwF+IAAoAiAiARCSASABQcAAQQgQsxYCQAJAAkACQCAAKAIADgIBAgALIAAoAgQiABCSASAAQcAAQQgQsxYPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLqgECAX8BfiAAKAIgIgEQogEgAUHAAEEIELMWAkACQAJAAkAgACgCAA4CAQIACyAAKAIEIgAQogEgAEHAAEEIELMWDwsgACkDCCICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAApAwgiAkIDg0IAUg0AIAKnIgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC7wBAQF/IwBBwABrIgIkACAAKAIAIQAgAkHcnZkBNgI4IAJB7J2ZATYCMCACIABBwQBqNgIsIAJBzJ2ZATYCKCACIABBOGo2AiQgAkH8nZkBNgIgIAIgAEEIajYCHCACQeydmQE2AhggAiAAQcAAajYCFCACQcSSmwE2AhAgAiAANgIMIAIgAEE8ajYCPCACIAJBPGo2AjQgAUHAjpsBQQxBsPaaAUEGIAJBDGpBBhCoCiEAIAJBwABqJAAgAAuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBOGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQdYDEMMLGiABQUhqIQEgAEE4aiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQTBsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakG8AxDDCxogAUFQaiEBIABBMGohAAwACwsgAkEEahClIyEBIAJBEGokACABC6EBAQN/IwBBEGsiAiQAIAAoAgAiA0EEaigCACEAIANBCGooAgAhAyABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgA0EYbCEBAkADQCABRQ0BIAIgADYCDCACQQRqIAJBDGpB3AMQwwsaIAFBaGohASAAQRhqIQAMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuhAQEDfyMAQRBrIgIkACAAKAIAIgNBBGooAgAhACADQQhqKAIAIQMgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIANBDGwhAQJAA0AgAUUNASACIAA2AgwgAkEEaiACQQxqQd0DEMMLGiABQXRqIQEgAEEMaiEADAALCyACQQRqEKUjIQEgAkEQaiQAIAELoQEBA38jAEEQayICJAAgACgCACIDQQRqKAIAIQAgA0EIaigCACEDIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCADQTBsIQECQANAIAFFDQEgAiAANgIMIAJBBGogAkEMakHH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AAsgAkEQaiQAC6MBAgJ/AX4jAEEQayIEJAACQAJAAkAgA0UNAAJAIAEtADxBAUcNACAEQQhqIAEQqhcCQCAELQAIQQRGDQAgBCkDCCIGQv8Bg0IEUg0DCyABQQA6ADwgASgCACEFIAFBADYCACAFQQFHDQAgASABKAIEEMUFCyABKAIoIAIgAxCOCSABIAIgAxDgBwsgAEEEOgAADAELIAAgBjcCAAsgBEEQaiQAC58BAQF/IwBBIGsiAiQAAkACQAJAIAEtABRBAkYNACACIAAgASABKAIYEKQHIAItABRBA0cNASABLQAUQQJGDQAgACgCFCABEKsIGgsgASgCGCAAEP4GDAELIAEQ/yggAUEYaiACQRhqKQMANwMAIAFBEGogAkEQaikDADcDACABQQhqIAJBCGopAwA3AwAgASACKQMANwMACyACQSBqJAALrAEBBH8jAEEQayICJAAgASgCDCEDAkACQAJAAkACQCABKAIEDgIAAQILIAMNAUEBIQRBACEBDAILIAMNACABKAIAIgMoAgQhASADKAIAIQQMAQsgACABEO0JDAELIAJBCGogAUEBQQFBwLycARCxGiACKAIIIQUgAigCDCEDAkAgAUUNACADIAQgAfwKAAALIAAgATYCCCAAIAM2AgQgACAFNgIACyACQRBqJAALowECAn8BfiMAQRBrIgQkAAJAAkACQCADRQ0AAkAgAS0APEEBRw0AIARBCGogARCqFwJAIAQtAAhBBEYNACAEKQMIIgZC/wGDQgRSDQMLIAFBADoAPCABKAIAIQUgAUEANgIAIAVBAUcNACABIAEoAgQQxgULIAEoAiggAiADEI4JIAEgAiADEOAHCyAAQQQ6AAAMAQsgACAGNwIACyAEQRBqJAALowECAn8BfiMAQRBrIgQkAAJAAkACQCADRQ0AAkAgAS0APEEBRw0AIARBCGogARCqFwJAIAQtAAhBBEYNACAEKQMIIgZC/wGDQgRSDQMLIAFBADoAPCABKAIAIQUgAUEANgIAIAVBAUcNACABIAEoAgQQxQULIAEoAiggAiADEI4JIAEgAiADEKcKCyAAQQQ6AAAMAQsgACAGNwIACyAEQRBqJAALmwECA38BfiMAQSBrIgIkAEEAIQNBACEEAkADQCABIARGDQEgACkCACEFIABBgYCAgHg2AgAgAkEIakEQaiAAQRBqKQIANwMAIAJBCGpBCGogAEEIaikCADcDACACIAU3AwgCQCAFp0GBgICAeEYNACAEQQFqIQQgAkEIahCMKQwBCwsgASAEayEDIAJBCGoQjCkLIAJBIGokACADC6UBAQR/IwBBEGsiAiQAIAIgASgCFCIDEKQjAkACQCACKAIAQQFHDQAgACACKQMINwMQIABC/v///wc3AwggAEEANgIADAELIAIoAgQhBAJAIAMgAUEMaiIFKAIARw0AIAVBxImAARD6GwsgACAENgIEIABBAzYCACABIANBAWo2AhQgASgCECADQQlsaiIBQgA3AAAgAUEIakEAOgAACyACQRBqJAALsQEBA38jAEEgayIDJAAgA0IAEPYLAkACQCADKAIAQYSAgIB4Rw0AQQAtAKDxngEaIAMoAgQhBEEQEH0iBUUNASAFIAI6AA0gBSABOgAMIAUgBDYCCCAFQoGAgIAQNwIAIABB1JmDATYCBCAAIAU2AgAgA0EgaiQADwsgA0EQakEIaiADQQhqKQMANwMAIAMgAykDADcDEEHEiJwBQSsgA0EQakH0lIMBQcSZgwEQ6hILAAuPAQIDfwF+AkACQCABrUIMfiIFQiCIpw0AIAWnIgJBeEsNACACQQdqQXhxIgIgAUEIamoiAyACSQ0AIANB+P///wdLDQBBAC0AoPGeARogAxB9IgNFDQEgAEEANgIMIAAgAUF/aiIENgIEIAAgAyACajYCACAAIAQgAUEDdkEHbCABQQlJGzYCCA8LEOchCwALpAECAn8BfgJAAkACQCABKAIAQQVGDQAgASkCACIFQiCIpyEDAkACQAJAIAWnIgRBfWoiAUECIAFBAkkbDgMAAQIAC0EBIQEgAhC0IyECDAMLIAJFDQNBASEBIAMgAkF/ahCxISECDAILQQEhASAEIAMQriEhAgwBCyABKAIEIQJBACEBCyAAIAI2AgQgACABNgIADwtB9OCDAUEkQZjhgwEQshcAC5UBAgF/An4gACAAKAI4QQFqNgI4IAAgAa1C/wGDIgMgACgCPCIBQQN0QThxrYYgACkDMIQiBDcDMAJAAkBBCCABayICQQFLDQAgACAAKQMYIASFNwMYIAAQ/Q0gACkDMCEEIAAgAyACQQN0rYg3AzAgACAEIAApAwCFNwMAIAFBeWohAQwBCyABQQFqIQELIAAg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ACACNgIEIAAgBDYCACADQRBqJAAPC0HEiJwBQSsgA0EPakGY24MBQajbgwEQ6hIAC0HEiJwBQSsgA0EPakHQuoABQai7gAEQ6hILAAufAQECfyAAEKgJIQEgACgCwBIgACgCxBIiAigCCEF/akF4cWpBCGogAigCGBEEACECAkAgAC0A1BJBAUcNAEGgppwBQShBqOuDARDSHgALIAEgAmogACgC0BIiACgC0AJBFGxqIAAoAtwCQQJ0aiAAKALEAiICKAIQQQN0aiACKAIcQQV0aiACKAIoQQxsaiACKAIsaiAAKALAAmpBiANqC5sBAQN/IwBBEGsiAiQAIAAoAgAiACgCCCEDIAAoAgQhACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQCQCADRQ0AIANBA3QhAQNAIAIgADYCDCACQQRqIAJBDGpBtwEQwwsaIABBCGohACABQXhqIgENAAsLIAJBBGoQpSMhACACQRBqJAAgAAueAQEDfyMAQdAAayICJAACQCABKAIgDQAgAUF/NgIgIAJBCDYCQCACIAFBJGogAkHAAGoQwAwgASABKAIgQQFqNgIgIABBCGohAyACKAIEIQECQAJAIAIoAgAiBEEqRg0AQThFDQEgAyACQQhqQTj8CgAADAELIAMgATYCAAsgACAENgIAIAAgATYCBCACQdAAaiQADwtBjKGEARDSGgALmAEBBH8CQCAAKAIAQYCAgIB4Rg0AIAAoAghBBHQhAiAAKAIEQQxqIQADQCACRQ0BAkAgAEF8aiIDKAIAIgQgAU0NACAAQQA6AAAgBCABayAEEPYmIQQgA0EANgIAIAFFDQACQCABRQ0AIABBeGooAgAiBSAFIARqIAH8CgAACyADIAE2AgALIAJBcGohAiAAQRBqIQAMAAsLC6EBAQN/AkACQAJAAkAgASgCACICDQBBACEDDAELQQAhAwNAAkAgASgCCCIEIAEoAgRPDQAgAiAEai0AAEHFAEcNACABIARBAWo2AggMAgsCQCADRQ0AIAEoAhAiAkUNACACQeKemgFBAhCCBg0DCyABEP8CDQIgA0EBaiEDIAEoAgAiAg0ACwtBACEBDAELQQEhAQsgACADNgIEIAAgATYCAAuXAQICfwF+IAAgACgCOEEBajYCOCAAQv8BIAAo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BBD/CyEADAILIAIgAEEIajYCCCABQceFmwFBByACQQhqQaMEEP8LIQAMAQsgAiAANgIMIAFBzoWbAUEFIAJBDGpBpAQQ/wshAAsgAkEQaiQAIAALkwEBAn8jAEEQayIDJAACQAJAIAEoAgAiBEEBakF+cSAERg0AIANBCGogARC8ISADKAIMIQEgAygCCCEEDAELIAEoAgghAQsCQAJAAkAgAUECSw0AIAFBAkcNAQwCCyAELAACQb9/Sg0BCyAEIAFBAiABIAIQ4yoACyAAIAFBfmo2AgQgACAEQQJqNgIAIANBEGokAAujAQIBfwF+IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKQMAQn58IgNCAiADQgJUG6cOAwABAgALIAIgAEEIajYCBCABQb6FmwFBCSACQQRqQZcGEP8LIQAMAgsgAiAAQQhqNgIIIAFBx4WbAUEHIAJBCGpBmAYQ/wshAAwBCyACIAA2AgwgAUHOhZsBQQUgAkEMakGZBhD/CyEACyACQRBqJAAgAAuWAQEBf0EALQCg8Z4BGgJAQcAAEH0iAQ0AAAsgASAAKQMANwMAIAFBOGogAEE4aikDADcDACABQTBqIABBMGopAwA3AwAgAUEoaiAAQShqKQMANwMAIAFBIGogAEEgaikDADcDACABQRhqIABBGGopAwA3AwAgAUEQaiAAQRBqKQMANwMAIAFBCGogAEEIaikDADcDACABC5oBAgN/An4gASgCDCECIAEoAgAiAykDACEFAkACQCABKAIEIgENAEIAIQZBACEEDAELIAMgAUEEdGtBcGqtQiCGIAFBEWxBGWqthCEGQQghBAsgACAGNwIkIAAgBDYCICAAIAI2AhggACADNgIQIAAgA0EIajYCCCAAIAMgAWpBAWo2AgwgACAFQn+FQoCBgoSIkKDAgH+DNwMAC9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnS3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAnW3C9MBAQJ/QQAhAkEAIQMCQCAAvUL///////////8Ag0L/////////9/8AVQ0AIACdIgAgAEQAAAAAAADwPaKdRAAAAAAAAPBBoqEgAKYiAEQAAAAAAADwQaAgACAARAAAAAAAAAAAYxv8AyEDCwJAIAG9Qv///////////wCDQv/////////3/wBVDQAgAZ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDQR9xIQILIAMgAna4C5kBAQF/IwBBIGsiBSQAIAUgBDoAByAFIAI2AgAgBUEIakEIaiADQQhqKAIANgIAIAUgAykCADcDCCABKAKIASEDIAUgBTYCGCAFIAVBB2o2AhQCQAJAIANBCHENACABIANBCHI2AogBIAAgBUEIaiABEJ8BIAEgASgCiAFBd3E2AogBDAELIAAgBUEIaiABEJ8BCyAFQSBqJAALlQEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEECdCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBLhDDCxogAUF8aiEBIANBBGohAwwACwsgAkEEahClIyEBIAJBEGokACABC5UBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABBDGwhAQJAA0AgAUUNASACIAM2AgwgAkEEaiACQQxqQT0QwwsaIAFBdGohASADQQxqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAg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AEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABBAnQhAQJAA0AgAUUNASACIAM2AgwgAkEEaiACQQxqQacCEMMLGiABQXxqIQEgA0EEaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlwEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEGdCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBxQQQwwsaIAFBQGohASADQcAAaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlgEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEobCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpByQQQwwsaIAFBWGohASADQShqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAgAQuZAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCEAIAEoAgBB4aucAUEBIAEoAgQoAgwRCwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBCAAQdgAbCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpBygQQwwsaIAFBqH9qIQEgA0HYAGohAwwACwsgAkEEahClIyEBIAJBEGokACABC5kBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEIABByABsIQECQANAIAFFDQEgAiADNgIMIAJBBGogAkEMakHLBBDDCxogAUG4f2ohASADQcgAaiEDDAALCyACQQRqEKUjIQEgAkEQaiQAIAELlgEBA38jAEEQayICJAAgACgCBCEDIAAoAgghACABKAIAQeGrnAFBASABKAIEKAIMEQsAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQgAEEobCEBAkADQCABRQ0BIAIgAzYCDCACQQRqIAJBDGpB2wMQwwsaIAFBWGohASADQShqIQMMAAsLIAJBBGoQpSMhASACQRBqJAAgAQudAQEBfyMAQRBrIgYk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IAM2AgQgAkEwaiQAC6ABAgR/AX4jAEEQayIBJAAgAUEIQQhBBBCjEiABKAIEIQICQAJAIAEoAgAiAw0AIAE1AgghBQwBCyABKQIIIQUgAkEJaiIERQ0AIANB/wEgBPwLAAsgAUEIaiIEIAU3AgAgASACNgIEIAEgAzYCACABQsHK2YvGDRDCBiABEPAfEMIGIABBCGogBCkCADcCACAAIAEpAgA3AgAgAUEQaiQAC6cBAAJAIAEgAkH46psBQQUQ4yVFDQBB5gAPCwJAIAEgAkGXn5wBQQYQ4yVFDQBBlAEPCwJAIAEgAkGIg5wBQQYQ4yVFDQBB5wAPCwJAIAEgAkGx9JsBQQYQ4yVFDQBBlgEPCwJAIAEgAkGjupwBQQMQ4yVFDQBBkwEPCwJAIAEgAkGr9JsBQQYQ4yVFDQBBlQEPC0Gef0GkfyABIAJB3fSbAUEJEOMlGwunAQACQCABIAJBqJacAUEEEOMlRQ0AQegADwsCQCABIAJB1IKcAUEFEOMlRQ0AQekADwsCQCABIAJBkaucAUEEEOMlRQ0AQeoADwsCQCABIAJBw/ObAUEGEOMlRQ0AQewADwsCQCABIAJBw4KcAUEDEOMlRQ0AQesADwsCQCABIAJBsoScAUEEEOMlRQ0AQZcBDwtBoH9BpH8gASACQdT/mwFBBhDjJRsL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADcrcL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADc7cL0AEBAn9BACECQQAhAwJAIAC9Qv///////////wCDQv/////////3/wBVDQAgAJ0iACAARAAAAAAAAPA9op1EAAAAAAAA8EGioSAApiIARAAAAAAAAPBBoCAAIABEAAAAAAAAAABjG/wDIQMLAkAgAb1C////////////AINC//////////f/AFUNACABnSIAIABEAAAAAAAA8D2inUQAAAAAAADwQaKhIACmIgBEAAAAAAAA8EGgIAAgAEQAAAAAAAAAAGMb/AMhAgsgAiADcbcLmAEBAn8jAEEQayIGJABBACEHAkACQAJAIAEtAOABQYQBRw0AIAEQoQsgBkEIaiABQQAgASgC2AEQgRMgBigCDCEHIAYoAghBAXENAQsgACAHNgIgIAAgAjYCGCAAQQI6ABQgACABKALUATYCHCAAIAWtQiCGIASthDcDAAwBCyAAIAc2AgBBAiEDCyAAIAM6ACQgBkEQaiQAC6wBAQJ/IwBBIGsiASQAAkACQEEAKALI8J4BDQACQAJAIABFDQAgACgCACECIABBADYCACACRQ0AIAAoAgQhAAwBC0EAQQAoAtzgngEiAEEBajYC3OCeASAARQ0CC0EAIAA2AszwngFBAEEBNgLI8J4BCyABQSBqJABBzPCeAQ8LIAFBADYCGCABQQE2AgwgAUGcnIQBNgIIIAFCBDcCECABQQhqQaSchAEQ6SMAC40BAQR/IwBBEGsiAyQAIANBCGogACgCACIEIAAoAgQgARCyGyADKAIIIQUgAy0ADCEGIAAgACgCDEEBajYCDCAAIAAoAgggBkEBcWs2AgggBEEAIAVrQRhsakFoaiIAIAIpAwA3AwAgAEEIaiACQQhqKQMANwMAIABBEGogAkEQaikDADcDACADQRBqJAALoAEAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCgECAwQFBggHCAABCyAAQQhqIAEQoQYPCyAAQRxqIAEQhSkPCyAAQQhqIAEQcQ8LIABBHGogARCFKQ8LAkACQCAAKAIIDgMAAQUACyAAKAIoIAEQYQ8LIAAoAiggARCdGw8LIABBBGogARCTLw8LIABBEGogARCFKQ8LIABBBGogARCTLwsLnwEBA38gAC0ACCEBAkACQCAAKAIAIgIN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AWo2AgAgBEF/TA0BCyAAIANqIAEgAhCJBhoPCwALlgECAn8BfgJAIAApAxAiA0IDg0IAUg0AIAOnIgEgASgCACICQX9qNgIAIAJBAUcNACABIAEoAhAQxiQLAkACQAJAIAAoAgAOAwACAQILIAApAwgiA0IDg0IAUg0BIAOnIgAgACgCACIBQX9qNgIAIAFBAUcNASAAIAAoAhAQxiQPCyAAKAIEIgAQrwEgAEHAAEEIELMWCwuVAQEBfyMAQSBrIgMkACADIAI2AhwCQAJAIAEoAogBIgJBgCBxDQAgASACQYAgcjYCiAEgA0EIaiADQRxqIAEQmQUgAygCCCECIAEgASgCiAFB/19xNgKIASADKAIMIQEMAQsgA0EQaiADQRxqIAEQmQUgAygCFCEBIAMoAhAhAgsgACACNgIAIAAgATYCBCADQSBqJAALkQEBBH8jAEEgayICJAAgAkEIakEQaiIDIAFBLGooAgA2AgAgAkEIakEIaiIEIAFBJGopAgA3AwAgAiABKQIcNwMIQRRBBBDdJyIFQRBqIAMoAgA2AgAgBUEIaiAEKQMANwIAIAUgAikDCDcCACABQQRqEO4nIAEQqy8gAEGcjpwBNgIEIAAgBTYCACACQSBqJAALmAEBAX8jAEEgayIDJAAgA0EIakEQaiABQRBqKQMANwMAIANBCGpBCGogAUEIaikDADcDACADIAEpAwA3AwgCQAJAIAIoAogBIgFBgICAgAFxRQ0AIAIgAUH/////fnE2AogBIAAgA0EIaiACEPICIAIgAigCiAFBgICAgAFyNgKIAQwBCyAAIANBCGogAhDyAgsgA0EgaiQAC4IBAgF/AX4CQAJAIAGtIAOtfiIFQiCIpw0AIAWnIgEgAkF/amoiBCABSQ0AIARBACACa3EiASADQQhqaiIDIAFJDQECQCADQYCAgIB4IAJrSw0AIAAgATYCCCAAIAM2AgQgACACNgIADwsgAEEANgIADwsgAEEANgIADwsgAEEANgIAC5IBAQR/IwBBEGsiAyQAAkACQCABKAIAIgQgAigCACIFTw0AIANBCGogAkEIaigCADYCACADIAIpAgA3AwAgACADIAEoAgQiBiABKAIIEPQKDAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgACADIAIoAgQiBiACKAIIEPQKIAUhBAsg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A0EwRg0DDAULIAFFDQQgAEEIahDrC0EBcw8LIABBBGogARClEg8LIABBKGogARClEiECCyACDwsgAEEEaiABEKUSDwtBAQuWAQEBfyMAQRBrIgIkAAJAAkACQAJAIAAoAgAiACgCAA4DAAECAAsgAiAAQQhqNgIEIAFBoJqbAUEIIAJBBGpBqwQQ/wshAAwCCyACIABBCGo2AgggAUHSu5wBQQYgAkEIakGsBBD/CyEADAELIAIgAEEEajYCDCABQci7nAFBBCACQQxqQdADEP8LIQALIAJBEGokACAAC4oBAgF/AX4CQAJAAkACQCAAKAIADgIBAgALIABBBGoQuQEPCyAAKQMIIgJCA4NCAFINASACpyIAIAAoAgAiAUF/ajYCACABQQFHDQEgACAAKAIQEMYkDwsgACkDCCICQgODQgBSDQAgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0AIAAgACgCEBDGJAsLlgEBAX8jAEEQayICJAACQAJAAkACQCAAKAIAIgAoAgAOAwABAgALIAIgAEEIajYCBCABQb67nAFBBSACQQRqQb4FEP8LIQAMAgsgAiAAQQhqNgIIIAFBhZqbAUELIAJBCGpBoAUQ/wshAAwBCyACIABBBGo2AgwgAUH9mZsBQQggAkEMakG9BRD/CyEACyACQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBBHQhAgNAIAMgADYCDCADQQRqIANBDGpB1wUQwwsaIABBEGohACACQXBqIgINAAsLIANBBGoQpSMhACADQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBBHQhAgNAIAMgADYCDCADQQRqIANBDGpB6wUQwwsaIABBEGohACACQXBqIgINAAsLIANBBGoQpSMhACADQRBqJAAgAAuIAQECfyMAQRBrIgMkACACKAIAQeGrnAFBASACKAIEKAIMEQsAIQQgA0EAOgAJIAMgBDoACCADIAI2AgQCQCABRQ0AIAFBAnQhAgNAIAMgADYCDCADQQRqIANBDGpB9wQQwwsaIABBBGohACAC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IABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEK4BIAFBwABBCBCzFiAAEMMRDAELIAAoAhAiARCuASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBELABIAFBwABBCBCzFiAAEMQRDAELIAAoAhAiARCwASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEK8BIAFBwABBCBCzFiAAEMYRDAELIAAoAhAiARCvASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguRAQEBfwJAAkAgACgCACIAKAIAQQNGDQAgACgCICIBEKQBIAFBwABBCBCzFiAAEMcRDAELIAAoAhAiARCkASABQcAAQQgQsxYgAEEEahDpHiAAKAIEIABBCGooAgAQmy0gACgCICIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCyAAQShBCBCzFguPAQEDfyMAQSBrIgEkACAAQQRqKAIAIQIgACgCACIDKAIAIQAgA0EANgIAIAAoAgwhAyAAQQA2AgwCQCADDQAgAUEANgIYIAFBATYCDCABQbCMngE2AgggAUIENwIQIAFBCGpBqL+cARDpIwALIAMRAQAhACACKAIAIgMgADYCBCADQQE2AgAgAUEgaiQAQQELlwEBA38jAEEQayICJAAgASgC2AEhAwJAAkAgASgCiAEiBEGAgIDAAHFFDQAgASAEQf///79/cTYCiAEgAkEIaiADIAEQyAQgAigCCCEDIAEgASgCiAFBgICAwAByNgKIASACKAIMIQEM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QCAAKQMIIgNCA4NCAFINACADpyIBIAEoAgAiAkF/ajYCACACQQFHDQAgASABKAIQEMYkCyAAQSBqEPUSCyAAQShBCBCzFguJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABCeAwwDCyABIAAoAgAQngMMAgsgACABEMEPDAELIAAgARDbEgsgAEEoaiEAIAJBWGoiAg0ACwsLhwEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQVAwDCyABIAAoAgAQVAwCCyAAIAEQwg8MAQsgACABENwSCyAAQShqIQAgAkFYaiICDQALCwuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIABBBGooAgAgARC+AwwDCyAAKAIAIAEQvgMMAgsgACABEMMPDAELIAAgARDdEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQgCcMAwsgASAAKAIAEIAnDAILIAAgARChDwwBCyAAIAEQ3hILIABBKGohACACQVhqIgINAAsLC4ABAgF/An4CQCAAKQMAIgJCA4NCAFINACACpykDCCECCyAAKAIIIQECQCAAKQMQIgNCA4NCAFINACADpykDCCEDCyACp0Hdy92eeWwgAkIgiKdqQd3L3Z55bCABakHdy92eeWwgA6dqQd3L3Z55bCADQiCIp2pB3cvdnnlsQQ93rQuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIABBBGooAgAgARCkAgwDCyAAKAIAIAEQpAIMAgsgACABEMQPDAELIAAgARDfEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQpwEMAwsgASAAKAIAEKcBDAILIAAgARCjDwwBCyAAIAEQ4BILIABBKGohACACQVhqIgINAAsLC4kBAQF/AkAgACgCCCICRQ0AIAJBKGwhAiAAKAIEQQRqIQADQAJAAkACQAJAAkAgAEF8aigCAA4FBAABAgMECyAAKAIAQQFHDQMgASAAQQRqKAIAEOYBDAMLIAEgACgCABDmAQwCCyAAIAEQxQ8MAQsgACABEOESCyAAQShqIQAgAkFYaiICDQALCwuJAQEBfwJAIAAoAggiAkUNACACQShsIQIgACgCBEEEaiEAA0ACQAJAAkACQAJAIABBfGooAgAOBQQAAQIDBAsgACgCAEEBRw0DIAEgAEEEaigCABDRAQwDCyABIAAoAgAQ0QEMAgsgACABEMYPDAELIAAgARDiEgsgAEEoaiEAIAJBWGoiAg0ACwsLiQEBAX8CQCAAKAIIIgJFDQAgAkEobCECIAAoAgRBBGohAANAAkACQAJAAkACQCAAQXxqKAIADgUEAAECAwQLIAAoAgBBAUcNAyABIABBBGooAgAQqgEMAwsgASAAKAIAEKoBDAILIAAgARDHDwwBCyAAIAEQ4xILIABBKGohACACQVhqIgINAAsLC4UBAQN/IwBBEGsiAyQAAkAgAC0AAEEBRg0AIANBCGogACgCBCIEKAIAIAAtAAFBAUYQ0yYCQCADQQhqENEmIgUNACAAQQI6AAEgBCgCACABIAIQhyMiBQ0AIANBBDoACCADQQhqENEmIQULIANBEGokACAFDwtBoKacAUEoQZjPmwEQ0h4AC4kBAQJ/IwBBEGsiBCQAAkACQCABKAKIASIFQYAgcQ0AIAEgBUGAIHI2AogBIAQgAiADIAEQxxIgBCgCACECIAEgASgCiAFB/19xNgKIASAEKAIEIQEMAQsgBEEIaiACIAMgARDHEiAEKAIMIQEgBCgCCCECCyAAIAI2AgAgACABNgIEIARBEGokAAuOAQEBfyMAQSBrIgMkACADQQhqQQhqIAFBCGopAgA3AwAgAyABKAIQNgIYIAMgASkCADcDCAJAAkAgAigCiAEiAUGAgICAAXENACACIAFBgICAgAFyNgKIASAAIANBCGogAhC8KCACIAIoAogBQf////9+cTYCiAEMAQsgACADQQhqIAIQvCgLIANBIGokAAuOAQEBfyMAQSBrIgMkACADQQhqQQhqIAFBCGopAgA3AwAgAyABKAIQNgIYIAMgASkCADcDCAJAAkAgAigCiAEiAUGAgICAAXENACACIAFBgICAgAFyNgKIASAAIANBCGogAhC9KCACIAIoAogBQf////9+cTYCiAEMAQsgACADQQhqIAIQvSgLIANBIGokAAuMAQEDfyMAQRBrIgIkAAJAAkAgASgCiAEiA0HAgAZxQcCABkYNACABIANBwIAGcjYCiAEgAkEIaiABEMIYIAIoAgghBCABIAEoAogBIANBv/95cnE2AogBIAIoAgwhAQwBCyACIAEQwhggAigCBCEBIAIoAgAhBAsgACAENgIAIAAgATYCBCACQRBqJAALhwEBAn8jAEEQayICJAAgASgCACEDIAFBADYCAAJAAkAgAyABKAIEEOImIgEQ1SwNACACQQhqIAEQlhZBASEBAkACQCACLQAIQQFHDQAgACACKAIMNgIEDAELIAAgAi0ACToAAUEAIQELIAAgAToAAAwBCyAAQYAEOwEAIAEQ3CoLIAJBEGokAAt1AQF+AkACQCABrSACrX4iA0IgiKcNACADpyIBQXhLDQAgAUEHakF4cSIBIAJBCGpqIgIgAUkNAQJAIAJB+P///wdLDQAgACABNgIIIAAgAjYCBCAAQQg2AgAPCyAAQQA2AgAPCyAAQQA2AgAPCyAAQQA2AgALjgECA38BfiMAQSBrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCECECIANBADYCEAJAIAINACABQQA2AhggAUEBNgIMIAFBsIyeATYCCCABQgQ3AhAgAUEIakGov5wBEOkjAAsgAhECACEEIAAoAgQiAygCACkDABCrHyADKAIAIAQ3AwAgAUEgaiQAQQELeAECfyMAQRBrIgUkACAFQQhqIAIgAyAEIAIoAgARDQAgBSgCDCECIAUoAgghAyABIAEoAgBBAWoiBkF/IAYbNgIAIAFBfyABKAIEIgYgAiAEIANBAXEbaiIEIAQgBkkbNgIEIAAgAjYCBCAAIAM2AgAgBUEQaiQAC4IBAQN/IwBBEGsiAiQAIAAoAgAhA0EAIQAgASgCAEHhq5wBQQEgASgCBCgCDBELACEEIAJBADoACSACIAQ6AAggAiABNgIEA0AgAiADIABqNgIMIAJBBGogAkEMakGnARDDCyEBIABBAWoiAEGAAkcNAAsgARClIyEAIAJBEGokACAAC4EBAQF/IwBBEGsiBCQAAkACQCADDQBBACEADAELIAQgABCNDyIAIAIgAxDFEwJAIAEoAggiAyABKAIARw0AIAFBkM6DARCYHAsgASADQQFqNgIIIAEoAgQgA0EEdGoiASAEKQIANwIAIAFBCGogBEEIaikCADcCAAsgBEEQaiQAIAALgQEBAX8gACgCCCIBIAEoAgAiAUF/ajYCAAJAIAFBAUcNACAAKAIIIABBDGooAgAQ7hILIAAoAhAiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCEBCeEQsCQCAAQX9GDQAgACAAKAIEIgFBf2o2AgQgAUEBRw0AIABBFEEEELMWCwuEAQEEfwJAIAAtADRFDQAgAC0AOSECIAAtADohAwJAIAEoAggiBEUNACABKAIEIQEgBEECdCEEA0ACQCAALQA0QQFHDQAgASgCACEFIABBgQI7ADkgBSAAEMEBIABBgQI7ADkLIAFBBGohASAEQXxqIgQNAAsLIAAgAzoAOiAAIAI6ADkLC4cBACAAQQA2AjggAEIANwIwIABBADYCFCAAQoCAgIDAADcCDCAAQgA3AjwgACABKQIANwIAIAAgAikCADcCGCAAQcQAakEAOwEAIABBCGogAUEIaigCADYCACAAQSBqIAJBCGopAgA3AgAgAEEoaiACQRBqKQIANwIAQQBBCBCdLUEAQQQQnC0LfwECfwJAIAAoAgAiAkEDRw0AIAEgACgCEBDmAQJAIAAoAgwiAkUNACACQQR0IQMgACgCCEEMaiECA0AgASACKAIAEOYBIAJBEGohAiADQXBqIgMNAAsLIABBIGoQgyMPCyABIAAoAiAQ5gECQCACQQJJDQAgASAAKAIEEOYBCwt5AQN/QQAhAQJAIAAtAEUiAkEDRg0AIABBIGohAAJAIAJBAkYNAANAIAAoAiAiAC0AJUECRw0ACwsgACgCCCICRQ0AIAAoAgQhACACQThsQUhqIQIDQCAAEMoOIgENASAAQThqIQAgAiEDIAJBSGohAiADDQALCyABC4wBAAJAAkACQAJAAkACQAJAIAAoAgAOBwABAwQFAgYACyAAQQA6ABwgAEEgahC5Iw8LIABBBGogARDqGiAAQQA6ABwLDwsgACgCBCABEJATIABBGGoQuSMPCyAAQQRqIAEQgw8gAEEAOgAcDwsgACgCBCABEJATIAEgACgCCBDmAQ8LIAEgACgCBBDmAQuEAQECfyMAQTBrIgEkAAJAAkAgACgCACICDQBBACEAQQAhAgwBCyABIAI2AiQgAUEANgIgIAEgAjYCFCABQQA2AhAgASAAKAIEIgI2AiggASACNgIYIAAoAgghAkEBIQALIAEgAjYCLCABIAA2AhwgASAANgIMIAFBDGoQsSQgAUEwaiQAC4YBAQJ/IwBBEGsiAyQAAkACQCABKAKIASIEQYACcUUNACABIARB/31xNgKIASADQQhqIAIgARD3AiADKAIIIQIgASABKAKIAUGAAnI2AogBIAMoAgwhAQwBCyADIAIgARD3AiADKAIEIQEgAygCACECCyAAIAI2AgAgACABNgIEIANBEGokAAuGAQECfyMAQRBrIgMkAAJAAkAgASgCiAEiBEGAAnFFDQAgASAEQf99cTYCiAEgA0EIaiACIAEQ7AIgAygCCCECIAEgASgCiAFBgAJyNgKIASADKAIMIQEMAQsgAyACIAEQ7AIgAygCBCEBIAMoAgAhAgsgACACNgIAIAAgATYCBCADQRBqJAALhgEBAn8jAEEQayIDJAACQAJAIAEoAogBIgRBgAJxRQ0AIAEgBEH/fXE2AogBIANBCGogAiABEO4CIAMoAgghAiABIAEoAogBQYACcjYCiAEgAygCDCEBDAELIAMgAiABEO4CIAMoAgQhASADKAIAIQILIAAgAjYCACAAIAE2AgQgA0EQaiQAC4kBAQJ/IwBBEGsiAyQAAkACQCACKAKIASIEQYCAEHFFDQAgAiAEQf//b3E2AogBIANBCGogASACEMoeIAMoAgghASACIAIoAogBQYCAEHI2AogBIAMoAgwhAgwBCyADIAEgAhDKHiADKAIEIQIgAygCACEBCyAAIAE2AgAgACACNgIEIANBEGokAAuJAQECfyMAQRBrIgMkAAJAAkAgAigCiAEiBEGAgBBxRQ0AIAIgBEH//29xNgKIASADQQhqIAEgAhDLHiADKAIIIQEgAiACKAKIAUGAgBByNgKIASADKAIM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IgAgACgCACIBQX9qNgIAIAFBAUcNACAAIAAoAhAQxiQLC3UCAn8BfgJAIAApAxAiA1ANACADQgODQgBSDQAgA6ciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsCQCAAKQMAIgNCA4NCAFINACADpyIAIAAoAgAiAUF/ajYCACABQQFHDQAgACAAKAIQEMYkCwuCAQECfyMAQRBrIgIkAAJAAkAgASgCiAEiA0GAwABxDQAgASADQYDAAHI2AogBIAIgARBfIAIoAgAhAyABIAEoAogBQf+/f3E2AogBIAIoAgQhAQwBCyACQQhqIAEQXyACKAIMIQEgAigCCCEDCyAAIAM2AgAgACABNgIEIAJBEGokAAuBAQECfyMAQRBrIgIkAAJAAkAgASgCiAEiA0HAAHENACABIANBwAByNgKIASACIAEQwhggAigCACEDIAEgASgCiAFBv39xNgKIASACKAIEIQEMAQsgAkEIaiABEMIYIAIoAgwhASACKAIIIQMLIAAgAzYCACAAIAE2AgQgAkEQaiQAC4EBAQJ/IwBBEGsiAiQAAkACQCABKAKIASIDQcAAcQ0AIAEgA0HAAHI2AogBIAIgARD/CSACKAIAIQMgASABKAKIAUG/f3E2AogBIAIoAgQhAQwBCyACQQhqIAEQ/wkgAigCDCEBIAIoAgghAwsgACADNgIAIAAgATYCBCACQRBqJAALhAEBAn8jAEEQayIDJAAgA0EMaiABQQxqKAIANgIAIAMgASgCADYCACADIAEpAgQ3AgQCQAJAIAIoAogBIgFBgJyAgAJxIgRFDQAgAiABQf/j//99cTYCiAEgACADIAIQpxMgAiACKAKIASAEcjYCiAEMAQsgACADIAIQpxMLIANBEGokAAt8AQJ/IwBBMGsiASQAIAEgADYCDAJAIAAtAABBAkkNACABQQE2AhQgAUG0xoMBNgIQIAFCATcCHCABQZMBNgIsIAEgAUEoajYCGCABIAFBDGo2AiggAUEQakGox4MBEOkjAAsgACgCBCECIABBDEEEELMWIAFBMGokACACC30AAkAgBCgCAEGAgICAeEcNACAELQAEIQQgACABIAIQjBQgACAEQQNqOgAkIAAgAykCADcCDCAAQRRqIANBCGopAgA3AgAgAEEcaiADQRBqKQIANwIADwsgAEGAgICAeDYCACAAIAQpAgA3AgQgAEEMaiAEQQhqKQIANwIAC3IBAn8jAEEgayIBJAACQAJAIAAoAjBBAkcNACAAQTRqIQIMAQsgASAANgIIIAEgAEE0aiICNgIMIAEgAUEfajYCGCABIAFBDGo2AhQgASABQQhqNgIQIABBMGogAUEQakHs5ZgBELoGCyABQSBqJAAgAguQAQICfwF8IwBBkAFrIgIkAAJAAkAgASsDACIERAAAAAAAAAAAYQ0AAkACQCAEvUL///////////8Ag0L/////////9/8AVQ0AIAJBDGohASAEIAJBDGoQ+wEhAwwBCyACIAQQtB8gAigCBCEDIAIoAgAhAQsgACABIAMQuhkMAQsgACABEOsTCyACQZABaiQAC3gBBH8jAEEQayICJAAgAkEIakEAQQAgASgCCCIDQbyvmwEQ2x8gAigCDCEEIAEgAigCCCIFNgIIIAAgBDYCDCAAIAE2AgggACADIARrNgIQIAAgASgCBCIBIARB2ABsajYCBCAAIAEgBUHYAGxqNgIAIAJBEGokAAt2AQJ/IwBBEGsiBCQAIARBCGogAiADIAEoAggiBUG8r5sBENsfIAQoAgwhAyABIAQoAggiAjYCCCAAIAM2AgwgACABNgIIIAAgBSADazYCECAAIAEoAgQiASADQTBsajYCBCAAIAEgAkEwbGo2AgAgBEEQaiQAC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANB+LKbATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQZCzmwFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANBoLObATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQbizmwFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC3oCAX8BfiMAQRBrIgUkAAJAAkACQCAEQYA8cUGAPEcNACADRQ0BIAVBCGogASACQQEQiwIgBS0ACEEERg0BIAUpAwgiBkL/AYNCBFENASAAIAY3AgAMAgsgAEEEOgAADAELQaCmnAFBKEG4/JgBENIeAAsgBUEQaiQAC44BAQF/QQEhAQJAAkACQAJAAkACQAJAIAAoAgAOCAAEAQMGBgIFAAsgAC0AJCEBDAULIAAoAgQtABghAQwECyAAKAIELQAsIQEMAwtBACEBDAILQQEhASAALQAkDQEgACgCICgCGEGAgICAeEYhAQwBC0EBIQEgACgCBCIALQBQDQAgACgCACEBCyABQQFxC4gBAQF/IwBBIGsiAyQAIANBADYCCCADQoCAgIAQNwIAIANB5IecATYCECADQqCAgIAONwIUIAMgAzYCDAJAIAEgAiADQQxqEPgtRQ0AQYysnAFBNyADQR9qQfyHnAFBkK2cARDqEgALIAAgAykCADcCACAAQQhqIANBCGooAgA2AgAgA0EgaiQAC4YBAQF/IwBBIGsiAiQAIAJBADYCCCACQoCAgIAQNwIAIAJBvMGAATYCECACQqCAgIAONwIUIAIgAjYCDAJAIAEgAkEMahDVH0UNAEGMrJwBQTcgAkEfakHUwYABQZCtnAEQ6hIACyAAIAIpAgA3AgAgAEEIaiACQQhqKAIANgIAIAJBIGokAAuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQbzBgAE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQjh5FDQBBjKycAUE3IAJBH2pB1MGAAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkGoyIABNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEI4eRQ0AQYysnAFBNyACQR9qQcDIgAFBkK2cARDqEgALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC4sBAQJ/IwBBEGsiAiQAIAAoAgAhACABKAIAQYu5gwFBCCABKAIEKAIMEQsAIQMgAkEAOgANIAIgAzoADCACIAE2AgggAkEIakGEl4IBQQRB/JaCAUHKABC9CUGMlpsBQQRBoJeCAUHKABC9CUGbuYMBQQkgAEEoakHLABC9CRCUFSEBIAJBEGokACABC4gBAQF/IwBBEGsiAiQAAkACQAJAAkAgACgCACIAKAIADgMAAQIACyABKAIAQZ35gwFBAiABKAIEKAIMEQsAIQEMAgsgASgCAEGf+YMBQQMgASgCBCgCDBELACEBDAELIAIgAEEEajYCDCABQaL5gwFBByACQQxqQa4BEP8LIQELIAJBEGokACABC4EBAQR/IwBBEGsiAiQAQQAhAwJAIAEoAgQiBCgCfCIFQYCAgMAASQ0AAkAgARCHDkUNAEEBIQMMAQsgBCgCfCIFQYCAgMAASQ0AIAIgBa03AwhBxIicAUErIAJBCGpBuIOEAUHkhIQBEOoSAAsgACAFNgIEIAAgAzYCACACQRBqJAALeQECfwJAIAAoAggiASAAKAIARw0AIAAQshwLIAAgAUEBajYCCCAAKAIEIAFBDGxqIgJBADYCCCACQoCAgIDAADcCAAJAIAAoAhQiAiAAKAIMRw0AIABBDGoQsxwLIAAgAkEBajYCFCAAKAIQIAJBAnRqQQA2AgAgAQuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQdj7hwE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQ1ixFDQBBjKycAUE3IAJBH2pB8PuHAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALewEBfyMAQRBrIgMkACADIAI2AgwgAyABKAIAQQhqQfjymAEQgCIgAygCBCECAkACQCADKAIAIANBDGoQywoiAUUNACAAIAFBBGooAgAgAUEIaigCABC8CgwBCyAAQYCAgIB4NgIACyACIAIoAgBBf2o2AgAgA0EQaiQAC3sBAX8jAEEQayIDJAAgAyACNgIMIAMgASgCBEEIakHo85gBEIAiIAMoAgQhAgJAAkAgAygCACADQQxqEMsKIgFFDQAgACABQQRqKAIAIAFBCGooAgAQvAoMAQsgAEGAgICAeDYCAAsgAiACKAIAQX9qNgIAIANBEGokAAtzAgN/AX4jAEEgayIBJAAQhCghAiAALQAUIQMgACkCDCEEIAFBCGogABDJBSACIAEpAgg3AgAgASAENwIUIAJBCGogAUEIakEIaikCADcCACABIAM6ABwgAkEQaiABQQhqQRBqKQIANwIAIAFBIGokACACC3cCAX8BfgJAAkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgACkDACAAKQMQELMVDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAAQtBELC3wBAX8gACkDCCAAKQMYEKoUAkAgAC0ANEEDRg0AIABBIGoQ7RALAkAgACgCOCIBRQ0AIAEQtx8gASgCACABQQRqKAIAEJ8tIAFBFEEEELMWCwJAIAAoAjwiAEUNACAAEKEXIAAoAgAgAEEEaigCABCcLSAAQRRBBBCzFgsLhgEBAX8jAEEgayICJAAgAkEANgIIIAJCgICAgBA3AgAgAkH8g5kBNgIQIAJCoICAgA43AhQgAiACNgIMAkAgASACQQxqEJEeRQ0AQYysnAFBNyACQR9qQZSEmQFBkK2cARDqEgALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgAkEgaiQAC3UBAX8CQAJAIAAoAgAiAkEDRw0AIAEgACgCEBCeAyAAKAIMIgJFDQEgAkEEdCECIAAoAghBDGohAANAIAEgACgCABCeAyAAQRBqIQAgAkFwaiICDQAMAgsLIAEgACgCIBCeAyACQQJJDQAgASAAKAIEEJ4DCwt1AQF/AkACQCAAKAIAIgJBA0cNACAAKAIQIAEQvgMgACgCDCICRQ0BIAJBBHQhAiAAKAIIQQxqIQADQCAAKAIAIAEQvgMgAEEQaiEAIAJBcGoiAg0ADAILCyAAKAIgIAEQvgMgAkECSQ0AIAAoAgQgARC+AwsLdQEBfwJAAkAgACgCACICQQNHDQAgASAAKAIQEJAgIAAoAgwiAkUNASACQQR0IQIgACgCCEEMaiEAA0AgASAAKAIAEJAgIABBEGohACACQXBqIgINAAwCCwsgASAAKAIgEJAgIAJBAkkNACABIAAoAgQQkCALC3cCAX8BfgJAAkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgACkDACAAKQMQEMUVDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2AgAgAUEBRw0BIAAgACgCEBDGJA8LIAAQvBELC3UBAX8CQAJAIAAoAgAiAkEDRw0AIAEgACgCEBDRASAAKAIMIgJFDQEgAkEEdCECIAAoAghBDGohAANAIAEgACgCABDRASAAQRBqIQAgAkFwaiICDQAMAgsLIAEgACgCIBDRASACQQJJDQAgASAAKAIEENEBCwt1AQF/AkACQCAAKAIAIgJBA0cNACAAKAIQIAEQggMgACgCDCICRQ0BIAJBBHQhAiAAKAIIQQxqIQADQCAAKAIAIAEQggMgAEEQaiEAIAJBcGoiAg0ADAILCyAAKAIgIAEQggMgAkECSQ0AIAAoAgQgARCCAwsLdQEBfwJAAkAgACgCACICQQNHDQAgACgCECABEPkCIAAoAgwiAkUNASACQQR0IQIgACgCCEEMaiEAA0AgACgCACABEPkCIABBEGohACACQXBqIgINAAwCCwsgACgCICABEPkCIAJBAkkNACAAKAIEIAEQ+QILC3UBAX8CQAJAIAAoAgAiAkEDRw0AIAEgACgCEBCqASAAKAIMIgJFDQEgAkEEdCECIAAoAghBDGohAANAIAEgACgCABCqASAAQRBqIQAgAkFwaiICDQAMAgsLIAEgACgCIBCqASACQQJJDQAgASAAKAIEEKoBCwt5AQF/IwBBEGsiBCQAAkACQCACIANB5LObAUEeEOMlRQ0AQQEhAwwBCyAEQQhqIAEoAgAoAgBBqJmcARCiKwJAIARBCGoQ0SYiAkUNAEECIQMgAiEBDAELIABBAToAAUEAIQMLIAAgATYCBCAAIAM6AAAgBEEQaiQAC30BAn8gAygCiAEiBEGAAnEhBQJAAkAgAUEBcQ0AIAVFDQEgAyAEQf99cTYCiAEgACACIAMQrysgAyADKAKIAUGAAnI2AogBDwsgBQ0AIAMgBEGAAnI2AogBIAAgAiADEK8rIAMgAygCiAFB/31xNgKIAQ8LIAAgAiADEK8rC30BAn8gAygCiAEiBEGAAXEhBQJAAkAgAUEBcQ0AIAVFDQEgAyAEQf9+cTYCiAEgACACIAMQiBUgAyADKAKIAUGAAXI2AogBDwsgBQ0AIAMgBEGAAXI2AogBIAAgAiADEIgVIAMgAygCiAFB/35xNgKIAQ8LIAAgAiADEIgVC3YCA38BfiMAQRBrIgMkACABKAIUIQQgASgCECEFIAMgAUEIahDxFSADQQhqIAIgBSAEIAMoAgAgAygCBBCFDwJAAkAgAy0ACEEERg0AIAMpAwgiBkL/AYNCBFENACAAIAY3AgAMAQsgAEEEOgAACyADQRBqJAALegEBfyAAKAIIQShsIQIgACgCBCEAAkADQCACRQ0BAkACQAJAAkACQCAAKAIADgUEAAECAwQLIABBBGogARDZJwwDCyAAQQRqIAEQlS8MAgsgAEEEaiABEJ4vDAELIABBBGogARD4EwsgAEEoaiEAIAJBWGohAgwACwsLZQEDf0EAIQMCQCABRQ0AA0ACQCABQQFLDQAgACADQQxsaigCACIBIAJGDQIgAyABIAJJaiEDDAILIAMgAUEBdiIEIANqIgUgACAFQQxsaigCACACSxshAyABIARrIQEMAAsLIAMLdgEBfyAAKAIIQThsIQIgACgCBCEAA0ACQAJAIAJFDQACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABENInIABBKGogARC0LwwDCyAAQTBqIAEQwCoMAgsgAEEEaiABEIcwDAELDwsgAEE4aiEAIAJBSGohAgwACwt6AQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgAEEEaiABENsnDAMLIABBBGogARCTLwwCCyAAQQRqIAEQoC8MAQsgAEEEaiABEPsTCyAAQShqIQAgAkFYaiECDAALCwt6AQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQAJAAkACQAJAIAAoAgAOBQQAAQIDBAsgAEEEaiABENonDAMLIABBBGogARCULwwCCyAAQQRqIAEQny8MAQsgAEEEaiABEPwTCyAAQShqIQAgAkFYaiECDAALCwtuAQJ/IAAoAiAhAiAAKAIcIQMCQAJAIAAoAgBBAUcNACACQTBsIQADQCAARQ0CIAEgAxDcJyAAQVBqIQAgA0EwaiEDDAALCyACQThsIQADQCAARQ0BIAMgARCfIiAAQUhqIQAgA0E4aiEDDAALCwuGAQEBfyMAQSBrIgIkACACQQA2AgggAkKAgICAEDcCACACQeSrnAE2AhAgAkKggICADjcCFCACIAI2AgwCQCABIAJBDGoQ9C5FDQBBjKycAUE3IAJBH2pB/KucAUGQrZwBEOoSAAsgACACKQIANwIAIABBCGogAkEIaigCADYCACACQSBqJAALdQEDfyMAQRBrIgMkACADQQRqIAJBAUEBEJUPIAMoAgghBAJAIAMoAgRBAUYNACADKAIMIQUCQCACRQ0AIAUgASAC/AoAAAsgACACNgIIIAAgBTYCBCAAIAQ2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ACgCABCjLSABQRxBBBCzFg8LIAFBBGoiACgCACABQQhqKAIAEKweIAEoAgAgACgCABCjLSABQRhBBBCzFgtsAQN/IwBBEGsiAiQAIAJBCGogASgCDBDJAyACKAIMIQMCQAJAIAEoAgBBAUYNACACKAIIIQEMAQsgASgCBCIEIAMgBCADSRshASAEIAMgBCADSxshAwsgACABNgIAIAAgAzYCBCACQRBqJAALbAEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCEHAsgACADQQFqNgIIIAAoAgQgA0EFdGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgAgAEEYaiABQRhqKQIANwIAC28BAX8CQCAAKAIIIgIgACgCAEcNACAAQbDMgAEQxx0LIAAgAkEBajYCCCAAKAIEIAJBBXRqIgAgASkDADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDAAtvAQF/AkAgACgCCCICIAAoAgBHDQAgAEHsyYABEMcdCyAAIAJBAWo2AgggACgCBCACQQV0aiIAIAEpAwA3AwAgAEEIaiABQQhqKQMANwMAIABBEGogAUEQaikDADcDACAAQRhqIAFBGGopAwA3AwALcQEDfyMAQRBrIgMkACADQQRqIAIQrRIgAygCCCEEAkAgAygCBEEBRg0AIAMoAgwhBQJAIAJFDQAgBSABIAL8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAAPCyAEIAMoAgxBwLycARCOKQALbQEBfyMAQSBrIgUkAAJAIAIgA08NACAFQQA2AhggBUEBNgIMIAVB0JmcATYCCCAFQgQ3AhAgBUEIaiAEEOkjAAsgACADNgIEIAAgATYCACAAIAIgA2s2AgwgACABIANBAnRqNgIIIAVBIGokAAttAQF/IwBBIGsiBSQAAkAgAiADTw0AIAVBADYCGCAFQQE2AgwgBUHQmZwBNgIIIAVCBDcCECAFQQhqIAQQ6SMACyAAIAM2AgQgACABNgIAIAAgAiADazYCDCAAIAEgA0ECdGo2AgggBUEgaiQAC20BAX8jAEEgayIFJAACQCACIANPDQAgBUEANgIYIAVBATYCDCAFQdCZnAE2AgggBUIENwIQIAVBCGogBBDpIwALIAAgAzYCBCAAIAE2AgAgACACIANrNgIMIAAgASADQQJ0ajYCCCAFQSBqJAALaAEDfwJAIAEgACgCCCICTQ0AIAAgASACayIDEIMlIANBf2ohASAAKAIEIAAoAggiBEECdGohAgJAA0AgAkEANgIAIAFFDQEgAUF/aiEBIAJBBGohAgwACwsgBCADaiEBCyAAIAE2AggLbAECf0EAIQNBACEEAkACQCACRQ0AIAJBf2oiBCABTw0BIAAgBGotAABB2LSEAWotAAAhBAsCQCACIAFPDQAgACACai0AAEHYtIQBai0AACEDCyAEIANzQX9zQQFxDwsgBCABQbithAEQkRUAC2wBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQjRwLIAAgA0EBajYCCCAAKAIEIANBHGxqIgAgASkCADcCACAAQQhqIAFBCGopAgA3AgAgAEEQaiABQRBqKQIANwIAIABBGGogAUEYaigCADYCAAtsAQF/AkAgACgCCCIDIAAoAgBHDQAgACACEI0cCyAAIANBAWo2AgggACgCBCADQRxsaiIAIAEpAgA3AgAgAEEIaiABQQhqKQIANwIAIABBEGogAUEQaikCADcCACAAQRhqIAFBGGooAgA2AgALZwEBfyMAQTBrIgQkACAEQSBqIAFCACAAQgAQ6RIgBEEQaiACQgAgAEIAEOkSIAQgBCkDKCIAIAQpAxB8IgEgBCkDGCABIABUrXwgA0H/AHFBwABzEJEWIAQpAwAhACAEQTBqJAAgAAtnAQF/IwBBMGsiBCQAIARBIGogAUIAIABCABDpEiAEQRBqIAJCACAAQgAQ6RIgBCAEKQMoIgAgBCkDEHwiASAEKQMYIAEgAFStfCADQf8AcUHAAHMQkRYgBCkDACEAIARBMGokACAAC38BAn8jAEEQayIEJABBAEEAKAK88J4BIgVBAWo2ArzwngECQCAFQQBIDQACQAJAQQAtAKDwngENAEEAQQAoApzwngFBAWo2ApzwngFBACgCxOyeAUF/Sg0BDAILIARBCGogACABEQYAAAtBAEEAOgCg8J4BIAJFDQAQxDAACwALbwIBfwF+AkACQAJAAkAgAC0ALEF9aiIBQQEgAUH/AXFBA0kbQf8BcQ4CAQIACyAAEJIUDwsgACkDACICQgODQgBSDQEgAqciACAAKAIAIgFBf2o2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AgQgAiAANgIAIAJBAzYCDCACQdi8gAE2AgggAkICNwIUIAJBC61CIIYiAyACQQRqrYQ3AyggAiADIAKthDcDICACIAJBIGo2AhAgAkEIakGs0YQBEOkjAAt2AQJ/IwBBEGsiAiQAAkACQAJAAkAgAUIBVg0AIAGnDgIBAgELQQEhAyACQQE6AAAgAiABNwMIIAAgAkGo0oABQbDSgAEQ0xU2AgQMAgtBACEDIABBADoAAQwBCyAAQQE6AAFBACEDCyAAIAM6AAAgAkEQaiQAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcCGggE2AgggA0ICNwIUIANBC61CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEOkjAAtpAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0HghoIBNgIIIANCAjcCFCADQQutQiCGIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhDpIwALaQIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANBlIeCATYCCCADQgI3AhQgA0ELrUIghiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQ6SMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQfiHggE2AgggA0ICNwIUIANBC61CIIYiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEOkjAAtnAQF/IwBBEGsiBCQAAkACQCAADQBBACEAIARBDGohAwwBCyAEIAI2AgwgACADbCEAIARBCGohAwsgAyAANgIAAkAgBCgCDCIARQ0AIAQoAggiA0UNACABIAMgABCzFgsgBEEQaiQAC2sBAX8jAEEQayIDJAAgA0EANgIMIANCgICAgBA3AgQgA0EEaiACEIQlAkAgAkUNAANAIANBBGogARDAFyACQX9qIgINAAsLIAAgAykCBDcCACAAQQhqIANBBGpBCGooAgA2AgAgA0EQaiQAC28BAn8jAEEQayIDJAACQAJAIAEoAgAgASgCCCIETQ0AIANBCGogASAEQQRBBBC6DiADKAIIIgRB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Qb4FEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGu+5oBQRIgAkEMakHWBhD/CyEADAELIAIgAzYCCCABQdT1mgFBCyACQQhqQdcGEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQRqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUHfu5wBQQQgAkEMakH3BBD/CyEADAELIAIgAzYCCCABQfCKmwFBByACQQhqQeQGEP8LIQALIAJBEGokACAAC24BAn8jAEEQayICJAAgACgCACIAQQhqIQMCQAJAIAAoAgBBAUcNACACIAM2AgwgAUGYnJsBQQMgAkEMakHCBhD/CyEADAELIAIgAzYCCCABQb67nAFBBSACQQhqQfoEEP8LIQALIAJBEGokACAAC2QBAn8CQCAAQgODQgBSDQAgAKciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsCQCABQgODQgBSDQAgAaciAiACKAIAIgNBf2o2AgAgA0EBRw0AIAIgAigCEBDGJAsLdwEBfyMAQRBrIgIkACACIABBOGo2AgwgAUH5jpsBQRFB1ZybAUEEIABBkwdBtJybAUEEIABBMGpBiwJBio+bAUEFIABBPGpBlAdBj4+bAUEMIABByABqQbkFQZuPmwFBCSACQQxqQakFEKkMIQAgAkEQaiQAIAALbgECfyMAQRBrIgIkACAAKAIAIgBBBGohAwJAAkAgACgCAEEBRw0AIAIgAzYCDCABQd+7nAFBBCACQQxqQfcEEP8LIQAMAQsgAiADNgIIIAFB2ZybAUEMIAJBCGpBlwUQ/wshAAsgAkEQaiQAIAALbwICfwF+IAApAwghAwJAAkAgACgCAA0AIANCA4NCAFINASADpyIBIAEoAgAiAkF/ajYCACACQQFHDQEgASABKAIQEMYkDAELIAMgACkDGBCqFAsCQCAAKAIoIgBFDQAgABCvASAAQcAAQQgQsxYLC2cBA38jAEEQayICJAACQAJAIAEtAOABIgNBEkYNAEEAIQFBACEEIANBPkcNARDLLQALIAJBCGogAUEAQQEQ9w8gAigCCEEBcSEEIAIoAgwhAQsgACABNgIEIAAgBDYCACACQRBqJAALcQEBfwJAAkACQCAAKAIYIgINACAALQAURQ0CIAEoAhwgASgCICAAKAIMEPkTIQAMAQsgASACQQRqKAIAIAJBCGooAgAQyh8gAC0AFEEBRw0BIAEoAhwgASgCICACKAIEQX9qEOgSIQALIAEgABDdJgsLbwECfyACKAKIASIDQSBxIQQCQAJAIAENACAERQ0BIAIgA0FfcTYCiAEgACACENcBIAIgAigCiAFBIHI2AogBDwsgBA0AIAIgA0EgcjYCiAEgACACENcBIAIgAigCiAFBX3E2AogBDwsgACACENcBC2wBBX8gACgCCCEBIAAoAgQiAiEDAkADQCABRQ0BAkAgAygCACIEQYCAgIB4Rg0AIANBBGooAgAiBSADQQhqKAIAEKYjIAQgBRDjLAsgAUF/aiEBIANBIGohAwwACwsgACgCACACQQRBIBCTFQtqAQF/IABBJGohAAJAA0AgAUUNASAAQWBqIgIoAgAgAEFkaigCABChIyAAQVxqKAIAIAIoAgAQ1ywgAEFoahDXJQJAIAAoAgBBgICAgHhGDQAgABDXJQsgAUF/aiEBIABBwABqIQAMAAsLC3ABAn8CQAJAIAEoAgQiAg0AQQAhAQwBCyAAIAEoAgAiA0EQaigCACADQRRqKAIAIAJB1JGEARDAJSICKAAANgABIAEgAigABSIDNgIEIAAgAzYABiAAQQVqIAJBBGotAAA6AABBASEBCyAAIAE6AAALawEBfyMAQTBrIgIkACACQQI2AgwgAkGE6pgBNgIIIAJCAjcCFCACQQs2AiwgAkELNgIkIAIgADYCICACIABBBGo2AiggAiACQSBqNgIQIAEoAgAgASgCBCACQQhqEN8FIQAgAkEwaiQAIAALZwEDfyMAQRBrIgIkACAAIAEoAgQgASgCAGsQ+CQgACgCCCEDIAAoAgQhBAJAA0AgAkEIaiABEKkfIAItAAhFDQEgBCADaiACLQAJOgAAIANBAWohAwwACwsgACADNgIIIAJBEGokAAttAQF/IwBBMGsiAyQAIAMgAjYCBCADIAE2AgAgA0ECNgIMIANB2MWYATYCCCADQgI3AhQgA0EUNgIsIANB1AA2AiQgAyAANgIgIAMgA0EgajYCECADIAM2AiggA0EIahDWHyECIANBMGokACACC4MBAQF/AkACQAJAAkACQAJAAkAgACgC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IQMMAQsCQCABQYAQTw0AQQIhAwwBC0EDQQQgAUGAgARJGyEDCyAAIAMQ+CQgASAAKAIEIAAoAghqEOYNIAAgAyACajYCCAtZAQF/IwBBIGsiAiQAIAJBADYCECACQQhqIAEgAkEQahDVGyACQRRqIAIoAgggAigCDBCJGCAAQQhqIAJBFGpBCGooAgA2AgAgACACKQIUNwIAIAJBIGokAAtaAQF/IwBBMGsiAyQAIAMgATYCDCADIAA2AgggA0EBNgIUIANBnL+cATYCECADQgE3AhwgA0EMrUIghiADQQhqrYQ3AyggAyADQShqNgIYIANBEGogAhDpIwALXQEBfyMAQSBrIgIkACACQQA6ABggAiABNgIUIAIgADYCECACQQE2AgwgAiACQQxqNgIcIAJBHGpBkNWAARABIQECQCACKAIMRQ0AIAJBEGoQ5ScLIAJBIGokACABC5ABACAAQcgAakH4ABDyFSAAQdQAakEhEPIVIABB4ABqQT4Q8hUgAEL8gICA4As3AkAgAEL8gICAwA83AjggAELbgICA0As3AjAgAEKngICA4As3AiggAEKugICAgAw3AiAgAEKsgICA4A43AhggAELegICA4Ac3AhAgAEKrgICAoAc3AgggAEKtgICAwA83AgALWgECfwJAIAAoAgwiAyAAKAIAIgRHDQAgACACELsOIAAoAgAhBCAAKAIMIQMLIAAgA0EBajYCDCAAKAIEIAAoAgggA2oiAEEAIAQgACAESRtrQQJ0aiABNgIAC2YBAX8jAEEQayICJAAgAiAAQYICajYCDCABQbmXgAFBDkGtl4ABQQcgAEEsQZyXgAFBBSAAQYACakEqQbSXgAFBBSAAQYECakEqQceXgAFBBSACQQxqQSQQ4wwhACACQRBqJAAgAAthAQJ/AkAgAigCACABKAIAIAFBfGoiAygCABDfIUUNACABKAIAIQQCQANAIAMiAUEEaiABKAIANgIAIAEgAEYNASACKAIAIAQgAUF8aiIDKAIAEN8hDQALCyABIAQ2AgALC2QBAX8jAEEQayICJAAgAiAAQRRqNgIMIAFBtLmDAUEJQZO5gwFBCCAAQQxqQTBB0buDAUEHIABBxABB2LuDAUEIIABBEGpBIUHgu4MBQQkgAkEMakEzEOMMIQAgAkEQaiQAIAALVwEBfyMAQRBrIgUkAAJA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IgRLDQACQCADIARJDQBBASECIAFBAToAAAwBC0EBIQIgASADQQFqOgABCyAAIAM6AAEgACACOgAAC10BAX9BASEDAkACQCABQf8BcUEBRg0AIAFBASACKAIIGyEDDAELIAJBADYCCCACQQRBBBCSHiACEKsMCyAAIAM6AAwgACACKQIANwIAIABBCGogAkEIaigCADYCAAtdAQR/IwBBEGsiAyQAIANBCGogAkHAvJwBEMsYIAMoAgghBCADKAIMIQUCQCACQQJ0IgZFDQAgBSABIAb8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAALYwEBfyMAQRBrIgIkAAJAAkAgACgCACIAKAIAQQNGDQAgAiAANgIMIAFBgbCcAUEEIAJBDGpB/QAQ/wshAQwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQELIAJBEGokACABC2MBAX8jAEEQayICJAACQAJAIAAoAgAiACgCAEECRg0AIAIgADYCDCABQYGwnAFBBCACQQxqQf8AEP8LIQEMAQsgASgCAEH9r5wBQQQgASgCBCgCDBELACEBCyACQRBqJAAgAQtlAQF/IwBBEGsiAiQAIAIgACgCACgCACIAQdgAajYCDCABQbjbgwFBCkGNuIQBQQYgAEEIakGHAUH4mZsBQQUgAEHMAGpBiAFBwtuDAUELIAJBDGpBiQEQpg0hACACQRBqJAAgAAtjAQF/IwBBEGsiAiQAIAIgASgCAEH+2oMBQQcgASgCBCgCDBELADoACCACIAE2AgQgAkEAOgAJIAJBADYCACACIAAoAgA2AgwgAiACQQxqQbYBENULEKwRIQEgAkEQaiQAIAELYgECfyAAKAIAIAAoAgQQ3ywgACgCECIBIAAoAhQQpyMgACgCDCABEOMsIAAoAhggACgCHBDfLAJAIAAoAigiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgAEEoahDQEgsLYAEBfyMAQRBrIgIkAAJAAkAgACgCAEEBRw0AIAIgAEEEajYCDCABQYGwnAFBBCACQQxqQTMQ/wshAAwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQALIAJBEGokACAAC2MBAX8jAEEQayICJAAgAiABKAIAQebZgwFBCSABKAIEKAIMEQsAOgAIIAIgATYCBCACQQA6AAkg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ACAFNgIEIAAgBDYCACADQRBqJAALVQECfyMAQRBrIgQkACAEQQA2AgwgBCADIARBDGoQ3BEgASACIAQoAgAgBCgCBCIDEOolIQUgACACIANrNgIEIAAgASADakEAIAUbNgIAIARBEGokAAtdAQJ/AkACQAJAIAEoAgAiAiABKAIERw0AQQAhAgwBCyABIAJBCGo2AgAgASgCCCIDIAEoAgxPDQEgASADQQFqNgIICyAAIAI2AgQgACADNgIADwtB4NqDARDSLAALYAEBfyMAQRBrIgIkACAAKAIAIQAgAiABKAIAQajBgwFBCyABKAIEKAIMEQsAOgAMIAIgATYCCCACQQA6AA0gAkEANgIEIAJBBGogAEGqARDVCxCsESEBIAJBEGokACABC1oBAX9BASEDAkAgAiABRg0AAkACQAJAIAIgAU8NACAAIAJqIgEtAABBdmoOBAIBAQMBCyACIAFBqK2EARCRFQALQQAPCyACRQ0AIAFBf2otAABBDUchAwsgAwthAQF/IwBBEGsiAiQAAkACQCAAKAIAIgAoAgBFDQAgAiAANgIMIAFBgbCcAUEEIAJBDGpBuAEQ/wshAQwBCyABKAIAQf2vnAFBBCABKAIEKAIMEQsAIQELIAJBEGokACABC1MAIAAoAgxBDGwgACgClAFBA3RqIAAoAkQgACgCOGogACgCVGogACgCYGpBAnRqIAAoAqQBaiAAKAJoaiAAKAKIASAAKAJ8aiAAKAKYAWpBAnRqC14BAX8jAEEQayICJAACQCABKAIgRQ0AQcyghAEQ0hoACyABQX82AiAgAkEANgIMIAJCgICAgMAANwIEIAAgAUEkaiACQQRqEIQfIAEgASgCIEEBajYCICACQRBqJAALUwACQAJAIAFFDQACQAJAIAMgAUsNACADIAFHDQEMAgsgAiABaiwAAEG/f0oNAQtBACECDAELIAIgAWohAiADIAFrIQELIAAgATYCBCAAIAI2AgALXAEDfyMAQRBrIgMkACADQQhqIAJBAUEBQcC8nAEQsBkgAygCCCEEIAMoAgwhBQJAIAJFDQAgBSABIAL8CgAACyAAIAI2AgggACAFNgIEIAAgBDYCACADQRBqJAALXAEDfyMAQRBrIgMkACADQQhqIAJBAUEBQcC8nAEQsRkgAygCCCEEIAMoAgwhBQJAIAJFDQAgBSAB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IQEMAQsgACABEO0JDwsgACABIAIQwBgLWAICfwJ+IwBBEGsiAiQAIAEoAtgBIQMgAiABEMgRIAEQoQsgAikDACEEIAIpAwghBSAAIAM2AgggACAFNwMQIAAgBDcDACAAIAEoAtQBNgIMIAJBEGokAAtUAQJ/AkAgAEH/AXFBA0cNACABKAIAIQICQCABKAIEIgAoAgAiA0UNACACIAMRAwALAkAgACgCBCIDRQ0AIAIgAyAAKAIIELMWCyABQQxBBBCzFgsLTwEDfyMAQRBrIgIkAEEAIQNBACEEAkAgASgCAEECRg0AIAJBCGogARDFFCACKAIMIQMgAigCCCEECyAAIAM2AgQgACAENgIAIAJBEGokAAtPAQN/IwBBEGsiAiQAQQAhA0EAIQQCQCABKAIAQQdGDQAgAkEIaiABEK4PIAIoAgwhAyACKAIIIQQLIAAgAzYCBCAAIAQ2AgAgAkEQaiQAC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARDtCQ8LIAAgASACELoZC0sBA38jAEEQayICJAAgAkEIaiABKAIAEMkDIAAgAigCDCIDIAEoAgwiBCADIARJGyADIAQgAyAESxsQyh8gASAAEJUvIAJBEGokAAtQAQF/AkADQCAALQAlQQJGDQEgACgCICEADAALCyAAKAIIQThsIQIgACgCBCEAAkADQCACRQ0BIAAgARCfIiACQUhqIQIgAEE4aiEADAALCwtQAQF/AkADQCAALQAlQQJGDQEgACgCICEADAALCyAAKAIIQThsIQIgACgCBCEAAkADQCACRQ0BIAAgARCrESACQUhqIQIgAEE4aiEADAALCwtPAQJ/EPIoGiABKAIIQThsIQIgASgCBCEBAkADQCACRQ0BIAEgABCOFgJAIAEoAjAiA0UNACADIAAQ+AMLIAFBOGohASACQUhqIQIMAAsLC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARDtCQ8LIAAgASACEMQYC0oBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASAAQQFqIQAg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IgBBgYCAgHhGDQAgACABKAIMQYzsmAEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQRgQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQbjemAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQZz2mAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfz1mAEQjikACyABQRBqJAALSQEBfyMAQRBrIgUkACAFQQhqIAAgASACIAMgBBD7CAJAIAUoAggiBEGBgICAeEYNACAEIAUoAgxBxISeARCOKQALIAVBEGokAAtHACAAKQMIIAApAxgQpi4CQCAALQA0QQNGDQAgAEEgahCJIgsgAEE4ahDlKQJAIAAoAjwiAEUNACAAEPwqIABBFEEEELMWCwtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBOBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBsNSbARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBCBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjNubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBDBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjPCbARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQRBEBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBOBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBxNibARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBKBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBOBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtIAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhB0AAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTAQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRAQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfienAEQjikACyABQRBqJAALSAEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQcAAEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0cBAX8jAEEQayICJAAgAkEIaiAAIAAoAgBBCEEgEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0sBAX8jAEEQayIBJAAgAUEIaiAAIAAoAgBBCEHYABCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB9N+bARCOKQALIAFBEGokAAtIAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhB2AAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQSgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdjgmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQwQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdDemwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQSgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQeTYmwEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdDemwEQjikACyABQRBqJAALSAEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQcgAEJYKAkAgAigCCCIAQYGAgIB4Rg0AIAAgAigCDCABEI4pAAsgAkEQaiQAC0sBAX8jAEEQayIBJAAgAUEIaiAAIAAoAgBBCEHAABCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBjLecARCOKQALIAFBEGokAAtCAQF/IwBBEGsiAiQAAkAgAUUNACACQQRqQQxBCCABQQFqENoRIAAgAigCDGsgAigCBCACKAIIEJMpCyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEIQTgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQYCumgEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQTAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEEQQQQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQRQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQfibmwEQjikACyABQRBqJAALRwEBfyMAQRBrIgIkACACQQhqIAAgACgCAEEIQRAQlgoCQCACKAIIIgBBgYCAgHhGDQAgACACKAIMIAEQjikACyACQRBqJAALRgADQAJAAkACQCAALQAlQQJGDQAgAC0AJEUNAiABLQA0DQIMAQsgASAAEIoECw8LIAEgAEEIakEAEIEQIAAoAiAhAAwACwtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBPBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB7IKbARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQhBGBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB+JubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBEBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxB/NqbARCOKQALIAFBEGokAAtHAQF/IwBBEGsiAiQAIAJBCGogACAAKAIAQQhBOBCWCgJAIAIoAggiAEGBgICAeEYNACAAIAIoAgwgARCOKQALIAJBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBBBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBgOubARCOKQALIAFBEGokAAtKAQF/IwBBEGsiASQAIAFBCGogACAAKAIAQQRBBBCWCgJAIAEoAggiAEGBgICAeEYNACAAIAEoAgxBqOebARCOKQALIAFBEGokAAtHAQJ/AkACQCABKAIYDQBBACEBDAELIAEQqBMhAiABIAEoAhhBf2o2AhggAkF4aiEDIAJBaGohAQsgACADNgIEIAAgATYCAAtEAQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQCAAKAIAQQdGDQAgACABEK4aCyAAQShqIQAgAkFYaiECDAALCwtEAQF/IAAoAghBKGwhAiAAKAIEIQACQANAIAJFDQECQCAAKAIAQQdGDQAgACABEI4WCyAAQShqIQAgAkFYaiECDAALCwtHAQF/AkBBCEHAABD/KyIBDQAACyABQRY2AgAgASAAKQIANwIEIAFBDGogAEEIaikCADcCACABQRRqIABBEGooAgA2AgAgAQtIAgF/AX4gACABIAEpAwBCfnwiA0ICIANCAlQbp0ECdCICQZzfngFqKAIAaigCADYCBCAAIAEgAkGQ354BaigCAGooAgA2AgALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQaSFnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQQQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdiEnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQcyUnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQgQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQdyUnAEQjikACyABQRBqJAALSgEBfyMAQRBrIgEkACABQQhqIAAgACgCAEEEQQwQlgoCQCABKAIIIgBBgYCAgHhGDQAgACABKAIMQZSZnAEQjikACyABQRBqJAALSAEEf0EBIQICQCAAQQRqIgMgASgCACIEIAEoAgQiBRCfAg0AIAEgACgCACIAKAIAIAAoAgQQggYNACADIAQgBRD0JSECCyACC0cBAX8jAEEQayICJAAgAiAAQQFqNgIMIAFBkJeAAUEMQZyXgAFBBSAAQSpBkLWbAUEGIAJBDGpBKxD3DSEAIAJBEGokACAAC0cBAX8jAEEQayICJAAgAiAAQQFqNgIMIAFB2ZeAAUENQZyXgAFBBSAAQSpBtJeAAUEFIAJBDGpBJBD3DSEAIAJBEGokACAAC0gBAX8jAEEQayICJAAgAiAAQQRqNgIMIAFBvImcAUEJQcWJnAFBCyAAQSFB0ImcAUEJIAJBDGpBxwAQ9w0hACACQRBqJAAgAAtJAQF/IwBBEGsiAiQAIAIgAEEEajYCDCABQaiXggFBBkGul4IBQQQgAEHNAEHgu4MBQQkgAkEMakHOABD3DSEAIAJBEGokACAAC0gBBH9BASECAkAgAEEEaiIDIAEoAgAiBCABKAIEIgUQnwINACABIAAoAgAiACgCBCAAKAIIEIIGDQAgAyAEIAUQ9CUhAgsgAgtJAQF/IwBBEGsiAiQAIAIgAEEMajYCDCABQaDWgAFBB0G8j5kBQQcgAEHcAEGt1JgBQQQgAkEMakHdABD3DSEAIAJBEGokACAAC0oBAX8CQCAALQAAQYABRw0AIAEoAgAgACgCBCABKAIEKAIQEQcADwsgASgCACAAIAAtAAoiAmogAC0ACyACayABKAIEKAIMEQsAC0kCAn8BfCABKAIIIgJBgICAAXEhAyAAKwMAIQQCQCACQYCAgIABcQ0AIAEgBCADQQBHQQAQgAUPCyABIAQgA0EARyABLwEOEGULQQECfyAAIAIgAWsiAkECdiIDEIMlIAAoAgghBAJAIAJFDQAgACgCBCAEQQJ0aiABIAL8CgAACyAAIAQgA2o2AggLPAEDfgJAIANFDQAgACABrUIghiACrSIEhCADrSIFgCIGPgIAIAAgBCAGIAV+fT4CBA8LQazCggEQ5SEAC0QAAkACQCABKQMAQgKFIAEpAwiEUA0AIAAoAvACQQJGDQEgACABENMKIABBwAFqIAFBkAVqENMKCw8LQfjqgwEQ0iwAC0oBAX8jAEEQayICJAAgAiAAQbANajYCDCABQfumgwFBDUH3poMBQQQgAEGLAUGEuIQBQQMgAkEMakGDARD3DSEAIAJBEGokACAAC0kBAX8jAEEQayICJAAgAiAANgIMIAFB7aSDAUEDQYS4hAFBAyAAQQRqQZkBQfCkgwFBCiACQQxqQZoBEPcNIQAgAkEQaiQAIAALSQEBfyMAQRBrIgIkACACIAA2AgwgAUHtpIMBQQNBhLiEAUEDIABBBGpBnAFB8KSDAUEKIAJBDGpBmgEQ9w0hACACQRBqJAAgAAtJAQF/IwBBEGsiAiQAIAIgADYCDCABQe2kgwFBA0GEuIQBQQMgAEEEakGdAUHwpIMBQQogAkEMakGaARD3DSEAIAJBEGokACAAC0oBAX8jAEEQayICJAAgAiAAQcgAajYCDCABQe2kgwFBA0GEuIQBQQMgAEGeAUHwpIMBQQogAkEMakGaARD3DSEAIAJBEGokACAAC0oBAX8jAEEQayICJAAgAiAAQZADajYCDCABQe2kgwFBA0GEuIQBQQMgAEGfAUHwpIMBQQogAkEMakGaARD3DSEAIAJBEGokACAAC0oBAX8jAEEQayICJAAgAiAAQYACajYCDCABQe2kgwFBA0GEuIQBQQMgAEGlAUHwpIMBQQogAkEMakGaARD3DSEAIAJBEGokACAAC0kBAX8jAEEQayICJAAgAiAANgIMIAFB7aSDAUEDQYS4hAFBAyAAQQRqQagBQfCkgwFBCiACQQxqQZoBEPcNIQAgAkEQaiQAIAALQgACQCABIAAoArACdCAAIAJB/wFxai0ALGoiASAAKAIUIgJJDQAgASACQaytgwEQkRUACyAAKAIQIAFBA3RqKQMAC0kBAX8jAEEQayICJAAgAiAANgIMIAFB9LeEAUEGQYS4hAFBAyAAQQhqQdoBQZ3wgwFBECACQQxqQc0BEPcNIQAgAkEQaiQAIAALSwAgAEHgAGoQtAkgAEIANwMIIABCADcDACAAQYKEiBA2AlggAEECNgJQIABBAjYCSCAAQQA2AkAgAEEDOgA8IABB3ABqQYIEOwEAC0kBAX8jAEEQayICJAAgAiAAQQRqNgIMIAFBvImcAUEJQcWJnAFBCyAAQfgAQdCJnAFBCSACQQxqQccAEPcNIQAgAkEQaiQAIAALTwEBf0EALQCg8Z4BGgJAQRgQfSIBDQAACyABQgQ3AhAgAUIANwIIIAFCgICAgMAANwIAIABBADoADCAAQQE2AgggACABNgIEIABBATYCAAtPAQF/QQAtAKDxngEaAkBBGBB9IgENAAALIAFCBDcCECABQgA3AgggAUKAgICAwAA3AgAgAEEBOgAMIABBATYCCCAAIAE2AgQgAEEBNgIAC0gBAX8jAEEQayICJAAgAiAAQQRqNgIMIAFBgPmDAUEVQe2PhAFBCSAAQa0BQZX5gwFBCCACQQxqQTMQ9w0hACACQRBqJAAgAAtBAQF/QQAhBgJAIAQgA08NACABIAIgBGotAABqLQAAQQFHDQAgACAENgIEIAAgBEEBajYCCEEBIQYLIAAgBjYCAAtJAQF/IwBBEGsiAiQAIAIgADYCDCABQfS3hAFBBkH6t4QBQQogAEEQakHeAUGEuIQBQQMgAkEMakHfARD3DSEAIAJBEGokACAAC08BAX8CQCABEPsPQdwARw0AIAAgARCEAQ8LIABBDGogARCnDSABEPsPIQIgARCNCxogAEEAOgAkIAAgAjYCCCAAQqKAgICggICAgH83AgALQwECfyAAKAIMIAAoAgQiAWtBHG4hAgJAA0AgAkUNASACQX9qIQIgARDYDiABQRxqIQEMAAsLIAAoAgggACgCABD2LAtFAQF/AkAgACgCAEGAgICAeEYNACAAKAIIQQR0IQEgACgCBCEAA0AgAUUNASAAQQA6AAwgAUFwaiEBIABBEGohAAwACwsLSQEBfyMAQRBrIgIkACACIABBDGo2AgwgAUHZiZwBQQ1B5omcAUEFIABB+gFB64mcAUEFIAJBDGpB+wEQ9w0hACACQRBqJAAgAAtJAQF/IwBBEGsiAiQAIAIgAEEMajYCDCABQfzsmAFBCUGF7ZgBQQ0gAEGPAkGS7ZgBQQsgAkEMakGQAhD3DSEAIAJBEGokACAAC0MBAX8CQCABRQ0AA0ACQCAAKAIAQQJGDQAgAEEMaigCACICEJIBIAJBwABBCBCzFgsgAEEQaiEAIAFBf2oiAQ0ACwsLQwEBfwJAIAFFDQADQCAAEKwHAkAgAEEwaigCACICRQ0AIAIQkgEgAkHAAEEIELMWCyAAQThqIQAgAUF/aiIBDQALCwtIAQF/AkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgACkDACAAKQMQEK0uDwsgACkDABDGIQ8LIAAQ8iILRAECfyMAQRBrIgIkACACQQhqIAAoAggiAyAAKAIAIAAoAgQQ1CMgACADIAEgAigCCCACKAIMEOMKajYCCCACQRBqJAALSAEBfwJAAkACQCAALQAsQX1qIgFBASABQf8BcUEDSRtB/wFxDgIBAgALIAApAwAgACkDEBC7Lg8LIAApAwAQyCEPCyAAEPciC0kBAX8jAEEQayICJAAgAiAANgIMIAFB8pybAUEJQbScmwFBBCAAQQhqQYsCQfucmwFBAyACQQxqQdACEPcNIQAgAkEQaiQAIAALSAEBfwJAAkACQCAALQAsQX1qIgFBASABQf8BcUEDSRtB/wFxDgIBAgALIAApAwAgACkDEBDBLg8LIAApAwAQyCEPCyAAEPkiC0cAIAApAwggACkDGBDALgJAIAAtADRBA0YNACAAQSBqEIoiCyAAKAI4EIQsAkAgACgCPCIARQ0AIAAQ/CogAEEUQQQQsxYLC0QBAn8gACgCDCAAKAIEIgFrQQZ2IQICQANAIAJFDQEgAkF/aiECIAEQiSwgAUHAAGohAQwACwsgACgCCCAAKAIAEJ0tC0MBAn8gACgCDCAAKAIEIgFrQQJ2IQICQANAIAJFDQEgAkF/aiECIAEQsgcgAUEEaiEBDAALCyAAKAIIIAAoAgAQ9CwLSAEBfwJAAkACQCAALQAsQX1qIgFBASABQf8BcUEDSRtB/wFxDgIBAgALIAApAwAgACkDEBCtLg8LIAApAwAQxiEPCyAAEPsiC0cAIAApAwggACkDGBCmLgJAIAAtADRBA0YNACAAQSBqEIsiCyAAKAI4EIQsAkAgACgCPCIARQ0AIAAQ/CogAEEUQQQQsxYLC0kBAX8jAEEQayICJAAgAiAAQRhqNgIMIAFBqJqbAUEMQbSamwFBAiAAQaYDQciZmwFBCCACQQxqQcsCEPcNIQAgAkEQaiQAIAALSQEBfyMAQRBrIgIkACACIAA2AgwgAUGFmpsBQQtBtJybAUEEIABBCGpBiwJB1ZybAUEEIAJBDGpB0AIQ9w0hACACQRBqJAAgAAtHACAAKQMIIAApAxgQui4CQCAALQA0QQNGDQAgAEEgahCMIgsgACgCOBCMLAJAIAAoAjwiAEUNACAAEPwqIABBFEEEELMWCwtIAQF/AkACQAJAIAAtACxBfWoiAUEBIAFB/wFxQQNJG0H/AXEOAgECAAsgACkDACAAKQMQELsuDwsgACkDABDIIQ8LIAAQ+SILQwECfwJAIAAoAjgiAkUNACAAKAI0IQMgAkEMbCECA0AgASADKAIAEIAnIANBDGohAyACQXRqIgINAAsLIAAgARD7DgtFAAJAAkACQAJAIAAoAgAOBAABAgMACyABIABBCGoQ8RgPCyAAQQRqIAEQ/BcPCyABIABBBGoQmh8PCyAAQQRqIAEQqw0LSgACQAJAAkACQCAAKAIADgMAAQIACyAAQQhqIAEQoCggACgCKCABEKIODwsgACgCMCIARQ0BIAEgABCeAw8LIAAoAgQgARCiDgsLQgECfwJAIAAoAjgiAkUNACAAKAI0IQMgAkEMbCECA0AgASADKAIAEFQgA0EMaiEDIAJBdGoiAg0ACwsgACABEKMMC0kBAX8jAEEQayICJAAgAiAANgIMIAFBhZqbAUELQbScmwFBBCAAQQhqQYsCQdWcmwFBBCACQQxqQb8FEPcNIQAgAkEQaiQAIAALSgACQAJAAkACQCAAKAIADgMAAQIACyABIABBCGoQ0CYgACgCKCABEKEODwsgACgCMCIARQ0BIAEgABCZKw8LIAAoAgQgARChDgsLSQEBfyMAQRBrIgIkACACIABBGGo2AgwgAUGompsBQQxBtJqbAUECIABBtAVByJmbAUEIIAJBDGpBtQUQ9w0hACACQRBqJAAgAAtJAQF/IwBBEGsiAiQAIAIgADYCDCABQfKcmwFBCUG0nJsBQQQgAEEIakGLAkH7nJsBQQMgAkEMakG/BRD3DSEAIAJBEGokACAAC0oAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABELEoIAAoAiggARClDg8LIAAoAjAiAEUNASABIAAQ0QEPCyAAKAIEIAEQpQ4LC0oAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABEK8oIAAoAiggARCkDg8LIAAoAjAiAEUNASAAIAEQggMPCyAAKAIEIAEQpA4LC0oAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABELAoIAAoAiggARCjDg8LIAAoAjAiAEUNASAAIAEQ+QIPCyAAKAIEIAEQow4LC0oAAkACQAJAAkAgACgCAA4DAAECAAsgAEEIaiABELMoIAAoAiggARCmDg8LIAAoAjAiAEUNASABIAAQqgEPCyAAKAIEIAEQpg4LC0kBAX8jAEEQayICJAAgAiAAQQxqNgIMIAFB2YmcAUENQeaJnAFBBSAAQa0HQeuJnAFBBSACQQxqQa4HEPcNIQAgAkEQaiQAIAALRwAgACkDCCAAKQMYEMAuAkAgAC0ANEEDRg0AIABBIGoQiiILIAAoAjgQhCwCQCAAKAI8IgBFDQAgABCqKyAAQRRBBBCzFgsLTAEBfwJAIAEoAogBIgRBgIAgcUUNACABIARB//9fcTYCiAEgACACIAMgARD2EyABIAEoAogBQYCAIHI2AogBDwsgACACIAMgARD2EwtGAQF/IwBBIGsiAyQAIANBADYCHCADQoCAgIDAADcCFCADQQhqIAIgA0EUaiABQQBBARCACSAAIAMpAwg3AwAgA0EgaiQAC0YBAX8jAEEgayIDJAAgA0EANgIcIANCgICAgMAANwIUIANBCGogAiADQRRqIAFBAEEAEIAJIAAgAykDCDcDACADQSBqJAALRwACQAJAAkAgBQ0AIARBgIABcUUNAEEEIQQMAQsgBEGAPHFBgDxGDQFBBSEECyAAIAQ6AAAPC0GgppwBQShBqPyYARDSHgALRQEBfyAAIAEgASgCAEF8aiICQQQgAkEHSRtBAnQiAkH42p4BaigCAGooAgA2AgQgACABIAJB3NqeAWooAgBqKAIANgIAC0AAIABBACABa0EMbGoiAUF0aigCAEHdy92eeWwgAUF4aigCAGpB3cvdnnlsIAFBfGooAgBqQd3L3Z55bEEPd60LRQACQAJAAkACQCAAKAIADgQAAQIDAAsgAEEIaiABEMoVDwsgASAAQQRqEJYRDwsgAEEEaiABELYrDwsgASAAQQRqEO0MC0cAIAApAwggACkDGBDALgJAIAAtADRBA0YNACAAQSBqEIoiCyAAKAI4EIQsAkAgACgCPCIARQ0AIAAQ/CogAEEUQQQQsxYLC0kBAX8jAEEQayICJAAgAiAAQQxqNgIMIAFB2YmcAUENQeaJnAFBBSAAQfoBQeuJnAFBBSACQQxqQa4HEPcNIQAgAkEQaiQAIAALQgEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQ6SMAC0sAIAAoAgAgACgCBBDnLCAAKAIMIAAoAhAQ6CwgACgCGCAAKAIcEN8sIAAoAiQgACgCKBDpLCAAKAIwIAAoAjQQ3ywgAEE8ahDqIws5ACAAKAIUQQlsIAAoAghBFGxqIAAoAixBA3RqIAAoAjggACgCIGpBAnRqIAAoAkRBACAAKAI8G2oLUwEBfyMAQSBrIgIkACACQQA2AhggAkK036/qlZSxshA3AxAgAkK26+fp4djGtnY3AwggACACQQhqQfC8gAEgAREKACACKAIYIQAgAkEgaiQAIAALRAIBfwF+IwBBEGsiAiQAIAIgARA1AkACQCACKAIADQBCACEDDAELIAAgAikDCDcDCEIBIQMLIAAgAzcDACACQRBqJAALPwECfyAAIAEoAgAgASABLQALIgJB/gFGIgMbNgIAIAAgASgCBCACQcAAakH/AXEiAUEMIAFBDEkbIAMbNgIECz4BAn8CQCAAKAIAIgENAEEADwtBASECAkAgAUEzSQ0AIAAoAgQgAUEDdEF4ak8NAEEAIQIgAEEANgIACyACC0IBAX8CQCAALQAMIgFBA0YNACABQQJGDQAgACgCACIBIAEoAgAiAUF/ajYCACABQQFHDQAgACgCACAAKAIEEO4SCwtGAQF/IwBBEGsiAiQAIAJBCGogAEHg44QBEOwjIAIoAgwhACACKAIIIAFB8OOEARDQFCAAIAAoAgBBAWo2AgAgAkEQaiQAC0IBAX8CQCAALQA0IgFBA0YNACABQQJGDQAgACgCKCIBIAEoAgAiAUF/ajYCACABQQFHDQAgACgCKCAAKAIsEO4SCwtCAQF/AkAgAC0ADCIBQQNGDQAgAUECRg0AIAAoAgAiASABKAIAIgFBf2o2AgAgAUEBRw0AIAAoAgAgACgCBBDuEgsLQQEBfwJAIAFFDQADQCAAQQRqIgIoAgAgAEEIaigCABCsGSAAKAIAIAIoAgAQgC0gAEEMaiEAIAFBf2oiAQ0ACwsLOQAgACgCFEEJbCAAKAIIQRRsaiAAKAIsQQN0aiAAKAI4IAAoAiBqQQJ0aiAAKAJEQQAgACgCPBtqC0sBAn8CQAJAAkAgACgCACIBQYCAgIB4cyICQQEgAkEDSRsOAgIBAAsgACgCBCAAKAIIEPYsDAELIAEgACgCBBCHLQsgAEEsahDMKQtLAQJ/AkACQAJAIAAoAgAiAUGAgICAeHMiAkEBIAJBA0kbDgICAQALIAAoAgQgACgCCBD2LAwBCyABIAAoAgQQhy0LIABBLGoQwikLRQEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhCnHAsCQEHwAEUNACAAKAIEIANB8ABsaiABQfAA/AoAAAsgACADQQFqNgIIC0UBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQphwLAkBBmAFFDQAgACgCBCADQZgBbGogAUGYAfwKAAALIAAgA0EBajYCCAtHAQJ/AkAgASgCCCICRQ0AIAAoAgQgACgCCCABKAIEIgMgAhDeFQ0AIAAgAyACELAfIAAQ+wUgACAALQAMIAEtAAxxOgAMCwtHAQJ/AkAgASgCCCICRQ0AIAAoAgQgACgCCCABKAIEIgMgAhCkFA0AIAAgAyACELEfIAAQ7QUgACAALQAMIAEtAAxxOgAMCwtKAQF/AkACQAJAAkAgACgCAEGAgLx/aiIBQQIgAUEISRsOCAEBAQECAQMAAQsgAEEEahDwKgsPCyAAQQRqEOgbDwsgAEEEahDJKQtFAQF/AkAgACgCCCIDIAAoAgBHDQAgACACELYcCwJAQdgARQ0AIAAoAgQgA0HYAGxqIAFB2AD8CgAACyAAIANBAWo2AggLPAAgBCAAQgKGIgBCAoQgASACIAMQ0RQ3AwAgBSAAIAZBf3OsfCABIAIgAxDRFDcDACAAIAEgAiADENEUCzwAIAQgAEIChiIAQgKEIAEgAiADENIUNwMAIAUgACAGQX9zrHwgASACIAMQ0hQ3AwAgACABIAIgAxDSFAtCAQJ/AkAgACgCCCIBRQ0AIAAoAgRBDGohAANAIAAoAgAiAhCSASACQcAAQQgQsxYgAEEQaiEAIAFBf2oiAQ0ACwsLQQEBfyMAQRBrIgMkAAJAIAItAJABDQAgAUUNACADIAAgARC5HyACQYABaiADKQMAIAMoAggQiQYaCyADQRBqJAALQAEBfwJAIAAoAggiAkUNACAAKAIEIQAgAkEwbCECA0AgAUEAOgB9IAAgARDkAiAAQTBqIQAgAkFQaiICDQALCws9AAJAIABCA4NCAFINACAApykDCCEACyAAp0Hdy92eeWwgAEIgiKdqQd3L3Z55bCABakHdy92eeWxBD3etC0wBAn8gAC0AnAEhAiAAQQE6AJwBIAEoAgAiAyAAENoOAkAgACgCAEUNACAAIAMQ+ggLIABBADoAnAEgACABKAIEEKcBIAAgAjoAnAELRQECfyABKAIEIQQCQAJAIAEoAgAiBUEBRg0AIAEoAgghAwwBCwJAIAVFDQAgBBD5EQsgAiEECyAAIAM2AgQgACAENgIAC0oBAX8gACgCACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABENYsDwsgACgCACABEMwSDwsgACgCACABEM0SC0oBAX8gABC2KAJAAkAgACgCDCIBKAIAQYCAgIB4Rg0AIAEQlSgMAQsgAUEEahC3AwsgAUEYQQQQsxYgACgCHBCjLCAAQSBqEKsrC0EBAX8CQCAAKAIUIgMgACgCDEcNACAAQQxqEIceCyAAIANBAWo2AhQgACgCECADQQN0aiIAIAI6AAQgACABNgIAC0UBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQ6x0LAkBB2ABFDQAgACgCBCADQdgAbGogAUHYAPwKAAALIAAgA0EBajYCCAtEAQF/AkAgACgCCCIDIAAoAgBHDQAgACACEOgdCwJAQcAARQ0AIAAoAgQgA0EGdGogAUHAAPwKAAALIAAgA0EBajYCCAtFAQF/AkAgACgCCCIDIAAoAgBHDQAgACACEOQdCwJAQdAARQ0AIAAoAgQgA0HQAGxqIAFB0AD8CgAACyAAIANBAWo2AggLRQEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhDwHQsCQEHIAEUNACAAKAIEIANByABsaiABQcgA/AoAAAsgACADQQFqNgIIC0IBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQ4h0LAkBBKEUNACAAKAIEIANBKGxqIAFBKPwKAAALIAAgA0EBajYCCAtCAQF/AkAgACgCCCIDIAAoAgBHDQAgACACEPwdCwJAQThFDQAgACgCBCADQThsaiABQTj8CgAACyAAIANBAWo2AggLQgEBfwJAIAAoAggiAyAAKAIARw0AIAAgAhD0HQsCQEEwRQ0AIAAoAgQgA0EwbGogAUEw/AoAAAsgACADQQFqNgIIC0cBAX8gACgCvAEiASABKAIAIgFBf2o2AgACQCABQQFHDQAgACgCvAEQiRsLIAAQ4CYgACgCbCAAKAJwEM4sIABBwAFqELokC0ABAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQ+xsLIAAgA0EBajYCCCAAKAIEIANBA3RqIgBBADYCBCAAIAE2AgALQwEDfyABKAIAIgNBBGogAy8BMkEBaiIEIAEoAggiBSACELUaIAMgBDsBMiAAIAU2AgggACADNgIAIAAgASgCBDYCBAtIAQF/AkAgAEGAAmoiAiABENMbDQAgAiABEIsYIAAgACgCoAJBAWo2AqACIAAgAC8BpAIgAUH/AXFB2NmEAWotAABqOwGkAgsLRwEBfyAAKAIAIQACQCABKAIIIgJBgICAEHENAAJAIAJBgICAIHENACAAIAEQ1iwPCyAAKAIAIAEQzBIPCyAAKAIAIAEQzRILPgEBfwNAAkAgAg0ADwsgACgAACEDIAAgASgAADYAACABIAM2AAAgAkF/aiECIAFBBGohASAAQQRqIQAMAAsLPwEBfyMAQRBrIgIkACAAKAIAIQAgAkEANgIMIAIgASACQQxqEJEMIAAgAigCACACKAIEEP0MIAJBEGokAEEACz4BAX8DQAJAIAINAA8LIAAoAAAhAyAAIAEoAAA2AAAgASADNgAAIAJBf2ohAiABQQRqIQEgAEEEaiEADAALCzoBAX8CQCAAQX9GDQAgACAAKAIEIgJBf2o2AgQgAkEBRw0AIAFBC2pBfHEiAUUNACAAIAFBBBCzFgsLPgEBfyMAQRBrIgIkACACIABBAmo2AgwgAUHCwYMBIABBlQEgAEEBakGVASACQQxqEKQGIQAgAkEQaiQAIAALPgEBfyMAQRBrIgMkACADQQxqIAJBCGooAgA2AgAgA0ECNgIAIAMgAikCADcCBCAAIAEgAxDADCADQRBqJAALPgEBfyMAQRBrIgMkACADQQxqIAJBCGooAgA2AgAgA0EGNgIAIAMgAikCADcCBCAAIAEgAxDADCADQRBqJAALPgEBf0EAIQYCQCAEIANPDQAgAS0AACACIARqLQAARw0AIAAgBDYCBEEBIQYgACAEQQFqNgIICyAAIAY2AgALQAEBfwJAIAAoAggiBCAAKAIARw0AIAAgAxCLHAsgACAEQQFqNgIIIAAoAgQgBEEDdGoiACACNgIEIAAgATYCAAtBAQF/QRgQ8SciAkEQaiABQRBqKQIANwIAIAJBCGogAUEIaikCADcCACACIAEpAgA3AgAgACACNgIEIABBADYCAAs2AQF/IAAgAUG/f2pBX3FBCmogAUFQaiIDIAJBCksbIAMgAUE5SxsiATYCBCAAIAEgAkk2AgALQAEBfwJAIAAoAggiBCAAKAIARw0AIAAgAxCuHAsgACAEQQFqNgIIIAAoAgQgBEEBdGoiACACOgABIAAgAToAAAtAAQF/AkAgACgCCCIEIAAoAgBHDQAgACADEIscCyAAIARBAWo2AgggACgCBCAEQQN0aiIAIAI2AgQgACABNgIAC0ABAX8CQCAAKAIIIgQgACgCAEcNACAAIAMQrhwLIAAgBEEBajYCCCAAKAIEIARBAXRqIgAgAjoAASAAIAE6AAALPgEBfwNAAkAgAg0ADwsgACgAACEDIAAgASgAADYAACABIAM2AAAgAkF/aiECIAFBBGohASAAQQRqIQAMAAsLPgEBfwNAAkAgAg0ADwsgACgAACEDIAAgASgAADYAACABIAM2AAAgAkF/aiECIAFBBGohASAAQQRqIQAMAAsLQAEBfyMAQRBrIgIkACACIAAoAgAiADYCDCABQezsmAFBECAAQQxqQYsCIAJBDGpBrwEQgAghACACQRBqJAAgAAtAAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFBtOKYAUEHIABB3AAgAkEMakGNAhCACCEAIAJBEGokACAACz4AIAIgAigCACAAp2pB3cvdnnlsIABCIIinakHdy92eeWwgAadqQd3L3Z55bCABQiCIp2pB3cvdnnlsNgIACz4BAX8jAEEQayIGJAAgBkEIaiABIAIgAyAEIAUQ4BEgBigCDCEFIAAgBigCCDYCACAAIAU2AgQgBkEQaiQACzsAQb2BmQEgAEEJdkG4v5wBaiAAQf/HDEsbLQAAQQV0IABBA3ZBP3FqQYDRnAFqLQAAIABBB3F2QQFxCz8AAkACQCAAKAIAIgAoAgBBA0YNACAAEPQiDAELIABBEGoQtAMgAEEEahD/KiAAQSBqEOUpCyAAQShBCBCzFgs+ACAAKAIAIgAQkSggAEEMahCSKCAAQTBqEIArIABBNGoQhCQgAEE4ahDlKSAAQRhqEJMoIABBwABBBBCzFgs5AQJ/IAJBA3QhAgJAA0AgAiIDRQ0BIANBeGohAiABIAAQkwwhBCABQQhqIQEgBEUNAAsLIANBAEcLNgEBfyAAIAFBv39qQV9xQQpqIAFBUGoiAyACQQpLGyADIAFBOUsbIgE2AgQgACABIAJJNgIACzYBAX8gACABQb9/akFfcUEKaiABQVBqIgMgAkEKSxsgAyABQTlLGyIBNgIEIAAgASACSTYCAAtHAAJAIAEgAkHNgpwBQQUQ4yVFDQBBzQAPCwJAIAEgAkGe9JsBQQcQ4yVFDQBB+gAPC0H5AEGkfyABIAJBpfSbAUEGEOMlGwtHAAJAIAEgAkHegpwBQQYQ4yVFDQBB5QAPCwJAIAEgAkG0uJwBQQgQ4yVFDQBBkQEPC0GSf0GkfyABIAJB7/SbAUEHEOMlGwtFAQF/IAEoAgAgABD7DgJAIAEoAhQiAUUNACAALQA0QQFHDQAgAC8AOSECIABBgQI7ADkgASgCACAAEMEBIAAgAjsAOQsLQQEBfyMAQRBrIgIkAAJAIAEtABRBAkYNACACIAEpAwAgASgCEBC5HyAAIAIpAwAgAigCCEEBELMMCyACQRBqJAALPgEBfwNAAkAgAg0ADwsgACgAACEDIAAgASgAADYAACABIAM2AAAgAkF/aiECIAFBBGohASAAQQRqIQAMAAsLSAEBfwJAIAEoAogBIgNBgIAgcUUNACABIANB//9fcTYCiAEgACACIAEQhQ0gASABKAKIAUGAgCByNgKIAQ8LIAAgAiABEIUNC0gBAX8CQCABKAKIASIDQYCAIHFFDQAgASADQf//X3E2AogBIAAgAiABEIgNIAEgASgCiAFBgIAgcjYCiAEPCyAAIAIgARCIDQtIAQF/AkAgASgCiAEiA0GAgARxRQ0AIAEgA0H//3txNgKIASAAIAIgARDnBCABIAEoAogBQYCABHI2AogBDwsgACACIAEQ5wQLPgEBfxDyKBogASgCCEEEdCECIAEoAgQhAQJAA0AgAkUNASABKAIMIAAQ+AMgAkFwaiECIAFBEGohAQwACwsLRwEBfyAAQRxqELQKIAAoAgwgACgCEBC6IyAAKAIEIgEgACgCCBDzJCAAKAIAIAEQ0i0gAEEsahDmEiAAKAIsIAAoAjAQ0y0LPgEBfxDyKBogASgCCEECdCECIAEoAgQhAQJAA0AgAkUNASABKAIAIAAQ+AMgAkF8aiECIAFBBGohAQwACwsLPwACQAJAAkAgACgCAA4CAQIACyAAQQRqEK4sDwsgAEEIahC9HSAAQShqELUqDwsgAEEQahC6KyAAQTBqELcrC0ABAX8CQAJAAkAgAC0ALEF9aiICQQEgAkH/AXFBA0kbQf8BcQ4DAAECAAsgASAAEKsIGg8LIABBGGogARC0JAsLPAACQCABaUEBRw0AIABBgICAgHggAWtLDQACQCAARQ0AQQAtAKDxngEaIAAgARChJyIBRQ0BCyABDwsAC0QBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEIsODwsgAC0AACABEKwSDwsgACABEO4RCz0BAX8jAEEQayIHJAAgB0EIaiABLQAAIAMgBBDmByAHKAIMIQEgACAHKAIINgIAIAAgATYCBCAHQRBqJAALPQEDfwJAIAEtAAQiAiABLQAFIgNPDQAgASACQQFqOgAEIAEgAmotAAAhBAsgACAEOgABIAAgAiADSToAAAs/AQJ/AkACQCABKAIAIgIgASgCBCIDRw0ADAELIAEgAkEBajYCACACLQAAIQELIAAgAToAASAAIAIgA0c6AAALQQEBfyABIAEoAggiBEEBajYCCAJAIARBAEgNACAAIAE2AgwgACADNgIIIAAgAjYCBCAAQbjZgAE2AgAPCxC3MAALOAECfwJAIABQDQAgAEIDg1BFDQAgAKciASABKAIAIgJBf2o2AgAgAkEBRw0AIAEgASgCEBDGJAsLPAEBfyMAQRBrIgMkACADQQA2AgwgAyACIANBDGoQ3BEgACABIAMoAgAgAygCBBDqJSECIANBEGokACACC0QBAX8gACgCACEAAkAgASgCCCICQYCAgBBxDQACQCACQYCAgCBxDQAgACABEIsODwsgAC0AACABEKwSDwsgACABEO4RCzsAAkAgAiAAIANB/wFxai0AQGoiAyAAKAIIIgJJDQAgAyACQaC6gwEQkRUACyAAKAIEIANBAnRqKAIAC0ABA38CQCABKAIUIgIgASgCDCIDTw0AIAEoAgggAmotAAAhBAsgACAEOgAJIAAgAiADSToACCAAIAEpAgA3AgALPAECfyAAIAIQkyUgACgCCCEDAkAgAkEDdCIERQ0AIAAoAgQgA0EDdGogASAE/AoAAAsgACAD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AkE4bCECA0AgACABEMQeIABBOGohACACQUhqIgINAAsLCzkBAX8CQCAAKAIIIgJFDQAgACgCBCEAIAJBMGwhAgNAIAAgARClBCAAQTBqIQAgAkFQaiICDQALCws/AgF/AX4CQEHo6p4BQejqngEQmBYpAwAiAUIDg0IAUg0AIAGnIgAgACgCACIAQQFqNgIAIABBf0oNAAALIAELOQEBfwJAIAAoAggiAkUNACAAKAIEIQAgAkEwbCECA0AgACABEKcEIABBMGohACACQVBqIgINAAsLCzkBAX8CQCAAKAIIIgJFDQAgACgCBCEAIAJBMGwhAgNAIAAgARCoBCAAQTBqIQAgAkFQaiICDQALCws5AQF/AkAgACgCCCICRQ0AIAAoAgQhACACQTBsIQIDQCAAIAEQmgQgAEEwaiEAIAJBUGoiAg0ACwsLQgECf0EBIQECQAJAAkAgAC0A4AEiAkF9ag4EAgEBAAELIAAQoQtBASEBDAELIAJBowFGIAAtAOEBciEBCyABQQFxC0QBAX8CQCABKAKIASICQYCABHFFDQAgASACQf//e3E2AogBIAAgARCTASABIAEoAogBQYCABHI2AogBDwsgACABEJMBC0oBAX8CQCABKAKIASICQYCAgIACcUUNACABIAJB/////31xNgKIASAAIAEQmiQgASABKAKIAUGAgICAAnI2AogBDwsgACABEJokCzsBAX8jAEEQayICJAAgARChCyACQQhqIAEQxhIgAigCDCEBIAAgAigCCDYCACAAIAE2AgQgAkEQaiQACz4BAX8CQCAAKAJYIgIgACgCUEcNACAAQdAAakGYmpoBENUdCyAAIAJBAWo2AlggACgCVCACQQJ0aiABNgIACzsBA38gACgCACEBIAAoAgQhAgJAA0AgASIDIAJGDQEgACADQcAAaiIBNgIAIAMQ8RtFDQALCyADIAJHC0QBAX8CQCABKAKIASICQYCABHFFDQAgASACQf//e3E2AogBIAAgARCQASABIAEoAogBQYCABHI2AogBDwsgACABEJABCzoAAkAgACgCACIAKAIAQQNHDQAgAEEQaiABEJUvIABBBGogARDJHyAAKAIgIAEQniYPCyAAIAEQuyULPQAgACgCACAAKAIEIAEQpyoCQCAAKAIgQQdGDQAgAEEgaiABEI4WCyAAKAJoIAEQ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IgIkACACIAAoAgA2AgwgAUHw74MBQRMgAkEMakHVARD/CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBjfCDAUEQIAJBDGpBzAAQ/wshACACQRBqJAAgAAs2AQF/IwBBEGsiAiQAIAIgACgCADYCDCABQdvvgwFBDCACQQxqQdwBEP8LIQAgAkEQaiQAIAALOAEBf0EBIQICQCABQYCAgIB4Rg0AIAEgAEGEBWoiACgCABDXGkYNACABIAAoAgAQ5RtGIQILIAILNgACQCABKAIgRQ0AQayghAEQ0hoACyABQX82AiAgACABQSRqIAIQgx8gASABKAIgQQFqNgIgCzgBAX8CQCABKAIAIgNB/////wdJDQAgAhDTGgALIAEgA0EBajYCACAAIAE2AgQgACABQQRqNgIACzYBAn9BACECAkAgASgCACIDIAEoAgRPDQBBASECIAEgA0EBajYCAAsgACADNgIEIAAgAjYCAAs6AQF/IwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEGAzZgBNgIIIABCBDcCECAAQQhqQYjNmAEQ6SMACzMBAX8jAEEQayIDJAAgA0EIaiAAEPEVIAMoAgggAygCDCABIAIQ6yUhACADQRBqJAAgAAszAQF/IwBBEGsiAyQAIANBCGogABDxFSADKAIIIAMoAgwgASACEOslIQAgA0EQaiQAIAALNgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGd7ZgBQQcgAkEMakHOABD/CyEAIAJBEGokACAACzYBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBnPGYAUEEIAJBDGpBzgAQ/wshACACQRBqJAAgAAs7AQF/IAAoAgAiARCiASABQcAAQQgQsxYgACgCBCIAELcfIAAoAgAgAEEEaigCABCfLSAAQRRBBBCzFgs8AQF/EIMoIgFCADcCCCABQoCAgICAATcCACAAIAE2AgQgAEECNgIAIAFBEGpCADcCACABQRhqQQA7AQALNgACQCAALQAUQQJHDQAgACgCACIAQRhqEIkiIAApAwAQxiEgAEEwQQgQsxYPCyAAKQMAEMYhCzYAAkAgAC0AFEECRw0AIAAoAgAiAEEYahCKIiAAKQMAEMghIABBMEEIELMWDwsgACkDABDIIQs2AAJAIAAtABRBAkcNACAA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IAIoAgAgARCOFgs8AQF/IABBBGohAgJAAkACQCAAKAIADgMAAQIACyACIAEQpi8PCyACKAIAIAEQ5xIPCyACKAIAIAEQixULPAEBfwJAAkAgACgCAA0AIAAoAhwiASAAKAIgEJwlIAAoAhggARCjLQwBCyAAQRhqEMkoCyAAKQMQEIMrCy8AAkAgA2lBAUcNACABQYCAgIB4IANrSw0AIAAgASADIAIQ9AMiA0UNACADDwsACzIBAX8jAEEQayICJAAgAiAANgIMIAFBwbCDAUEMIAJBDGpBHhD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFB/JaAAUEGIAJBDGpBLxD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFBycGDAUEGIAJBDGpBNBD/CyEAIAJBEGokACAACy0AAkAgAiADTw0AIAMgAiAEEOAsAAsgACACIANrNgIEIAAgASADQQJ0ajYCAAstAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAUECdGo2AgALLQACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACzQAAkAgASADRw0AAkAgAUECdCIBRQ0AIAIgACAB/AoAAAsPC0HwvJsBQShBmL2bARDSHgALLQACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACzAAAkAgAyABTw0AIAEgA0H0m5wBEOAsAAsgACADIAFrNgIEIAAgAiABQQJ0ajYCAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQaC1gAFBCCACQQxqQckAEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHEnIQBQQ8gAkEMakHMABD/CyEAIAJBEGokACAACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQ3ysgAEEgaiEADAALCwsyAQF/IAAoAgghASAAKAIEIQACQANAIAFFDQEgAUF/aiEBIAAQmhMgAEEQaiEADAALCws3AQF/IwBBEGsiAiQAIAEgAkEPakHAzYABEO4GIQEgAEGVgICAeDYCACAAIAE2AgQgAkEQaiQACzEBAX8jAEEQayICJAAgAkEIaiAAENceIAEgAigCCCACKAIMEIIGIQAgAkEQaiQAIAALNAEBfyMAQRBrIgMkAAJAIAANAEH0gpkBQQ4gA0EPakH03IABIAIQ6hIACyADQRBqJAAgAQszAQF/IwBBEGsiAiQAIAIgADYCDCABQeTLmwFBESACQQxqQcwAEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGL8ZkBQQQgAkEMakHOABD/CyEAIAJBEGokACAACy0AAkAgAiADTw0AIAMgAiAEEOAsAAsgACACIANrNgIEIAAgASADQQJ0ajYCAAstAAJAIAIgA08NACADIAIgBBDgLAALIAAgAiADazYCBCAAIAEgA0ECdGo2AgALNgEBfyABKAIEIAFBCGoiBCgCACACIAMQhgggARCrDCAAQQhqIAQoAgA2AgAgACABKQIANwIACy0AAkAgAyABTw0AIAEgAyAEEOAsAAsgACADIAFrNgIEIAAgAiABQQJ0ajYCAAstAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAUECdGo2AgALLgEBfyMAQRBrIgUkACAFQQRqIAEgAhDgFyAAIAVBBGogAyAEEMMiIAVBEGokAAsrAAJAIAAgAUECdGpBfGoiAA0AQazBggEQ0iwACyABrUIFhiAAKAIAZ619CzQBAX8CQCAAKAIIIgMgACgCAEcNACAAIAIQig8LIAAgA0EBajYCCCAAKAIEIANqIAE6AAALLQACQCACIANPDQAgAyACIAQQ4CwACyAAIAIgA2s2AgQgACABIANBAnRqNgIACzIBAX8gACgCCCEBIAAoAgQhAAJAA0AgAUUNASABQX9qIQEgABDXDiAAQRxqIQAMAAsLCzIBAX8gACgCCCEBIAAoAgQhAAJAA0AgAUUNASABQX9qIQEgABDoCyAAQQhqIQAMAAsLCy4BAX8jAEEQayICJAAgAkEIakEKIAAgARCuESACKAIIIQEgAkEQaiQAIAFBAUYLMwEBfyMAQRBrIgIkACACIAA2AgwgAUGjp4MBQQYgAkEMakH6ABD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFBnKeDAUEHIAJBDGpB/AAQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQa3wgwFBEiACQQxqQf4AEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGHuIQBQQYgAkEMakGAARD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB5KSDAUEJIAJBDGpBhgEQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQamngwFBDSACQQxqQZABEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGWuIQBQQogAkEMakGUARD/CyEAIAJBEGokACAACzIBAX8jAEEQayICJAAgAiAANgIMIAFBtcGDAUEGIAJBDGpBJBD/CyEAIAJBEGokACAACzMBAX8jAEEQayICJAAgAiAANgIMIAFB9o+EAUEHIAJBDGpBpgEQ/wshACACQRBqJAAgAAszAQF/IwBBEGsiAiQAIAIgADYCDCABQcGwgwFBDCACQQxqQbUBEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUGWuIQBQQogAkEMakG+ARD/CyEAIAJBEGokACAACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagszAQF/IwBBEGsiAiQAIAIgADYCDCABQcSchAFBDyACQQxqQcwAEP8LIQAgAkEQaiQAIAALNQEBf0EALQCg8Z4BGgJAQQwQfSIBDQAACyABIAApAgA3AgAgAUEIaiAAQQhqKAIANgIAIAELKAAgACACIAEgAyABIANJGxCIGyICIAEgA2sgAhsiA0EASiADQQBIawszAQF/IwBBEGsiAiQAIAIgADYCDCABQdKPhAFBCyACQQxqQc4AEP8LIQAgAkEQaiQAIAALMwEBfyMAQRBrIgIkACACIAA2AgwgAUHIj4QBQQogAkEMakHMABD/CyEAIAJBEGokACAACzQAAkAgASgCIEUNAEGMoIQBENIaAAsgAUF/NgIgIAAgAUEkahCQJSABIAEoAiBBAWo2AiALMwEBfyAAKAIIIQEgACgCBCEAAkADQCABRQ0BIAFBf2ohASAAEOUeIABB2ABqIQAMAAsLCzQBAX9BACECAkAgACgC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QRBqJAALNgEBfwJAIAAoAgAiAUUNACABELcfIAEoAgAgAUEEaigCABCfLSABQRRBBBCzFgsgAEEANgIACzYBAX8CQCAAKAIAIgFFDQAgARDRDyABKAIAIAFBBGooAgAQni0gAUEUQQQQsxYLIABBADYCAAswAQF/IwBBEGsiAyQAIAMgASACELkfIABBEGogAykDACADKAIIEIkGGiADQRBqJAALQwEBf0EBIQECQAJAAkACQCAAKAIADggDAAMDAQEDAgMLIAAoAiAoAhhBgICAgHhHDwtBAA8LIAAoAgQQjxMhAQsgAQsuAQF/IwBBEGsiAyQAIANBCGogACABIAIQqwYgA0EIahDRJiECIANBEGokACACCzAAAkAgAyABTw0AIAEgA0G8t5sBEOAsAAsgACADIAFrNgIEIAAgAiABQRxsajYCAAs0AQF/AkAgACgCCCIDIAAoAgBHDQAgACACEIoPCyAAIANBAWo2AgggACgCBCADaiABOgAACzcAIABBIGoQmywCQAJAAkAgACgCAA4CAQIACyAAQQRqEJssDwsgACkDCBDGIQ8LIAApAwgQxiELNwAgAEEgahC3AwJAAkACQCAAKAIADgIBAgALIABBBGoQtwMPCyAAKQMIEMghDwsgACkDCBDIIQs6AQF/IAAoAiRB6AFqIABBCRD+HiAAKAIMIgEgACgCEBDpJCAAKAIIIAEQrC0gACgCFCAAKAIYEPIdCzgAAkAgA0UNAAJAIAFFDQAgACABIAMgAigCNBEKAA8LIABBgICAgHg2AgAPCyAAQYCAgIB4NgIACzUAAkAgASgCOEUNAAJAIAEtADwNACABIAIQxQUMAQsgASACNgIEIAFBATYCAAsgAEEEOgAACzQBAX9BACECAkAgACgCACABKAIARw0AIAAoAgQgASgCBEcNACAAKAIIIAEoAghGIQILIAILNQACQCABKAI4RQ0AAkAgAS0APA0AIAEgAhDGBQwBCyABIAI2AgQgAUEBNgIACyAAQQQ6AAALLgEBfyMAQRBrIgMkACADQQhqIAIgACABEK4RIAMoAgghASADQRBqJAAgAUEBRgs1AAJAIAEoAjhFDQACQCABLQA8DQAgASACEMUFDAELIAEgAjYCBCABQQE2AgALIABBBDoAAAswAAJAIAAoAgAiACgCAEEDRw0AIABBEGogARCT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IAAoAgAoAgAQ3gRBACEBCyABCzYBAX8CQCABKAIARQ0AIAEgABCeKA8LIAAtAJABIQIgAEEBOgCQASABIAAQniggACACOgCQAQs1AQJ/AkAgACgCACIBRQ0AIAEoAgAiAhDeAyACQeAAQQgQsxYgAUEMQQQQsxYLIABBADYCAAspAQF/AkAgAUUNACAAIAFBAnRBC2pBeHEiAmsgASACakEJakEIELMWCws3AAJAAkACQAJAIAAtAAAOBwMDAwECAAMACyAAQQRqEPQFDwsgAEEEahC5LQ8LIABBBGoQoCsLCywBAX8jAEEQayIDJAAgA0EDOgAPIAAgAiABQQFxIANBD2oQ3wYgA0EQaiQACysAIAFBMGwhAQJAA0AgAUUNASAAIAIQ6gUgAUFQaiEBIABBMGohAAwACwsLPgAgAEEEahDuJwJAIAFC+IKZvZXuxsW5f1INACACQu26rbbNhdT14wBSDQAgAEEkahDGGgsgAEEwQQQQsxYLLAAgAUEGdCEBAkADQCABRQ0BIAAgAhDMKiABQUBqIQEgAEHAAGohAAwACwsLLwEBfyMAQRBrIgIkACACIAAoAgAiADYCDCACQQxqIAEQpgggABCeJyACQRBqJAALLwECfwJAIAAoAgAiAUUNACABIAEoAgAiAkF/ajYCACACQQFHDQAgACgCABCrEAsLMQEBfwJAIAEoAgAiAkUNACAAIAIRAwALAkAgASgCBCICRQ0AIAAgAiABKAIIELMWCwsxAQF/AkAgASgCACICRQ0AIAAgAhEDAAsCQCABKAIEIgJFDQAgACACIAEoAggQsxYLCy4AIAAgASACIANB/wFxakGEnoABQfSdgAEgBEEBRiIDGxC+JUEAIAQgAxs2AgALLQEBfyMAQRBrIgMkACADIAAQ0QggAyABIAIQ0RUhAiAAENIVIANBEGokACACCzkBAX8gACEBAkACQAJAIAAtACAOBAECAgACCyAAQRRqIQELIAEQ5ScgACgCDBDcKiAAKAIQENwqCwsqAAJAIAMgAU8NACABIAMgBBDgLAALIAAgAyABazYCBCAAIAIgAWo2AgALKgACQCADIAFPDQAgASADIAQQ4CwACyAAIAMgAWs2AgQgACACIAFqNgIACzABAX8jAEEQayIBJAAgAUEANgIMIAFCgICAgBA3AgQgACABQQRqENwYIAFB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IAEoAgAgACgCAC0AAEECdCIAQdjRngFqKAIAIABBtNGeAWooAgAgASgCBCgCDBELAAsoACABIAIgAyAEEOolIQMgACACIARrNgIEIAAgASAEakEAIAMbNgIACy0AAkAgACgCACIARQ0AIAAQ0Q8gACgCACAAQQRqKAIAEJ4tIABBFEEEELMWCwszACABKAIAIAAoAgAtAABBAnQiAEGA1p4BaigCACAAQfTVngFqKAIAIAEoAgQoAgwRCwALMwAgASgCACAAKAIALQAAQQJ0IgBBpNaeAWooAgAgAEGY1p4BaigCACABKAIEKAIMEQsACzMAIAEoAgAgACgCAC0AAEECdCIAQeTWngFqKAIAIABBsNaeAWooAgAgASgCBCgCDBELAAszACABKAIAIAAoAgAtAABBAnQiAEGk154BaigCACAAQZjXngFqKAIAIAEoAgQoAgwRCwALLAAgACACQoCBgoSIkKDAgH+DIgJCAFI2AgAgACACeqdBA3YgA2ogAXE2AgQLNQEBf0GAASEDAkAgASACQdrzmwFBBhDjJQ0AQf8AQaR/IAEgAkGgupwBQQMQ4yUbIQMLIAMLNQEBf0HtACEDAkAgASACQfjimwFBAxDjJQ0AQe4AQaR/IAEgAkG39JsBQQQQ4yUbIQMLIAMLNQEBf0HvACEDAkAgASACQdmCnAFBBRDjJQ0AQfAAQaR/IAEgAkHChJwBQQQQ4yUbIQMLIAMLMAEBfwJAIAEoAgBBA0cNACAALQA5IQIgAEEBOgA5IAEoAgQgABDaASAAIAI6ADkLCywBAX8DQCABQRhqIQICQCABLQAsQQJGDQAgACACELQTDwsgAigCACEBDAALCzABAX8CQCABKAIAQQJHDQAgAC0AOSECIABBAToAOSABKAIEIAAQ2gEgACACOgA5CwswAQF/AkAgASgCAEEBRw0AIAAtADkhAiAAQQE6ADkgASgCBCAAENoBIAAgAjoAOQsLLQACQCAAKAIAIgBFDQAgABDRDyAAKAIAIABBBGooAgAQni0gAEEUQQQQsxYLCzMAIAEoAgAgACgCAC0AAEECdCIAQZTangFqKAIAIABBiNqeAWooAgAgASgCBCgCDBELAAssACABIAAQvycCQCABKAIAQQNHDQAgASgCBCIBKAIAQRlHDQAgACABEMcBCwszACABKAIAIAAoAgAt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AgQiASAAKAIIEO4iIAAoAgAgARChLQsXACAAKAIAQQhqIAEoAgAgASgCBBDQBQsXACAAKAIAIAEgACgCBEEMaigCABEHAAsVACABIAAoArwCRiABIAAoAsACRnILFQAgASAAKALYAkYgASAAKALcAkZyCxUAIAEgACgC0AJGIAEgACgC1AJGcgsZACAAKAIAIAAoAgQgASgCACABKAIEEOsDCxUAAkAgAEUNACABIABBBEEIEJMVCwsXACAAQQRqEO4nIAAoAhwgACgCIBC/LwsZACAAKAIEIAAoAgggASgCACABKAIEEOsDCxcBAX8gABAkIgE2AgQgACABQQBHNgIACxcBAX8gABAlIgE2AgQgACABQQBHNgIACxcBAX8gABAmIgE2AgQgACABQQBHNgIACxcBAX8gABAnIgE2AgQgACABQQBHNgIACxgAIAAQqgQgABD2DiAAKAIYQTRBBBCzFgsVACABIAAoArwCRiABIAAoAsACRnILFQAgASAAKALQAkYgASAAKALUAkZyCxUAIAEgACgC2AJGIAEgACgC3AJGcgsVAAJAIAENAEEAQQAgAhCRFQALIAALFQACQCABDQBBAEEAIAIQkRUACyAACxkAIAAoAgAgACgCBCABKAIAIAEoAgQQ6wMLGQAgACgCBCAAKAIIIAEoAgAgASgCBBDrAwsTACABKAIAIAJBBHRrQXBqENkFCxUAAkAgAUH/AXFBAkYNACAAEMYhCwsVAAJAIAFB/wFxQQJGDQAgABDIIQsLFQACQCABQf8BcUECRg0AIAAQyCELCxcAIAAgASACIAMQ4Bo2AgQgAEEBNgIACxUAIAAgARCTDCAAKAIIIAEoAghGcQsdAAJAQQAoAojrngFBAkYNABD7GgtBACgChOueAQsXACAAQQA2AhAgAEIBNwIAIABBADYCCAsXACAAKAIAIABBBGooAgAQ9CwgABCJLwsXACAAQQxqEJssIAAQ/yogACgCHBCELAsVAAJAIAAtAABFDQAgAEEEahDpBwsLFwAgABCxHiAAQTxqELsoIAAoAjgQhCwLFQACQCAAKAIARQ0AIABBBGoQySwLCxoAAkAgACgCAEGAgICAeEYNACAAIAEQhiELCxoAAkAgACgCAEGAgICAeEYNACAAIAEQiCELCxYAAkAgASgCACIBRQ0AIAEgABCJIQsLFgAC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IAEgABChJwsQACAAEMcoIABBHEEEELMWCxAAIAAQxyggAEEYQQQQsxYLDwAgABDUAyAAQQRqELMGCw8AIAAQtSogAEEUahC4KwsPAAJAIABFDQAgABCFLAsLIQAgAELQr6/Z4cDf4pJ/NwMIIABCxITPwofQy/snNwMACxEAIAAoAgAiABCIBCAAEIgvCw8AIABBIGoQsSwgABC2JAsPACAAELEsIABBBGoQkQYLEAAgACABKAIAKAIAIAIQewsRACAAKAIAIgAQqAMgABCILwsPACAAELUsIABBBGoQnwYLDwAgABC+HSAAQSBqELUsCyEAIABC+uS16sSa6LkjNwMIIABCqKrrluGhn4qhfzcDAAshACAAQvjM69Sv9bCpczcDCCAAQvrY9o/g8bfw0gA3AwALEwAgAEEfNgIEIABB74ucATYCAAsTACAAQQ02AgQgAEGOjJwBNgIACyEAIABC/Nf7/tHxgf67fzcDCCAAQvToq6SjnLOEVTcDAAshACAAQofz952r/suKq383AwggAEKokZWU3Oqn13c3AwALIgAgAEKw5ceF7tGb5rh/NwMIIABC4JrKm5Hcj63KADcDAAshACAAQqre593e4reKfDcDCCAAQsmU4+vWuJ3A0wA3AwALEwAgAEEoNgIEIABBjIicATYCAAsTACAAQdiOnAE2AgQgACABNgIACxMAIABBKDYCBCAAQYyInAE2AgALEwAgAEGUj5wBNgIEIAAgATYCAAsSACAAKAIAEJYnIAAoAgQQlicLEQAgACgCACIAEMoDIAAQiC8LDwAgABDFLCAAQQRqELQGCxIAQQAtAKDxngEaIAEgABChJwsiACAAQr2r3N/6tMLJ9QA3AwggAEKxnJTpsPP9nsEANwMACxEAIAAoAgAiABD3AyAAEIgvCw8AIAAQySwgAEEEahCSBgsPACAAENYoIABBFGoQzSsLDwAgABCsKyAAQRRqEM0rCw8AIAAoAgAgACgCBBDPLAsNACAAIAFBAUEKEJIVCw0AIAAgAUEBQQEQkxULDQAgACABQQRBCBCTFQsNACAAIAFBBEEEEJMVCw8AQcSWgQFBKyAAENIeAAsNACAAIAFBBEEgEJIVCwsAIAAgARAYQQFGCwwAIABBgQEQMUEARwsOACAAKAIAQQEgARDrBwsNACAAIAFBBEEQEJkWCw0AIAAgAUEBQQEQmRYLDQAgACABQQRBCBCZFgsNACAAIAFBBEEUEJkWCw4AIAAgAUEEQcAAEJkWCw0AIAAgAUEEQRwQmRYLDgAgACABQQRB3AAQkxULDQAgACABIAIQuwFBAAsNACAAIAFBBEEEEJMWCwwAIAAgASACEJsVAAsMACAAIAEgAhCcFQALDAAgACABIAIQnRUACw0AIAAgAUEEQQwQkxYLDQAgACABQQFBARCTFgsMACAAIAEgAhBsQQALDgAgACkDAEEBIAEQ1QcLDQAgACABQQRBFBCTFgsNACAAIAFBAUEJEJMWCw0AIAAgAUEEQQgQkxYLDAAgAEEMaiABEPAMCw0AIAAgAUEIQSAQkxULDQAgACABQQhBEBCTFQsLACAAIAEQFkEARwsPACAAKAIAIAAoAgQQvy8LDQAgACgCACgCCEEBRgsMACABIAAgAhCeFQALDQAgACABQQFBARCfFQsNACAAIAFBAUEBELIWCw0AIAAgAUEBQQEQkhULDQAgACABQQRBBBCZFgsNACAAIAFBBEEkEJwWCw0AIAAgAUEEQRwQnBYLDQAgACABQQRBCBCcFgsPACAAKAIAIAAoAgQQhy0LDwAgACgCACAAKAIEEOQsCw0AIAAgAUEIQQgQkxYLDQAgACABQQRBBBCTFgsNACAAIAFBBEEQEJwWCw0AIAAgAUEEQRAQkxYLDQAgACABQQRBDBCTFgsNACAAIAFBBEEUEJMWCw0AIAAgAUEEQQgQkxYLDQAgACABQQFBAhCTFgsNACAAIAFBAUECEJwWCw4AIAAoAgBBDEEEELMWCw4AIAAoAgBBAkEBELMWCw0AIAAgAUEEQRgQkxYLDwAgAEGAi4QBQSAQiBtFCw0AIAAgAUEBQQEQnBYLDgAgACABQQRB2AAQnBYLDwAgACgCACgCACABEPEJCw8AIAAoAgAgASgCABD2BAsNACAAIAFBBEEEEJwWCw0AIAAgAUEEQRgQnBYLEgAgABDNKSAAQYCAgIB4NgIACw0AIAAgASACEPgrQQALDwAgACgCACAAKAIEEMovCw0AIAIgAyAAIAEQ6SILDQAgAiADIAAgARDpIgsPACAAKAIAIAAoAgQQyi8LDwBBAC0AoPGeARogABB9Cw8AIAAoAgAgACgCBBCVLQsNACAAIAFBAUEBEKIWCw0AIAAgAUEIQRgQohYLDQAgASAAQf8BcRC/JgsNACAAIAEgAiADEOMlCw0AIAAgAUEEQQwQmRYLDQAgACABQQhBGBCZFgsNACAAIAFBBEEQEJkWCw0AIAAgAUEEQQwQmRYLDgAgACABQQhBwAAQmRYLDQAgACABQQhBMBCZFgsNACAAIAFBBEEEEJkWCw0AIAAgAUEIQSAQmRYLDQAgACABQQhBKBCZFgsOACAAIAFBCEHYABCZFgsNACAAIAFBCEE4EJkWCw0AIAAgAUEEQRgQmRYLDgAgACABQQhByAAQmRYLDgAgACABQQhB0AAQmRYLDwAgACgCACAAKAIEENgsCw0AIAAgASACEP4rQQALDwAgABC0AyAAKAIEEIAsCw8AIAAoAgAoAgAgARDlDAsPACAAEPQCIAAoAgQQgCwLDQAgACABQQhBCBCZFgsNACAAIAFBCEEoEJkWCw0AIAAgAUEEQQgQnxULDwAgABCDAyAAKAIEEIAsCw8AIAAQtQMgACgCBBCALAsPACAAEIsDIAAoAgQQgCwLDwAgABDmAiAAKAIEEI0sCw0AIAAgAiABIAMQvScLDQAgACACIAEgAxC8JwsNACABIABBBEEEEJkWCw0AIAAgAUEIQRAQmRYLDQAgACgCACABEP0vAAsPACAAKAIAIAAoAgQQ2CwLDwAgACgCACAAKAIEEPEsCw0AIAAgAUEEQRAQnxULDQAgACABQQRBGBCfFQsNACAAIAFBBEEEEJ8VCw0AIAAgAUEEQQwQnxULEAAgACABQeSzmwFBHhDjJQsQACAAIAFB4KucAUEBEKMrCw0AIAAgAUEEQRwQnxULDQAgACABQQRBJBCfFQsPACAAKAIAIAAoAgQQgDALEAAgACABQeKrnAFBARCjKwsQACAAIAFBlaucAUEEEKMrCxAAIAAgAUGpmZwBQQEQoysLEgBBoKacAUEoQYCYnAEQ0h4ACw8AIAAQmywgACgCBBCALAsNACAAIAEgAhDUK0EACw8AIAAQtwMgACgCBBCALAsNACAAIAIgAUEAEJYGCxIAQaCmnAFBKEGQmJwBENIeAAsPAEEALQCg8Z4BGiAAEH0LDQAgACABQQFBABDeBgsNACAAIAEoAgAgAhBHCw4AIAAgASgCACACEJ0SCw0AIAAgASgCACACEE4LDQAgASAAQQRBBBCTFQsNACAAIAFBCEEYEJMVCw0AIAAgAUEEQTwQkxULDwAgABCnLCAAKAIEEIAsCw8AIAAQ1AMgACgCBBCALAsPACAAELEsIAAoAgQQgCwLDQAgACABKAIAIAIQSQsPACAAELUsIAAoAgQQgCwLDwAgACgCACAAKAIEEL8vCw8AIAAoAgggACgCDBC/LwsPACAAKAIAIAAoAgQQvy8LDQAgACABQQRBDBCTFQsOACAAIAEoAgAgAhDGBgsPACAAEMUsIAAoAgQQgCwLDwAgABDJLCAAKAIEEIAsCwsAIAAjAGokACMACwkAIAAQF0EBRgsJACAAEBlBAUYLCQAgABAvQQBHCwsAIAAgASACEIUBCwwAIAAoAgAgARC9IAsLACAAIAEgAhCcAQsLACAAIAEgAhDoAQsKACAAIAEgAhBbCwwAIAAoAgAgARDZKwsMACAAKAIAIAEQuyALDgAgAUHI2pcBQQIQggYLCwAgASAAKAK0Ak0LCwAgASAAKALQAk0LCwAgASAAKALIAk0LCwAgACgCACABEGQLCwAgACABELAXQQALCQAgABAoQQBHCwkAIAAgARA0AAsMACAAEN4oIAAQ9C0LCwAgAEEsQQQQsxYLCwAgACABIAIQnhQLCwAgAEEMQQQQsxYLCwAgACACIAMQyRQLCwAgAiAAIAEQggYLDAAgACgCACABEMITCwoAIAAQhxMaQQELDAAgACgCACABENYrCwwAIAAoAgAgARCEBwsMACAAKAIAIAEQiw4LDAAgACgCACABELImCwwAIAAoAgAgARDxCQsMACAAKAKkDUHEAmoLCwAgAC0ArApBAXELDAAgACgCpA1BxAJqCwwAIAAoAqQNQcQCagsLACAAKAKMA0ECSwsKACAAQQRqEIslCwsAIAEgACgCtAJNCwsAIAEgACgCyAJNCwsAIAEgACgC0AJNCwsAIAAoAowDQQJLCwwAIAAoAgAgARDnFwsMACAAKAIAIAEQ1AoLDAAgACgCACABEOQXCwoAIABBMGoQ3B4LCwAgAEEYQQQQsxYLCwAgAEE0QQQQsxYLCwAgAEEcQQQQsxYLDgAgAEGcuYgBQQoQjQ0LDwAgAEHsuYgBQccAEI0NCwwAIAAoAgAgARCHEAsLACAAIAEQkApBAAsMACAAKAIAIAEQjB4LCwAgACABEMAXQQALDgAgAUHI2pcBQQIQggYLDAAgACgCACABENsrCwoAIAAgARCaLgALCgAgACABEIEkAAsMACAAKAIAIAEQsiYLDAAgACgCACABEPwMCwwAIAAgASkCADcDAAsMACAAKAIAIAEQ4BULCgAgABCSDhpBAQsKACAAELUCGkEBCwsAIAAgAUEEEP4eCwwAIAAoAgAgARDsKwsKACAAEPQNGkEBCwwAIAAoAgAgARC7HAsMACAAKAIAIAEQ7AQLDAAgABDGISABEPsqCwwAIAAoAgAgARDcGgsMACAAKAIAIAEQ5QwLDAAgACgCACABEM8CCwwAIAAoAgAgARDJFwsMACAAKAIAIAEQ0yALDAAgACgCACABENkZCwwAIAAQxiEgARDGIQsMACAAKAIAIAEQry4LDAAgACgCACABEJAFCwwAIAAoAgAgARDdGgsMACAAKAIAIAEQvwoLDAAgACgCACABELwZCwwAIAAoAgAgARDXCgsMACAAKAIAIAEQ1gwLDAAgACgCACABEKcuCwwAIAAoAgAgARD5EAsMACAAKAIAIAEQqg0LDAAgACgCACABEOsiCwsAIABBAToADEEBCwwAIAAQyCEgARCDKwsMACAAEMghIAEQyCELDAAgACgCACABEMkhCwwAIAAoAgAgARD+FQsMACAAKAIAIAEQ8xALDAAgACgCACABEPAQCwwAIAAQyCEgARCDKwsMACAAEMghIAEQyCELDAAgACgCACABEPcQCwwAIAAoAgAgARDvDgsMACAAKAIAIAEQ3CgLDAAgACgCACABEJEeCwwAIAAoAgAgARDjCQsMACAAKAIAIAEQ5BgLDAAgACgCACABENgZCwwAIAAoAgAgARDpGQsMACAAKAIAIAEQyhcLCwAgAEEEQQQQsxYLCwAgAEEgQQgQsxYLCwAgACABIAIQ4BoLCwAgACABIAIQ4BoLCwAgASAAIAIQzS4LDAAgACgCACABEKoICwwAIAAoAgAgARClCAsLACAAIAFBABCIBwsLACAAIAFBARCIBwsMACAAIAFB4gQQlQMLDAAgACABQeMEEJUDCwwAIAAgAUHkBBCVAwsMACAAIAFB5QQQlQMLDAAgACABQeYEEJUDCwwAIAAgAUHnBBCVAwsMACAAIAFB6AQQlQMLDAAgACABQekEEJUDCwwAIAAgAUHqBBCVAwsMACAAIAFB6wQQlQMLDAAgACABQewEEJUDCwwAIAAgAUHt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ARCxCAsIACAAIAEQRQsJACAAIAEQ8wkLCQAgACABEK4CCwkAIAAgARDKAgsJACAAIAEQyQcLCQAgACABEOkCCwkAIAAgARCyJgsMAEH7opsBQQ0Q0wwLDABB8qKbAUEJENMMCwwAQeSimwFBDhDTDAsJACABIAAQ5gELDABBi6qbAUEIENMMCwcAIABBGGoLCQAgACABEPEsCwkAIABBADYCAAsJACAAIAEQ1isLCQAgACABENYrCwgAIAAgARBkCwkAIAAgARCyLwsJACAAIAEQsy8LCQAgACABELQvCwoAEJoHIAAQlA0LCgAgACgCABCeJwsJACAAIAEQ4wELBwAgABCMKQsHAEEBEN4qCwcAQQAQ3ioLCAAgAC0AxAILBwAgACgCFAsIACAAKAKsAgsIACAAKAKwAgsIACAALQDgAgsHACAAKAI4CwgAIAAoAsgCCwgAIAAoAswCCwUAIAFFCwgAIAAtANgCCwcAIAAoAiALCAAgACgCwAILCAAgACgCxAILCAAgAC0AzBILCAAgAC0AvA0LBwAgABDFDQsHACAAEKgJCwcAIAAoAkALBwAgABCfEwsIACAALQDEAgsHACAAKAIUCwgAIAAoAqwCCwgAIAAoArACCwUAIAFFCwgAIAAtANgCCwcAIAAoAiALCAAgACgCwAILCAAgACgCxAILCAAgAC0A4AILBwAgACgCOAsIACAAKALIAgsIACAAKALMAgsHACAAKAJACwcAQQAQ/BULBwAgACgCIAsHACAAKAIkCwcAIAAoAigLBwAgABCWCAsEAEEBCwcAQcDwngELBwBBuPCeAQsDAAALBAAgAAsEAEEACwQAQQELBABBAQsEAEEACwQAIAALBABBAQsEAEEACwQAIAALBABBAAsEAEEBCwQAQQALAwAACwQAQQALBABBAQsHAEHE8J4BCwQAQQELBABBAQsCAAsCAAsCAAsCAAsCAAsCAAsCAAsCAAsL9OseAgBBgICAAQug4B7JAwAADAAAAAQAAADKAwAAywMAAMwDAAAAAAAAAAAAAAEAAADNAwAAzgMAAAQAAAAEAAAAzwMAANADAADEAAAABAAAANEDAADSAwAA0wMAAGl0IHNob3VsZCBub3QgZmFpbCB3aXRob3V0IGVtaXR0aW5nIGVycm9ycyB0byBoYW5kbGVyAAAAGiwgACIAAAB7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AAAA8gEAABgAAAAs2iAAbQAAAPMBAAAjAAAALNogAG0AAADzAQAAGAAAACzaIABtAAAA7QEAACMAAAAs2iAAbQAAAO0BAAAYAAAALNogAG0AAADuAQAAHgAAACzaIABtAAAA7gEAACMAAAAs2iAAbQAAAO8BAAAZAAAALNogAG0AAACYAgAANAAAACzaIABtAAAAmwIAACEAAAAs2iAAbQAAAJsCAAAmAAAALNogAG0AAACcAgAAHwAAACzaIABtAAAAnAIAADIAAAAs2iAAbQAAAJMCAAA0AAAALNogAG0AAACVAgAAGAAAACzaIABtAAAAjwIAADQAAAAs2iAAbQAAAJACAAAnAAAALNogAG0AAACQAgAALAAAACzaIABtAAAA0gIAABEAAAAs2iAAbQAAANMCAAARAAAALNogAG0AAADMAgAANAAAACzaIABtAAAAzgIAABEAAAAs2iAAbQAAAM8CAAARAAAALNogAG0AAADQAgAAEQAAACzaIABtAAAAyAIAABEAAAAs2iAAbQAAAMkCAAARAAAALNogAG0AAADaAgAAPAAAACzaIABtAAAA3AIAABUAAAAs2iAAbQAAANsCAAARAAAALNogAG0AAADfAgAAFQAAACzaIABtAAAA3gIAABEAAAAs2iAAbQAAAAoDAAARAAAALNogAG0AAAANAwAAEQAAACzaIABtAAAA+AIAABUAAABlcXVpdmFsZW5jZSBjbGFzc2VzIGFyZSBuZXZlciBlbXB0eQBAFCAAIwAAACzaIABtAAAALgMAAAkAAAAs2iAAbQAAADADAAAQAAAALNogAG0AAAA/AwAAHQAAACzaIABtAAAAswMAACUAAAAs2iAAbQAAAOADAAAjAAAALNogAG0AAADhAwAAIQAAACzaIABtAAAA4gMAACgAAAAs2iAAbQAAAOMDAAAmAAAALNogAG0AAADuAwAAEgAAACzaIABtAAAA7wMAABoAAAAs2iAAbQAAANgDAAAmAAAALNogAG0AAADSAwAAHgAAACzaIABtAAAAxgMAACIAAAAAAAAABAAAAAQAAAAkAAAAAAAAAAQAAAAEAAAATgAAAAAAAAAEAAAABAAAAO0DAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmJ5X2lkLmxlbigpIDw9IHUxNjo6TUFYIGFzIHVzaXplAAEaIABtAAAASAAAAAkAAAABGiAAbQAAAEsAAAAUAAAAARogAG0AAABMAAAAFAAAAAEaIABtAAAAjwAAABwAAAABGiAAbQAAAMgAAAAlAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3JlbWFwcGVyLnJz9BUgAGwAAAByAAAAEgAAAPQVIABsAAAAjAAAACQAAAD0FSAAbAAAAJEAAAAgAAAA9BUgAGwAAACTAAAAHQAAAJQKIQBpAAAAhwIAACkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwAAsBYgAG4AAADhAgAAAQAAAAAAAAAIAAAABAAAAO4DAABhc3NlcnRpb24gZmFpbGVkOiBwYXR0ZXJucy5sZW4oKSA+PSAxL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvcmFiaW5rYXJwLnJzZRcgAG8AAAA9AAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IGhhc2hfbGVuID49IDEAZRcgAG8AAAA/AAAACQAAAGUXIABvAAAASAAAABYAAABlFyAAbwAAAE0AAAAsAAAAZRcgAG8AAABPAAAAFwAAAGUXIABvAAAATwAAACAAAABAAAAAZRcgAG8AAABgAAAAKwAAAGUXIABvAAAAbwAAABEAAABlFyAAbwAAAFsAAAAJAAAAZRcgAG8AAACOAAAAIwAAAGUXIABvAAAAlwAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvYWxwaGFiZXQucnOx5yAADAAAAGKPJgACAAAA4hUnAAEAAABCeXRlQ2xhc3Nlcyg8b25lLWNsYXNzLXBlci1ieXRlPikAAAAsGSAAIQAAAKgYIABsAAAA9QAAAC4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvZGVidWcucnMAAABoGSAAaQAAABgAAAA9AAAAaBkgAGkAAAAVAAAADQAAAEJvcnJvd2VkT3duZWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9wYXR0ZXJuLnJzAAABGiAAbQAAAF0AAAAaAAAAARogAG0AAABdAAAAMAAAAAAAAAAAAAAAAQAAAO8DAABDb3dCeXRlc25lZWRsZVBhdHRlcm5zYnlfaWRvcmRlcnRvdGFsX3BhdHRlcm5fYnl0ZXNpbXBtZW1vcnlfdXNhZ2UAAPADAABcAQAABAAAAKEAAADwAwAAXAEAAAQAAADxAwAA8gMAAPMDAAD0AwAA9QMAAPYDAAD3AwAA+AMAAPkDAAD6AwAA+wMAAPwDAAD9AwAA/gMAAP8DAAAABAAAAQQAAKEAAADkGiAAAgQAAEgBAAAEAAAAAwQAAAIEAABIAQAABAAAAAQEAAAFBAAABgQAAPQDAAAHBAAACAQAAAkEAAAKBAAACwQAAAwEAAANBAAADgQAAA8EAAAQBAAAEQQAABIEAAATBAAAAwQAAEwbIAAUBAAAZAEAAAQAAAAVBAAAFAQAAGQBAAAEAAAAFgQAABcEAAAYBAAA9AMAABkEAAAaBAAAGwQAABwEAAAdBAAAHgQAAB8EAAAgBAAAIQQAACIEAAAjBAAAJAQAACUEAAAVBAAAtBsgACzaIABtAAAA0wAAACEAAABkCCEAcAAAAHACAAAeAAAAAAAAAAQAAAAEAAAAJgQAACcEAAAMAAAABAAAACgEAAApBAAAKgQAAGxpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzZBwgACAAAAAuAgAAEQAAAGxpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwCUHCAAGwAAAOgBAAAXAAAAAAAAAAAAAAABAAAAKwQAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90bGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAAAmHSAAGAAAAIoCAAAOAAAAAAAAAAAAAAABAAAALAQAAGxpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAABgHSAAGgAAAL4BAAAdAAAAbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwAAAIwdIAAZAAAAhAEAADIAAAApIHNob3VsZCBiZSA8IGxlbiAoaXMgaW5zZXJ0aW9uIGluZGV4IChpcyApIHNob3VsZCBiZSA8PSBsZW4gKGlzIAAAAM4dIAAUAAAA4h0gABcAAABcgicAAQAAAHJlbW92YWwgaW5kZXggKGlzIAAAFB4gABIAAAC4HSAAFgAAAFyCJwABAAAAYGF0YCBzcGxpdCBpbmRleCAoaXMgAAAAQB4gABUAAADiHSAAFwAAAFyCJwABAAAAAAAAAAQAAAAEAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaW52YWxpZCBPbmNlIHN0YXRlfB4gADwAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvb25jZS9ub190aHJlYWRzLnJzAMAeIABbAAAANQAAABIAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobikAAEMWJwBLAAAAFAgAAB0AAADJAwAADAAAAAQAAADKAwAAywMAAMwDAADJAwAADAAAAAQAAADKAwAAywMAAMwDAAAAAAAAAAAAAAEAAADNAwAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnMAwB8gAF8AAABnBAAADgAAAAoKQ2F1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AAAAyiImAAsAAABpbnZhbGlkIGxlbmd0aCAASCcgAA8AAADKIiYACwAAAGR1cGxpY2F0ZSBmaWVsZCBgAAAAaCcgABEAAADg+SYAAQAAAHVua25vd24gdmFyaWFudCBgYCwgZXhwZWN0ZWQgAAAAjCcgABEAAACdJyAADAAAAIX0JgBYAAAAlQgAABsAAACF9CYAWAAAAJMIAAAaAAAATWFwQWNjZXNzOjpuZXh0X3ZhbHVlIGNhbGxlZCBiZWZvcmUgbmV4dF9rZXkvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9jb3JlLTEuMC4yMjUvc3JjL2RlL3ZhbHVlLnJzAAgoIABnAAAAZwUAABsAAAB2ZXJiYXRpbU1vZHVsZVN5bnRheG5hdGl2ZUNsYXNzUHJvcGVydGllc2ltcG9ydE5vdFVzZWRBc1ZhbHVlc25vRW1wdHlFeHBvcnRpbXBvcnRFeHBvcnRBc3NpZ25Db25maWd0c0VudW1Jc011dGFibGVyZW1vdmVwcmVzZXJ2ZfIoIAAGAAAA+CggAAgAAAB2YXJpYW50IGluZGV4IDAgPD0gaSA8IDIQKSAAGAAAAAAAAAAIAAAABAAAADwEAABDbGFzc2ljUHJlc2VydmVOb2RlTmV4dEVzTmV4dAAAAEApIAAHAAAARykgAAgAAABPKSAACAAAAFcpIAAGAAAAdmFyaWFudCBpbmRleCAwIDw9IGkgPCA0gCkgABgAAACAKCAAFAAAAJQoIAAVAAAAqSggABUAAAC+KCAADQAAAMsoIAAYAAAA4yggAA8AAAB2YWx1ZSBpcyBtaXNzaW5ndHN4AOApIAADAAAAzckmAAoAAABzdHJpcC1vbmx5dHJhbnNmb3JtAPQpIAAKAAAA/ikgAAkAAABmaWxlbmFtZXBhcnNlcmRlcHJlY2F0ZWRUc01vZHVsZUFzRXJyb3Jzb3VyY2VNYXDU+SYABgAAABgqIAAIAAAAICogAAYAAAA54SAABAAAAP4pIAAJAAAAJiogABkAAAA/KiAACQAAAD0EAAAkAAAABAAAAD4EAAAAAAAABAAAAAQAAAA/BAAAQAQAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC41MC9zcmMvbGliLnJzAKQqIABrAAAA5gAAABUAAABUc0Vycm9yAEEEAAAQAAAABAAAAEIEAABBBAAAEAAAAAQAAABDBAAAQgQAACgrIABEBAAARQQAAEYEAABEBAAARwQAAEgEAAAsAAAABAAAAEkEAABIBAAALAAAAAQAAABKBAAASQQAAGQrIABLBAAATAQAAE0EAABOBAAATwQAAFAEAABRBAAAUgQAAFMEAABUBAAAVQQAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXBfdGhyb3coKWAgb24gYSBgTm9uZWAgdmFsdWVjYWxsZWQgYFJlc3VsdDo6dW53cmFwX3Rocm93KClgIG9uIGFuIGBFcnJgIHZhbHVlYmluZGluZ190eXBlc2NyaXB0X3dhc20vc3JjL2xpYi5ycxosIAAiAAAAIwAAABcAAAAAAAAAAAAAAAEAAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABfBAAAYAQAAGEEAABiBAAAYwQAAF8EAABkBAAAzCwgAF4AAABIBQAAMgAAAMwsIABeAAAAVgUAAEkAAABlBAAAZgQAAGcEAABoBAAAaQQAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2J5dGVzLTEuMTAuMS9zcmMvYnl0ZXMucnMvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9ieXRlcy1zdHItMC4yLjcvc3JjL2J5dGVfc3RyLnJzbiBpcyBub3QgYSBjaGFyYWN0ZXIgYm91bmRhcnkAji0gAB0AAAAqLSAAZAAAAJsBAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvY29tcGFjdF9zdHItMC43LjEvc3JjL2xpYi5yc2lkeCBtdXN0IGxpZSBvbiBjaGFyIGJvdW5kYXJ5AAAlLiAAHQAAAMQtIABhAAAAiQMAAAkAAAAAAAAABAAAAAQAAABqBAAAawQAAGwEAAAAAAAAAAAAAAEAAABWBAAAgkEmAGcAAAB2AQAAQgAAAHZhbGlkIGxheW91dIJBJgBnAAAAeQEAAA4AAACCQSYAZwAAAKwBAAAOAAAAQRoGGi8BCgEEAQUXAR8BAAQMDgUHAQEBVgEdEgECAgQBAQYBAQMBAQEUAVMBiwimASYCAQYpJw4BAQECAQIBAQgbBAQdCwU4AQcOZgEIBAgEAwoDAgEQMA1lGCEJAgQBBRgCExMZBwsFGAEGCAEIKgoMAwcGTAEQAQMEDw0TAQgCAgIWAQcBAQMEAwgCAgICAQEIAQQCAQUMAgoBBAMBBgQCAhYBBwECAQIBAgQFBAICAgQBBwQBAREGCwMBCQEDARYBBwECAQUDCQEDAQIDAQ8EFQQEAwEIAgICFgEHAQIBBQMIAgICAgkCBAIBBQ0BEAIBBgMDAQQDAgEBAQIDAgMDAwwEBQMDAQMDAQYBKA0BAwEXARADCAEDAQMIAgEDAgECBBwEAQgBAwEXAQoBBQMIAQMBAwgCBgIBBA0DDA0BAwEpAggBAwEDAQEFBAcFFgYBAwESAxgBCQEBAgcIBgEBAQgSAg06BQcGATMCAQEBBQEYAQEBEwEDAgUBAQYBDgQgAT8IASQEEwQQASRDNwEBAgUQQAoEAiYBAQUBAisBAAEEAgcBAQEEAikBBAIhAQQCBwEBAQQCDwE5AQQCQyUQEFYCBgMAAhEBGgVLAwsHFAsVDBQMDQEDAQIMNAITDgEEAUNZBysFRgofAQwECRceAgULLAQaNhwEPwIUMgEXAgsDMTQBDwEIMyoCBAosAQsONxYDCiQCCwUrAgMpBAEGAQIDAQXAEyILAAIGAiYCBgIIAQEBAQEBAR8CNQEHAQEDAwEHAwQCBgQNBQMBB3QBDQEQDWUBBAECCgEBAwUGAQEBAQEBBAELAgQFBQQBESkANADlBgQDAgwmAQEFAQI4BwEQFwkHAQcBBwEHAQcBBwEHAQcBIC8BAAMZCQcFAgUEVgYDAVoBBAUrAV4RIDAQAABAAEMuAgADEAoCFC8FCANxJwkCZwJDAgIBAQEIFRQBIRg0DEQBASwGAwEBAwohBSMNHQMzAQwPARAQCgUBNwkOEhcDRQEBAQEYAwIQAgQLBgIGAgYJBwEHASsBDgZ7FQAMFwQxAAACaiYHDAUFDAENAQUBAQECAQIBbCEAEkACNigMdAUBhyQaBhoLWQMGAgYCBgIDIwwBGgETAQIBDwIOIntFNQAdAzEvIA0eBSsFHgIkBAgBBSqeEiQEJAQoCDQMCwEPAQcBAgELAQ8BBwECAzQMAAkWCggYBgEqAQlFBgIBASwBAgMBAhcKFwkfQRMBAgoWChpGOAYCQAQBAgUIAQMBHSodAx0jCAEcGzYKFgoTDRJuSTczDTMNKCIcAwEFF/oqAQIDAhADNwEDHQoBCBYqEi4VGxcJRisFCjkJAQ0ZFzMRBAgjAwEJQAEECQIKAQEBIxIBIgIBBgQ+BwEBAQQBDwEKBzkXBAEIAgICFgEHAQIBBQMIAgICAgMBBgEFBxwKAQECAQEmAQoBAQIBAQQBAgMBAQEsQgEDAQQUAx5CAgIBAbg2AgcZBiI/AQEDATs2AgFHGwIOFQe5OWdAHwgCAQIIAQIBHgECAgICBF0IAi4CBgEBAQIbMwIKEUgFARJJxyEfCQEtAQcBATEeAhYBDkkHAQIBLAMBAQIBAwEBAgIYBgECASUBAgEEAQEAFwkRASkDA28BTwBmbxHEAGEPABEGGQAFAAAvAAAHHxFPER4SMBAEHxUFEwAt00CASwQ5BxFAAgEBDAIOAAgAKQoABAEHAQIBAA8BHQMCAQ4ECAAAawUNAwkHCgQBAFUBRwECAgECAgIEAQwBAQEHAUEBBAIIAQcBHAEEAQUBAQMHAQACGQEZAR8BGQEfARkBHwEZAR8BGQEIAB8GBtUHARECBwECAQUFPiEBcC0KBxABAB4SLAAc5B4CAQAHAQQBAgEPAcU7RAMBAwEABAEbAQIBAQIBAQoBBAEBAQEGAQQBAQEBAQEDAQIBAQIBAQEBAQEBAQEBAgEBAgQBBwEEAQQBAQEKAREFAwEFAREAGgYaBhoAACAABt4CAA4ADwAAAAAABQAAAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDOwkqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgIBAQMDAQQHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwAEHAMdAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAoEAyYJDAIgBAIGOAEBAgMBAQU4CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsBASwDMAECBAICAgEkAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABEEFAAJPBEYLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJAQEIBAIBXwMCBAYBAgGdAQMIFQI5AgEBAQEMAQkBDgcDBUMBAgYBAQIBAQMEAwEBDgJVCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAghlAQEBAgQBBQAJAQL1AQoEBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQMXAQABBg8ADAMDAAU7BwABPwRRAQsCAAIALgIXAAUDBggIAgceBJQDADcEMggBDgEWBQEPAAcBEQIHAQIBBWQBoAcAAT0EAAT+AgAHbQcAYIDwADAKeAIFAQIDAAqGCsYKAAp2CgQGbAp2CnYKAgZuDXMKCAdnCmgHBxNtCmAKdgpGFAAKRgoAFAAD7woGChYKAAqAC6UKBgq2ClYKhgoGCgABAwYGCsYzAgUAPE4WAB4AAQABGQkOAwAEigoeCAEPIAonDwAKvAoABpoKJgrGChYKVgoACgAKAC0MORECABskBB0BCAGGBcoKAAgZBycJSwUWBqACAhACLkAJNAIeA0sFaAgYCCkHAAYwCgYKAB+eCioEcAeGHoAKPAqQCgcU+woACnYKAApmCgYUTAwAE10KAApWHeMKRgoACmYVAG8ACgAKVgqGCgEHAAoAFwAKABQMFGwZADIACgAKAAr3CgAJgAoAOwEDAQRMLQEPAA0ACgAAAAAAAAEAAAAAAAAACgAAAAAAAABkAAAAAAAAAOgDAAAAAAAAECcAAAAAAACghgEAAAAAAEBCDwAAAAAAgJaYAAAAAAAA4fUFAAAAAADKmjsAAAAAAOQLVAIAAAAA6HZIFwAAAAAQpdToAAAAAKByThgJAAAAQHoQ81oAAACAxqR+jQMAbGlicmFyeS9jb3JlL3NyYy9udW0vZGVjMmZsdC9kZWNpbWFsX3NlcS5ycwBAOSAAKwAAAFYAAAAnAAAAQDkgACsAAACIAAAAEwAAAEA5IAArAAAAsAAAACAAAABAOSAAKwAAAMcAAAAlAAAAQDkgACsAAAD0AAAAFQAAAEA5IAArAAAA/wAAABgAAAAAAAAIAQgDCAYQCRANEBIYFxgdGCQgKyAzIDwgRihQKFsoZzBzMIAwjjicOKs4uzjMQN1A70ACSRVJKUk+UVNRaVGAUZhZsFnJWeNh/WEYYjRqUGptaotqqnLJculyCnsre017cIOTg7eD3IMCjCiMT4x3lJ+UyJTynBwFHAUcBRwFBQIFAQIFBgIFAwECBQEFBgIFBwgBAgUDCQAGAgUBCQUDAQIFCQcGBQYCBQQICAIIAQIFAgQEAQQABgIFAQICAAcAAwECBQYBAAMFAQUGAgUDAAUBBwUHCAECBQEFAgUIBwgJAAYCBQcGAgkDCQQFAwECBQMIAQQGCQcCBgUGAgUBCQAHAwQIBgMCCAECBQkFAwYHBAMBBgQABgIFBAcGCAMHAQUIAgADAQIFAgMIBAEIBQcJAQABBQYCBQEBCQIACQIICQUFAAcIAQIFBQkGAAQGBAQHBwUDCQAGAgUCCQgAAgMCAgMIBwYJBQMBAgUBBAkAAQEGAQEJAwgEBwYFBgIFBwQFAAUIAAUJBgkCAwgCCAECBQMHAgUCCQACCQgEBgEJAQQABgIFAQgGAgYEBQEECQIDAAkFBwADAQIFCQMBAwICBQcEBgEFBAcIBQEFBgIFBAYFBgYBAggHAwAHBwMJAgUHCAECBQIDAggDAAYEAwYFAwgGCQYCCAkABgIFAQEGBAEFAwIBCAIGCQMECAEEBAUDAQIFBQgCAAcGBgAJAQMEBgcEAAcCAgYFBgIFAgkBAAMIAwAEBQYHAwMHAAMGAQMCCAECBQEEBQUBCQEFAgIIAwYGCAUBCAAGBgQABgIFBwIHBQkFBwYBBAEIAwQCBQkAAwMCAAMBAgUDBgMHCQcICAAHAAkBBwECCQUBBgYAAQUGAgUBCAEICQgJBAADBQQFCAUGBAcFCAMAAAcIAQIFCQAJBAkEBwABBwcCCQIIAgMHCQEFAAMJAAYCBQQFBAcEBwMFAAgIBgQGBAEBCAkFBwUBCQUDAQIFAgIHAwcDBgcFBAQDAgMCAAUJBAcIBwUJBwYFBgIFAQEDBggGCAMHBwIBBgEGAAIJBwMJAwcJCAgCCAECBQUGCAQDBAEICAYACAAIAAEECAYJBggJCQQBBAAGAgUCCAQCAQcACQQDAAQABAAABwQDBAgEBAkHAAcAAwECBQEEAgEACAUEBwEFAgACAAADBwEHBAICBAgFAwUBBQYCBQcBAAUEAgcDBQcGAAEAAAEIBQgHAQECBAIGBwUHCAECBQMFBQIHAQMGBwgIAAAFAAAJAgkDBQUGAgEDAwcICQAGAgUBBwcGAwUGCAMJBAAAAgUABAYEBgcHCAEABgYICQQFAwECBQgICAEHCAQBCQcAAAECBQIDAgMDCAkABQMDBAQHAgYFBgIFBAQEAAgJAgAJCAUAAAYCBgEGAQYJBAUCBgYHAgMGAwIIAQIFAgICAAQEBgAECQIFAAMBAwAIAAgEBwIGAwMDBgEIAQYEAAYCBQEBAQACAgMAAgQGAgUBBQYFBAAEAgMGAwEGBggACQAIAgADAQIFBQUFAQEBBQECAwECBQcIAgcAAgEBCAEFCAMEAAQFBAEAAQUGAgUCBwcFBQUHBQYBBQYCCAkBAwUBAAUJAAcJAQcAAgIHAAUABwgBAgUBAwgHBwcIBwgABwgBBAQFBgcFBQIJBQMJBQgFAQEDBQIFAwkABgIFBgkDCAgJAwkAAwkABwICCAMHBwYEBwYJBwkCBQUGBwYCBgkFAwECBQMEBgkEBAYJBQEJBQMGAQQBCAgIAgMIBAgJBgIHCAMIAQMEBwYFBgIFAQcDBAcCAwQHBQkHBggABwAJBAQBAQkCBAQIAQMJAQkABgcDCAIIAQIFCAYHAwYBBwMHCQgIBAADBQQHAgAFCQYCAgQABgkFCQUDAwYJAQQABgIFAABAOSAAKwAAAGwBAAAbAAAAQDkgACsAAABxAQAAEwAAAAADBgkNEBMXGh0hJCcrLjE1ODsAAAAAAAAA8D8AAAAAAAAkQAAAAAAAAFlAAAAAAABAj0AAAAAAAIjDQAAAAAAAavhAAAAAAICELkEA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IHN5bWJvbG5vbi16ZXJvIHRyYWlsaW5nIGJpdHNpbnZhbGlkIHBhZGRpbmcgbGVuZ3RoIGF0IAEAAAAAAAAAXIYgAAQAAABMZW5ndGhUcmFpbGluZ1BhZGRpbmdEZWNvZGVFcnJvcnBvc2l0aW9uAgAAAAAAAAAAAAgAAAAAAAAAAAAgAADpL3J1c3QvZGVwcy9oYXNoYnJvd24tMC4xNS4zL3NyYy9yYXcvbW9kLnJzAACwhiAAKgAAACUAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaGFzaGJyb3duLTAuMTUuNC9zcmMvcmF3L21vZC5yc+yGIABkAAAAJQAAACgAAAAAAAAAAAAAAAEAAABWBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdHJpb21waGUtMC4xLjE0L3NyYy9hcmMucnMAcIcgAF8AAAA1AQAADgAAAHCHIABfAAAAbgEAAC0AAABwhyAAXwAAAG8BAAAOAAAAAAAAAAwAAAAEAAAAcgQAAHMEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9oc3RyLTIuMS4wL3NyYy9saWIucnMAABSIIABaAAAAFAEAADwAAAAAAAAAAAAAAAEAAAB0BAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaHN0ci0yLjEuMC9zcmMvZHluYW1pYy5ycwAAkIggAF4AAABxAAAAIAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5yc3JldHVybiB0aGlzAIkgAF0AAAD7GAAAAQAAAHSDJwBvAAAAJAEAAA4AAAB3RCYAcAAAAE0AAAAuAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJn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Njg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pdGVyLnJzAABAoiAATgAAAPYFAAAVAAAAAAAAAAQAAAAEAAAATgAAAG5lZ2F0aXZlIHZhbHVlcyBhcmUgbm9uLXplcm8vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWdpbnQvc2hpZnQucnMAAADMoiAAaQAAAGYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAAAEijIABtAAAAOwAAABoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3NoaWZ0LnJzAADIoyAAagAAAB4AAAAcAAAAyKMgAGoAAAAoAAAAGQAAAMijIABqAAAALgAAABIAAADIoyAAagAAAEoAAAAjAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC5yc3SkIABkAAAAYwMAABcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJz6KQgAHAAAAA0AAAAGgAAAOikIABwAAAANQAAABoAAABDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEueKUgADQAAADopCAAcAAAAEUAAAAFAAAA6KQgAHAAAABdAAAAGgAAAOikIABwAAAAXgAAABoAAABhc3NlcnRpb24gZmFpbGVkOiBhX2hpLmlzX2VtcHR5KCkAAADopCAAcAAAAGIAAAAFAAAA6KQgAHAAAABlAAAABQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnMopiAAZAAAAIMBAAABAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvaW1wX3N0ZC5yc5ymIABkAAAAoQAAADYAAACcpiAAZAAAAJsAAAAJAAAAMzg7NTswMzg7NTsxMzg7NTsyMzg7NTszMzg7NTs0Mzg7NTs1Mzg7NTs2Mzg7NTs3Mzg7NTs4Mzg7NTs5Mzg7NTsxMDM4OzU7MTEzODs1OzEyMzg7NTsxMzM4OzU7MTQzODs1OzE1Mzg7NTsxNjM4OzU7MTczODs1OzE4Mzg7NTsxOTM4OzU7MjAzODs1OzIxMzg7NTsyMjM4OzU7MjMzODs1OzI0Mzg7NTsyNTM4OzU7MjYzODs1OzI3Mzg7NTsyODM4OzU7MjkzODs1OzMwMzg7NTszMTM4OzU7MzIzODs1OzMzMzg7NTszNDM4OzU7MzUzODs1OzM2Mzg7NTszNzM4OzU7MzgzODs1OzM5Mzg7NTs0MDM4OzU7NDEzODs1OzQyMzg7NTs0MzM4OzU7NDQzODs1OzQ1Mzg7NTs0NjM4OzU7NDczODs1OzQ4Mzg7NTs0OTM4OzU7NTAzODs1OzUxMzg7NTs1MjM4OzU7NTMzODs1OzU0Mzg7NTs1NTM4OzU7NTYzODs1OzU3Mzg7NTs1ODM4OzU7NTkzODs1OzYwMzg7NTs2MTM4OzU7NjIzODs1OzYzMzg7NTs2NDM4OzU7NjUzODs1OzY2Mzg7NTs2NzM4OzU7NjgzODs1OzY5Mzg7NTs3MDM4OzU7NzEzODs1OzcyMzg7NTs3MzM4OzU7NzQzODs1Ozc1Mzg7NTs3NjM4OzU7NzczODs1Ozc4Mzg7NTs3OTM4OzU7ODAzODs1OzgxMzg7NTs4MjM4OzU7ODMzODs1Ozg0Mzg7NTs4NTM4OzU7ODYzODs1Ozg3Mzg7NTs4ODM4OzU7ODkzODs1OzkwMzg7NTs5MTM4OzU7OTIzODs1OzkzMzg7NTs5NDM4OzU7OTUzODs1Ozk2Mzg7NTs5NzM4OzU7OTgzODs1Ozk5Mzg7NTsxMDAzODs1OzEwMTM4OzU7MTAyMzg7NTsxMDMzODs1OzEwNDM4OzU7MTA1Mzg7NTsxMDYzODs1OzEwNzM4OzU7MTA4Mzg7NTsxMDkzODs1OzExMDM4OzU7MTExMzg7NTsxMTIzODs1OzExMzM4OzU7MTE0Mzg7NTsxMTUzODs1OzExNjM4OzU7MTE3Mzg7NTsxMTgzODs1OzExOTM4OzU7MTIwMzg7NTsxMjEzODs1OzEyMjM4OzU7MTIzMzg7NTsxMjQzODs1OzEyNTM4OzU7MTI2Mzg7NTsxMjczODs1OzEyODM4OzU7MTI5Mzg7NTsxMzAzODs1OzEzMTM4OzU7MTMyMzg7NTsxMzMzODs1OzEzNDM4OzU7MTM1Mzg7NTsxMzYzODs1OzEzNzM4OzU7MTM4Mzg7NTsxMzkzODs1OzE0MDM4OzU7MTQxMzg7NTsxNDIzODs1OzE0MzM4OzU7MTQ0Mzg7NTsxNDUzODs1OzE0NjM4OzU7MTQ3Mzg7NTsxNDgzODs1OzE0OTM4OzU7MTUwMzg7NTsxNTEzODs1OzE1MjM4OzU7MTUzMzg7NTsxNTQzODs1OzE1NTM4OzU7MTU2Mzg7NTsxNTczODs1OzE1ODM4OzU7MTU5Mzg7NTsxNjAzODs1OzE2MTM4OzU7MTYyMzg7NTsxNjMzODs1OzE2NDM4OzU7MTY1Mzg7NTsxNjYzODs1OzE2NzM4OzU7MTY4Mzg7NTsxNjkzODs1OzE3MDM4OzU7MTcxMzg7NTsxNzIzODs1OzE3MzM4OzU7MTc0Mzg7NTsxNzUzODs1OzE3NjM4OzU7MTc3Mzg7NTsxNzgzODs1OzE3OTM4OzU7MTgwMzg7NTsxODEzODs1OzE4MjM4OzU7MTgzMzg7NTsxODQzODs1OzE4NTM4OzU7MTg2Mzg7NTsxODczODs1OzE4ODM4OzU7MTg5Mzg7NTsxOTAzODs1OzE5MTM4OzU7MTkyMzg7NTsxOTMzODs1OzE5NDM4OzU7MTk1Mzg7NTsxOTYzODs1OzE5NzM4OzU7MTk4Mzg7NTsxOTkzODs1OzIwMDM4OzU7MjAxMzg7NTsyMDIzODs1OzIwMzM4OzU7MjA0Mzg7NTsyMDUzODs1OzIwNjM4OzU7MjA3Mzg7NTsyMDgzODs1OzIwOTM4OzU7MjEwMzg7NTsyMTEzODs1OzIxMjM4OzU7MjEzMzg7NTsyMTQzODs1OzIxNTM4OzU7MjE2Mzg7NTsyMTczODs1OzIxODM4OzU7MjE5Mzg7NTsyMjAzODs1OzIyMTM4OzU7MjIyMzg7NTsyMjMzODs1OzIyNDM4OzU7MjI1Mzg7NTsyMjYzODs1OzIyNzM4OzU7MjI4Mzg7NTsyMjkzODs1OzIzMDM4OzU7MjMxMzg7NTsyMzIzODs1OzIzMzM4OzU7MjM0Mzg7NTsyMzUzODs1OzIzNjM4OzU7MjM3Mzg7NTsyMzgzODs1OzIzOTM4OzU7MjQwMzg7NTsyNDEzODs1OzI0MjM4OzU7MjQzMzg7NTsyNDQzODs1OzI0NTM4OzU7MjQ2Mzg7NTsyNDczODs1OzI0ODM4OzU7MjQ5Mzg7NTsyNTAzODs1OzI1MTM4OzU7MjUyMzg7NTsyNTMzODs1OzI1NDM4OzU7MjU1NDg7NTswNDg7NTsxNDg7NTsyNDg7NTszNDg7NTs0NDg7NTs1NDg7NTs2NDg7NTs3NDg7NTs4NDg7NTs5NDg7NTsxMDQ4OzU7MTE0ODs1OzEyNDg7NTsxMzQ4OzU7MTQ0ODs1OzE1NDg7NTsxNjQ4OzU7MTc0ODs1OzE4NDg7NTsxOTQ4OzU7MjA0ODs1OzIxNDg7NTsyMjQ4OzU7MjM0ODs1OzI0NDg7NTsyNTQ4OzU7MjY0ODs1OzI3NDg7NTsyODQ4OzU7Mjk0ODs1OzMwNDg7NTszMTQ4OzU7MzI0ODs1OzMzNDg7NTszNDQ4OzU7MzU0ODs1OzM2NDg7NTszNzQ4OzU7Mzg0ODs1OzM5NDg7NTs0MDQ4OzU7NDE0ODs1OzQyNDg7NTs0MzQ4OzU7NDQ0ODs1OzQ1NDg7NTs0NjQ4OzU7NDc0ODs1OzQ4NDg7NTs0OTQ4OzU7NTA0ODs1OzUxNDg7NTs1MjQ4OzU7NTM0ODs1OzU0NDg7NTs1NTQ4OzU7NTY0ODs1OzU3NDg7NTs1ODQ4OzU7NTk0ODs1OzYwNDg7NTs2MTQ4OzU7NjI0ODs1OzYzNDg7NTs2NDQ4OzU7NjU0ODs1OzY2NDg7NTs2NzQ4OzU7Njg0ODs1OzY5NDg7NTs3MDQ4OzU7NzE0ODs1OzcyNDg7NTs3MzQ4OzU7NzQ0ODs1Ozc1NDg7NTs3NjQ4OzU7Nzc0ODs1Ozc4NDg7NTs3OTQ4OzU7ODA0ODs1OzgxNDg7NTs4MjQ4OzU7ODM0ODs1Ozg0NDg7NTs4NTQ4OzU7ODY0ODs1Ozg3NDg7NTs4ODQ4OzU7ODk0ODs1OzkwNDg7NTs5MTQ4OzU7OTI0ODs1OzkzNDg7NTs5NDQ4OzU7OTU0ODs1Ozk2NDg7NTs5NzQ4OzU7OTg0ODs1Ozk5NDg7NTsxMDA0ODs1OzEwMTQ4OzU7MTAyNDg7NTsxMDM0ODs1OzEwNDQ4OzU7MTA1NDg7NTsxMDY0ODs1OzEwNzQ4OzU7MTA4NDg7NTsxMDk0ODs1OzExMDQ4OzU7MTExNDg7NTsxMTI0ODs1OzExMzQ4OzU7MTE0NDg7NTsxMTU0ODs1OzExNjQ4OzU7MTE3NDg7NTsxMTg0ODs1OzExOTQ4OzU7MTIwNDg7NTsxMjE0ODs1OzEyMjQ4OzU7MTIzNDg7NTsxMjQ0ODs1OzEyNTQ4OzU7MTI2NDg7NTsxMjc0ODs1OzEyODQ4OzU7MTI5NDg7NTsxMzA0ODs1OzEzMTQ4OzU7MTMyNDg7NTsxMzM0ODs1OzEzNDQ4OzU7MTM1NDg7NTsxMzY0ODs1OzEzNzQ4OzU7MTM4NDg7NTsxMzk0ODs1OzE0MDQ4OzU7MTQxNDg7NTsxNDI0ODs1OzE0MzQ4OzU7MTQ0NDg7NTsxNDU0ODs1OzE0NjQ4OzU7MTQ3NDg7NTsxNDg0ODs1OzE0OTQ4OzU7MTUwNDg7NTsxNTE0ODs1OzE1MjQ4OzU7MTUzNDg7NTsxNTQ0ODs1OzE1NTQ4OzU7MTU2NDg7NTsxNTc0ODs1OzE1ODQ4OzU7MTU5NDg7NTsxNjA0ODs1OzE2MTQ4OzU7MTYyNDg7NTsxNjM0ODs1OzE2NDQ4OzU7MTY1NDg7NTsxNjY0ODs1OzE2NzQ4OzU7MTY4NDg7NTsxNjk0ODs1OzE3MDQ4OzU7MTcxNDg7NTsxNzI0ODs1OzE3MzQ4OzU7MTc0NDg7NTsxNzU0ODs1OzE3NjQ4OzU7MTc3NDg7NTsxNzg0ODs1OzE3OTQ4OzU7MTgwNDg7NTsxODE0ODs1OzE4MjQ4OzU7MTgzNDg7NTsxODQ0ODs1OzE4NTQ4OzU7MTg2NDg7NTsxODc0ODs1OzE4ODQ4OzU7MTg5NDg7NTsxOTA0ODs1OzE5MTQ4OzU7MTkyNDg7NTsxOTM0ODs1OzE5NDQ4OzU7MTk1NDg7NTsxOTY0ODs1OzE5NzQ4OzU7MTk4NDg7NTsxOTk0ODs1OzIwMDQ4OzU7MjAxNDg7NTsyMDI0ODs1OzIwMzQ4OzU7MjA0NDg7NTsyMDU0ODs1OzIwNjQ4OzU7MjA3NDg7NTsyMDg0ODs1OzIwOTQ4OzU7MjEwNDg7NTsyMTE0ODs1OzIxMjQ4OzU7MjEzNDg7NTsyMTQ0ODs1OzIxNTQ4OzU7MjE2NDg7NTsyMTc0ODs1OzIxODQ4OzU7MjE5NDg7NTsyMjA0ODs1OzIyMTQ4OzU7MjIyNDg7NTsyMjM0ODs1OzIyNDQ4OzU7MjI1NDg7NTsyMjY0ODs1OzIyNzQ4OzU7MjI4NDg7NTsyMjk0ODs1OzIzMDQ4OzU7MjMxNDg7NTsyMzI0ODs1OzIzMzQ4OzU7MjM0NDg7NTsyMzU0ODs1OzIzNjQ4OzU7MjM3NDg7NTsyMzg0ODs1OzIzOTQ4OzU7MjQwNDg7NTsyNDE0ODs1OzI0MjQ4OzU7MjQzNDg7NTsyNDQ0ODs1OzI0NTQ4OzU7MjQ2NDg7NTsyNDc0ODs1OzI0ODQ4OzU7MjQ5NDg7NTsyNTA0ODs1OzI1MTQ4OzU7MjUyNDg7NTsyNTM0ODs1OzI1NDQ4OzU7MjU1Mzg7MjsAAABEtiAABQAAALgPJwABAAAAuA8nAAEAAAA0ODsyOwAAAGS2IAAFAAAAuA8nAAEAAAC4DycAAQAAADMwMzEzMjMzMzQzNTM2MzczOTkwOTE5MjkzOTQ5NTk2OTc0MDQxNDI0MzQ0NDU0NjQ3NDkxMDAxMDExMDIxMDMxMDQxMDUxMDYxMDczODsyOzI0MDsyNDg7MjU1Mzg7MjsyNTA7MjM1OzIxNTM4OzI7MDAwOzI1NTsyNTUzODsyOzEyNzsyNTU7MjEyMzg7MjsyNDA7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyMjAzODsyOzI1NTsyMjg7MTk2Mzg7MjswMDA7MDAwOzAwMDM4OzI7MjU1OzIzNTsyMDUzODsyOzAwMDswMDA7MjU1Mzg7MjsxMzg7MDQzOzIyNjM4OzI7MTY1OzA0MjswNDIzODsyOzIyMjsxODQ7MTM1Mzg7MjswOTU7MTU4OzE2MDM4OzI7MTI3OzI1NTswMDAzODsyOzIxMDsxMDU7MDMwMzg7MjsyNTU7MTI3OzA4MDM4OzI7MTAwOzE0OTsyMzczODsyOzI1NTsyNDg7MjIwMzg7MjsyMjA7MDIwOzA2MDM4OzI7MDAwOzAwMDsxMzkzODsyOzAwMDsxMzk7MTM5Mzg7MjsxODQ7MTM0OzAxMTM4OzI7MTY5OzE2OTsxNjkzODsyOzAwMDsxMDA7MDAwMzg7MjsxODk7MTgzOzEwNzM4OzI7MTM5OzAwMDsxMzkzODsyOzA4NTsxMDc7MDQ3Mzg7MjsyNTU7MTQwOzAwMDM4OzI7MTUzOzA1MDsyMDQzODsyOzEzOTswMDA7MDAwMzg7MjsyMzM7MTUwOzEyMjM4OzI7MTQzOzE4ODsxNDMzODsyOzA3MjswNjE7MTM5Mzg7MjswNDc7MDc5OzA3OTM4OzI7MDAwOzIwNjsyMDkzODsyOzE0ODswMDA7MjExMzg7MjsyNTU7MDIwOzE0NzM4OzI7MDAwOzE5MTsyNTUzODsyOzEwNTsxMDU7MTA1Mzg7MjswMzA7MTQ0OzI1NTM4OzI7MTc4OzAzNDswMzQzODsyOzI1NTsyNTA7MjQwMzg7MjswMzQ7MTM5OzAzNDM4OzI7MjU1OzAwMDsyNTUzODsyOzIyMDsyMjA7MjIwMzg7MjsyNDg7MjQ4OzI1NTM4OzI7MjU1OzIxNTswMDAzODsyOzIxODsxNjU7MDMyMzg7MjsxMjg7MTI4OzEyODM4OzI7MDAwOzEyODswMDAzODsyOzE3MzsyNTU7MDQ3Mzg7MjsyNDA7MjU1OzI0MDM4OzI7MjU1OzEwNTsxODAzODsyOzIwNTswOTI7MDkyMzg7MjswNzU7MDAwOzEzMDM4OzI7MjU1OzI1NTsyNDAzODsyOzI0MDsyMzA7MTQwMzg7MjsyMzA7MjMwOzI1MDM4OzI7MjU1OzI0MDsyNDUzODsyOzEyNDsyNTI7MDAwMzg7MjsyNTU7MjUwOzIwNTM4OzI7MTczOzIxNjsyMzAzODsyOzI0MDsxMjg7MTI4Mzg7MjsyMjQ7MjU1OzI1NTM4OzI7MjUwOzI1MDsyMTAzODsyOzIxMTsyMTE7MjExMzg7MjsxNDQ7MjM4OzE0NDM4OzI7MjU1OzE4MjsxOTMzODsyOzI1NTsxNjA7MTIyMzg7MjswMzI7MTc4OzE3MDM4OzI7MTM1OzIwNjsyNTAzODsyOzExOTsxMzY7MTUzMzg7MjsxNzY7MTk2OzIyMjM4OzI7MjU1OzI1NTsyMjQzODsyOzAwMDsyNTU7MDAwMzg7MjswNTA7MjA1OzA1MDM4OzI7MjUwOzI0MDsyMzAzODsyOzEyODswMDA7MDAwMzg7MjsxMDI7MjA1OzE3MDM4OzI7MDAwOzAwMDsyMDUzODsyOzE4NjswODU7MjExMzg7MjsxNDc7MTEyOzIxOTM4OzI7MDYwOzE3OTsxMTMzODsyOzEyMzsxMDQ7MjM4Mzg7MjswMDA7MjUwOzE1NDM4OzI7MDcyOzIwOTsyMDQzODsyOzE5OTswMjE7MTMzMzg7MjswMjU7MDI1OzExMjM4OzI7MjQ1OzI1NTsyNTAzODsyOzI1NTsyMjg7MjI1Mzg7MjsyNTU7MjI4OzE4MTM4OzI7MjU1OzIyMjsxNzMzODsyOzAwMDswMDA7MTI4Mzg7MjsyNTM7MjQ1OzIzMDM4OzI7MTI4OzEyODswMDAzODsyOzEwNzsxNDI7MDM1Mzg7MjsyNTU7MTY1OzAwMDM4OzI7MjU1OzA2OTswMDAzODsyOzIxODsxMTI7MjE0Mzg7MjsyMzg7MjMyOzE3MDM4OzI7MTUyOzI1MTsxNTIzODsyOzE3NTsyMzg7MjM4Mzg7MjsyMTk7MTEyOzE0NzM4OzI7MjU1OzIzOTsyMTMzODsyOzI1NTsyMTg7MTg1Mzg7MjsyMDU7MTMzOzA2MzM4OzI7MjU1OzE5MjsyMDMzODsyOzIyMTsxNjA7MjIxMzg7MjsxNzY7MjI0OzIzMDM4OzI7MTI4OzAwMDsxMjgzODsyOzEwMjswNTE7MTUzMzg7MjsyNTU7MDAwOzAwMDM4OzI7MTg4OzE0MzsxNDMzODsyOzA2NTsxMDU7MjI1Mzg7MjsxMzk7MDY5OzAxOTM4OzI7MjUwOzEyODsxMTQzODsyOzI0NDsxNjQ7MDk2Mzg7MjswNDY7MTM5OzA4NzM4OzI7MjU1OzI0NTsyMzgzODsyOzE2MDswODI7MDQ1Mzg7MjsxOTI7MTkyOzE5MjM4OzI7MTM1OzIwNjsyMzUzODsyOzEwNjswOTA7MjA1Mzg7MjsxMTI7MTI4OzE0NDM4OzI7MjU1OzI1MDsyNTAzODsyOzAwMDsyNTU7MTI3Mzg7MjswNzA7MTMwOzE4MDM4OzI7MjEwOzE4MDsxNDAzODsyOzAwMDsxMjg7MTI4Mzg7MjsyMTY7MTkxOzIxNjM4OzI7MjU1OzA5OTswNzEzODsyOzA2NDsyMjQ7MjA4Mzg7MjsyMzg7MTMwOzIzODM4OzI7MjQ1OzIyMjsxNzkzODsyOzI1NTsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzI0NTM4OzI7MjU1OzI1NTswMDAzODsyOzE1NDsyMDU7MDUwNDg7MjsyNDA7MjQ4OzI1NTQ4OzI7MjUwOzIzNTsyMTU0ODsyOzAwMDsyNTU7MjU1NDg7MjsxMjc7MjU1OzIxMjQ4OzI7MjQwOzI1NTsyNTU0ODsyOzI0NTsyNDU7MjIwNDg7MjsyNTU7MjI4OzE5NjQ4OzI7MDAwOzAwMDswMDA0ODsyOzI1NTsyMzU7MjA1NDg7MjswMDA7MDAwOzI1NTQ4OzI7MTM4OzA0MzsyMjY0ODsyOzE2NTswNDI7MDQyNDg7MjsyMjI7MTg0OzEzNTQ4OzI7MDk1OzE1ODsxNjA0ODsyOzEyNzsyNTU7MDAwNDg7MjsyMTA7MTA1OzAzMDQ4OzI7MjU1OzEyNzswODA0ODsyOzEwMDsxNDk7MjM3NDg7MjsyNTU7MjQ4OzIyMDQ4OzI7MjIwOzAyMDswNjA0ODsyOzAwMDswMDA7MTM5NDg7MjswMDA7MTM5OzEzOTQ4OzI7MTg0OzEzNDswMTE0ODsyOzE2OTsxNjk7MTY5NDg7MjswMDA7MTAwOzAwMDQ4OzI7MTg5OzE4MzsxMDc0ODsyOzEzOTswMDA7MTM5NDg7MjswODU7MTA3OzA0NzQ4OzI7MjU1OzE0MDswMDA0ODsyOzE1MzswNTA7MjA0NDg7MjsxMzk7MDAwOzAwMDQ4OzI7MjMzOzE1MDsxMjI0ODsyOzE0MzsxODg7MTQzNDg7MjswNzI7MDYxOzEzOTQ4OzI7MDQ3OzA3OTswNzk0ODsyOzAwMDsyMDY7MjA5NDg7MjsxNDg7MDAwOzIxMTQ4OzI7MjU1OzAyMDsxNDc0ODsyOzAwMDsxOTE7MjU1NDg7MjsxMDU7MTA1OzEwNTQ4OzI7MDMwOzE0NDsyNTU0ODsyOzE3ODswMzQ7MDM0NDg7MjsyNTU7MjUwOzI0MDQ4OzI7MDM0OzEzOTswMzQ0ODsyOzI1NTswMDA7MjU1NDg7MjsyMjA7MjIwOzIyMDQ4OzI7MjQ4OzI0ODsyNTU0ODsyOzI1NTsyMTU7MDAwNDg7MjsyMTg7MTY1OzAzMjQ4OzI7MTI4OzEyODsxMjg0ODsyOzAwMDsxMjg7MDAwNDg7MjsxNzM7MjU1OzA0NzQ4OzI7MjQwOzI1NTsyNDA0ODsyOzI1NTsxMDU7MTgwNDg7MjsyMDU7MDkyOzA5MjQ4OzI7MDc1OzAwMDsxMzA0ODsyOzI1NTsyNTU7MjQwNDg7MjsyNDA7MjMwOzE0MDQ4OzI7MjMwOzIzMDsyNTA0ODsyOzI1NTsyNDA7MjQ1NDg7MjsxMjQ7MjUyOzAwMDQ4OzI7MjU1OzI1MDsyMDU0ODsyOzE3MzsyMTY7MjMwNDg7MjsyNDA7MTI4OzEyODQ4OzI7MjI0OzI1NTsyNTU0ODsyOzI1MDsyNTA7MjEwNDg7MjsyMTE7MjExOzIxMTQ4OzI7MTQ0OzIzODsxNDQ0ODsyOzI1NTsxODI7MTkzNDg7MjsyNTU7MTYwOzEyMjQ4OzI7MDMyOzE3ODsxNzA0ODsyOzEzNTsyMDY7MjUwNDg7MjsxMTk7MTM2OzE1MzQ4OzI7MTc2OzE5NjsyMjI0ODsyOzI1NTsyNTU7MjI0NDg7MjswMDA7MjU1OzAwMDQ4OzI7MDUwOzIwNTswNTA0ODsyOzI1MDsyNDA7MjMwNDg7MjsxMjg7MDAwOzAwMDQ4OzI7MTAyOzIwNTsxNzA0ODsyOzAwMDswMDA7MjA1NDg7MjsxODY7MDg1OzIxMTQ4OzI7MTQ3OzExMjsyMTk0ODsyOzA2MDsxNzk7MTEzNDg7MjsxMjM7MTA0OzIzODQ4OzI7MDAwOzI1MDsxNTQ0ODsyOzA3MjsyMDk7MjA0NDg7MjsxOTk7MDIxOzEzMzQ4OzI7MDI1OzAyNTsxMTI0ODsyOzI0NTsyNTU7MjUwNDg7MjsyNTU7MjI4OzIyNTQ4OzI7MjU1OzIyODsxODE0ODsyOzI1NTsyMjI7MTczNDg7MjswMDA7MDAwOzEyODQ4OzI7MjUzOzI0NTsyMzA0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ZmEvY29udGlndW91cy5ycwAAACzaIABtAAAAcQIAABYAAAAs2iAAbQAAAHMCAAANAAAALNogAG0AAAB1AgAADQAAACzaIABtAAAAKQIAAAkAAAAs2iAAbQAAAE8CAAANAAAALNogAG0AAABKAgAADQAAAGQIIQBwAAAAMgEAACEAAAAyBQAABAAAAAQAAAAzBQAAAAAAAAgAAAAEAAAANAUAAAAAAAAEAAAABAAAADUFAAAAAAAAAQAAAAEAAACFAAAAAAAAAAQAAAAEAAAAeAAAAAAAAAAEAAAABAAAAKcAAABtaW5pbXVtX2xlbm1heGltdW1fbGVubG9va19zZXRsb29rX3NldF9wcmVmaXhsb29rX3NldF9zdWZmaXhsb29rX3NldF9wcmVmaXhfYW55bG9va19zZXRfc3VmZml4X2FueXV0ZjhleHBsaWNpdF9jYXB0dXJlc19sZW5zdGF0aWNfZXhwbGljaXRfY2FwdHVyZXNfbGVubGl0ZXJhbGFsdGVybmF0aW9uX2xpdGVyYWwAAABs2yAACwAAAHfbIAALAAAAgtsgAAgAAACK2yAADwAAAJnbIAAPAAAAqNsgABMAAAC72yAAEwAAAM7bIAAEAAAA0tsgABUAAADn2yAAHAAAAAPcIAAHAAAACtwgABMAAABQcm9wZXJ0aWVzSVNlYXJjaGVycGF0dGVybnNyYWJpbmthcnBzZWFyY2hfa2luZFRlZGR5UmFiaW5LYXJwL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9kZmEucnMAvdwgAGIAAADhAAAAEwAAAL3cIABiAAAABQEAABoAAAC93CAAYgAAAB0BAAAVAAAAvdwgAGIAAAAdAQAAHQAAAL3cIABiAAAAFgEAABUAAABJbnZhbGlkSW5wdXRBbmNob3JlZEludmFsaWRJbnB1dFVuYW5jaG9yZWRVbnN1cHBvcnRlZFN0cmVhbVVuc3VwcG9ydGVkT3ZlcmxhcHBpbmdVbnN1cHBvcnRlZEVtcHR5YnVja2V0c2hhc2hfbGVuaGFzaF8ycG93L3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9hbGxvYy9zcmMvYm94ZWQucnMA6d0gAEoAAADpBgAAHwAAACzaIABtAAAAxQAAABwAAAAs2iAAbQAAAN0AAAAZAAAALNogAG0AAADdAAAAIgAAACzaIABtAAAA6gAAAC0AAAAs2iAAbQAAAOcAAAAtAAAALNogAG0AAADkAAAALQAAACzaIABtAAAA4QAAAC0AAAAs2iAAbQAAANQAAAApAAAALNogAG0AAADOAAAAKQAAACzaIABtAAAA9QAAACAAAAAs2iAAbQAAABoBAAAaAAAALNogAG0AAAAwAQAAFwAAACzaIABtAAAAKQEAADcAAABkCCEAcAAAAJkCAAAaAAAAZAghAHAAAACtAgAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9tZXRhL3JldmVyc2VfaW5uZXIucnMANN8gAHMAAABLAAAAGgAAADTfIABzAAAAXAAAADAAAAAAAAAAAQAAAAEAAACZAAAANgUAADcFAAA4BQAAOQUAAAAAAAACAAAAAQAAAJwAAAA6BQAAOwUAADgFAAA5BQAAAAAAAAMAAAABAAAAnQAAADwFAAA9BQAAOAUAADkFAAA+BQAASAAAAAgAAACeAAAAPwUAAEAFAABBBQAA4AQAAEIFAACQAQAABAAAAJ8AAABDBQAARAUAAEUFAABGBQAAAAAAAAABAAABAAAApQAAAEcFAABIBQAAOAUAAEkFAABKBQAADAAAAAQAAACoAAAASwUAAEwFAABNBQAAwAQAAEFob0NvcmFzaWNrYWNNZW1jaHJNZW1jaHIyTWVtY2hyM01lbW1lbWZpbmRlcnNlYXJjaGVyYW5jaG9yZWRfYWNQcmVmaWx0ZXJpc19mYXN0bWF4X25lZWRsZV9sZW5RdWl0Ynl0ZUdhdmVVcEhheXN0YWNrVG9vTG9uZ2xlblVuc3VwcG9ydGVkQW5jaG9yZWRtb2RlAAAAAAAAAAgAAAAIAAAATgUAACgBIQBuAAAA2QAAADIAAAAoASEAbgAAAJEIAAAJAAAAKAEhAG4AAACSCAAACQAAACgBIQBuAAAAkwgAAAkAAAAoASEAbgAAAJoIAAAaAAAAKAEhAG4AAACbCAAAHAAAACgBIQBuAAAAnAgAABwAAAAoASEAbgAAALUIAAAoAAAAKAEhAG4AAAC7CAAAIgAAACgBIQBuAAAAwAgAAB8AAAAoASEAbgAAAMAIAAAlAAAAKAEhAG4AAADKCAAAHwAAACgBIQBuAAAAyggAACUAAAAoASEAbgAAANAIAAAJAAAAKAEhAG4AAADSCAAAOAAAACgBIQBuAAAA0ggAAAkAAAAoASEAbgAAAPAIAABBAAAAR3JvdXBJbmZvVG9vTWFueVBhdHRlcm5zZXJyVG9vTWFueUdyb3Vwc3BhdHRlcm5taW5pbXVtTWlzc2luZ0dyb3Vwc0ZpcnN0TXVzdEJlVW5uYW1lZER1cGxpY2F0ZQAAAAAAAAAAAAABAAAATwUAAGVycm9yIGJ1aWxkaW5nIE5GQWludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGZvdW5kIGltcG9zc2libGUgZXJyb3IgaW4gbWV0YSBlbmdpbmU6IADi4iAAUQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9tZXRhL2Vycm9yLnJzADzjIABrAAAA7QAAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL21hcC5ycwAAALjjIABxAAAAiQAAABwAAAC44yAAcQAAAIIAAAAYAAAAuOMgAHEAAACWAAAACQAAALjjIABxAAAAnwAAAB4AAAC44yAAcQAAALYAAAARAAAAuOMgAHEAAAD4AAAAHAAAALjjIABxAAAA9AAAABgAAAC44yAAcQAAAAgBAAAJAAAAuOMgAHEAAAAUAQAAHgAAALjjIABxAAAAJQEAABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdl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IGZhaWxlZDogc3RhY2suaXNfZW1wdHkoKS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL2RldGVybWluaXplL21vZC5ycwA27CAAdQAAAHgBAAAFAAAANuwgAHUAAACAAQAACwAAADbsIAB1AAAApAEAABsAAABTbWFsbEluZGV4UGF0dGVybklEL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcHJpbWl0aXZlcy5ycwDv7CAAcAAAAPECAAABAAAAUGF0dGVybklERXJyb3JTdGF0ZUlEAAAA7+wgAHAAAADyAgAAAQAAAAAAAAAAAAAAAQAAAFAFAABQHycASQAAABcIAAApAAAAUmVnZXhJbmZvSXByb3BzX3VuaW9uAAAAAAAAAAEAAAABAAAA3gAAAAAAAAABAAAAAQAAAFEFAABSBQAAEAAAAAQAAADaAAAAAAAAAAEAAAABAAAAUwUAAAAAAAAIAAAABAAAAFQFAAAAAAAACAAAAAQAAAA0BQAAAAAAAAQAAAAEAAAARwAAAHV0ZjhfZW1wdHlhdXRvcHJld2hpY2hfY2FwdHVyZXNuZmFfc2l6ZV9saW1pdG9uZXBhc3Nfc2l6ZV9saW1pdGh5YnJpZF9jYWNoZV9jYXBhY2l0eWh5YnJpZGRmYWRmYV9zaXplX2xpbWl0ZGZhX3N0YXRlX2xpbWl0b25lcGFzc2JhY2t0cmFja2xpbmVfdGVybWluYXRvcgAAAPobIQAKAAAAQO4gAAoAAABK7iAABwAAAAQcIQADAAAAUe4gAA4AAABf7iAADgAAAG3uIAASAAAAf+4gABUAAACU7iAABgAAAJruIAADAAAAne4gAA4AAACr7iAADwAAALruIAAHAAAAwe4gAAkAAADvBiEADAAAAMruIAAPAAAAR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhAAAAAAAAAAAAAQAAAE8FAAB3RCYAcAAAALwAAAAqAAAAd0QmAHAAAAC5AAAAKgAAAHdEJgBwAAAAOgAAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9tZW1jaHItMi43LjUvc3JjL21lbW1lbS9zZWFyY2hlci5yc9zvIABoAAAAdAIAABsAAADYASEAawAAAMcEAAAeAAAA2AEhAGsAAADpBQAAHgAAAG5vIHF1aXQgaW4gc3RhcnQgd2l0aG91dCBsb29rLWJlaGluZNgBIQBrAAAARQYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBpZC5pc19tYXRjaCgpANgBIQBrAAAAtQYAAAkAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gdXBkYXRlANgBIQBrAAAAtwcAACQAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gZmluaXNoANgBIQBrAAAAwwcAACIAAADYASEAawAAAI4KAAAdAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL2h5YnJpZC9zZWFyY2gucnMAAEjxIABuAAAAWQAAACkAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzaWQgYmVpbmcgdW5rbm93biBpcyBhIGJ1Z8jxIABEAAAASPEgAG4AAAAdAQAAEQAAAEjxIABuAAAAGgEAAC0AAABI8SAAbgAAAFcBAAApAAAASPEgAG4AAACtAQAAEQAAAEjxIABuAAAAqgEAAC0AAABI8SAAbgAAAPsBAAAlAAAASPEgAG4AAAAiAgAAEQAAAEjxIABuAAAAHQIAABUAAABI8SAAbgAAAOICAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvbGltaXRlZC5ycwAAAKTyIABtAAAAjgAAACUAAACk8iAAbQAAAOgAAAAUAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvc3RvcGF0LnJzNPMgAGwAAABuAAAAJQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL3dpcmUucnMAALDzIABqAAAAVwIAAA4AAACw8yAAagAAAHgDAAAMAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvZW1wdHkucnMAPPQgAGsAAAD5AAAAOgAAAAAAAAAIAAAABAAAAFUFAAAAAAAABAAAAAQAAAB4AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvd3JhcHBlcnMucnMAANj0IABuAAAAiQAAABkAAADY9CAAbgAAAEUBAAAdAAAA2PQgAG4AAAD7AQAAHQAAANj0IABuAAAAHwMAAB0AAADY9CAAbgAAACwEAAANAAAA2PQgAG4AAAC0BAAAHQAAANj0IABuAAAARAUAAA0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL2JhY2t0cmFjay5ycwC49SAAdwAAAJkFAAAVAAAAuPUgAHcAAACiBQAAGgAAALj1IAB3AAAAAQYAACEAAAC49SAAdwAAAAUGAAAlAAAAuPUgAHcAAAAhBwAAFwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL2VzY2FwZS5yc4D2IABsAAAAKAAAAD0AAACA9iAAbAAAACUAAAANAAAAVgUAAGAAAAAQAAAAVwUAAPcEAAAEAAAABAAAAI0AAAAAAAAAIAAAABAAAABYBQAAAAAAAAEAAAABAAAA3gAAAFIFAAAQAAAABAAAANoAAAAAAAAAAQAAAAEAAABRBQAAAAAAADAAAAAQAAAAWQUAAAAAAAAIAAAABAAAADQFAAAAAAAACAAAAAQAAABUBQAAZm9yd2FyZHJldmVyc2VQaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzRW5naW5lSHlicmlkRW5naW5lREZBRW5naW5lUmV2ZXJzZUh5YnJpZEVuZ2luZVJldmVyc2VERkFSZXZlcnNlREZBRW5naW5ldmlzaXRlZF9jYXBhY2l0eUJvdW5kZWRCYWNrdHJhY2tlcgAAAAAACAAAAAQAAABaBQAAAAAAAAQAAAAEAAAAWwUAAAAAAAAEAAAABAAAAFwFAABQcm9wZXJ0aWVzL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL21ldGEvcmVnZXgucnMAAAB6+CAAawAAAIgHAAATAAAAevggAGsAAABvDQAAEgAAAHr4IABrAAAAZQ0AABIAAABdBQAACAAAAAQAAABeBQAAXwUAAF8FAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbmZhL3Rob21wc29uL2xpdGVyYWxfdHJpZS5ycwAAMPkgAHoAAAB0AAAAFAAAADD5IAB6AAAAgQAAACEAAAAw+SAAegAAAIkAAAAdAAAAMPkgAHoAAACOAAAALwAAADD5IAB6AAAArAAAACwAAAAw+SAAegAAAK8AAAAfAAAAMPkgAHoAAAC2AAAAHgAAADD5IAB6AAAAvwAAABsAAAAw+SAAegAAAMAAAAAwAAAAMPkgAHoAAACwAAAAHgAAADD5IAB6AAAAzgAAABkAAAAw+SAAegAAANUAAAAZAAAAMPkgAHoAAADnAAAALgAAADD5IAB6AAAASQEAACMAAAAw+SAAegAAAIABAAAVAAAAMPkgAHoAAACYAQAAGgAAADD5IAB6AAAAxwEAACoAAABhc3NlcnRpb24gZmFpbGVkOiBtLmlzX2VtcHR5KCkAAKnyJgBqAAAApQIAAAkAAACp8iYAagAAAKYCAABAAAAAUGF0dGVyblNldCBzaG91bGQgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5AADM8yYAbAAAAMsEAAAOAAAAcXVpdCBzZWFyY2ggYWZ0ZXIgb2JzZXJ2aW5nIGJ5dGUgIGF0IG9mZnNldCA4+yAAIQAAAFn7IAALAAAAZ2F2ZSB1cCBzZWFyY2hpbmcgYXQgb2Zmc2V0IHT7IAAcAAAAaGF5c3RhY2sgb2YgbGVuZ3RoICBpcyB0b28gbG9uZwCY+yAAEwAAAKv7IAAMAAAAdW5hbmNob3JlZCBzZWFyY2hlcyBhcmUgbm90IHN1cHBvcnRlZCBvciBlbmFibGVkYW5jaG9yZWQgc2VhcmNoZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZGFuY2hvcmVkIHNlYXJjaGVzIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gKCkgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZAAAJvwgACoAAABQ/CAAHgAAAFBhdHRlcm5TZXRJbnNlcnRFcnJvcmNhcGFjaXR5Tm9ZZXNQYXR0ZXJuAAAAAAAAAAgAAAAIAAAATgUAAFN0YW5kYXJkTGVmdG1vc3RGaXJzdExlZnRtb3N0TG9uZ2VzdC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vYnVpbGRlci5yc211c3QgY2FsbCAnZmluaXNoX3BhdHRlcm4nIGZpcnN0AAAAVf0gACAAAADg/CAAdQAAAJ8BAAAJAAAA4PwgAHUAAAAwAgAAHAAAAOD8IAB1AAAAMgIAABgAAADg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Yy9zcmMvYm94ZWQvY29udmVydC5ycwABCCEAUgAAAFIAAAATAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvbm9uY29udGlndW91cy5yc2QIIQBwAAAAIgEAACAAAABkCCEAcAAAAFQBAAAdAAAAZAghAHAAAABmAQAAFwAAAGV4cGVjdGVkIG51bWJlciBvZiBwYXR0ZXJucyB0byBtYXRjaCBwYXR0ZXJuIElEAAQJIQAvAAAAZAghAHAAAAA0BAAADQAAAGQIIQBwAAAAOQQAACMAAABkCCEAcAAAAFUEAAA5AAAAZAghAHAAAADKAwAAGQAAAGQIIQBwAAAAywMAABoAAABkCCEAcAAAAM8DAAAYAAAAZAghAHAAAADjAwAAGQAAAGQIIQBwAAAAFgQAABkAAABkCCEAcAAAABcEAAAYAAAAZAghAHAAAAAYBAAAGgAAAGQIIQBwAAAAGQQAAB8AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvc2VhcmNoLnJzAADsCSEAagAAAE4BAAAJAAAAaW52YWxpZCBtYXRjaCBzcGFuAABoCiEAEgAAAOwJIQBqAAAAWwMAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3BhY2tlZC9hcGkucnMAAACUCiEAaQAAABkCAAAcAAAAlAohAGkAAAAfAgAAMQAAADIFAAAEAAAABAAAADMFAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvYnl0ZXNldC5ycwAwCyEAdwAAACMAAAARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL3V0aWwvcHJlZmlsdGVyL21lbWNoci5ycwAAuAshAHYAAAAnAAAALQAAALgLIQB2AAAAVQAAABYAAAC4CyEAdgAAAFYAAAAWAAAAuAshAHYAAABkAAAANgAAALgLIQB2AAAAkgAAABYAAAC4CyEAdgAAAJMAAAAWAAAAuAshAHYAAACUAAAAFgAAALgLIQB2AAAAogAAAD4AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvbWVtbWVtLnJzAACwDCEAdgAAACsAAAAnAAAAsAwhAHYAAAA7AAAAGAAAAGFoby1jb3Jhc2ljayBERkEgc2hvdWxkIG5ldmVyIGZhaWwvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9wcmVmaWx0ZXIvdGVkZHkucnMAag0hAHUAAABxAAAAEgAAAHJlZ2V4OiB0aHJlYWQgSUQgYWxsb2NhdGlvbiBzcGFjZSBleGhhdXN0ZWQA8A0hACsAAABs+yYAagAAAF4BAAARAAAAAAAAAAAAAAABAAAATwUAAFRyeUZyb21JbnRFcnJvci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vY29tcGlsZXIucnMAAABTDiEAdgAAALUDAAAWAAAAUw4hAHYAAAC2AwAAFgAAAFMOIQB2AAAA3QMAAA4AAABTDiEAdgAAADAEAAAoAAAAUw4hAHYAAAAsBAAAFgAAAFMOIQB2AAAARQUAABkAAABTDiEAdgAAAEcFAAATAAAAUw4hAHYAAACdBQAALAAAAFMOIQB2AAAAngUAADIAAABTDiEAdgAAAIUFAAAwAAAAUw4hAHYAAACOBQAAMAAAAFMOIQB2AAAAjwUAADYAAABTDiEAdgAAAGYFAAAdAAAAUw4hAHYAAABsBQAAPwAAAFMOIQB2AAAAbQUAADsAAABTDiEAdgAAAGoFAAAXAAAAUw4hAHYAAADtBQAAKgAAAFMOIQB2AAAATwYAABYAAABTDiEAdgAAAFMGAAAWAAAAUw4hAHYAAABaBgAAFgAAAFMOIQB2AAAAXgYAABYAAABTDiEAdgAAAGIGAAAWAAAAUw4hAHYAAABtBgAAFgAAAFMOIQB2AAAAdAYAABYAAABTDiEAdgAAAHgGAAAWAAAAUw4hAHYAAAB8BgAAFgAAAFMOIQB2AAAAhQYAABYAAABTDiEAdgAAAJAGAAAWAAAAUw4hAHYAAACUBgAAFgAAAFMOIQB2AAAAmAYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBwcmVmaXhfbGVuIDwgcmFuZ2VzLmxlbigpAFMOIQB2AAAA/gYAAAkAAABub24tZW1wdHkgbm9kZXMAUw4hAHYAAAAiBwAADgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3RhdGUudW5jb21waWxlZFtsYXN0XS5sYXN0LmlzX25vbmUoKVMOIQB2AAAAIwcAAAkAAABTDiEAdgAAACkHAAAjAAAAUw4hAHYAAAAxBwAAHwAAAFMOIQB2AAAANQcAADoAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLnN0YXRlLnVuY29tcGlsZWRbMF0ubGFzdC5pc19ub25lKCkAAABTDiEAdgAAADwHAAAJAAAAUw4hAHYAAAA9BwAAJQAAAFMOIQB2AAAAOwcAAAkAAABTDiEAdgAAAEYHAAAOAAAAUw4hAHYAAABOBwAAGAAAAEFsbEltcGxpY2l0AIAEAAAEAAAABAAAAIEEAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvbWV0YS9saXRlcmFsLnJzAAAALBIhAG0AAAAeAAAADQAAACwSIQBtAAAAPgAAAA4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgvBIhAEAAAAAsEiEAbQAAADgAAAAeAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCAAABQTIQBKAAAALBIhAG0AAAA8AAAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy9uZmEvdGhvbXBzb24vbmZhLnJzAAAAeBMhAHEAAAB5AgAAFwAAAHgTIQBxAAAAgwcAABQAAAAAAAAAAAAAAAAAAAACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvcmVnZXgtYXV0b21hdGEtMC40Ljkvc3JjL25mYS90aG9tcHNvbi9waWtldm0ucnMcFCEAdAAAAIUEAAAKAAAAYnl0ZSBzbGljZSBsZW5ndGhzIG11c3QgYmUgbGVzcyB0aGFuIHVzaXplIE1BWAAAoBQhAC4AAAAcFCEAdAAAANgEAAAJAAAAHBQhAHQAAACHBQAACQAAABwUIQB0AAAAzAUAABMAAAAcFCEAdAAAAFgGAAAPAAAAHBQhAHQAAABcBgAAHwAAABwUIQB0AAAAwQYAABsAAAAcFCEAdAAAAMoGAAAfAAAAHBQhAHQAAADPBgAARgAAABwUIQB0AAAAnAYAADQAAABzbG90IHRhYmxlIGxlbmd0aCBkb2Vzbid0IG92ZXJmbG93AAAcFCEAdAAAAD0IAAAOAAAAHBQhAHQAAABlCAAAGAAAABwUIQB0AAAAbggAABgAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9sb29rLnJzAAC8FSEAagAAAMsBAAAsAAAAvBUhAGoAAADYAQAACQAAALwVIQBq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AAAAYgQAADEAAAAgKiEAagAAAGoEAAAXAAAAICohAGoAAADRBAAADwAAACAqIQBqAAAAZwYAABgAAAAgKiEAagAAAHQGAAATAAAAICohAGoAAABtBgAAGgAAACAqIQBqAAAAnAYAABgAAAAgKiEAagAAAKoGAAATAAAAICohAGoAAACjBgAAGgAAACAqIQBqAAAAeAcAABEAAAAFAAAACgAAAAQAAAAKAAAAAwAAAEAAAAACAAAAQAAAAAEAAAAKAAAAICohAGoAAADOCAAAFQAAACAqIQBqAAAA3ggAACgAAAAgKiEAagAAAPIIAAAVAAAAICohAGoAAADiCAAAHgAAACAqIQBqAAAA5AgAACcAAAAgKiEAagAAAOQIAAAzAAAAICohAGoAAADlCAAANAAAACAqIQBqAAAA6wgAACAAAAAgKiEAagAAAOsIAAAtAAAAICohAGoAAAACCQAAFQAAACAqIQBqAAAAAwkAABYAAAA3NDMyMTAvLi1n8kJD5SwrKikoJyYlJCMiITggHx4dHP+UpJWIoJut3d6GeujK1+DQ3My7t7OxqLLI4sOauK5+eL+dwqq9oqGWwY6Jq7C5p7pwr8C8nIyPe4WAk4qSct+X+dju7P3j2ub3h7Tx6fb054v18/vrycTw1pi2zbV/G9TT0tXkxamfg6xpUGJgYVHPkXRzkIKZeWuEbW58b1Jsdo1xgXd9pXVcalNIY11BT6bto8e+4dHLxtnbzur4nu//////////////////////////////////////////////////////////////////////////////////////dHJpZWQgdG8gdW53cmFwIGV4cHIgZnJvbSBIaXJGcmFtZSwgZ290OiAAAADYLSEAKQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNS9zcmMvaGlyL3RyYW5zbGF0ZS5ycwwuIQBsAAAAAQEAABIAAAB0cmllZCB0byB1bndyYXAgVW5pY29kZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAiC4hADIAAAAMLiEAbAAAAAoBAAASAAAAdHJpZWQgdG8gdW53cmFwIGJ5dGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAA1C4hAC8AAAAMLiEAbAAAABcBAAASAAAAdHJpZWQgdG8gdW53cmFwIHJlcGV0aXRpb24gZnJvbSBIaXJGcmFtZSwgZ290OiAAHC8hAC8AAAAMLiEAbAAAACUBAAARAAAAdHJpZWQgdG8gdW53cmFwIGdyb3VwIGZyb20gSGlyRnJhbWUsIGdvdDogAABkLyEAKgAAAAwuIQBsAAAANAEAABEAAAB0cmllZCB0byB1bndyYXAgYWx0IHBpcGUgZnJvbSBIaXJGcmFtZSwgZ290OiAAAACoLyEALQAAAAwuIQBsAAAAPwEAABEAAAAMLiEAbAAAAE4BAAAnAAAADC4hAGwAAABPAQAAFwAAAAwuIQBsAAAATgEAAAkAAAAMLiEAbAAAAKwBAAAuAAAADC4hAGwAAACjAQAALgAAAAwuIQBsAAAAtwEAACcAAAAMLiEAbAAAALgBAAAcAAAADC4hAGwAAAC8AQAAJwAAAAwuIQBsAAAAvQEAACwAAAAMLiEAbAAAAM4BAAAgAAAADC4hAGwAAADPAQAAGwAAAAwuIQBsAAAAxQEAAB8AAAAMLiEAbAAAAP4BAAAuAAAADC4hAGwAAAD6AQAALgAAAAwuIQBsAAAACgIAAC4AAAAMLiEAbAAAAAYCAAAuAAAADC4hAGwAAAAZAgAALgAAAAwuIQBsAAAAFAIAAC4AAAAMLiEAbAAAACACAAAqAAAADC4hAGwAAAAsAgAALgAAAAwuIQBsAAAAJwIAAC4AAAAMLiEAbAAAAD4CAAAvAAAADC4hAGwAAABFAgAALwAAAAwuIQBsAAAAMwIAAC8AAAAMLiEAbAAAADoCAAAvAAAADC4hAGwAAACMAgAAJgAAAAwuIQBsAAAAjQIAACYAAAAMLiEAbAAAAI4CAAAmAAAADC4hAGwAAABzAgAAJgAAAAwuIQBsAAAAdAIAACYAAAAMLiEAbAAAAHUCAAAmAAAADC4hAGwAAAC4AgAAHAAAAAwuIQBsAAAAuAIAACkAAAAMLiEAbAAAAMMCAAAsAAAADC4hAGwAAADHAgAAEwAAAAwuIQBsAAAA0QIAACwAAAAMLiEAbAAAANMCAAAVAAAADC4hAGwAAADVAgAAEwAAAAwuIQBsAAAA2wIAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IFVuaWNvZGUgY2xhc3NgMiEAVAAAAAwuIQBsAAAA6QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGJ5dGUgY2xhc3MAAADMMiEAUQAAAAwuIQBsAAAA7AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IHJlcGV0aXRpb24AAAA4MyEAUQAAAAwuIQBsAAAA7wIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGdyb3VwpDMhAEwAAAAMLiEAbAAAAPICAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgbWFya2VyAAAACDQhAFEAAAAMLiEAbAAAAPUCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcnQ0IQBYAAAADC4hAGwAAAD4AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgVW5pY29kZSBjbGFzcwAAAOQ0IQBRAAAADC4hAGwAAAAIAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYnl0ZSBjbGFzcwAAUDUhAE4AAAAMLiEAbAAAAAsDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCByZXBldGl0aW9uAAC4NSEATgAAAAwuIQBsAAAADgMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGdyb3VwAAAAIDYhAEkAAAAMLiEAbAAAABEDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBjb25jYXQgbWFya2VyAAAAhDYhAFEAAAAMLiEAbAAAABQDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgAAAPA2IQBVAAAADC4hAGwAAAAXAwAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuZmxhZ3MoKS51bmljb2RlKCkMLiEAbAAAAEMEAAAJAAAABQxhc3NlcnRpb24gZmFpbGVkOiAhc2VsZi5mbGFncygpLnVuaWNvZGUoKQAMLiEAbAAAAFkEAAAJAAAAMDlBWmF6QVphegB/CQkgIAAff38wOSF+YXogfiEvOkBbYHt+CQkKCgsLDAwNDSAgQVowOUFaX19hejA5QUZhZpwBIgBmAAAAVwEAABkAAABhAAAAYgAAAGMAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAKiEAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAfwEAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABBAAAAQgAAAEMAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAKiEAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAfwEAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAACcAwAAvAMAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAACshAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAACeHgAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAKyEAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAHgBAAABAQAAAAEAAAMBAAACAQAABQEAAAQBAAAHAQAABgEAAAkBAAAIAQAACwEAAAoBAAANAQAADAEAAA8BAAAOAQAAEQEAABABAAATAQAAEgEAABUBAAAUAQAAFwEAABYBAAAZAQAAGAEAABsBAAAaAQAAHQEAABwBAAAfAQAAHgEAACEBAAAgAQAAIwEAACIBAAAlAQAAJAEAACcBAAAmAQAAKQEAACgBAAArAQAAKgEAAC0BAAAsAQAALwEAAC4BAAAzAQAAMgEAADUBAAA0AQAANwEAADYBAAA6AQAAOQEAADwBAAA7AQAAPgEAAD0BAABAAQAAPwEAAEIBAABBAQAARAEAAEMBAABGAQAARQEAAEgBAABHAQAASwEAAEoBAABNAQAATAEAAE8BAABOAQAAUQEAAFABAABTAQAAUgEAAFUBAABUAQAAVwEAAFYBAABZAQAAWAEAAFsBAABaAQAAXQEAAFwBAABfAQAAXgEAAGEBAABgAQAAYwEAAGIBAABlAQAAZAEAAGcBAABmAQAAaQEAAGgBAABrAQAAagEAAG0BAABsAQAAbwEAAG4BAABxAQAAcAEAAHMBAAByAQAAdQEAAHQBAAB3AQAAdgEAAP8AAAB6AQAAeQEAAHwBAAB7AQAAfgEAAH0BAABTAAAAcwAAAEMCAABTAgAAgwEAAIIBAACFAQAAhAEAAFQCAACIAQAAhwEAAFYCAABXAgAAjAEAAIsBAADdAQAAWQIAAFsCAACSAQAAkQEAAGACAABjAgAA9gEAAGkCAABoAgAAmQEAAJgBAAA9AgAA3KcAAG8CAAByAgAAIAIAAHUCAAChAQAAoAEAAKMBAACiAQAApQEAAKQBAACAAgAAqAEAAKcBAACDAgAArQEAAKwBAACIAgAAsAEAAK8BAACKAgAAiwIAALQBAACzAQAAtgEAALUBAACSAgAAuQEAALgBAAC9AQAAvAEAAPcBAADFAQAAxgEAAMQBAADGAQAAxAEAAMUBAADIAQAAyQEAAMcBAADJAQAAxwEAAMgBAADLAQAAzAEAAMoBAADMAQAAygEAAMsBAADOAQAAzQEAANABAADPAQAA0gEAANEBAADUAQAA0wEAANYBAADVAQAA2AEAANcBAADaAQAA2QEAANwBAADbAQAAjgEAAN8BAADeAQAA4QEAAOABAADjAQAA4gEAAOUBAADkAQAA5wEAAOYBAADpAQAA6AEAAOsBAADqAQAA7QEAAOwBAADvAQAA7gEAAPIBAADzAQAA8QEAAPMBAADxAQAA8gEAAPUBAAD0AQAAlQEAAL8BAAD5AQAA+AEAAPsBAAD6AQAA/QEAAPwBAAD/AQAA/gEAAAECAAAAAgAAAwIAAAICAAAFAgAABAIAAAcCAAAGAgAACQIAAAgCAAALAgAACgIAAA0CAAAMAgAADwIAAA4CAAARAgAAEAIAABMCAAASAgAAFQIAABQCAAAXAgAAFgIAABkCAAAYAgAAGwIAABoCAAAdAgAAHAIAAB8CAAAeAgAAngEAACMCAAAiAgAAJQIAACQCAAAnAgAAJgIAACkCAAAoAgAAKwIAACoCAAAtAgAALAIAAC8CAAAuAgAAMQIAADACAAAzAgAAMgIAAGUsAAA8AgAAOwIAAJoBAABmLAAAfiwAAH8sAABCAgAAQQIAAIABAACJAgAAjAIAAEcCAABGAgAASQIAAEgCAABLAgAASgIAAE0CAABMAgAATwIAAE4CAABvLAAAbSwAAHAsAACBAQAAhgEAAIkBAACKAQAAjwEAAJABAACrpwAAkwEAAKynAACUAQAAy6cAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAA0x8AALEDAACyAwAA0AMAALMDAAC0AwAAtQMAAPUDAAC2AwAAtwMAALgDAADRAwAA9AMAAEUDAAC5AwAAvh8AALoDAADwAwAAuwMAALUAAAC8AwAAvQMAAL4DAAC/AwAAwAMAANYDAADBAwAA8QMAAMIDAADDAwAAxAMAAMUDAADGAwAA1QMAAMcDAADIAwAAyQMAACYhAADKAwAAywMAAIYDAACIAwAAiQMAAIoDAADjHwAAkQMAAJIDAADQAwAAkwMAAJQDAACVAwAA9QMAAJYDAACXAwAAmAMAANEDAAD0AwAARQMAAJkDAAC+HwAAmgMAAPADAACbAwAAtQAAAJwDAACdAwAAngMAAJ8DAACgAwAA1gMAAKEDAADxAwAAowMAAMMDAACjAwAAwgMAAKQDAAClAwAApgMAANUDAACnAwAAqAMAAKkDAAAmIQAAqgMAAKsDAACMAwAAjgMAAI8DAADXAwAAkgMAALIDAACYAwAAuAMAAPQDAACmAwAAxgMAAKADAADAAwAAzwMAANkDAADYAwAA2wMAANoDAADdAwAA3AMAAN8DAADeAwAA4QMAAOADAADjAwAA4gMAAOUDAADkAwAA5wMAAOYDAADpAwAA6AMAAOsDAADqAwAA7QMAAOwDAADvAwAA7gMAAJoDAAC6AwAAoQMAAMEDAAD5AwAAfwMAAJgDAAC4AwAA0QMAAJUDAAC1AwAA+AMAAPcDAADyAwAA+wMAAPoDAAB7AwAAfAMAAH0DAABQBAAAUQQAAFIEAABTBAAAVAQAAFUEAABWBAAAVwQAAFgEAABZBAAAWgQAAFsEAABcBAAAXQQAAF4EAABfBAAAMAQAADEEAAAyBAAAgBwAADMEAAA0BAAAgRwAADUEAAA2BAAANwQAADgEAAA5BAAAOgQAADsEAAA8BAAAPQQAAD4EAACCHAAAPwQAAEAEAABBBAAAgxwAAEIEAACEHAAAhRwAAEMEAABEBAAARQQAAEYEAABHBAAASAQAAEkEAABKBAAAhhwAAEsEAABMBAAATQQAAE4EAABPBAAAEAQAABEEAAASBAAAgBwAABMEAAAUBAAAgRwAABUEAAAWBAAAFwQAABgEAAAZBAAAGgQAABsEAAAcBAAAHQQAAB4EAACCHAAAHwQAACAEAAAhBAAAgxwAACIEAACEHAAAhRwAACMEAAAkBAAAJQQAACYEAAAnBAAAKAQAACkEAAAqBAAAhhwAACsEAAAsBAAALQQAAC4EAAAvBAAAAAQAAAEEAAACBAAAAwQAAAQEAAAFBAAABgQAAAcEAAAIBAAACQQAAAoEAAALBAAADAQAAA0EAAAOBAAADwQAAGEEAABgBAAAYwQAAIccAABiBAAAhxwAAGUEAABkBAAAZwQAAGYEAABpBAAAaAQAAGsEAABqBAAAbQQAAGwEAABvBAAAbgQAAHEEAABwBAAAcwQAAHIEAAB1BAAAdAQAAHcEAAB2BAAAeQQAAHgEAAB7BAAAegQAAH0EAAB8BAAAfwQAAH4EAACBBAAAgAQAAIsEAACKBAAAjQQAAIwEAACPBAAAjgQAAJEEAACQBAAAkwQAAJIEAACVBAAAlAQAAJcEAACWBAAAmQQAAJgEAACbBAAAmgQAAJ0EAACcBAAAnwQAAJ4EAAChBAAAoAQAAKMEAACiBAAApQQAAKQEAACnBAAApgQAAKkEAACoBAAAqwQAAKoEAACtBAAArAQAAK8EAACuBAAAsQQAALAEAACzBAAAsgQAALUEAAC0BAAAtwQAALYEAAC5BAAAuAQAALsEAAC6BAAAvQQAALwEAAC/BAAAvgQAAM8EAADCBAAAwQQAAMQEAADDBAAAxgQAAMUEAADIBAAAxwQAAMoEAADJBAAAzAQAAMsEAADOBAAAzQQAAMAEAADRBAAA0AQAANMEAADSBAAA1QQAANQEAADXBAAA1gQAANkEAADYBAAA2wQAANoEAADdBAAA3AQAAN8EAADeBAAA4QQAAOAEAADjBAAA4gQAAOUEAADkBAAA5wQAAOYEAADpBAAA6AQAAOsEAADqBAAA7QQAAOwEAADvBAAA7gQAAPEEAADwBAAA8wQAAPIEAAD1BAAA9AQAAPcEAAD2BAAA+QQAAPgEAAD7BAAA+gQAAP0EAAD8BAAA/wQAAP4EAAABBQAAAAUAAAMFAAACBQAABQUAAAQFAAAHBQAABgUAAAkFAAAIBQAACwUAAAoFAAANBQAADAUAAA8FAAAOBQAAEQUAABAFAAATBQAAEgUAABUFAAAUBQAAFwUAABYFAAAZBQAAGAUAABsFAAAaBQAAHQUAABwFAAAfBQAAHgUAACEFAAAgBQAAIwUAACIFAAAlBQAAJAUAACcFAAAmBQAAKQUAACgFAAArBQAAKgUAAC0FAAAsBQAALwUAAC4FAABhBQAAYgUAAGMFAABkBQAAZQUAAGYFAABnBQAAaAUAAGkFAABqBQAAawUAAGwFAABtBQAAbgUAAG8FAABwBQAAcQUAAHIFAABzBQAAdAUAAHUFAAB2BQAAdwUAAHgFAAB5BQAAegUAAHsFAAB8BQAAfQUAAH4FAAB/BQAAgAUAAIEFAACCBQAAgwUAAIQFAACFBQAAhgUAADEFAAAyBQAAMwUAADQFAAA1BQAANgUAADcFAAA4BQAAOQUAADoFAAA7BQAAPAUAAD0FAAA+BQAAPwUAAEAFAABBBQAAQgUAAEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABTBQAAVAUAAFUFAABWBQAAAC0AAAEtAAACLQAAAy0AAAQtAAAFLQAABi0AAActAAAILQAACS0AAAotAAALLQAADC0AAA0tAAAOLQAADy0AABAtAAARLQAAEi0AABMtAAAULQAAFS0AABYtAAAXLQAAGC0AABktAAAaLQAAGy0AABwtAAAdLQAAHi0AAB8tAAAgLQAAIS0AACItAAAjLQAAJC0AACUtAAAnLQAALS0AAJAcAACRHAAAkhwAAJMcAACUHAAAlRwAAJYcAACXHAAAmBwAAJkcAACaHAAAmxwAAJwcAACdHAAAnhwAAJ8cAACgHAAAoRwAAKIcAACjHAAApBwAAKUcAACmHAAApxwAAKgcAACpHAAAqhwAAKscAACsHAAArRwAAK4cAACvHAAAsBwAALEcAACyHAAAsxwAALQcAAC1HAAAthwAALccAAC4HAAAuRwAALocAAC9HAAAvhwAAL8cAABwqwAAcasAAHKrAABzqwAAdKsAAHWrAAB2qwAAd6sAAHirAAB5qwAAeqsAAHurAAB8qwAAfasAAH6rAAB/qwAAgKsAAIGrAACCqwAAg6sAAISrAACFqwAAhqsAAIerAACIqwAAiasAAIqrAACLqwAAjKsAAI2rAACOqwAAj6sAAJCrAACRqwAAkqsAAJOrAACUqwAAlasAAJarAACXqwAAmKsAAJmrAACaqwAAm6sAAJyrAACdqwAAnqsAAJ+rAACgqwAAoasAAKKrAACjqwAApKsAAKWrAACmqwAAp6sAAKirAACpqwAAqqsAAKurAACsqwAArasAAK6rAACvqwAAsKsAALGrAACyqwAAs6sAALSrAAC1qwAAtqsAALerAAC4qwAAuasAALqrAAC7qwAAvKsAAL2rAAC+qwAAv6sAAPgTAAD5EwAA+hMAAPsTAAD8EwAA/RMAAPATAADxEwAA8hMAAPMTAAD0EwAA9RMAABIEAAAyBAAAFAQAADQEAAAeBAAAPgQAACEEAABBBAAAIgQAAEIEAACFHAAAIgQAAEIEAACEHAAAKgQAAEoEAABiBAAAYwQAAEqmAABLpgAAihwAAIkcAADQEAAA0RAAANIQAADTEAAA1BAAANUQAADWEAAA1xAAANgQAADZEAAA2hAAANsQAADcEAAA3RAAAN4QAADfEAAA4BAAAOEQAADiEAAA4xAAAOQQAADlEAAA5hAAAOcQAADoEAAA6RAAAOoQAADrEAAA7BAAAO0QAADuEAAA7xAAAPAQAADxEAAA8hAAAPMQAAD0EAAA9RAAAPYQAAD3EAAA+BAAAPkQAAD6EAAA/RAAAP4QAAD/EAAAfacAAGMsAADGpwAAAR4AAAAeAAADHgAAAh4AAAUeAAAEHgAABx4AAAYeAAAJHgAACB4AAAseAAAKHgAADR4AAAweAAAPHgAADh4AABEeAAAQHgAAEx4AABIeAAAVHgAAFB4AABceAAAWHgAAGR4AABgeAAAbHgAAGh4AAB0eAAAcHgAAHx4AAB4eAAAhHgAAIB4AACMeAAAiHgAAJR4AACQeAAAnHgAAJh4AACkeAAAoHgAAKx4AACoeAAAtHgAALB4AAC8eAAAuHgAAMR4AADAeAAAzHgAAMh4AADUeAAA0HgAANx4AADYeAAA5HgAAOB4AADseAAA6HgAAPR4AADweAAA/HgAAPh4AAEEeAABAHgAAQx4AAEIeAABFHgAARB4AAEceAABGHgAASR4AAEgeAABLHgAASh4AAE0eAABMHgAATx4AAE4eAABRHgAAUB4AAFMeAABSHgAAVR4AAFQeAABXHgAAVh4AAFkeAABYHgAAWx4AAFoeAABdHgAAXB4AAF8eAABeHgAAYR4AAJseAABgHgAAmx4AAGMeAABiHgAAZR4AAGQeAABnHgAAZh4AAGkeAABoHgAAax4AAGoeAABtHgAAbB4AAG8eAABuHgAAcR4AAHAeAABzHgAAch4AAHUeAAB0HgAAdx4AAHYeAAB5HgAAeB4AAHseAAB6HgAAfR4AAHweAAB/HgAAfh4AAIEeAACAHgAAgx4AAIIeAACFHgAAhB4AAIceAACGHgAAiR4AAIgeAACLHgAAih4AAI0eAACMHgAAjx4AAI4eAACRHgAAkB4AAJMeAACSHgAAlR4AAJQeAABgHgAAYR4AAN8AAAChHgAAoB4AAKMeAACiHgAApR4AAKQeAACnHgAAph4AAKkeAACoHgAAqx4AAKoeAACtHgAArB4AAK8eAACuHgAAsR4AALAeAACzHgAAsh4AALUeAAC0HgAAtx4AALYeAAC5HgAAuB4AALseAAC6HgAAvR4AALweAAC/HgAAvh4AAMEeAADAHgAAwx4AAMIeAADFHgAAxB4AAMceAADGHgAAyR4AAMgeAADLHgAAyh4AAM0eAADMHgAAzx4AAM4eAADRHgAA0B4AANMeAADSHgAA1R4AANQeAADXHgAA1h4AANkeAADYHgAA2x4AANoeAADdHgAA3B4AAN8eAADeHgAA4R4AAOAeAADjHgAA4h4AAOUeAADkHgAA5x4AAOYeAADpHgAA6B4AAOseAADqHgAA7R4AAOweAADvHgAA7h4AAPEeAADwHgAA8x4AAPIeAAD1HgAA9B4AAPceAAD2HgAA+R4AAPgeAAD7HgAA+h4AAP0eAAD8HgAA/x4AAP4eAAAIHwAACR8AAAofAAALHwAADB8AAA0fAAAOHwAADx8AAAAfAAABHwAAAh8AAAMfAAAEHwAABR8AAAYfAAAHHwAAGB8AABkfAAAaHwAAGx8AABwfAAAdHwAAEB8AABEfAAASHwAAEx8AABQfAAAVHwAAKB8AACkfAAAqHwAAKx8AACwfAAAtHwAALh8AAC8fAAAgHwAAIR8AACIfAAAjHwAAJB8AACUfAAAmHwAAJx8AADgfAAA5HwAAOh8AADsfAAA8HwAAPR8AAD4fAAA/HwAAMB8AADEfAAAyHwAAMx8AADQfAAA1HwAANh8AADcfAABIHwAASR8AAEofAABLHwAATB8AAE0fAABAHwAAQR8AAEIfAABDHwAARB8AAEUfAABZHwAAWx8AAF0fAABfHwAAUR8AAFMfAABVHwAAVx8AAGgfAABpHwAAah8AAGsfAABsHwAAbR8AAG4fAABvHwAAYB8AAGEfAABiHwAAYx8AAGQfAABlHwAAZh8AAGcfAAC6HwAAux8AAMgfAADJHwAAyh8AAMsfAADaHwAA2x8AAPgfAAD5HwAA6h8AAOsfAAD6HwAA+x8AAIgfAACJHwAAih8AAIsfAACMHwAAjR8AAI4fAACPHwAAgB8AAIEfAACCHwAAgx8AAIQfAACFHwAAhh8AAIcfAACYHwAAmR8AAJofAACbHwAAnB8AAJ0fAACeHwAAnx8AAJAfAACRHwAAkh8AAJMfAACUHwAAlR8AAJYfAACXHwAAqB8AAKkfAACqHwAAqx8AAKwfAACtHwAArh8AAK8fAACgHwAAoR8AAKIfAACjHwAApB8AAKUfAACmHwAApx8AALgfAAC5HwAAvB8AALAfAACxHwAAcB8AAHEfAACzHwAARQMAAJkDAAC5AwAAzB8AAHIfAABzHwAAdB8AAHUfAADDHwAA2B8AANkfAACQAwAA0B8AANEfAAB2HwAAdx8AAOgfAADpHwAAsAMAAOwfAADgHwAA4R8AAHofAAB7HwAA5R8AAPwfAAB4HwAAeR8AAHwfAAB9HwAA8x8AAKkDAADJAwAASwAAAGsAAADFAAAA5QAAAE4hAAAyIQAAcCEAAHEhAAByIQAAcyEAAHQhAAB1IQAAdiEAAHchAAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJinAACbpwAAmqcAAJ2nAACcpwAAn6cAAJ6nAAChpwAAoKcAAKOnAACipwAApacAAKSnAACnpwAApqcAAKmnAACopwAAZgIAAFwCAABhAgAAbAIAAGoCAACeAgAAhwIAAJ0CAABTqwAAtacAALSnAAC3pwAAtqcAALmnAAC4pwAAu6cAALqnAAC9pwAAvKcAAL+nAAC+pwAAwacAAMCnAADDpwAAwqcAAJSnAACCAgAAjh0AAMinAADHpwAAyqcAAMmnAABkAgAAzacAAMynAADRpwAA0KcAANenAADWpwAA2acAANinAADbpwAA2qcAAJsBAAD2pwAA9acAALOnAACgEwAAoRMAAKITAACjEwAApBMAAKUTAACmEwAApxMAAKgTAACpEwAAqhMAAKsTAACsEwAArRMAAK4TAACvEwAAsBMAALETAACyEwAAsxMAALQTAAC1EwAAthMAALcTAAC4EwAAuRMAALoTAAC7EwAAvBMAAL0TAAC+EwAAvxMAAMATAADBEwAAwhMAAMMTAADEEwAAxRMAAMYTAADHEwAAyBMAAMkTAADKEwAAyxMAAMwTAADNEwAAzhMAAM8TAADQEwAA0RMAANITAADTEwAA1BMAANUTAADWEwAA1xMAANgTAADZEwAA2hMAANsTAADcEwAA3RMAAN4TAADfEwAA4BMAAOETAADiEwAA4xMAAOQTAADlEwAA5hMAAOcTAADoEwAA6RMAAOoTAADrEwAA7BMAAO0TAADuEwAA7xMAAAb7AAAF+wAAQf8AAEL/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+BAEAvwQBAMAEAQDBBAEAwgQBAMMEAQDEBAEAxQQBAMYEAQDHBAEAyAQBAMkEAQDKBAEAywQBAMwEAQDNBAEAzgQBAM8EAQDQBAEA0QQBANIEAQDTBAEAlwUBAJgFAQCZBQEAmgUBAJsFAQCcBQEAnQUBAJ4FAQCfBQEAoAUBAKEFAQCjBQEApAUBAKUFAQCmBQEApwUBAKgFAQCpBQEAqgUBAKsFAQCsBQEArQUBAK4FAQCvBQEAsAUBALEFAQCzBQEAtAUBALUFAQC2BQEAtwUBALgFAQC5BQEAuwUBALwFAQBwBQEAcQUBAHIFAQBzBQEAdAUBAHUFAQB2BQEAdwUBAHgFAQB5BQEAegUBAHwFAQB9BQEAfgUBAH8FAQCABQEAgQUBAIIFAQCDBQEAhAUBAIUFAQCGBQEAhwUBAIgFAQCJBQEAigUBAIwFAQCNBQEAjgUBAI8FAQCQBQEAkQUBAJIFAQCUBQEAlQUBAMAMAQDBDAEAwgwBAMMMAQDEDAEAxQwBAMYMAQDHDAEAyAwBAMkMAQDKDAEAywwBAMwMAQDNDAEAzgwBAM8MAQDQDAEA0QwBANIMAQDTDAEA1AwBANUMAQDWDAEA1wwBANgMAQDZDAEA2gwBANsMAQDcDAEA3QwBAN4MAQDfDAEA4AwBAOEMAQDiDAEA4wwBAOQMAQDlDAEA5gwBAOcMAQDoDAEA6QwBAOoMAQDrDAEA7AwBAO0MAQDuDAEA7wwBAPAMAQDxDAEA8gwBAIAMAQCBDAEAggwBAIMMAQCEDAEAhQwBAIYMAQCHDAEAiAwBAIkMAQCKDAEAiwwBAIwMAQCNDAEAjgwBAI8MAQCQDAEAkQwBAJIMAQCTDAEAlAwBAJUMAQCWDAEAlwwBAJgMAQCZDAEAmgwBAJsMAQCcDAEAnQwBAJ4MAQCfDAEAoAwBAKEMAQCiDAEAowwBAKQMAQClDAEApgwBAKcMAQCoDAEAqQwBAKoMAQCr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OSEAAQAAAM8AAABEOSEAAQAAANAAAABIOSEAAQAAANEAAABMOSEAAQAAANIAAABQOSEAAQAAANMAAABUOSEAAQAAANQAAABYOSEAAQAAANUAAABcOSEAAQAAANYAAABgOSEAAQAAANgAAABkOSEAAQAAANkAAABoOSEAAQAAANoAAABsOSEAAQAAANsAAABwOSEAAQAAANwAAAB0OSEAAQAAAN0AAAB4OSEAAQAAAN4AAAB8OSEAAQAAAN8AAACAOSEAAQAAAOAAAACEOSEAAQAAAOEAAACIOSEAAQAAAOIAAACMOSEAAQAAAOMAAACQOSEAAQAAAOQAAACUOSEAAQAAAOUAAACYOSEAAgAAAOYAAACgOSEAAQAAAOcAAACkOSEAAQAAAOgAAACoOSEAAQAAAOkAAACsOSEAAQAAAOoAAACwOSEAAQAAAOsAAAC0OSEAAQAAAOwAAAC4OSEAAQAAAO0AAAC8OSEAAQAAAO4AAADAOSEAAQAAAO8AAADEOSEAAQAAAPAAAADIOSEAAQAAAPEAAADMOSEAAQAAAPIAAADQOSEAAQAAAPMAAADUOSEAAQAAAPQAAADYOSEAAQAAAPUAAADcOSEAAQAAAPYAAADgOSEAAQAAAPgAAADkOSEAAQAAAPkAAADoOSEAAQAAAPoAAADsOSEAAQAAAPsAAADwOSEAAQAAAPwAAAD0OSEAAQAAAP0AAAD4OSEAAQAAAP4AAAD8OSEAAQAAAP8AAAAAOiEAAQAAAAABAAAEOiEAAQAAAAEBAAAIOiEAAQAAAAIBAAAMOiEAAQAAAAMBAAAQOiEAAQAAAAQBAAAUOiEAAQAAAAUBAAAYOiEAAQAAAAYBAAAcOiEAAQAAAAcBAAAgOiEAAQAAAAgBAAAkOiEAAQAAAAkBAAAoOiEAAQAAAAoBAAAsOiEAAQAAAAsBAAAwOiEAAQAAAAwBAAA0OiEAAQAAAA0BAAA4OiEAAQAAAA4BAAA8OiEAAQAAAA8BAABAOiEAAQAAABABAABEOiEAAQAAABEBAABIOiEAAQAAABIBAABMOiEAAQAAABMBAABQOiEAAQAAABQBAABUOiEAAQAAABUBAABYOiEAAQAAABYBAABcOiEAAQAAABcBAABgOiEAAQAAABgBAABkOiEAAQAAABkBAABoOiEAAQAAABoBAABsOiEAAQAAABsBAABwOiEAAQAAABwBAAB0OiEAAQAAAB0BAAB4OiEAAQAAAB4BAAB8OiEAAQAAAB8BAACAOiEAAQAAACABAACEOiEAAQAAACEBAACIOiEAAQAAACIBAACMOiEAAQAAACMBAACQOiEAAQAAACQBAACUOiEAAQAAACUBAACYOiEAAQAAACYBAACcOiEAAQAAACcBAACgOiEAAQAAACgBAACkOiEAAQAAACkBAACoOiEAAQAAACoBAACsOiEAAQAAACsBAACwOiEAAQAAACwBAAC0OiEAAQAAAC0BAAC4OiEAAQAAAC4BAAC8OiEAAQAAAC8BAADAOiEAAQAAADIBAADEOiEAAQAAADMBAADIOiEAAQAAADQBAADMOiEAAQAAADUBAADQOiEAAQAAADYBAADUOiEAAQAAADcBAADYOiEAAQAAADkBAADcOiEAAQAAADoBAADgOiEAAQAAADsBAADkOiEAAQAAADwBAADoOiEAAQAAAD0BAADsOiEAAQAAAD4BAADwOiEAAQAAAD8BAAD0OiEAAQAAAEABAAD4OiEAAQAAAEEBAAD8OiEAAQAAAEIBAAAAOyEAAQAAAEMBAAAEOyEAAQAAAEQBAAAIOyEAAQAAAEUBAAAMOyEAAQAAAEYBAAAQOyEAAQAAAEcBAAAUOyEAAQAAAEgBAAAYOyEAAQAAAEoBAAAcOyEAAQAAAEsBAAAgOyEAAQAAAEwBAAAkOyEAAQAAAE0BAAAoOyEAAQAAAE4BAAAsOyEAAQAAAE8BAAAwOyEAAQAAAFABAAA0OyEAAQAAAFEBAAA4OyEAAQAAAFIBAAA8OyEAAQAAAFMBAABAOyEAAQAAAFQBAABEOyEAAQAAAFUBAABIOyEAAQAAAFYBAABMOyEAAQAAAFcBAABQOyEAAQAAAFgBAABUOyEAAQAAAFkBAABYOyEAAQAAAFoBAABcOyEAAQAAAFsBAABgOyEAAQAAAFwBAABkOyEAAQAAAF0BAABoOyEAAQAAAF4BAABsOyEAAQAAAF8BAABwOyEAAQAAAGABAAB0OyEAAQAAAGEBAAB4OyEAAQAAAGIBAAB8OyEAAQAAAGMBAACAOyEAAQAAAGQBAACEOyEAAQAAAGUBAACIOyEAAQAAAGYBAACMOyEAAQAAAGcBAACQOyEAAQAAAGgBAACUOyEAAQAAAGkBAACYOyEAAQAAAGoBAACcOyEAAQAAAGsBAACgOyEAAQAAAGwBAACkOyEAAQAAAG0BAACoOyEAAQAAAG4BAACsOyEAAQAAAG8BAACwOyEAAQAAAHABAAC0OyEAAQAAAHEBAAC4OyEAAQAAAHIBAAC8OyEAAQAAAHMBAADAOyEAAQAAAHQBAADEOyEAAQAAAHUBAADIOyEAAQAAAHYBAADMOyEAAQAAAHcBAADQOyEAAQAAAHgBAADUOyEAAQAAAHkBAADYOyEAAQAAAHoBAADcOyEAAQAAAHsBAADgOyEAAQAAAHwBAADkOyEAAQAAAH0BAADoOyEAAQAAAH4BAADsOyEAAQAAAH8BAADwOyEAAgAAAIABAAD4OyEAAQAAAIEBAAD8OyEAAQAAAIIBAAAAPCEAAQAAAIMBAAAEPCEAAQAAAIQBAAAIPCEAAQAAAIUBAAAMPCEAAQAAAIYBAAAQPCEAAQAAAIcBAAAUPCEAAQAAAIgBAAAYPCEAAQAAAIkBAAAcPCEAAQAAAIoBAAAgPCEAAQAAAIsBAAAkPCEAAQAAAIwBAAAoPCEAAQAAAI4BAAAsPCEAAQAAAI8BAAAwPCEAAQAAAJABAAA0PCEAAQAAAJEBAAA4PCEAAQAAAJIBAAA8PCEAAQAAAJMBAABAPCEAAQAAAJQBAABEPCEAAQAAAJUBAABIPCEAAQAAAJYBAABMPCEAAQAAAJcBAABQPCEAAQAAAJgBAABUPCEAAQAAAJkBAABYPCEAAQAAAJoBAABcPCEAAQAAAJsBAABgPCEAAQAAAJwBAABkPCEAAQAAAJ0BAABoPCEAAQAAAJ4BAABsPCEAAQAAAJ8BAABwPCEAAQAAAKABAAB0PCEAAQAAAKEBAAB4PCEAAQAAAKIBAAB8PCEAAQAAAKMBAACAPCEAAQAAAKQBAACEPCEAAQAAAKUBAACIPCEAAQAAAKYBAACMPCEAAQAAAKcBAACQPCEAAQAAAKgBAACUPCEAAQAAAKkBAACYPCEAAQAAAKwBAACcPCEAAQAAAK0BAACgPCEAAQAAAK4BAACkPCEAAQAAAK8BAACoPCEAAQAAALABAACsPCEAAQAAALEBAACwPCEAAQAAALIBAAC0PCEAAQAAALMBAAC4PCEAAQAAALQBAAC8PCEAAQAAALUBAADAPCEAAQAAALYBAADEPCEAAQAAALcBAADIPCEAAQAAALgBAADMPCEAAQAAALkBAADQPCEAAQAAALwBAADUPCEAAQAAAL0BAADYPCEAAQAAAL8BAADcPCEAAQAAAMQBAADgPCEAAgAAAMUBAADoPCEAAgAAAMYBAADwPCEAAgAAAMcBAAD4PCEAAgAAAMgBAAAAPSEAAgAAAMkBAAAIPSEAAgAAAMoBAAAQPSEAAgAAAMsBAAAYPSEAAgAAAMwBAAAgPSEAAgAAAM0BAAAoPSEAAQAAAM4BAAAsPSEAAQAAAM8BAAAwPSEAAQAAANABAAA0PSEAAQAAANEBAAA4PSEAAQAAANIBAAA8PSEAAQAAANMBAABAPSEAAQAAANQBAABEPSEAAQAAANUBAABIPSEAAQAAANYBAABMPSEAAQAAANcBAABQPSEAAQAAANgBAABUPSEAAQAAANkBAABYPSEAAQAAANoBAABcPSEAAQAAANsBAABgPSEAAQAAANwBAABkPSEAAQAAAN0BAABoPSEAAQAAAN4BAABsPSEAAQAAAN8BAABwPSEAAQAAAOABAAB0PSEAAQAAAOEBAAB4PSEAAQAAAOIBAAB8PSEAAQAAAOMBAACAPSEAAQAAAOQBAACEPSEAAQAAAOUBAACIPSEAAQAAAOYBAACMPSEAAQAAAOcBAACQPSEAAQAAAOgBAACUPSEAAQAAAOkBAACYPSEAAQAAAOoBAACcPSEAAQAAAOsBAACgPSEAAQAAAOwBAACkPSEAAQAAAO0BAACoPSEAAQAAAO4BAACsPSEAAQAAAO8BAACwPSEAAQAAAPEBAAC0PSEAAgAAAPIBAAC8PSEAAgAAAPMBAADEPSEAAgAAAPQBAADMPSEAAQAAAPUBAADQPSEAAQAAAPYBAADUPSEAAQAAAPcBAADYPSEAAQAAAPgBAADcPSEAAQAAAPkBAADgPSEAAQAAAPoBAADkPSEAAQAAAPsBAADoPSEAAQAAAPwBAADsPSEAAQAAAP0BAADwPSEAAQAAAP4BAAD0PSEAAQAAAP8BAAD4PSEAAQAAAAACAAD8PSEAAQAAAAECAAAAPiEAAQAAAAICAAAEPiEAAQAAAAMCAAAIPiEAAQAAAAQCAAAMPiEAAQAAAAUCAAAQPiEAAQAAAAYCAAAUPiEAAQAAAAcCAAAYPiEAAQAAAAgCAAAcPiEAAQAAAAkCAAAgPiEAAQAAAAoCAAAkPiEAAQAAAAsCAAAoPiEAAQAAAAwCAAAsPiEAAQAAAA0CAAAwPiEAAQAAAA4CAAA0PiEAAQAAAA8CAAA4PiEAAQAAABACAAA8PiEAAQAAABECAABAPiEAAQAAABICAABEPiEAAQAAABMCAABIPiEAAQAAABQCAABMPiEAAQAAABUCAABQPiEAAQAAABYCAABUPiEAAQAAABcCAABYPiEAAQAAABgCAABcPiEAAQAAABkCAABgPiEAAQAAABoCAABkPiEAAQAAABsCAABoPiEAAQAAABwCAABsPiEAAQAAAB0CAABwPiEAAQAAAB4CAAB0PiEAAQAAAB8CAAB4PiEAAQAAACACAAB8PiEAAQAAACICAACAPiEAAQAAACMCAACEPiEAAQAAACQCAACIPiEAAQAAACUCAACMPiEAAQAAACYCAACQPiEAAQAAACcCAACUPiEAAQAAACgCAACYPiEAAQAAACkCAACcPiEAAQAAACoCAACgPiEAAQAAACsCAACkPiEAAQAAACwCAACoPiEAAQAAAC0CAACsPiEAAQAAAC4CAACwPiEAAQAAAC8CAAC0PiEAAQAAADACAAC4PiEAAQAAADECAAC8PiEAAQAAADICAADAPiEAAQAAADMCAADEPiEAAQAAADoCAADIPiEAAQAAADsCAADMPiEAAQAAADwCAADQPiEAAQAAAD0CAADUPiEAAQAAAD4CAADYPiEAAQAAAD8CAADcPiEAAQAAAEACAADgPiEAAQAAAEECAADkPiEAAQAAAEICAADoPiEAAQAAAEMCAADsPiEAAQAAAEQCAADwPiEAAQAAAEUCAAD0PiEAAQAAAEYCAAD4PiEAAQAAAEcCAAD8PiEAAQAAAEgCAAAAPyEAAQAAAEkCAAAEPyEAAQAAAEoCAAAIPyEAAQAAAEsCAAAMPyEAAQAAAEwCAAAQPyEAAQAAAE0CAAAUPyEAAQAAAE4CAAAYPyEAAQAAAE8CAAAcPyEAAQAAAFACAAAgPyEAAQAAAFECAAAkPyEAAQAAAFICAAAoPyEAAQAAAFMCAAAsPyEAAQAAAFQCAAAwPyEAAQAAAFYCAAA0PyEAAQAAAFcCAAA4PyEAAQAAAFkCAAA8PyEAAQAAAFsCAABAPyEAAQAAAFwCAABEPyEAAQAAAGACAABIPyEAAQAAAGECAABMPyEAAQAAAGMCAABQPyEAAQAAAGQCAABUPyEAAQAAAGUCAABYPyEAAQAAAGYCAABcPyEAAQAAAGgCAABgPyEAAQAAAGkCAABkPyEAAQAAAGoCAABoPyEAAQAAAGsCAABsPyEAAQAAAGwCAABwPyEAAQAAAG8CAAB0PyEAAQAAAHECAAB4PyEAAQAAAHICAAB8PyEAAQAAAHUCAACAPyEAAQAAAH0CAACEPyEAAQAAAIACAACIPyEAAQAAAIICAACMPyEAAQAAAIMCAACQPyEAAQAAAIcCAACUPyEAAQAAAIgCAACYPyEAAQAAAIkCAACcPyEAAQAAAIoCAACgPyEAAQAAAIsCAACkPyEAAQAAAIwCAACoPyEAAQAAAJICAACsPyEAAQAAAJ0CAACwPyEAAQAAAJ4CAAC0PyEAAQAAAEUDAAC4PyEAAwAAAHADAADEPyEAAQAAAHEDAADIPyEAAQAAAHIDAADMPyEAAQAAAHMDAADQPyEAAQAAAHYDAADUPyEAAQAAAHcDAADYPyEAAQAAAHsDAADcPyEAAQAAAHwDAADgPyEAAQAAAH0DAADkPyEAAQAAAH8DAADoPyEAAQAAAIYDAADsPyEAAQAAAIgDAADwPyEAAQAAAIkDAAD0PyEAAQAAAIoDAAD4PyEAAQAAAIwDAAD8PyEAAQAAAI4DAAAAQCEAAQAAAI8DAAAEQCEAAQAAAJADAAAIQCEAAQAAAJEDAAAMQCEAAQAAAJIDAAAQQCEAAgAAAJMDAAAYQCEAAQAAAJQDAAAcQCEAAQAAAJUDAAAgQCEAAgAAAJYDAAAoQCEAAQAAAJcDAAAsQCEAAQAAAJgDAAAwQCEAAwAAAJkDAAA8QCEAAwAAAJoDAABIQCEAAgAAAJsDAABQQCEAAQAAAJwDAABUQCEAAgAAAJ0DAABcQCEAAQAAAJ4DAABgQCEAAQAAAJ8DAABkQCEAAQAAAKADAABoQCEAAgAAAKEDAABwQCEAAgAAAKMDAAB4QCEAAgAAAKQDAACAQCEAAQAAAKUDAACEQCEAAQAAAKYDAACIQCEAAgAAAKcDAACQQCEAAQAAAKgDAACUQCEAAQAAAKkDAACYQCEAAgAAAKoDAACgQCEAAQAAAKsDAACkQCEAAQAAAKwDAACoQCEAAQAAAK0DAACsQCEAAQAAAK4DAACwQCEAAQAAAK8DAAC0QCEAAQAAALADAAC4QCEAAQAAALEDAAC8QCEAAQAAALIDAADAQCEAAgAAALMDAADIQCEAAQAAALQDAADMQCEAAQAAALUDAADQQCEAAgAAALYDAADYQCEAAQAAALcDAADcQCEAAQAAALgDAADgQCEAAwAAALkDAADsQCEAAwAAALoDAAD4QCEAAgAAALsDAAAAQSEAAQAAALwDAAAEQSEAAgAAAL0DAAAMQSEAAQAAAL4DAAAQQSEAAQAAAL8DAAAUQSEAAQAAAMADAAAYQSEAAgAAAMEDAAAgQSEAAgAAAMIDAAAoQSEAAgAAAMMDAAAwQSEAAgAAAMQDAAA4QSEAAQAAAMUDAAA8QSEAAQAAAMYDAABAQSEAAgAAAMcDAABIQSEAAQAAAMgDAABMQSEAAQAAAMkDAABQQSEAAgAAAMoDAABYQSEAAQAAAMsDAABcQSEAAQAAAMwDAABgQSEAAQAAAM0DAABkQSEAAQAAAM4DAABoQSEAAQAAAM8DAABsQSEAAQAAANADAABwQSEAAgAAANEDAAB4QSEAAwAAANUDAACEQSEAAgAAANYDAACMQSEAAgAAANcDAACUQSEAAQAAANgDAACYQSEAAQAAANkDAACcQSEAAQAAANoDAACgQSEAAQAAANsDAACkQSEAAQAAANwDAACoQSEAAQAAAN0DAACsQSEAAQAAAN4DAACwQSEAAQAAAN8DAAC0QSEAAQAAAOADAAC4QSEAAQAAAOEDAAC8QSEAAQAAAOIDAADAQSEAAQAAAOMDAADEQSEAAQAAAOQDAADIQSEAAQAAAOUDAADMQSEAAQAAAOYDAADQQSEAAQAAAOcDAADUQSEAAQAAAOgDAADYQSEAAQAAAOkDAADcQSEAAQAAAOoDAADgQSEAAQAAAOsDAADkQSEAAQAAAOwDAADoQSEAAQAAAO0DAADsQSEAAQAAAO4DAADwQSEAAQAAAO8DAAD0QSEAAQAAAPADAAD4QSEAAgAAAPEDAAAAQiEAAgAAAPIDAAAIQiEAAQAAAPMDAAAMQiEAAQAAAPQDAAAQQiEAAwAAAPUDAAAcQiEAAgAAAPcDAAAkQiEAAQAAAPgDAAAoQiEAAQAAAPkDAAAsQiEAAQAAAPoDAAAwQiEAAQAAAPsDAAA0QiEAAQAAAP0DAAA4QiEAAQAAAP4DAAA8QiEAAQAAAP8DAABAQiEAAQAAAAAEAABEQiEAAQAAAAEEAABIQiEAAQAAAAIEAABMQiEAAQAAAAMEAABQQiEAAQAAAAQEAABUQiEAAQAAAAUEAABYQiEAAQAAAAYEAABcQiEAAQAAAAcEAABgQiEAAQAAAAgEAABkQiEAAQAAAAkEAABoQiEAAQAAAAoEAABsQiEAAQAAAAsEAABwQiEAAQAAAAwEAAB0QiEAAQAAAA0EAAB4QiEAAQAAAA4EAAB8QiEAAQAAAA8EAACAQiEAAQAAABAEAACEQiEAAQAAABEEAACIQiEAAQAAABIEAACMQiEAAgAAABMEAACUQiEAAQAAABQEAACYQiEAAgAAABUEAACgQiEAAQAAABYEAACkQiEAAQAAABcEAACoQiEAAQAAABgEAACsQiEAAQAAABkEAACwQiEAAQAAABoEAAC0QiEAAQAAABsEAAC4QiEAAQAAABwEAAC8QiEAAQAAAB0EAADAQiEAAQAAAB4EAADEQiEAAgAAAB8EAADMQiEAAQAAACAEAADQQiEAAQAAACEEAADUQiEAAgAAACIEAADcQiEAAwAAACMEAADoQiEAAQAAACQEAADsQiEAAQAAACUEAADwQiEAAQAAACYEAAD0QiEAAQAAACcEAAD4QiEAAQAAACgEAAD8QiEAAQAAACkEAAAAQyEAAQAAACoEAAAEQyEAAgAAACsEAAAMQyEAAQAAACwEAAAQQyEAAQAAAC0EAAAUQyEAAQAAAC4EAAAYQyEAAQAAAC8EAAAcQyEAAQAAADAEAAAgQyEAAQAAADEEAAAkQyEAAQAAADIEAAAoQyEAAgAAADMEAAAwQyEAAQAAADQEAAA0QyEAAgAAADUEAAA8QyEAAQAAADYEAABAQyEAAQAAADcEAABEQyEAAQAAADgEAABIQyEAAQAAADkEAABMQyEAAQAAADoEAABQQyEAAQAAADsEAABUQyEAAQAAADwEAABYQyEAAQAAAD0EAABcQyEAAQAAAD4EAABgQyEAAgAAAD8EAABoQyEAAQAAAEAEAABsQyEAAQAAAEEEAABwQyEAAgAAAEIEAAB4QyEAAwAAAEMEAACEQyEAAQAAAEQEAACIQyEAAQAAAEUEAACMQyEAAQAAAEYEAACQQyEAAQAAAEcEAACUQyEAAQAAAEgEAACYQyEAAQAAAEkEAACcQyEAAQAAAEoEAACgQyEAAgAAAEsEAACoQyEAAQAAAEwEAACsQyEAAQAAAE0EAACwQyEAAQAAAE4EAAC0QyEAAQAAAE8EAAC4QyEAAQAAAFAEAAC8QyEAAQAAAFEEAADAQyEAAQAAAFIEAADEQyEAAQAAAFMEAADIQyEAAQAAAFQEAADMQyEAAQAAAFUEAADQQyEAAQAAAFYEAADUQyEAAQAAAFcEAADYQyEAAQAAAFgEAADcQyEAAQAAAFkEAADgQyEAAQAAAFoEAADkQyEAAQAAAFsEAADoQyEAAQAAAFwEAADsQyEAAQAAAF0EAADwQyEAAQAAAF4EAAD0QyEAAQAAAF8EAAD4QyEAAQAAAGAEAAD8QyEAAQAAAGEEAAAARCEAAQAAAGIEAAAERCEAAgAAAGMEAAAMRCEAAgAAAGQEAAAURCEAAQAAAGUEAAAYRCEAAQAAAGYEAAAcRCEAAQAAAGcEAAAgRCEAAQAAAGgEAAAkRCEAAQAAAGkEAAAoRCEAAQAAAGoEAAAsRCEAAQAAAGsEAAAwRCEAAQAAAGwEAAA0RCEAAQAAAG0EAAA4RCEAAQAAAG4EAAA8RCEAAQAAAG8EAABARCEAAQAAAHAEAABERCEAAQAAAHEEAABIRCEAAQAAAHIEAABMRCEAAQAAAHMEAABQRCEAAQAAAHQEAABURCEAAQAAAHUEAABYRCEAAQAAAHYEAABcRCEAAQAAAHcEAABgRCEAAQAAAHgEAABkRCEAAQAAAHkEAABoRCEAAQAAAHoEAABsRCEAAQAAAHsEAABwRCEAAQAAAHwEAAB0RCEAAQAAAH0EAAB4RCEAAQAAAH4EAAB8RCEAAQAAAH8EAACARCEAAQAAAIAEAACERCEAAQAAAIEEAACIRCEAAQAAAIoEAACMRCEAAQAAAIsEAACQRCEAAQAAAIwEAACURCEAAQAAAI0EAACYRCEAAQAAAI4EAACcRCEAAQAAAI8EAACgRCEAAQAAAJAEAACkRCEAAQAAAJEEAACoRCEAAQAAAJIEAACsRCEAAQAAAJMEAACwRCEAAQAAAJQEAAC0RCEAAQAAAJUEAAC4RCEAAQAAAJYEAAC8RCEAAQAAAJcEAADARCEAAQAAAJgEAADERCEAAQAAAJkEAADIRCEAAQAAAJoEAADMRCEAAQAAAJsEAADQRCEAAQAAAJwEAADURCEAAQAAAJ0EAADYRCEAAQAAAJ4EAADcRCEAAQAAAJ8EAADgRCEAAQAAAKAEAADkRCEAAQAAAKEEAADoRCEAAQAAAKIEAADsRCEAAQAAAKMEAADwRCEAAQAAAKQEAAD0RCEAAQAAAKUEAAD4RCEAAQAAAKYEAAD8RCEAAQAAAKcEAAAARSEAAQAAAKgEAAAERSEAAQAAAKkEAAAIRSEAAQAAAKoEAAAMRSEAAQAAAKsEAAAQRSEAAQAAAKwEAAAURSEAAQAAAK0EAAAYRSEAAQAAAK4EAAAcRSEAAQAAAK8EAAAgRSEAAQAAALAEAAAkRSEAAQAAALEEAAAoRSEAAQAAALIEAAAsRSEAAQAAALMEAAAwRSEAAQAAALQEAAA0RSEAAQAAALUEAAA4RSEAAQAAALYEAAA8RSEAAQAAALcEAABARSEAAQAAALgEAABERSEAAQAAALkEAABIRSEAAQAAALoEAABMRSEAAQAAALsEAABQRSEAAQAAALwEAABURSEAAQAAAL0EAABYRSEAAQAAAL4EAABcRSEAAQAAAL8EAABgRSEAAQAAAMAEAABkRSEAAQAAAMEEAABoRSEAAQAAAMIEAABsRSEAAQAAAMMEAABwRSEAAQAAAMQEAAB0RSEAAQAAAMUEAAB4RSEAAQAAAMYEAAB8RSEAAQAAAMcEAACARSEAAQAAAMgEAACERSEAAQAAAMkEAACIRSEAAQAAAMoEAACMRSEAAQAAAMsEAACQRSEAAQAAAMwEAACURSEAAQAAAM0EAACYRSEAAQAAAM4EAACcRSEAAQAAAM8EAACgRSEAAQAAANAEAACkRSEAAQAAANEEAACoRSEAAQAAANIEAACsRSEAAQAAANMEAACwRSEAAQAAANQEAAC0RSEAAQAAANUEAAC4RSEAAQAAANYEAAC8RSEAAQAAANcEAADARSEAAQAAANgEAADERSEAAQAAANkEAADIRSEAAQAAANoEAADMRSEAAQAAANsEAADQRSEAAQAAANwEAADURSEAAQAAAN0EAADYRSEAAQAAAN4EAADcRSEAAQAAAN8EAADgRSEAAQAAAOAEAADkRSEAAQAAAOEEAADoRSEAAQAAAOIEAADsRSEAAQAAAOMEAADwRSEAAQAAAOQEAAD0RSEAAQAAAOUEAAD4RSEAAQAAAOYEAAD8RSEAAQAAAOcEAAAARiEAAQAAAOgEAAAERiEAAQAAAOkEAAAIRiEAAQAAAOoEAAAMRiEAAQAAAOsEAAAQRiEAAQAAAOwEAAAURiEAAQAAAO0EAAAYRiEAAQAAAO4EAAAcRiEAAQAAAO8EAAAgRiEAAQAAAPAEAAAkRiEAAQAAAPEEAAAoRiEAAQAAAPIEAAAsRiEAAQAAAPMEAAAwRiEAAQAAAPQEAAA0RiEAAQAAAPUEAAA4RiEAAQAAAPYEAAA8RiEAAQAAAPcEAABARiEAAQAAAPgEAABERiEAAQAAAPkEAABIRiEAAQAAAPoEAABMRiEAAQAAAPsEAABQRiEAAQAAAPwEAABURiEAAQAAAP0EAABYRiEAAQAAAP4EAABcRiEAAQAAAP8EAABgRiEAAQAAAAAFAABkRiEAAQAAAAEFAABoRiEAAQAAAAIFAABsRiEAAQAAAAMFAABwRiEAAQAAAAQFAAB0RiEAAQAAAAUFAAB4RiEAAQAAAAYFAAB8RiEAAQAAAAcFAACARiEAAQAAAAgFAACERiEAAQAAAAkFAACIRiEAAQAAAAoFAACMRiEAAQAAAAsFAACQRiEAAQAAAAwFAACURiEAAQAAAA0FAACYRiEAAQAAAA4FAACcRiEAAQAAAA8FAACgRiEAAQAAABAFAACkRiEAAQAAABEFAACoRiEAAQAAABIFAACsRiEAAQAAABMFAACwRiEAAQAAABQFAAC0RiEAAQAAABUFAAC4RiEAAQAAABYFAAC8RiEAAQAAABcFAADARiEAAQAAABgFAADERiEAAQAAABkFAADIRiEAAQAAABoFAADMRiEAAQAAABsFAADQRiEAAQAAABwFAADURiEAAQAAAB0FAADYRiEAAQAAAB4FAADcRiEAAQAAAB8FAADgRiEAAQAAACAFAADkRiEAAQAAACEFAADoRiEAAQAAACIFAADsRiEAAQAAACMFAADwRiEAAQAAACQFAAD0RiEAAQAAACUFAAD4RiEAAQAAACYFAAD8RiEAAQAAACcFAAAARyEAAQAAACgFAAAERyEAAQAAACkFAAAIRyEAAQAAACoFAAAMRyEAAQAAACsFAAAQRyEAAQAAACwFAAAURyEAAQAAAC0FAAAYRyEAAQAAAC4FAAAcRyEAAQAAAC8FAAAgRyEAAQAAADEFAAAkRyEAAQAAADIFAAAoRyEAAQAAADMFAAAsRyEAAQAAADQFAAAwRyEAAQAAADUFAAA0RyEAAQAAADYFAAA4RyEAAQAAADcFAAA8RyEAAQAAADgFAABARyEAAQAAADkFAABERyEAAQAAADoFAABIRyEAAQAAADsFAABMRyEAAQAAADwFAABQRyEAAQAAAD0FAABURyEAAQAAAD4FAABYRyEAAQAAAD8FAABcRyEAAQAAAEAFAABgRyEAAQAAAEEFAABkRyEAAQAAAEIFAABoRyEAAQAAAEMFAABsRyEAAQAAAEQFAABwRyEAAQAAAEUFAAB0RyEAAQAAAEYFAAB4RyEAAQAAAEcFAAB8RyEAAQAAAEgFAACARyEAAQAAAEkFAACERyEAAQAAAEoFAACIRyEAAQAAAEsFAACMRyEAAQAAAEwFAACQRyEAAQAAAE0FAACURyEAAQAAAE4FAACYRyEAAQAAAE8FAACcRyEAAQAAAFAFAACgRyEAAQAAAFEFAACkRyEAAQAAAFIFAACoRyEAAQAAAFMFAACsRyEAAQAAAFQFAACwRyEAAQAAAFUFAAC0RyEAAQAAAFYFAAC4RyEAAQAAAGEFAAC8RyEAAQAAAGIFAADARyEAAQAAAGMFAADERyEAAQAAAGQFAADIRyEAAQAAAGUFAADMRyEAAQAAAGYFAADQRyEAAQAAAGcFAADURyEAAQAAAGgFAADYRyEAAQAAAGkFAADcRyEAAQAAAGoFAADgRyEAAQAAAGsFAADkRyEAAQAAAGwFAADoRyEAAQAAAG0FAADsRyEAAQAAAG4FAADwRyEAAQAAAG8FAAD0RyEAAQAAAHAFAAD4RyEAAQAAAHEFAAD8RyEAAQAAAHIFAAAASCEAAQAAAHMFAAAESCEAAQAAAHQFAAAISCEAAQAAAHUFAAAMSCEAAQAAAHYFAAAQSCEAAQAAAHcFAAAUSCEAAQAAAHgFAAAYSCEAAQAAAHkFAAAcSCEAAQAAAHoFAAAgSCEAAQAAAHsFAAAkSCEAAQAAAHwFAAAoSCEAAQAAAH0FAAAsSCEAAQAAAH4FAAAwSCEAAQAAAH8FAAA0SCEAAQAAAIAFAAA4SCEAAQAAAIEFAAA8SCEAAQAAAIIFAABASCEAAQAAAIMFAABESCEAAQAAAIQFAABISCEAAQAAAIUFAABMSCEAAQAAAIYFAABQSCEAAQAAAKAQAABUSCEAAQAAAKEQAABYSCEAAQAAAKIQAABcSCEAAQAAAKMQAABgSCEAAQAAAKQQAABkSCEAAQAAAKUQAABoSCEAAQAAAKYQAABsSCEAAQAAAKcQAABwSCEAAQAAAKgQAAB0SCEAAQAAAKkQAAB4SCEAAQAAAKoQAAB8SCEAAQAAAKsQAACASCEAAQAAAKwQAACESCEAAQAAAK0QAACISCEAAQAAAK4QAACMSCEAAQAAAK8QAACQSCEAAQAAALAQAACUSCEAAQAAALEQAACYSCEAAQAAALIQAACcSCEAAQAAALMQAACgSCEAAQAAALQQAACkSCEAAQAAALUQAACoSCEAAQAAALYQAACsSCEAAQAAALcQAACwSCEAAQAAALgQAAC0SCEAAQAAALkQAAC4SCEAAQAAALoQAAC8SCEAAQAAALsQAADASCEAAQAAALwQAADESCEAAQAAAL0QAADISCEAAQAAAL4QAADMSCEAAQAAAL8QAADQSCEAAQAAAMAQAADUSCEAAQAAAMEQAADYSCEAAQAAAMIQAADcSCEAAQAAAMMQAADgSCEAAQAAAMQQAADkSCEAAQAAAMUQAADoSCEAAQAAAMcQAADsSCEAAQAAAM0QAADwSCEAAQAAANAQAAD0SCEAAQAAANEQAAD4SCEAAQAAANIQAAD8SCEAAQAAANMQAAAASSEAAQAAANQQAAAESSEAAQAAANUQAAAISSEAAQAAANYQAAAMSSEAAQAAANcQAAAQSSEAAQAAANgQAAAUSSEAAQAAANkQAAAYSSEAAQAAANoQAAAcSSEAAQAAANsQAAAgSSEAAQAAANwQAAAkSSEAAQAAAN0QAAAoSSEAAQAAAN4QAAAsSSEAAQAAAN8QAAAwSSEAAQAAAOAQAAA0SSEAAQAAAOEQAAA4SSEAAQAAAOIQAAA8SSEAAQAAAOMQAABASSEAAQAAAOQQAABESSEAAQAAAOUQAABISSEAAQAAAOYQAABMSSEAAQAAAOcQAABQSSEAAQAAAOgQAABUSSEAAQAAAOkQAABYSSEAAQAAAOoQAABcSSEAAQAAAOsQAABgSSEAAQAAAOwQAABkSSEAAQAAAO0QAABoSSEAAQAAAO4QAABsSSEAAQAAAO8QAABwSSEAAQAAAPAQAAB0SSEAAQAAAPEQAAB4SSEAAQAAAPIQAAB8SSEAAQAAAPMQAACASSEAAQAAAPQQAACESSEAAQAAAPUQAACISSEAAQAAAPYQAACMSSEAAQAAAPcQAACQSSEAAQAAAPgQAACUSSEAAQAAAPkQAACYSSEAAQAAAPoQAACcSSEAAQAAAP0QAACgSSEAAQAAAP4QAACkSSEAAQAAAP8QAACoSSEAAQAAAKATAACsSSEAAQAAAKETAACwSSEAAQAAAKITAAC0SSEAAQAAAKMTAAC4SSEAAQAAAKQTAAC8SSEAAQAAAKUTAADASSEAAQAAAKYTAADESSEAAQAAAKcTAADISSEAAQAAAKgTAADMSSEAAQAAAKkTAADQSSEAAQAAAKoTAADUSSEAAQAAAKsTAADYSSEAAQAAAKwTAADcSSEAAQAAAK0TAADgSSEAAQAAAK4TAADkSSEAAQAAAK8TAADoSSEAAQAAALATAADsSSEAAQAAALETAADwSSEAAQAAALITAAD0SSEAAQAAALMTAAD4SSEAAQAAALQTAAD8SSEAAQAAALUTAAAASiEAAQAAALYTAAAESiEAAQAAALcTAAAISiEAAQAAALgTAAAMSiEAAQAAALkTAAAQSiEAAQAAALoTAAAUSiEAAQAAALsTAAAYSiEAAQAAALwTAAAcSiEAAQAAAL0TAAAgSiEAAQAAAL4TAAAkSiEAAQAAAL8TAAAoSiEAAQAAAMATAAAsSiEAAQAAAMETAAAwSiEAAQAAAMITAAA0SiEAAQAAAMMTAAA4SiEAAQAAAMQTAAA8SiEAAQAAAMUTAABASiEAAQAAAMYTAABESiEAAQAAAMcTAABISiEAAQAAAMgTAABMSiEAAQAAAMkTAABQSiEAAQAAAMoTAABUSiEAAQAAAMsTAABYSiEAAQAAAMwTAABcSiEAAQAAAM0TAABgSiEAAQAAAM4TAABkSiEAAQAAAM8TAABoSiEAAQAAANATAABsSiEAAQAAANETAABwSiEAAQAAANITAAB0SiEAAQAAANMTAAB4SiEAAQAAANQTAAB8SiEAAQAAANUTAACASiEAAQAAANYTAACESiEAAQAAANcTAACISiEAAQAAANgTAACMSiEAAQAAANkTAACQSiEAAQAAANoTAACUSiEAAQAAANsTAACYSiEAAQAAANwTAACcSiEAAQAAAN0TAACgSiEAAQAAAN4TAACkSiEAAQAAAN8TAACoSiEAAQAAAOATAACsSiEAAQAAAOETAACwSiEAAQAAAOITAAC0SiEAAQAAAOMTAAC4SiEAAQAAAOQTAAC8SiEAAQAAAOUTAADASiEAAQAAAOYTAADESiEAAQAAAOcTAADISiEAAQAAAOgTAADMSiEAAQAAAOkTAADQSiEAAQAAAOoTAADUSiEAAQAAAOsTAADYSiEAAQAAAOwTAADcSiEAAQAAAO0TAADgSiEAAQAAAO4TAADkSiEAAQAAAO8TAADoSiEAAQAAAPATAADsSiEAAQAAAPETAADwSiEAAQAAAPITAAD0SiEAAQAAAPMTAAD4SiEAAQAAAPQTAAD8SiEAAQAAAPUTAAAASyEAAQAAAPgTAAAESyEAAQAAAPkTAAAISyEAAQAAAPoTAAAMSyEAAQAAAPsTAAAQSyEAAQAAAPwTAAAUSyEAAQAAAP0TAAAYSyEAAQAAAIAcAAAcSyEAAgAAAIEcAAAkSyEAAgAAAIIcAAAsSyEAAgAAAIMcAAA0SyEAAgAAAIQcAAA8SyEAAwAAAIUcAABISyEAAwAAAIYcAABUSyEAAgAAAIccAABcSyEAAgAAAIgcAABkSyEAAgAAAIkcAABsSyEAAQAAAIocAABwSyEAAQAAAJAcAAB0SyEAAQAAAJEcAAB4SyEAAQAAAJIcAAB8SyEAAQAAAJMcAACASyEAAQAAAJQcAACESyEAAQAAAJUcAACISyEAAQAAAJYcAACMSyEAAQAAAJccAACQSyEAAQAAAJgcAACUSyEAAQAAAJkcAACYSyEAAQAAAJocAACcSyEAAQAAAJscAACgSyEAAQAAAJwcAACkSyEAAQAAAJ0cAACoSyEAAQAAAJ4cAACsSyEAAQAAAJ8cAACwSyEAAQAAAKAcAAC0SyEAAQAAAKEcAAC4SyEAAQAAAKIcAAC8SyEAAQAAAKMcAADASyEAAQAAAKQcAADESyEAAQAAAKUcAADISyEAAQAAAKYcAADMSyEAAQAAAKccAADQSyEAAQAAAKgcAADUSyEAAQAAAKkcAADYSyEAAQAAAKocAADcSyEAAQAAAKscAADgSyEAAQAAAKwcAADkSyEAAQAAAK0cAADoSyEAAQAAAK4cAADsSyEAAQAAAK8cAADwSyEAAQAAALAcAAD0SyEAAQAAALEcAAD4SyEAAQAAALIcAAD8SyEAAQAAALMcAAAATCEAAQAAALQcAAAETCEAAQAAALUcAAAITCEAAQAAALYcAAAMTCEAAQAAALccAAAQTCEAAQAAALgcAAAUTCEAAQAAALkcAAAYTCEAAQAAALocAAAcTCEAAQAAAL0cAAAgTCEAAQAAAL4cAAAkTCEAAQAAAL8cAAAoTCEAAQAAAHkdAAAsTCEAAQAAAH0dAAAwTCEAAQAAAI4dAAA0TCEAAQAAAAAeAAA4TCEAAQAAAAEeAAA8TCEAAQAAAAIeAABATCEAAQAAAAMeAABETCEAAQAAAAQeAABITCEAAQAAAAUeAABMTCEAAQAAAAYeAABQTCEAAQAAAAceAABUTCEAAQAAAAgeAABYTCEAAQAAAAkeAABcTCEAAQAAAAoeAABgTCEAAQAAAAseAABkTCEAAQAAAAweAABoTCEAAQAAAA0eAABsTCEAAQAAAA4eAABwTCEAAQAAAA8eAAB0TCEAAQAAABAeAAB4TCEAAQAAABEeAAB8TCEAAQAAABIeAACATCEAAQAAABMeAACETCEAAQAAABQeAACITCEAAQAAABUeAACMTCEAAQAAABYeAACQTCEAAQAAABceAACUTCEAAQAAABgeAACYTCEAAQAAABkeAACcTCEAAQAAABoeAACgTCEAAQAAABseAACkTCEAAQAAABweAACoTCEAAQAAAB0eAACsTCEAAQAAAB4eAACwTCEAAQAAAB8eAAC0TCEAAQAAACAeAAC4TCEAAQAAACEeAAC8TCEAAQAAACIeAADATCEAAQAAACMeAADETCEAAQAAACQeAADITCEAAQAAACUeAADMTCEAAQAAACYeAADQTCEAAQAAACceAADUTCEAAQAAACgeAADYTCEAAQAAACkeAADcTCEAAQAAACoeAADgTCEAAQAAACseAADkTCEAAQAAACweAADoTCEAAQAAAC0eAADsTCEAAQAAAC4eAADwTCEAAQAAAC8eAAD0TCEAAQAAADAeAAD4TCEAAQAAADEeAAD8TCEAAQAAADIeAAAATSEAAQAAADMeAAAETSEAAQAAADQeAAAITSEAAQAAADUeAAAMTSEAAQAAADYeAAAQTSEAAQAAADceAAAUTSEAAQAAADgeAAAYTSEAAQAAADkeAAAcTSEAAQAAADoeAAAgTSEAAQAAADseAAAkTSEAAQAAADweAAAoTSEAAQAAAD0eAAAsTSEAAQAAAD4eAAAwTSEAAQAAAD8eAAA0TSEAAQAAAEAeAAA4TSEAAQAAAEEeAAA8TSEAAQAAAEIeAABATSEAAQAAAEMeAABETSEAAQAAAEQeAABITSEAAQAAAEUeAABMTSEAAQAAAEYeAABQTSEAAQAAAEceAABUTSEAAQAAAEgeAABYTSEAAQAAAEkeAABcTSEAAQAAAEoeAABgTSEAAQAAAEseAABkTSEAAQAAAEweAABoTSEAAQAAAE0eAABsTSEAAQAAAE4eAABwTSEAAQAAAE8eAAB0TSEAAQAAAFAeAAB4TSEAAQAAAFEeAAB8TSEAAQAAAFIeAACATSEAAQAAAFMeAACETSEAAQAAAFQeAACITSEAAQAAAFUeAACMTSEAAQAAAFYeAACQTSEAAQAAAFceAACUTSEAAQAAAFgeAACYTSEAAQAAAFkeAACcTSEAAQAAAFoeAACgTSEAAQAAAFseAACkTSEAAQAAAFweAACoTSEAAQAAAF0eAACsTSEAAQAAAF4eAACwTSEAAQAAAF8eAAC0TSEAAQAAAGAeAAC4TSEAAgAAAGEeAADATSEAAgAAAGIeAADITSEAAQAAAGMeAADMTSEAAQAAAGQeAADQTSEAAQAAAGUeAADUTSEAAQAAAGYeAADYTSEAAQAAAGceAADcTSEAAQAAAGgeAADgTSEAAQAAAGkeAADkTSEAAQAAAGoeAADoTSEAAQAAAGseAADsTSEAAQAAAGweAADwTSEAAQAAAG0eAAD0TSEAAQAAAG4eAAD4TSEAAQAAAG8eAAD8TSEAAQAAAHAeAAAATiEAAQAAAHEeAAAETiEAAQAAAHIeAAAITiEAAQAAAHMeAAAMTiEAAQAAAHQeAAAQTiEAAQAAAHUeAAAUTiEAAQAAAHYeAAAYTiEAAQAAAHceAAAcTiEAAQAAAHgeAAAgTiEAAQAAAHkeAAAkTiEAAQAAAHoeAAAoTiEAAQAAAHseAAAsTiEAAQAAAHweAAAwTiEAAQAAAH0eAAA0TiEAAQAAAH4eAAA4TiEAAQAAAH8eAAA8TiEAAQAAAIAeAABATiEAAQAAAIEeAABETiEAAQAAAIIeAABITiEAAQAAAIMeAABMTiEAAQAAAIQeAABQTiEAAQAAAIUeAABUTiEAAQAAAIYeAABYTiEAAQAAAIceAABcTiEAAQAAAIgeAABgTiEAAQAAAIkeAABkTiEAAQAAAIoeAABoTiEAAQAAAIseAABsTiEAAQAAAIweAABwTiEAAQAAAI0eAAB0TiEAAQAAAI4eAAB4TiEAAQAAAI8eAAB8TiEAAQAAAJAeAACATiEAAQAAAJEeAACETiEAAQAAAJIeAACITiEAAQAAAJMeAACMTiEAAQAAAJQeAACQTiEAAQAAAJUeAACUTiEAAQAAAJseAACYTiEAAgAAAJ4eAACgTiEAAQAAAKAeAACkTiEAAQAAAKEeAACoTiEAAQAAAKIeAACsTiEAAQAAAKMeAACwTiEAAQAAAKQeAAC0TiEAAQAAAKUeAAC4TiEAAQAAAKYeAAC8TiEAAQAAAKceAADATiEAAQAAAKgeAADETiEAAQAAAKkeAADITiEAAQAAAKoeAADMTiEAAQAAAKseAADQTiEAAQAAAKweAADUTiEAAQAAAK0eAADYTiEAAQAAAK4eAADcTiEAAQAAAK8eAADgTiEAAQAAALAeAADkTiEAAQAAALEeAADoTiEAAQAAALIeAADsTiEAAQAAALMeAADwTiEAAQAAALQeAAD0TiEAAQAAALUeAAD4TiEAAQAAALYeAAD8TiEAAQAAALceAAAATyEAAQAAALgeAAAETyEAAQAAALkeAAAITyEAAQAAALoeAAAMTyEAAQAAALseAAAQTyEAAQAAALweAAAUTyEAAQAAAL0eAAAYTyEAAQAAAL4eAAAcTyEAAQAAAL8eAAAgTyEAAQAAAMAeAAAkTyEAAQAAAMEeAAAoTyEAAQAAAMIeAAAsTyEAAQAAAMMeAAAwTyEAAQAAAMQeAAA0TyEAAQAAAMUeAAA4TyEAAQAAAMYeAAA8TyEAAQAAAMceAABATyEAAQAAAMgeAABETyEAAQAAAMkeAABITyEAAQAAAMoeAABMTyEAAQAAAMseAABQTyEAAQAAAMweAABUTyEAAQAAAM0eAABYTyEAAQAAAM4eAABcTyEAAQAAAM8eAABgTyEAAQAAANAeAABkTyEAAQAAANEeAABoTyEAAQAAANIeAABsTyEAAQAAANMeAABwTyEAAQAAANQeAAB0TyEAAQAAANUeAAB4TyEAAQAAANYeAAB8TyEAAQAAANceAACATyEAAQAAANgeAACETyEAAQAAANkeAACITyEAAQAAANoeAACMTyEAAQAAANseAACQTyEAAQAAANweAACUTyEAAQAAAN0eAACYTyEAAQAAAN4eAACcTyEAAQAAAN8eAACgTyEAAQAAAOAeAACkTyEAAQAAAOEeAACoTyEAAQAAAOIeAACsTyEAAQAAAOMeAACwTyEAAQAAAOQeAAC0TyEAAQAAAOUeAAC4TyEAAQAAAOYeAAC8TyEAAQAAAOceAADATyEAAQAAAOgeAADETyEAAQAAAOkeAADITyEAAQAAAOoeAADMTyEAAQAAAOseAADQTyEAAQAAAOweAADUTyEAAQAAAO0eAADYTyEAAQAAAO4eAADcTyEAAQAAAO8eAADgTyEAAQAAAPAeAADkTyEAAQAAAPEeAADoTyEAAQAAAPIeAADsTyEAAQAAAPMeAADwTyEAAQAAAPQeAAD0TyEAAQAAAPUeAAD4TyEAAQAAAPYeAAD8TyEAAQAAAPceAAAAUCEAAQAAAPgeAAAEUCEAAQAAAPkeAAAIUCEAAQAAAPoeAAAMUCEAAQAAAPseAAAQUCEAAQAAAPweAAAUUCEAAQAAAP0eAAAYUCEAAQAAAP4eAAAcUCEAAQAAAP8eAAAgUCEAAQAAAAAfAAAkUCEAAQAAAAEfAAAoUCEAAQAAAAIfAAAsUCEAAQAAAAMfAAAwUCEAAQAAAAQfAAA0UCEAAQAAAAUfAAA4UCEAAQAAAAYfAAA8UCEAAQAAAAcfAABAUCEAAQAAAAgfAABEUCEAAQAAAAkfAABIUCEAAQAAAAofAABMUCEAAQAAAAsfAABQUCEAAQAAAAwfAABUUCEAAQAAAA0fAABYUCEAAQAAAA4fAABcUCEAAQAAAA8fAABgUCEAAQAAABAfAABkUCEAAQAAABEfAABoUCEAAQAAABIfAABsUCEAAQAAABMfAABwUCEAAQAAABQfAAB0UCEAAQAAABUfAAB4UCEAAQAAABgfAAB8UCEAAQAAABkfAACAUCEAAQAAABofAACEUCEAAQAAABsfAACIUCEAAQAAABwfAACMUCEAAQAAAB0fAACQUCEAAQAAACAfAACUUCEAAQAAACEfAACYUCEAAQAAACIfAACcUCEAAQAAACMfAACgUCEAAQAAACQfAACkUCEAAQAAACUfAACoUCEAAQAAACYfAACsUCEAAQAAACcfAACwUCEAAQAAACgfAAC0UCEAAQAAACkfAAC4UCEAAQAAACofAAC8UCEAAQAAACsfAADAUCEAAQAAACwfAADEUCEAAQAAAC0fAADIUCEAAQAAAC4fAADMUCEAAQAAAC8fAADQUCEAAQAAADAfAADUUCEAAQAAADEfAADYUCEAAQAAADIfAADcUCEAAQAAADMfAADgUCEAAQAAADQfAADkUCEAAQAAADUfAADoUCEAAQAAADYfAADsUCEAAQAAADcfAADwUCEAAQAAADgfAAD0UCEAAQAAADkfAAD4UCEAAQAAADofAAD8UCEAAQAAADsfAAAAUSEAAQAAADwfAAAEUSEAAQAAAD0fAAAIUSEAAQAAAD4fAAAMUSEAAQAAAD8fAAAQUSEAAQAAAEAfAAAUUSEAAQAAAEEfAAAYUSEAAQAAAEIfAAAcUSEAAQAAAEMfAAAgUSEAAQAAAEQfAAAkUSEAAQAAAEUfAAAoUSEAAQAAAEgfAAAsUSEAAQAAAEkfAAAwUSEAAQAAAEofAAA0USEAAQAAAEsfAAA4USEAAQAAAEwfAAA8USEAAQAAAE0fAABAUSEAAQAAAFEfAABEUSEAAQAAAFMfAABIUSEAAQAAAFUfAABMUSEAAQAAAFcfAABQUSEAAQAAAFkfAABUUSEAAQAAAFsfAABYUSEAAQAAAF0fAABcUSEAAQAAAF8fAABgUSEAAQAAAGAfAABkUSEAAQAAAGEfAABoUSEAAQAAAGIfAABsUSEAAQAAAGMfAABwUSEAAQAAAGQfAAB0USEAAQAAAGUfAAB4USEAAQAAAGYfAAB8USEAAQAAAGcfAACAUSEAAQAAAGgfAACEUSEAAQAAAGkfAACIUSEAAQAAAGofAACMUSEAAQAAAGsfAACQUSEAAQAAAGwfAACUUSEAAQAAAG0fAACYUSEAAQAAAG4fAACcUSEAAQAAAG8fAACgUSEAAQAAAHAfAACkUSEAAQAAAHEfAACoUSEAAQAAAHIfAACsUSEAAQAAAHMfAACwUSEAAQAAAHQfAAC0USEAAQAAAHUfAAC4USEAAQAAAHYfAAC8USEAAQAAAHcfAADAUSEAAQAAAHgfAADEUSEAAQAAAHkfAADIUSEAAQAAAHofAADMUSEAAQAAAHsfAADQUSEAAQAAAHwfAADUUSEAAQAAAH0fAADYUSEAAQAAAIAfAADcUSEAAQAAAIEfAADgUSEAAQAAAIIfAADkUSEAAQAAAIMfAADoUSEAAQAAAIQfAADsUSEAAQAAAIUfAADwUSEAAQAAAIYfAAD0USEAAQAAAIcfAAD4USEAAQAAAIgfAAD8USEAAQAAAIkfAAAAUiEAAQAAAIofAAAEUiEAAQAAAIsfAAAIUiEAAQAAAIwfAAAMUiEAAQAAAI0fAAAQUiEAAQAAAI4fAAAUUiEAAQAAAI8fAAAYUiEAAQAAAJAfAAAcUiEAAQAAAJEfAAAgUiEAAQAAAJIfAAAkUiEAAQAAAJMfAAAoUiEAAQAAAJQfAAAsUiEAAQAAAJUfAAAwUiEAAQAAAJYfAAA0UiEAAQAAAJcfAAA4UiEAAQAAAJgfAAA8UiEAAQAAAJkfAABAUiEAAQAAAJofAABEUiEAAQAAAJsfAABIUiEAAQAAAJwfAABMUiEAAQAAAJ0fAABQUiEAAQAAAJ4fAABUUiEAAQAAAJ8fAABYUiEAAQAAAKAfAABcUiEAAQAAAKEfAABgUiEAAQAAAKIfAABkUiEAAQAAAKMfAABoUiEAAQAAAKQfAABsUiEAAQAAAKUfAABwUiEAAQAAAKYfAAB0UiEAAQAAAKcfAAB4UiEAAQAAAKgfAAB8UiEAAQAAAKkfAACAUiEAAQAAAKofAACEUiEAAQAAAKsfAACIUiEAAQAAAKwfAACMUiEAAQAAAK0fAACQUiEAAQAAAK4fAACUUiEAAQAAAK8fAACYUiEAAQAAALAfAACcUiEAAQAAALEfAACgUiEAAQAAALMfAACkUiEAAQAAALgfAACoUiEAAQAAALkfAACsUiEAAQAAALofAACwUiEAAQAAALsfAAC0UiEAAQAAALwfAAC4UiEAAQAAAL4fAAC8UiEAAwAAAMMfAADIUiEAAQAAAMgfAADMUiEAAQAAAMkfAADQUiEAAQAAAMofAADUUiEAAQAAAMsfAADYUiEAAQAAAMwfAADcUiEAAQAAANAfAADgUiEAAQAAANEfAADkUiEAAQAAANMfAADoUiEAAQAAANgfAADsUiEAAQAAANkfAADwUiEAAQAAANofAAD0UiEAAQAAANsfAAD4UiEAAQAAAOAfAAD8UiEAAQAAAOEfAAAAUyEAAQAAAOMfAAAEUyEAAQAAAOUfAAAIUyEAAQAAAOgfAAAMUyEAAQAAAOkfAAAQUyEAAQAAAOofAAAUUyEAAQAAAOsfAAAYUyEAAQAAAOwfAAAcUyEAAQAAAPMfAAAgUyEAAQAAAPgfAAAkUyEAAQAAAPkfAAAoUyEAAQAAAPofAAAsUyEAAQAAAPsfAAAwUyEAAQAAAPwfAAA0UyEAAQAAACYhAAA4UyEAAgAAACohAABAUyEAAgAAACshAABIUyEAAgAAADIhAABQUyEAAQAAAE4hAABUUyEAAQAAAGAhAABYUyEAAQAAAGEhAABcUyEAAQAAAGIhAABgUyEAAQAAAGMhAABkUyEAAQAAAGQhAABoUyEAAQAAAGUhAABsUyEAAQAAAGYhAABwUyEAAQAAAGchAAB0UyEAAQAAAGghAAB4UyEAAQAAAGkhAAB8UyEAAQAAAGohAACAUyEAAQAAAGshAACEUyEAAQAAAGwhAACIUyEAAQAAAG0hAACMUyEAAQAAAG4hAACQUyEAAQAAAG8hAACUUyEAAQAAAHAhAACYUyEAAQAAAHEhAACcUyEAAQAAAHIhAACgUyEAAQAAAHMhAACkUyEAAQAAAHQhAACoUyEAAQAAAHUhAACsUyEAAQAAAHYhAACwUyEAAQAAAHchAAC0UyEAAQAAAHghAAC4UyEAAQAAAHkhAAC8UyEAAQAAAHohAADAUyEAAQAAAHshAADEUyEAAQAAAHwhAADIUyEAAQAAAH0hAADMUyEAAQAAAH4hAADQUyEAAQAAAH8hAADUUyEAAQAAAIMhAADYUyEAAQAAAIQhAADcUyEAAQAAALYkAADgUyEAAQAAALckAADkUyEAAQAAALgkAADoUyEAAQAAALkkAADsUyEAAQAAALokAADwUyEAAQAAALskAAD0UyEAAQAAALwkAAD4UyEAAQAAAL0kAAD8UyEAAQAAAL4kAAAAVCEAAQAAAL8kAAAEVCEAAQAAAMAkAAAIVCEAAQAAAMEkAAAMVCEAAQAAAMIkAAAQVCEAAQAAAMMkAAAUVCEAAQAAAMQkAAAYVCEAAQAAAMUkAAAcVCEAAQAAAMYkAAAgVCEAAQAAAMckAAAkVCEAAQAAAMgkAAAoVCEAAQAAAMkkAAAsVCEAAQAAAMokAAAwVCEAAQAAAMskAAA0VCEAAQAAAMwkAAA4VCEAAQAAAM0kAAA8VCEAAQAAAM4kAABAVCEAAQAAAM8kAABEVCEAAQAAANAkAABIVCEAAQAAANEkAABMVCEAAQAAANIkAABQVCEAAQAAANMkAABUVCEAAQAAANQkAABYVCEAAQAAANUkAABcVCEAAQAAANYkAABgVCEAAQAAANckAABkVCEAAQAAANgkAABoVCEAAQAAANkkAABsVCEAAQAAANokAABwVCEAAQAAANskAAB0VCEAAQAAANwkAAB4VCEAAQAAAN0kAAB8VCEAAQAAAN4kAACAVCEAAQAAAN8kAACEVCEAAQAAAOAkAACIVCEAAQAAAOEkAACMVCEAAQAAAOIkAACQVCEAAQAAAOMkAACUVCEAAQAAAOQkAACYVCEAAQAAAOUkAACcVCEAAQAAAOYkAACgVCEAAQAAAOckAACkVCEAAQAAAOgkAACoVCEAAQAAAOkkAACsVCEAAQAAAAAsAACwVCEAAQAAAAEsAAC0VCEAAQAAAAIsAAC4VCEAAQAAAAMsAAC8VCEAAQAAAAQsAADAVCEAAQAAAAUsAADEVCEAAQAAAAYsAADIVCEAAQAAAAcsAADMVCEAAQAAAAgsAADQVCEAAQAAAAksAADUVCEAAQAAAAosAADYVCEAAQAAAAssAADcVCEAAQAAAAwsAADgVCEAAQAAAA0sAADkVCEAAQAAAA4sAADoVCEAAQAAAA8sAADsVCEAAQAAABAsAADwVCEAAQAAABEsAAD0VCEAAQAAABIsAAD4VCEAAQAAABMsAAD8VCEAAQAAABQsAAAAVSEAAQAAABUsAAAEVSEAAQAAABYsAAAIVSEAAQAAABcsAAAMVSEAAQAAABgsAAAQVSEAAQAAABksAAAUVSEAAQAAABosAAAYVSEAAQAAABssAAAcVSEAAQAAABwsAAAgVSEAAQAAAB0sAAAkVSEAAQAAAB4sAAAoVSEAAQAAAB8sAAAsVSEAAQAAACAsAAAwVSEAAQAAACEsAAA0VSEAAQAAACIsAAA4VSEAAQAAACMsAAA8VSEAAQAAACQsAABAVSEAAQAAACUsAABEVSEAAQAAACYsAABIVSEAAQAAACcsAABMVSEAAQAAACgsAABQVSEAAQAAACksAABUVSEAAQAAACosAABYVSEAAQAAACssAABcVSEAAQAAACwsAABgVSEAAQAAAC0sAABkVSEAAQAAAC4sAABoVSEAAQAAAC8sAABsVSEAAQAAADAsAABwVSEAAQAAADEsAAB0VSEAAQAAADIsAAB4VSEAAQAAADMsAAB8VSEAAQAAADQsAACAVSEAAQAAADUsAACEVSEAAQAAADYsAACIVSEAAQAAADcsAACMVSEAAQAAADgsAACQVSEAAQAAADksAACUVSEAAQAAADosAACYVSEAAQAAADssAACcVSEAAQAAADwsAACgVSEAAQAAAD0sAACkVSEAAQAAAD4sAACoVSEAAQAAAD8sAACsVSEAAQAAAEAsAACwVSEAAQAAAEEsAAC0VSEAAQAAAEIsAAC4VSEAAQAAAEMsAAC8VSEAAQAAAEQsAADAVSEAAQAAAEUsAADEVSEAAQAAAEYsAADIVSEAAQAAAEcsAADMVSEAAQAAAEgsAADQVSEAAQAAAEksAADUVSEAAQAAAEosAADYVSEAAQAAAEssAADcVSEAAQAAAEwsAADgVSEAAQAAAE0sAADkVSEAAQAAAE4sAADoVSEAAQAAAE8sAADsVSEAAQAAAFAsAADwVSEAAQAAAFEsAAD0VSEAAQAAAFIsAAD4VSEAAQAAAFMsAAD8VSEAAQAAAFQsAAAAViEAAQAAAFUsAAAEViEAAQAAAFYsAAAIViEAAQAAAFcsAAAMViEAAQAAAFgsAAAQViEAAQAAAFksAAAUViEAAQAAAFosAAAYViEAAQAAAFssAAAcViEAAQAAAFwsAAAgViEAAQAAAF0sAAAkViEAAQAAAF4sAAAoViEAAQAAAF8sAAAsViEAAQAAAGAsAAAwViEAAQAAAGEsAAA0ViEAAQAAAGIsAAA4ViEAAQAAAGMsAAA8ViEAAQAAAGQsAABAViEAAQAAAGUsAABEViEAAQAAAGYsAABIViEAAQAAAGcsAABMViEAAQAAAGgsAABQViEAAQAAAGksAABUViEAAQAAAGosAABYViEAAQAAAGssAABcViEAAQAAAGwsAABgViEAAQAAAG0sAABkViEAAQAAAG4sAABoViEAAQAAAG8sAABsViEAAQAAAHAsAABwViEAAQAAAHIsAAB0ViEAAQAAAHMsAAB4ViEAAQAAAHUsAAB8ViEAAQAAAHYsAACAViEAAQAAAH4sAACEViEAAQAAAH8sAACIViEAAQAAAIAsAACMViEAAQAAAIEsAACQViEAAQAAAIIsAACUViEAAQAAAIMsAACYViEAAQAAAIQsAACcViEAAQAAAIUsAACgViEAAQAAAIYsAACkViEAAQAAAIcsAACoViEAAQAAAIgsAACsViEAAQAAAIksAACwViEAAQAAAIosAAC0ViEAAQAAAIssAAC4ViEAAQAAAIwsAAC8ViEAAQAAAI0sAADAViEAAQAAAI4sAADEViEAAQAAAI8sAADIViEAAQAAAJAsAADMViEAAQAAAJEsAADQViEAAQAAAJIsAADUViEAAQAAAJMsAADYViEAAQAAAJQsAADcViEAAQAAAJUsAADgViEAAQAAAJYsAADkViEAAQAAAJcsAADoViEAAQAAAJgsAADsViEAAQAAAJksAADwViEAAQAAAJosAAD0ViEAAQAAAJssAAD4ViEAAQAAAJwsAAD8ViEAAQAAAJ0sAAAAVyEAAQAAAJ4sAAAEVyEAAQAAAJ8sAAAIVyEAAQAAAKAsAAAMVyEAAQAAAKEsAAAQVyEAAQAAAKIsAAAUVyEAAQAAAKMsAAAYVyEAAQAAAKQsAAAcVyEAAQAAAKUsAAAgVyEAAQAAAKYsAAAkVyEAAQAAAKcsAAAoVyEAAQAAAKgsAAAsVyEAAQAAAKksAAAwVyEAAQAAAKosAAA0VyEAAQAAAKssAAA4VyEAAQAAAKwsAAA8VyEAAQAAAK0sAABAVyEAAQAAAK4sAABEVyEAAQAAAK8sAABIVyEAAQAAALAsAABMVyEAAQAAALEsAABQVyEAAQAAALIsAABUVyEAAQAAALMsAABYVyEAAQAAALQsAABcVyEAAQAAALUsAABgVyEAAQAAALYsAABkVyEAAQAAALcsAABoVyEAAQAAALgsAABsVyEAAQAAALksAABwVyEAAQAAALosAAB0VyEAAQAAALssAAB4VyEAAQAAALwsAAB8VyEAAQAAAL0sAACAVyEAAQAAAL4sAACEVyEAAQAAAL8sAACIVyEAAQAAAMAsAACMVyEAAQAAAMEsAACQVyEAAQAAAMIsAACUVyEAAQAAAMMsAACYVyEAAQAAAMQsAACcVyEAAQAAAMUsAACgVyEAAQAAAMYsAACkVyEAAQAAAMcsAACoVyEAAQAAAMgsAACsVyEAAQAAAMksAACwVyEAAQAAAMosAAC0VyEAAQAAAMssAAC4VyEAAQAAAMwsAAC8VyEAAQAAAM0sAADAVyEAAQAAAM4sAADEVyEAAQAAAM8sAADIVyEAAQAAANAsAADMVyEAAQAAANEsAADQVyEAAQAAANIsAADUVyEAAQAAANMsAADYVyEAAQAAANQsAADcVyEAAQAAANUsAADgVyEAAQAAANYsAADkVyEAAQAAANcsAADoVyEAAQAAANgsAADsVyEAAQAAANksAADwVyEAAQAAANosAAD0VyEAAQAAANssAAD4VyEAAQAAANwsAAD8VyEAAQAAAN0sAAAAWCEAAQAAAN4sAAAEWCEAAQAAAN8sAAAIWCEAAQAAAOAsAAAMWCEAAQAAAOEsAAAQWCEAAQAAAOIsAAAUWCEAAQAAAOMsAAAYWCEAAQAAAOssAAAcWCEAAQAAAOwsAAAgWCEAAQAAAO0sAAAkWCEAAQAAAO4sAAAoWCEAAQAAAPIsAAAsWCEAAQAAAPMsAAAwWCEAAQAAAAAtAAA0WCEAAQAAAAEtAAA4WCEAAQAAAAItAAA8WCEAAQAAAAMtAABAWCEAAQAAAAQtAABEWCEAAQAAAAUtAABIWCEAAQAAAAYtAABMWCEAAQAAAActAABQWCEAAQAAAAgtAABUWCEAAQAAAAktAABYWCEAAQAAAAotAABcWCEAAQAAAAstAABgWCEAAQAAAAwtAABkWCEAAQAAAA0tAABoWCEAAQAAAA4tAABsWCEAAQAAAA8tAABwWCEAAQAAABAtAAB0WCEAAQAAABEtAAB4WCEAAQAAABItAAB8WCEAAQAAABMtAACAWCEAAQAAABQtAACEWCEAAQAAABUtAACIWCEAAQAAABYtAACMWCEAAQAAABctAACQWCEAAQAAABgtAACUWCEAAQAAABktAACYWCEAAQAAABotAACcWCEAAQAAABstAACgWCEAAQAAABwtAACkWCEAAQAAAB0tAACoWCEAAQAAAB4tAACsWCEAAQAAAB8tAACwWCEAAQAAACAtAAC0WCEAAQAAACEtAAC4WCEAAQAAACItAAC8WCEAAQAAACMtAADAWCEAAQAAACQtAADEWCEAAQAAACUtAADIWCEAAQAAACctAADMWCEAAQAAAC0tAADQWCEAAQAAAECmAADUWCEAAQAAAEGmAADYWCEAAQAAAEKmAADcWCEAAQAAAEOmAADgWCEAAQAAAESmAADkWCEAAQAAAEWmAADoWCEAAQAAAEamAADsWCEAAQAAAEemAADwWCEAAQAAAEimAAD0WCEAAQAAAEmmAAD4WCEAAQAAAEqmAAD8WCEAAgAAAEumAAAEWSEAAgAAAEymAAAMWSEAAQAAAE2mAAAQWSEAAQAAAE6mAAAUWSEAAQAAAE+mAAAYWSEAAQAAAFCmAAAcWSEAAQAAAFGmAAAgWSEAAQAAAFKmAAAkWSEAAQAAAFOmAAAoWSEAAQAAAFSmAAAsWSEAAQAAAFWmAAAwWSEAAQAAAFamAAA0WSEAAQAAAFemAAA4WSEAAQAAAFimAAA8WSEAAQAAAFmmAABAWSEAAQAAAFqmAABEWSEAAQAAAFumAABIWSEAAQAAAFymAABMWSEAAQAAAF2mAABQWSEAAQAAAF6mAABUWSEAAQAAAF+mAABYWSEAAQAAAGCmAABcWSEAAQAAAGGmAABgWSEAAQAAAGKmAABkWSEAAQAAAGOmAABoWSEAAQAAAGSmAABsWSEAAQAAAGWmAABwWSEAAQAAAGamAAB0WSEAAQAAAGemAAB4WSEAAQAAAGimAAB8WSEAAQAAAGmmAACAWSEAAQAAAGqmAACEWSEAAQAAAGumAACIWSEAAQAAAGymAACMWSEAAQAAAG2mAACQWSEAAQAAAICmAACUWSEAAQAAAIGmAACYWSEAAQAAAIKmAACcWSEAAQAAAIOmAACgWSEAAQAAAISmAACkWSEAAQAAAIWmAACoWSEAAQAAAIamAACsWSEAAQAAAIemAACwWSEAAQAAAIimAAC0WSEAAQAAAImmAAC4WSEAAQAAAIqmAAC8WSEAAQAAAIumAADAWSEAAQAAAIymAADEWSEAAQAAAI2mAADIWSEAAQAAAI6mAADMWSEAAQAAAI+mAADQWSEAAQAAAJCmAADUWSEAAQAAAJGmAADYWSEAAQAAAJKmAADcWSEAAQAAAJOmAADgWSEAAQAAAJSmAADkWSEAAQAAAJWmAADoWSEAAQAAAJamAADsWSEAAQAAAJemAADwWSEAAQAAAJimAAD0WSEAAQAAAJmmAAD4WSEAAQAAAJqmAAD8WSEAAQAAAJumAAAAWiEAAQAAACKnAAAEWiEAAQAAACOnAAAIWiEAAQAAACSnAAAMWiEAAQAAACWnAAAQWiEAAQAAACanAAAUWiEAAQAAACenAAAYWiEAAQAAACinAAAcWiEAAQAAACmnAAAgWiEAAQAAACqnAAAkWiEAAQAAACunAAAoWiEAAQAAACynAAAsWiEAAQAAAC2nAAAwWiEAAQAAAC6nAAA0WiEAAQAAAC+nAAA4WiEAAQAAADKnAAA8WiEAAQAAADOnAABAWiEAAQAAADSnAABEWiEAAQAAADWnAABIWiEAAQAAADanAABMWiEAAQAAADenAABQWiEAAQAAADinAABUWiEAAQAAADmnAABYWiEAAQAAADqnAABcWiEAAQAAADunAABgWiEAAQAAADynAABkWiEAAQAAAD2nAABoWiEAAQAAAD6nAABsWiEAAQAAAD+nAABwWiEAAQAAAECnAAB0WiEAAQAAAEGnAAB4WiEAAQAAAEKnAAB8WiEAAQAAAEOnAACAWiEAAQAAAESnAACEWiEAAQAAAEWnAACIWiEAAQAAAEanAACMWiEAAQAAAEenAACQWiEAAQAAAEinAACUWiEAAQAAAEmnAACYWiEAAQAAAEqnAACcWiEAAQAAAEunAACgWiEAAQAAAEynAACkWiEAAQAAAE2nAACoWiEAAQAAAE6nAACsWiEAAQAAAE+nAACwWiEAAQAAAFCnAAC0WiEAAQAAAFGnAAC4WiEAAQAAAFKnAAC8WiEAAQAAAFOnAADAWiEAAQAAAFSnAADEWiEAAQAAAFWnAADIWiEAAQAAAFanAADMWiEAAQAAAFenAADQWiEAAQAAAFinAADUWiEAAQAAAFmnAADYWiEAAQAAAFqnAADcWiEAAQAAAFunAADgWiEAAQAAAFynAADkWiEAAQAAAF2nAADoWiEAAQAAAF6nAADsWiEAAQAAAF+nAADwWiEAAQAAAGCnAAD0WiEAAQAAAGGnAAD4WiEAAQAAAGKnAAD8WiEAAQAAAGOnAAAAWyEAAQAAAGSnAAAEWyEAAQAAAGWnAAAIWyEAAQAAAGanAAAMWyEAAQAAAGenAAAQWyEAAQAAAGinAAAUWyEAAQAAAGmnAAAYWyEAAQAAAGqnAAAcWyEAAQAAAGunAAAgWyEAAQAAAGynAAAkWyEAAQAAAG2nAAAoWyEAAQAAAG6nAAAsWyEAAQAAAG+nAAAwWyEAAQAAAHmnAAA0WyEAAQAAAHqnAAA4WyEAAQAAAHunAAA8WyEAAQAAAHynAABAWyEAAQAAAH2nAABEWyEAAQAAAH6nAABIWyEAAQAAAH+nAABMWyEAAQAAAICnAABQWyEAAQAAAIGnAABUWyEAAQAAAIKnAABYWyEAAQAAAIOnAABcWyEAAQAAAISnAABgWyEAAQAAAIWnAABkWyEAAQAAAIanAABoWyEAAQAAAIenAABsWyEAAQAAAIunAABwWyEAAQAAAIynAAB0WyEAAQAAAI2nAAB4WyEAAQAAAJCnAAB8WyEAAQAAAJGnAACAWyEAAQAAAJKnAACEWyEAAQAAAJOnAACIWyEAAQAAAJSnAACMWyEAAQAAAJanAACQWyEAAQAAAJenAACUWyEAAQAAAJinAACYWyEAAQAAAJmnAACcWyEAAQAAAJqnAACgWyEAAQAAAJunAACkWyEAAQAAAJynAACoWyEAAQAAAJ2nAACsWyEAAQAAAJ6nAACwWyEAAQAAAJ+nAAC0WyEAAQAAAKCnAAC4WyEAAQAAAKGnAAC8WyEAAQAAAKKnAADAWyEAAQAAAKOnAADEWyEAAQAAAKSnAADIWyEAAQAAAKWnAADMWyEAAQAAAKanAADQWyEAAQAAAKenAADUWyEAAQAAAKinAADYWyEAAQAAAKmnAADcWyEAAQAAAKqnAADgWyEAAQAAAKunAADkWyEAAQAAAKynAADoWyEAAQAAAK2nAADsWyEAAQAAAK6nAADwWyEAAQAAALCnAAD0WyEAAQAAALGnAAD4WyEAAQAAALKnAAD8WyEAAQAAALOnAAAAXCEAAQAAALSnAAAEXCEAAQAAALWnAAAIXCEAAQAAALanAAAMXCEAAQAAALenAAAQXCEAAQAAALinAAAUXCEAAQAAALmnAAAYXCEAAQAAALqnAAAcXCEAAQAAALunAAAgXCEAAQAAALynAAAkXCEAAQAAAL2nAAAoXCEAAQAAAL6nAAAsXCEAAQAAAL+nAAAwXCEAAQAAAMCnAAA0XCEAAQAAAMGnAAA4XCEAAQAAAMKnAAA8XCEAAQAAAMOnAABAXCEAAQAAAMSnAABEXCEAAQAAAMWnAABIXCEAAQAAAManAABMXCEAAQAAAMenAABQXCEAAQAAAMinAABUXCEAAQAAAMmnAABYXCEAAQAAAMqnAABcXCEAAQAAAMunAABgXCEAAQAAAMynAABkXCEAAQAAAM2nAABoXCEAAQAAANCnAABsXCEAAQAAANGnAABwXCEAAQAAANanAAB0XCEAAQAAANenAAB4XCEAAQAAANinAAB8XCEAAQAAANmnAACAXCEAAQAAANqnAACEXCEAAQAAANunAACIXCEAAQAAANynAACMXCEAAQAAAPWnAACQXCEAAQAAAPanAACUXCEAAQAAAFOrAACYXCEAAQAAAHCrAACcXCEAAQAAAHGrAACgXCEAAQAAAHKrAACkXCEAAQAAAHOrAACoXCEAAQAAAHSrAACsXCEAAQAAAHWrAACwXCEAAQAAAHarAAC0XCEAAQAAAHerAAC4XCEAAQAAAHirAAC8XCEAAQAAAHmrAADAXCEAAQAAAHqrAADEXCEAAQAAAHurAADIXCEAAQAAAHyrAADMXCEAAQAAAH2rAADQXCEAAQAAAH6rAADUXCEAAQAAAH+rAADYXCEAAQAAAICrAADcXCEAAQAAAIGrAADgXCEAAQAAAIKrAADkXCEAAQAAAIOrAADoXCEAAQAAAISrAADsXCEAAQAAAIWrAADwXCEAAQAAAIarAAD0XCEAAQAAAIerAAD4XCEAAQAAAIirAAD8XCEAAQAAAImrAAAAXSEAAQAAAIqrAAAEXSEAAQAAAIurAAAIXSEAAQAAAIyrAAAMXSEAAQAAAI2rAAAQXSEAAQAAAI6rAAAUXSEAAQAAAI+rAAAYXSEAAQAAAJCrAAAcXSEAAQAAAJGrAAAgXSEAAQAAAJKrAAAkXSEAAQAAAJOrAAAoXSEAAQAAAJSrAAAsXSEAAQAAAJWrAAAwXSEAAQAAAJarAAA0XSEAAQAAAJerAAA4XSEAAQAAAJirAAA8XSEAAQAAAJmrAABAXSEAAQAAAJqrAABEXSEAAQAAAJurAABIXSEAAQAAAJyrAABMXSEAAQAAAJ2rAABQXSEAAQAAAJ6rAABUXSEAAQAAAJ+rAABYXSEAAQAAAKCrAABcXSEAAQAAAKGrAABgXSEAAQAAAKKrAABkXSEAAQAAAKOrAABoXSEAAQAAAKSrAABsXSEAAQAAAKWrAABwXSEAAQAAAKarAAB0XSEAAQAAAKerAAB4XSEAAQAAAKirAAB8XSEAAQAAAKmrAACAXSEAAQAAAKqrAACEXSEAAQAAAKurAACIXSEAAQAAAKyrAACMXSEAAQAAAK2rAACQXSEAAQAAAK6rAACUXSEAAQAAAK+rAACYXSEAAQAAALCrAACcXSEAAQAAALGrAACgXSEAAQAAALKrAACkXSEAAQAAALOrAACoXSEAAQAAALSrAACsXSEAAQAAALWrAACwXSEAAQAAALarAAC0XSEAAQAAALerAAC4XSEAAQAAALirAAC8XSEAAQAAALmrAADAXSEAAQAAALqrAADEXSEAAQAAALurAADIXSEAAQAAALyrAADMXSEAAQAAAL2rAADQXSEAAQAAAL6rAADUXSEAAQAAAL+rAADYXSEAAQAAAAX7AADcXSEAAQAAAAb7AADgXSEAAQAAACH/AADkXSEAAQAAACL/AADoXSEAAQAAACP/AADsXSEAAQAAACT/AADwXSEAAQAAACX/AAD0XSEAAQAAACb/AAD4XSEAAQAAACf/AAD8XSEAAQAAACj/AAAAXiEAAQAAACn/AAAEXiEAAQAAACr/AAAIXiEAAQAAACv/AAAMXiEAAQAAACz/AAAQXiEAAQAAAC3/AAAUXiEAAQAAAC7/AAAYXiEAAQAAAC//AAAcXiEAAQAAADD/AAAgXiEAAQAAADH/AAAkXiEAAQAAADL/AAAoXiEAAQAAADP/AAAsXiEAAQAAADT/AAAwXiEAAQAAADX/AAA0XiEAAQAAADb/AAA4XiEAAQAAADf/AAA8XiEAAQAAADj/AABAXiEAAQAAADn/AABEXiEAAQAAADr/AABIXiEAAQAAAEH/AABMXiEAAQAAAEL/AABQXiEAAQAAAEP/AABUXiEAAQAAAET/AABYXiEAAQAAAEX/AABcXiEAAQAAAEb/AABgXiEAAQAAAEf/AABkXiEAAQAAAEj/AABoXiEAAQAAAEn/AABsXiEAAQAAAEr/AABwXiEAAQAAAEv/AAB0XiEAAQAAAEz/AAB4XiEAAQAAAE3/AAB8XiEAAQAAAE7/AACAXiEAAQAAAE//AACEXiEAAQAAAFD/AACIXiEAAQAAAFH/AACMXiEAAQAAAFL/AACQXiEAAQAAAFP/AACUXiEAAQAAAFT/AACYXiEAAQAAAFX/AACcXiEAAQAAAFb/AACgXiEAAQAAAFf/AACkXiEAAQAAAFj/AACoXiEAAQAAAFn/AACsXiEAAQAAAFr/AACwXiEAAQAAAAAEAQC0XiEAAQAAAAEEAQC4XiEAAQAAAAIEAQC8XiEAAQAAAAMEAQDAXiEAAQAAAAQEAQDEXiEAAQAAAAUEAQDIXiEAAQAAAAYEAQDMXiEAAQAAAAcEAQDQXiEAAQAAAAgEAQDUXiEAAQAAAAkEAQDYXiEAAQAAAAoEAQDcXiEAAQAAAAsEAQDgXiEAAQAAAAwEAQDkXiEAAQAAAA0EAQDoXiEAAQAAAA4EAQDsXiEAAQAAAA8EAQDwXiEAAQAAABAEAQD0XiEAAQAAABEEAQD4XiEAAQAAABIEAQD8XiEAAQAAABMEAQAAXyEAAQAAABQEAQAEXyEAAQAAABUEAQAIXyEAAQAAABYEAQAMXyEAAQAAABcEAQAQXyEAAQAAABgEAQAUXyEAAQAAABkEAQAYXyEAAQAAABoEAQAcXyEAAQAAABsEAQAgXyEAAQAAABwEAQAkXyEAAQAAAB0EAQAoXyEAAQAAAB4EAQAsXyEAAQAAAB8EAQAwXyEAAQAAACAEAQA0XyEAAQAAACEEAQA4XyEAAQAAACIEAQA8XyEAAQAAACMEAQBAXyEAAQAAACQEAQBEXyEAAQAAACUEAQBIXyEAAQAAACYEAQBMXyEAAQAAACcEAQBQXyEAAQAAACgEAQBUXyEAAQAAACkEAQBYXyEAAQAAACoEAQBcXyEAAQAAACsEAQBgXyEAAQAAACwEAQBkXyEAAQAAAC0EAQBoXyEAAQAAAC4EAQBsXyEAAQAAAC8EAQBwXyEAAQAAADAEAQB0XyEAAQAAADEEAQB4XyEAAQAAADIEAQB8XyEAAQAAADMEAQCAXyEAAQAAADQEAQCEXyEAAQAAADUEAQCIXyEAAQAAADYEAQCMXyEAAQAAADcEAQCQXyEAAQAAADgEAQCUXyEAAQAAADkEAQCYXyEAAQAAADoEAQCcXyEAAQAAADsEAQCgXyEAAQAAADwEAQCkXyEAAQAAAD0EAQCoXyEAAQAAAD4EAQCsXyEAAQAAAD8EAQCwXyEAAQAAAEAEAQC0XyEAAQAAAEEEAQC4XyEAAQAAAEIEAQC8XyEAAQAAAEMEAQDAXyEAAQAAAEQEAQDEXyEAAQAAAEUEAQDIXyEAAQAAAEYEAQDMXyEAAQAAAEcEAQDQXyEAAQAAAEgEAQDUXyEAAQAAAEkEAQDYXyEAAQAAAEoEAQDcXyEAAQAAAEsEAQDgXyEAAQAAAEwEAQDkXyEAAQAAAE0EAQDoXyEAAQAAAE4EAQDsXyEAAQAAAE8EAQDwXyEAAQAAALAEAQD0XyEAAQAAALEEAQD4XyEAAQAAALIEAQD8XyEAAQAAALMEAQAAYCEAAQAAALQEAQAEYCEAAQAAALUEAQAIYCEAAQAAALYEAQAMYCEAAQAAALcEAQAQYCEAAQAAALgEAQAUYCEAAQAAALkEAQAYYCEAAQAAALoEAQAcYCEAAQAAALsEAQAgYCEAAQAAALwEAQAkYCEAAQAAAL0EAQAoYCEAAQAAAL4EAQAsYCEAAQAAAL8EAQAwYCEAAQAAAMAEAQA0YCEAAQAAAMEEAQA4YCEAAQAAAMIEAQA8YCEAAQAAAMMEAQBAYCEAAQAAAMQEAQBEYCEAAQAAAMUEAQBIYCEAAQAAAMYEAQBMYCEAAQAAAMcEAQBQYCEAAQAAAMgEAQBUYCEAAQAAAMkEAQBYYCEAAQAAAMoEAQBcYCEAAQAAAMsEAQBgYCEAAQAAAMwEAQBkYCEAAQAAAM0EAQBoYCEAAQAAAM4EAQBsYCEAAQAAAM8EAQBwYCEAAQAAANAEAQB0YCEAAQAAANEEAQB4YCEAAQAAANIEAQB8YCEAAQAAANMEAQCAYCEAAQAAANgEAQCEYCEAAQAAANkEAQCIYCEAAQAAANoEAQCMYCEAAQAAANsEAQCQYCEAAQAAANwEAQCUYCEAAQAAAN0EAQCYYCEAAQAAAN4EAQCcYCEAAQAAAN8EAQCgYCEAAQAAAOAEAQCkYCEAAQAAAOEEAQCoYCEAAQAAAOIEAQCsYCEAAQAAAOMEAQCwYCEAAQAAAOQEAQC0YCEAAQAAAOUEAQC4YCEAAQAAAOYEAQC8YCEAAQAAAOcEAQDAYCEAAQAAAOgEAQDEYCEAAQAAAOkEAQDIYCEAAQAAAOoEAQDMYCEAAQAAAOsEAQDQYCEAAQAAAOwEAQDUYCEAAQAAAO0EAQDYYCEAAQAAAO4EAQDcYCEAAQAAAO8EAQDgYCEAAQAAAPAEAQDkYCEAAQAAAPEEAQDoYCEAAQAAAPIEAQDsYCEAAQAAAPMEAQDwYCEAAQAAAPQEAQD0YCEAAQAAAPUEAQD4YCEAAQAAAPYEAQD8YCEAAQAAAPcEAQAAYSEAAQAAAPgEAQAEYSEAAQAAAPkEAQAIYSEAAQAAAPoEAQAMYSEAAQAAAPsEAQAQYSEAAQAAAHAFAQAUYSEAAQAAAHEFAQAYYSEAAQAAAHIFAQAcYSEAAQAAAHMFAQAgYSEAAQAAAHQFAQAkYSEAAQAAAHUFAQAoYSEAAQAAAHYFAQAsYSEAAQAAAHcFAQAwYSEAAQAAAHgFAQA0YSEAAQAAAHkFAQA4YSEAAQAAAHoFAQA8YSEAAQAAAHwFAQBAYSEAAQAAAH0FAQBEYSEAAQAAAH4FAQBIYSEAAQAAAH8FAQBMYSEAAQAAAIAFAQBQYSEAAQAAAIEFAQBUYSEAAQAAAIIFAQBYYSEAAQAAAIMFAQBcYSEAAQAAAIQFAQBgYSEAAQAAAIUFAQBkYSEAAQAAAIYFAQBoYSEAAQAAAIcFAQBsYSEAAQAAAIgFAQBwYSEAAQAAAIkFAQB0YSEAAQAAAIoFAQB4YSEAAQAAAIwFAQB8YSEAAQAAAI0FAQCAYSEAAQAAAI4FAQCEYSEAAQAAAI8FAQCIYSEAAQAAAJAFAQCMYSEAAQAAAJEFAQCQYSEAAQAAAJIFAQCUYSEAAQAAAJQFAQCYYSEAAQAAAJUFAQCcYSEAAQAAAJcFAQCgYSEAAQAAAJgFAQCkYSEAAQAAAJkFAQCoYSEAAQAAAJoFAQCsYSEAAQAAAJsFAQCwYSEAAQAAAJwFAQC0YSEAAQAAAJ0FAQC4YSEAAQAAAJ4FAQC8YSEAAQAAAJ8FAQDAYSEAAQAAAKAFAQDEYSEAAQAAAKEFAQDIYSEAAQAAAKMFAQDMYSEAAQAAAKQFAQDQYSEAAQAAAKUFAQDUYSEAAQAAAKYFAQDYYSEAAQAAAKcFAQDcYSEAAQAAAKgFAQDgYSEAAQAAAKkFAQDkYSEAAQAAAKoFAQDoYSEAAQAAAKsFAQDsYSEAAQAAAKwFAQDwYSEAAQAAAK0FAQD0YSEAAQAAAK4FAQD4YSEAAQAAAK8FAQD8YSEAAQAAALAFAQAAYiEAAQAAALEFAQAEYiEAAQAAALMFAQAIYiEAAQAAALQFAQAMYiEAAQAAALUFAQAQYiEAAQAAALYFAQAUYiEAAQAAALcFAQAYYiEAAQAAALgFAQAcYiEAAQAAALkFAQAgYiEAAQAAALsFAQAkYiEAAQAAALwFAQAoYiEAAQAAAIAMAQAsYiEAAQAAAIEMAQAwYiEAAQAAAIIMAQA0YiEAAQAAAIMMAQA4YiEAAQAAAIQMAQA8YiEAAQAAAIUMAQBAYiEAAQAAAIYMAQBEYiEAAQAAAIcMAQBIYiEAAQAAAIgMAQBMYiEAAQAAAIkMAQBQYiEAAQAAAIoMAQBUYiEAAQAAAIsMAQBYYiEAAQAAAIwMAQBcYiEAAQAAAI0MAQBgYiEAAQAAAI4MAQBkYiEAAQAAAI8MAQBoYiEAAQAAAJAMAQBsYiEAAQAAAJEMAQBwYiEAAQAAAJIMAQB0YiEAAQAAAJMMAQB4YiEAAQAAAJQMAQB8YiEAAQAAAJUMAQCAYiEAAQAAAJYMAQCEYiEAAQAAAJcMAQCIYiEAAQAAAJgMAQCMYiEAAQAAAJkMAQCQYiEAAQAAAJoMAQCUYiEAAQAAAJsMAQCYYiEAAQAAAJwMAQCcYiEAAQAAAJ0MAQCgYiEAAQAAAJ4MAQCkYiEAAQAAAJ8MAQCoYiEAAQAAAKAMAQCsYiEAAQAAAKEMAQCwYiEAAQAAAKIMAQC0YiEAAQAAAKMMAQC4YiEAAQAAAKQMAQC8YiEAAQAAAKUMAQDAYiEAAQAAAKYMAQDEYiEAAQAAAKcMAQDIYiEAAQAAAKgMAQDMYiEAAQAAAKkMAQDQYiEAAQAAAKoMAQDUYiEAAQAAAKsMAQDYYiEAAQAAAKwMAQDcYiEAAQAAAK0MAQDgYiEAAQAAAK4MAQDkYiEAAQAAAK8MAQDoYiEAAQAAALAMAQDsYiEAAQAAALEMAQDwYiEAAQAAALIMAQD0YiEAAQAAAMAMAQD4YiEAAQAAAMEMAQD8YiEAAQAAAMIMAQAAYyEAAQAAAMMMAQAEYyEAAQAAAMQMAQAIYyEAAQAAAMUMAQAMYyEAAQAAAMYMAQAQYyEAAQAAAMcMAQAUYyEAAQAAAMgMAQAYYyEAAQAAAMkMAQAcYyEAAQAAAMoMAQAgYyEAAQAAAMsMAQAkYyEAAQAAAMwMAQAoYyEAAQAAAM0MAQAsYyEAAQAAAM4MAQAwYyEAAQAAAM8MAQA0YyEAAQAAANAMAQA4YyEAAQAAANEMAQA8YyEAAQAAANIMAQBAYyEAAQAAANMMAQBEYyEAAQAAANQMAQBIYyEAAQAAANUMAQBMYyEAAQAAANYMAQBQYyEAAQAAANcMAQBUYyEAAQAAANgMAQBYYyEAAQAAANkMAQBcYyEAAQAAANoMAQBgYyEAAQAAANsMAQBkYyEAAQAAANwMAQBoYyEAAQAAAN0MAQBsYyEAAQAAAN4MAQBwYyEAAQAAAN8MAQB0YyEAAQAAAOAMAQB4YyEAAQAAAOEMAQB8YyEAAQAAAOIMAQCAYyEAAQAAAOMMAQCEYyEAAQAAAOQMAQCIYyEAAQAAAOUMAQCMYyEAAQAAAOYMAQCQYyEAAQAAAOcMAQCUYyEAAQAAAOgMAQCYYyEAAQAAAOkMAQCcYyEAAQAAAOoMAQCgYyEAAQAAAOsMAQCkYyEAAQAAAOwMAQCoYyEAAQAAAO0MAQCsYyEAAQAAAO4MAQCwYyEAAQAAAO8MAQC0YyEAAQAAAPAMAQC4YyEAAQAAAPEMAQC8YyEAAQAAAPIMAQDAYyEAAQAAAFANAQDEYyEAAQAAAFENAQDIYyEAAQAAAFINAQDMYyEAAQAAAFMNAQDQYyEAAQAAAFQNAQDUYyEAAQAAAFUNAQDYYyEAAQAAAFYNAQDcYyEAAQAAAFcNAQDgYyEAAQAAAFgNAQDkYyEAAQAAAFkNAQDoYyEAAQAAAFoNAQDsYyEAAQAAAFsNAQDwYyEAAQAAAFwNAQD0YyEAAQAAAF0NAQD4YyEAAQAAAF4NAQD8YyEAAQAAAF8NAQAAZCEAAQAAAGANAQAEZCEAAQAAAGENAQAIZCEAAQAAAGINAQAMZCEAAQAAAGMNAQAQZCEAAQAAAGQNAQAUZCEAAQAAAGUNAQAYZCEAAQAAAHANAQAcZCEAAQAAAHENAQAgZCEAAQAAAHINAQAkZCEAAQAAAHMNAQAoZCEAAQAAAHQNAQAsZCEAAQAAAHUNAQAwZCEAAQAAAHYNAQA0ZCEAAQAAAHcNAQA4ZCEAAQAAAHgNAQA8ZCEAAQAAAHkNAQBAZCEAAQAAAHoNAQBEZCEAAQAAAHsNAQBIZCEAAQAAAHwNAQBMZCEAAQAAAH0NAQBQZCEAAQAAAH4NAQBUZCEAAQAAAH8NAQBYZCEAAQAAAIANAQBcZCEAAQAAAIENAQBgZCEAAQAAAIINAQBkZCEAAQAAAIMNAQBoZCEAAQAAAIQNAQBsZCEAAQAAAIUNAQBwZCEAAQAAAKAYAQB0ZCEAAQAAAKEYAQB4ZCEAAQAAAKIYAQB8ZCEAAQAAAKMYAQCAZCEAAQAAAKQYAQCEZCEAAQAAAKUYAQCIZCEAAQAAAKYYAQCMZCEAAQAAAKcYAQCQZCEAAQAAAKgYAQCUZCEAAQAAAKkYAQCYZCEAAQAAAKoYAQCcZCEAAQAAAKsYAQCgZCEAAQAAAKwYAQCkZCEAAQAAAK0YAQCoZCEAAQAAAK4YAQCsZCEAAQAAAK8YAQCwZCEAAQAAALAYAQC0ZCEAAQAAALEYAQC4ZCEAAQAAALIYAQC8ZCEAAQAAALMYAQDAZCEAAQAAALQYAQDEZCEAAQAAALUYAQDIZCEAAQAAALYYAQDMZCEAAQAAALcYAQDQZCEAAQAAALgYAQDUZCEAAQAAALkYAQDYZCEAAQAAALoYAQDcZCEAAQAAALsYAQDgZCEAAQAAALwYAQDkZCEAAQAAAL0YAQDoZCEAAQAAAL4YAQDsZCEAAQAAAL8YAQDwZCEAAQAAAMAYAQD0ZCEAAQAAAMEYAQD4ZCEAAQAAAMIYAQD8ZCEAAQAAAMMYAQAAZSEAAQAAAMQYAQAEZSEAAQAAAMUYAQAIZSEAAQAAAMYYAQAMZSEAAQAAAMcYAQAQZSEAAQAAAMgYAQAUZSEAAQAAAMkYAQAYZSEAAQAAAMoYAQAcZSEAAQAAAMsYAQAgZSEAAQAAAMwYAQAkZSEAAQAAAM0YAQAoZSEAAQAAAM4YAQAsZSEAAQAAAM8YAQAwZSEAAQAAANAYAQA0ZSEAAQAAANEYAQA4ZSEAAQAAANIYAQA8ZSEAAQAAANMYAQBAZSEAAQAAANQYAQBEZSEAAQAAANUYAQBIZSEAAQAAANYYAQBMZSEAAQAAANcYAQBQZSEAAQAAANgYAQBUZSEAAQAAANkYAQBYZSEAAQAAANoYAQBcZSEAAQAAANsYAQBgZSEAAQAAANwYAQBkZSEAAQAAAN0YAQBoZSEAAQAAAN4YAQBsZSEAAQAAAN8YAQBwZSEAAQAAAEBuAQB0ZSEAAQAAAEFuAQB4ZSEAAQAAAEJuAQB8ZSEAAQAAAENuAQCAZSEAAQAAAERuAQCEZSEAAQAAAEVuAQCIZSEAAQAAAEZuAQCMZSEAAQAAAEduAQCQZSEAAQAAAEhuAQCUZSEAAQAAAEluAQCYZSEAAQAAAEpuAQCcZSEAAQAAAEtuAQCgZSEAAQAAAExuAQCkZSEAAQAAAE1uAQCoZSEAAQAAAE5uAQCsZSEAAQAAAE9uAQCwZSEAAQAAAFBuAQC0ZSEAAQAAAFFuAQC4ZSEAAQAAAFJuAQC8ZSEAAQAAAFNuAQDAZSEAAQAAAFRuAQDEZSEAAQAAAFVuAQDIZSEAAQAAAFZuAQDMZSEAAQAAAFduAQDQZSEAAQAAAFhuAQDUZSEAAQAAAFluAQDYZSEAAQAAAFpuAQDcZSEAAQAAAFtuAQDgZSEAAQAAAFxuAQDkZSEAAQAAAF1uAQDoZSEAAQAAAF5uAQDsZSEAAQAAAF9uAQDwZSEAAQAAAGBuAQD0ZSEAAQAAAGFuAQD4ZSEAAQAAAGJuAQD8ZSEAAQAAAGNuAQAAZiEAAQAAAGRuAQAEZiEAAQAAAGVuAQAIZiEAAQAAAGZuAQAMZiEAAQAAAGduAQAQZiEAAQAAAGhuAQAUZiEAAQAAAGluAQAYZiEAAQAAAGpuAQAcZiEAAQAAAGtuAQAgZiEAAQAAAGxuAQAkZiEAAQAAAG1uAQAoZiEAAQAAAG5uAQAsZiEAAQAAAG9uAQAwZiEAAQAAAHBuAQA0ZiEAAQAAAHFuAQA4ZiEAAQAAAHJuAQA8ZiEAAQAAAHNuAQBAZiEAAQAAAHRuAQBEZiEAAQAAAHVuAQBIZiEAAQAAAHZuAQBMZiEAAQAAAHduAQBQZiEAAQAAAHhuAQBUZiEAAQAAAHluAQBYZiEAAQAAAHpuAQBcZiEAAQAAAHtuAQBgZiEAAQAAAHxuAQBkZiEAAQAAAH1uAQBoZiEAAQAAAH5uAQBsZiEAAQAAAH9uAQBwZiEAAQAAAADpAQB0ZiEAAQAAAAHpAQB4ZiEAAQAAAALpAQB8ZiEAAQAAAAPpAQCAZiEAAQAAAATpAQCEZiEAAQAAAAXpAQCIZiEAAQAAAAbpAQCMZiEAAQAAAAfpAQCQZiEAAQAAAAjpAQCUZiEAAQAAAAnpAQCYZiEAAQAAAArpAQCcZiEAAQAAAAvpAQCgZiEAAQAAAAzpAQCkZiEAAQAAAA3pAQCoZiEAAQAAAA7pAQCsZiEAAQAAAA/pAQCwZiEAAQAAABDpAQC0ZiEAAQAAABHpAQC4ZiEAAQAAABLpAQC8ZiEAAQAAABPpAQDAZiEAAQAAABTpAQDEZiEAAQAAABXpAQDIZiEAAQAAABbpAQDMZiEAAQAAABfpAQDQZiEAAQAAABjpAQDUZiEAAQAAABnpAQDYZiEAAQAAABrpAQDcZiEAAQAAABvpAQDgZiEAAQAAABzpAQDkZiEAAQAAAB3pAQDoZiEAAQAAAB7pAQDsZiEAAQAAAB/pAQDwZiEAAQAAACDpAQD0ZiEAAQAAACHpAQD4ZiEAAQAAACLpAQD8ZiEAAQAAACPpAQAAZyEAAQAAACTpAQAEZyEAAQAAACXpAQAIZyEAAQAAACbpAQAMZyEAAQAAACfpAQAQZyEAAQAAACjpAQAUZyEAAQAAACnpAQAYZyEAAQAAACrpAQAcZyEAAQAAACvpAQAgZyEAAQAAACzpAQAkZyEAAQAAAC3pAQAoZyEAAQAAAC7pAQAsZyEAAQAAAC/pAQAwZyEAAQAAADDpAQA0ZyEAAQAAADHpAQA4ZyEAAQAAADLpAQA8ZyEAAQAAADPpAQBAZyEAAQAAADTpAQBEZyEAAQAAADXpAQBIZyEAAQAAADbpAQBMZyEAAQAAADfpAQBQZyEAAQAAADjpAQBUZyEAAQAAADnpAQBYZyEAAQAAADrpAQBcZyEAAQAAADvpAQBgZyEAAQAAADzpAQBkZyEAAQAAAD3pAQBoZyEAAQAAAD7pAQBsZyEAAQAAAD/pAQBwZyEAAQAAAEDpAQB0ZyEAAQAAAEHpAQB4ZyEAAQAAAELpAQB8ZyEAAQAAAEPpAQCAZyEAAQAAAExpdGVyYWxDbGFzc1VuaWNvZGVDbGFzc0J5dGVzUmVwZXRpdGlvbkdyb3Vwb2xkX2ZsYWdzQ29uY2F0QWx0ZXJuYXRpb25BbHRlcm5hdGlvbkJyYW5jaAAAAAAAAQAAAAEAAABoBQAAAAAAAAQAAAAEAAAAaQUAAGNhc2VfaW5zZW5zaXRpdmVtdWx0aV9saW5lZG90X21hdGNoZXNfbmV3X2xpbmVzd2FwX2dyZWVkdW5pY29kZWNybGYAtPEhABAAAADE8SEACgAAAM7xIQAUAAAA4vEhAAoAAADs8SEABwAAAPPxIQAEAAAARmxhZ3MvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1zeW50YXgtMC44LjUvc3JjL2hpci9pbnRlcnZhbC5ycy3yIQBrAAAAVgAAABUAAAAt8iEAawAAAHkAAAAkAAAALfIhAGsAAACmAAAAKgAAAC3yIQBrAAAApgAAAEUAAAAt8iEAawAAAKcAAAAdAAAALfIhAGsAAACqAAAAHwAAAC3yIQBrAAAAqgAAADkAAAAt8iEAawAAAA0BAAAkAAAALfIhAGsAAAAOAQAAGQAAAC3yIQBrAAAA0AAAABwAAAAt8iEAawAAANAAAAA1AAAALfIhAGsAAADWAAAAGwAAAC3yIQBrAAAA1gAAADUAAAAt8iEAawAAAN0AAAAhAAAALfIhAGsAAADdAAAASAAAAC3yIQBrAAAA6gAAACgAAAAt8iEAawAAAOwAAAA+AAAALfIhAGsAAADvAAAAPQAAAC3yIQBrAAAA+AAAACUAAAAt8iEAawAAAAIBAAAgAAAALfIhAGsAAAAJAQAAGQAAAGFzc2VydGlvbiBmYWlsZWQ6ICFzZWxmLnJhbmdlc1thXS5pc19pbnRlcnNlY3Rpb25fZW1wdHkoJm90aGVyLnJhbmdlc1tiXSkAAAAt8iEAawAAAN0AAAANAAAALfIhAGsAAADXAAAAKAAAAC3yIQBrAAAA2AAAAB0AAAAt8iEAawAAADkBAAAXAAAALfIhAGsAAAA6AQAAJAAAAC3yIQBrAAAAOwEAABkAAAAt8iEAawAAAEIBAAAXAAAALfIhAGsAAABDAQAAJAAAAC3yIQBrAAAARAEAABkAAAAt8iEAawAAAD4BAAAkAAAALfIhAGsAAAA/AQAAJAAAAC3yIQBrAAAAQAEAABkAAAAt8iEAawAAACsBAAAZAAAALfIhAGsAAABnAQAAMgAAAC3yIQBrAAAAbAEAACQAAAAt8iEAawAAAG0BAAAZAAAAYXNzZXJ0aW9uIGZhaWxlZDogIXNlbGYucmFuZ2VzLmlzX2VtcHR5KCkAAAAt8iEAawAAAFwBAAAJAAAALfIhAGsAAAATAgAAHQAAAC3yIQBrAAAAFgIAAB0AAAAt8iEAawAAACgCAABHAAAALfIhAGsAAAAvAgAAPQAAAC3yIQBrAAAALwIAAEcAAABJbnRlcnZhbFNldHJhbmdlc2ZvbGRlZGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXB0dXJpbmcgZ3JvdXBzICjX9SEAMQAAAFyCJwABAAAAaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgZm91bmQgaW4gY2hhcmFjdGVyIGNsYXNzGPYhADAAAABpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZABQ9iEAOwAAAGludmFsaWQgcmFuZ2UgYm91bmRhcnksIG11c3QgYmUgYSBsaXRlcmFsAAAAlPYhACkAAAB1bmNsb3NlZCBjaGFyYWN0ZXIgY2xhc3PI9iEAGAAAAGRlY2ltYWwgbGl0ZXJhbCBlbXB0eQAAAOj2IQAVAAAAZGVjaW1hbCBsaXRlcmFsIGludmFsaWQACPchABcAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGVtcHR5AAAAKPchABkAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGlzIG5vdCBhIFVuaWNvZGUgc2NhbGFyIHZhbHVlAAAATPchADEAAABpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0AAAAiPchABkAAABpbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZSwgcmVhY2hlZCBlbmQgb2YgcGF0dGVybiBwcmVtYXR1cmVseQAArPchAD4AAAB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNl9PchABwAAABkYW5nbGluZyBmbGFnIG5lZ2F0aW9uIG9wZXJhdG9yABj4IQAfAAAAZHVwbGljYXRlIGZsYWcAAED4IQAOAAAAZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZABY+CEAHwAAAGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXgAAID4IQAiAAAAdW5yZWNvZ25pemVkIGZsYWcAAACs+CEAEQAAAGR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWXI+CEAHAAAAGVtcHR5IGNhcHR1cmUgZ3JvdXAgbmFtZez4IQAYAAAAaW52YWxpZCBjYXB0dXJlIGdyb3VwIGNoYXJhY3RlcgAM+SEAHwAAAHVuY2xvc2VkIGNhcHR1cmUgZ3JvdXAgbmFtZQA0+SEAGwAAAHVuY2xvc2VkIGdyb3VwAABY+SEADgAAAHVub3BlbmVkIGdyb3VwAABw+SEADgAAAGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHBhcmVudGhlc2VzL2JyYWNrZXRzICgAAIj5IQA6AAAAXIInAAEAAABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmTU+SEAPAAAAHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbAAAABj6IQAtAAAAdW5jbG9zZWQgY291bnRlZCByZXBldGl0aW9uAFD6IQAbAAAAcmVwZXRpdGlvbiBvcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb24AAHT6IQAmAAAAc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIApPohAFMAAAB1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGYAAPshAGMAAABmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2UAAABs+yEAgQAAAGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgY2xhc3MA+PshAB8AAABiYWNrcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCD8IQAgAAAAbG9vay1hcm91bmQsIGluY2x1ZGluZyBsb29rLWFoZWFkIGFuZCBsb29rLWJlaGluZCwgaXMgbm90IHN1cHBvcnRlZABI/CEAQwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LXN5bnRheC0wLjguNS9zcmMvYXN0L21vZC5ycwAAlPwhAGYAAAB/AgAAIgAAAJT8IQBmAAAAmAIAACIAAABhbG51bWJsYW5rZ3JhcGhwcmludHhkaWdpdAAAlPwhAGYAAADnBAAAFAAAAJT8IQBmAAAA8wQAACMAAACU/CEAZgAAAA8GAAAUAAAAlPwhAGYAAACHBgAAGwAAAJT8IQBmAAAAigYAABsAAACU/CEAZgAAAI0GAAAbAAAAlPwhAGYAAACQBgAAGwAAAJT8IQBmAAAAxAYAAB8AAACU/CEAZgAAAMsGAAAbAAAAlPwhAGYAAADMBgAAGwAAAGYFAAAMAAAABAAAAGoFAABrBQAAfQQAAAAAAAAAAAAAAQAAAM0DAAByZWdleCBwYXJzZSBlcnJvcjoKAAD+IQATAAAAZXJyb3I6IAAc/iEABwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4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CAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAgBMAAI8TAACgEwAA9RMAAPgTAAD9EwAAARQAAGwWAABvFgAAfxYAAIEWAACaFgAAoBYAAOoWAADuFgAA+BYAAAAXAAAVFwAAHxcAADQXAABAFwAAUxcAAGAXAABsFwAAbhcAAHAXAAByFwAAcxcAAIAXAADTFwAA1xcAANcXAADcFwAA3RcAAOAXAADpFwAACxgAAA0YAAAPGAAAGRgAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOxkAAEYZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAA0BkAANkZAAAAGgAAGxoAACAaAABeGgAAYBoAAHwaAAB/GgAAiRoAAJAaAACZGgAApxoAAKcaAACwGgAAzhoAAAAbAABMGwAAUBsAAFkbAABrGwAAcxsAAIAbAADzGwAAABwAADccAABAHAAASRwAAE0cAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA0BwAANIcAADUHAAA+hwAAAAdAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAADCAAAA0gAAA/IAAAQCAAAFQgAABUIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAvIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAtiQAAOkkAAAALAAA5CwAAOssAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAMC0AAGctAABvLQAAby0AAH8tAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADOLQAA0C0AANYtAADYLQAA3i0AAOAtAAD/LQAALy4AAC8uAAAFMAAABzAAACEwAAAvMAAAMTAAADUwAAA4MAAAPDAAAEEwAACWMAAAmTAAAJowAACdMAAAnzAAAKEwAAD6MAAA/DAAAP8wAAAFMQAALzEAADExAACOMQAAoDEAAL8xAADwMQAA/zEAAAA0AAC/TQAAAE4AAIykAADQpAAA/aQAAAClAAAMpgAAEKYAACumAABApgAAcqYAAHSmAAB9pgAAf6YAAPGmAAAXpwAAH6cAACKnAACIpwAAi6cAAM2nAADQpwAA0acAANOnAADTpwAA1acAANynAADypwAAJ6gAACyoAAAsqAAAQKgAAHOoAACAqAAAxagAANCoAADZqAAA4KgAAPeoAAD7qAAA+6gAAP2oAAAtqQAAMKkAAFOpAABgqQAAfKkAAICpAADAqQAAz6kAANmpAADgqQAA/qkAAACqAAA2qgAAQKoAAE2qAABQqgAAWaoAAGCqAAB2qgAAeqoAAMKqAADbqgAA3aoAAOCqAADvqgAA8qoAAPaqAAABqwAABqsAAAmrAAAOqwAAEasAABarAAAgqwAAJqsAACirAAAuqwAAMKsAAFqrAABcqwAAaasAAHCrAADqqwAA7KsAAO2rAADwqwAA+asAAACsAACj1wAAsNcAAMbXAADL1wAA+9cAAAD5AABt+gAAcPoAANn6AAAA+wAABvsAABP7AAAX+wAAHfsAACj7AAAq+wAANvsAADj7AAA8+wAAPvsAAD77AABA+wAAQfsAAEP7AABE+wAARvsAALH7AADT+wAAPf0AAFD9AACP/QAAkv0AAMf9AADw/QAA+/0AAAD+AAAP/gAAIP4AAC/+AAAz/gAANP4AAE3+AABP/gAAcP4AAHT+AAB2/gAA/P4AABD/AAAZ/wAAIf8AADr/AAA//wAAP/8AAEH/AABa/wAAZv8AAL7/AADC/wAAx/8AAMr/AADP/wAA0v8AANf/AADa/wAA3P8AAAAAAQALAAEADQABACYAAQAoAAEAOgABADwAAQA9AAEAPwABAE0AAQBQAAEAXQABAIAAAQD6AAEAQAEBAHQBAQD9AQEA/QEBAIACAQCcAgEAoAIBANACAQDgAgEA4AIBAAADAQAfAwEALQMBAEoDAQBQAwEAegMBAIADAQCdAwEAoAMBAMMDAQDIAwEAzwMBANEDAQDVAwEAAAQBAJ0EAQCgBAEAqQQBALAEAQDTBAEA2AQBAPsEAQAABQEAJwUBADAFAQBjBQEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAFAQDzBQEAAAYBADYHAQBABwEAVQcBAGAHAQBnBwEAgAcBAIUHAQCHBwEAsAcBALIHAQC6BwEAAAgBAAUIAQAICAEACAgBAAoIAQA1CAEANwgBADgIAQA8CAEAPAgBAD8IAQBVCAEAYAgBAHYIAQCACAEAnggBAOAIAQDyCAEA9AgBAPUIAQAACQEAFQkBACAJAQA5CQEAgAkBALcJAQC+CQEAvwkBAAAKAQADCgEABQoBAAYKAQAMCgEAEwoBABUKAQAXCgEAGQoBADUKAQA4CgEAOgoBAD8KAQA/CgEAYAoBAHwKAQCACgEAnAoBAMAKAQDHCgEAyQoBAOYKAQAACwEANQsBAEALAQBVCwEAYAsBAHILAQCACwEAkQsBAAAMAQBIDAEAgAwBALIMAQDADAEA8gwBAAANAQAnDQEAMA0BADkNAQBADQEAZQ0BAGkNAQBtDQEAbw0BAIUNAQCADgEAqQ4BAKsOAQCsDgEAsA4BALEOAQDCDgEAxA4BAPwOAQAcDwEAJw8BACcPAQAwDwEAUA8BAHAPAQCFDwEAsA8BAMQPAQDgDwEA9g8BAAAQAQBGEAEAZhABAHUQAQB/EAEAuhABAMIQAQDCEAEA0BABAOgQAQDwEAEA+RABAAARAQA0EQEANhEBAD8RAQBEEQEARxEBAFARAQBzEQEAdhEBAHYRAQCAEQEAxBEBAMkRAQDMEQEAzhEBANoRAQDcEQEA3BEBAAASAQAREgEAExIBADcSAQA+EgEAQRIBAIASAQCGEgEAiBIBAIgSAQCKEgEAjRIBAI8SAQCdEgEAnxIBAKgSAQCwEgEA6hIBAPASAQD5EgEAABMBAAMTAQAFEwEADBMBAA8TAQAQEwEAExMBACgTAQAqEwEAMBMBADITAQAzEwEANRMBADkTAQA7EwEARBMBAEcTAQBIEwEASxMBAE0TAQBQEwEAUBMBAFcTAQBXEwEAXRMBAGMTAQBmEwEAbBMBAHATAQB0EwEAgBMBAIkTAQCLEwEAixMBAI4TAQCOEwEAkBMBALUTAQC3EwEAwBMBAMITAQDCEwEAxRMBAMUTAQDHEwEAyhMBAMwTAQDTEwEA4RMBAOITAQAAFAEAShQBAFAUAQBZFAEAXhQBAGEUAQCAFAEAxRQBAMcUAQDHFAEA0BQBANkUAQCAFQEAtRUBALgVAQDAFQEA2BUBAN0VAQAAFgEAQBYBAEQWAQBEFgEAUBYBAFkWAQCAFgEAuBYBAMAWAQDJFgEA0BYBAOMWAQAAFwEAGhcBAB0XAQArFwEAMBcBADkXAQBAFwEARhcBAAAYAQA6GAEAoBgBAOkYAQD/GAEABhkBAAkZAQAJGQEADBkBABMZAQAVGQEAFhkBABgZAQA1GQEANxkBADgZAQA7GQEAQxkBAFAZAQBZGQEAoBkBAKcZAQCqGQEA1xkBANoZAQDhGQEA4xkBAOQZAQAAGgEAPhoBAEcaAQBHGgEAUBoBAJkaAQCdGgEAnRoBALAaAQD4GgEAwBsBAOAbAQDwGwEA+RsBAAAcAQAIHAEAChwBADYcAQA4HAEAQBwBAFAcAQBZHAEAchwBAI8cAQCSHAEApxwBAKkcAQC2HAEAAB0BAAYdAQAIHQEACR0BAAsdAQA2HQEAOh0BADodAQA8HQEAPR0BAD8dAQBHHQEAUB0BAFkdAQBgHQEAZR0BAGcdAQBoHQEAah0BAI4dAQCQHQEAkR0BAJMdAQCYHQEAoB0BAKkdAQDgHgEA9h4BAAAfAQAQHwEAEh8BADofAQA+HwEAQh8BAFAfAQBaHwEAsB8BALAfAQAAIAEAmSMBAAAkAQBuJAEAgCQBAEMlAQCQLwEA8C8BAAAwAQAvNAEAQDQBAFU0AQBgNAEA+kMBAABEAQBGRgEAAGEBADlhAQAAaAEAOGoBAEBqAQBeagEAYGoBAGlqAQBwagEAvmoBAMBqAQDJagEA0GoBAO1qAQDwagEA9GoBAABrAQA2awEAQGsBAENrAQBQawEAWWsBAGNrAQB3awEAfWsBAI9rAQBAbQEAbG0BAHBtAQB5bQEAQG4BAH9uAQAAbwEASm8BAE9vAQCHbwEAj28BAJ9vAQDgbwEA4W8BAONvAQDkbwEA8G8BAPFvAQAAcAEA94cBAACIAQDVjAEA/4wBAAiNAQDwrwEA868BAPWvAQD7rwEA/a8BAP6vAQAAsAEAIrEBADKxAQAysQEAULEBAFKxAQBVsQEAVbEBAGSxAQBnsQEAcLEBAPuyAQAAvAEAarwBAHC8AQB8vAEAgLwBAIi8AQCQvAEAmbwBAJ28AQCevAEA8MwBAPnMAQAAzwEALc8BADDPAQBGzwEAZdEBAGnRAQBt0QEActEBAHvRAQCC0QEAhdEBAIvRAQCq0QEArdEBAELSAQBE0gEAANQBAFTUAQBW1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQAe1QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAUtUBAKXWAQCo1gEAwNYBAMLWAQDa1gEA3NYBAPrWAQD81gEAFNcBABbXAQA01wEANtcBAE7XAQBQ1wEAbtcBAHDXAQCI1wEAitcBAKjXAQCq1wEAwtcBAMTXAQDL1wEAztcBAP/XAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA3wEAHt8BACXfAQAq3wEAAOABAAbgAQAI4AEAGOABABvgAQAh4AEAI+ABACTgAQAm4AEAKuABADDgAQBt4AEAj+ABAI/gAQAA4QEALOEBADDhAQA94QEAQOEBAEnhAQBO4QEATuEBAJDiAQCu4gEAwOIBAPniAQDQ5AEA+eQBANDlAQD65QEA4OcBAObnAQDo5wEA6+cBAO3nAQDu5wEA8OcBAP7nAQAA6AEAxOgBANDoAQDW6AEAAOkBAEvpAQBQ6QEAWekBAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BADDxAQBJ8QEAUPEBAGnxAQBw8QEAifEBAPD7AQD5+wEAAAACAN+mAgAApwIAObcCAEC3AgAduAIAILgCAKHOAgCwzgIA4OsCAPDrAgBd7gIAAPgCAB36AgAAAAMAShMDAFATAwCvIwMAAAEOAO8BDgAJAAAADQAAACAAAAAgAAAAhQAAAIUAAACgAAAAoAAAAIAWAACAFgAAACAAAAogAAAoIAAAKSAAAC8gAAAvIAAAXyAAAF8gAAAAMAAAADAAADAAAAA5AAAAYAYAAGkGAADwBgAA+QYAAMAHAADJBwAAZgkAAG8JAADmCQAA7wkAAGYKAABvCgAA5goAAO8KAABmCwAAbwsAAOYLAADvCwAAZgwAAG8MAADmDAAA7wwAAGYNAABvDQAA5g0AAO8NAABQDgAAWQ4AANAOAADZDgAAIA8AACkPAABAEAAASRAAAJAQAACZEAAA4BcAAOkXAAAQGAAAGRgAAEYZAABPGQAA0BkAANkZAACAGgAAiRoAAJAaAACZGgAAUBsAAFkbAACwGwAAuRsAAEAcAABJHAAAUBwAAFkcAAAgpgAAKaYAANCoAADZqAAAAKkAAAmpAADQqQAA2akAAPCpAAD5qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAAoAQBAKkEAQAwDQEAOQ0BAEANAQBJDQEAZhABAG8QAQDwEAEA+RABADYRAQA/EQEA0BEBANkRAQDwEgEA+RIBAFAUAQBZFAEA0BQBANkUAQBQFgEAWRYBAMAWAQDJFgEA0BYBAOMWAQAwFwEAORcBAOAYAQDpGAEAUBkBAFkZAQDwGwEA+RsBAFAcAQBZHAEAUB0BAFkdAQCgHQEAqR0BAFAfAQBZHwEAMGEBADlhAQBgagEAaWoBAMBqAQDJagEAUGsBAFlrAQBwbQEAeW0BAPDMAQD5zAEAztcBAP/XAQBA4QEASeEBAPDiAQD54gEA8OQBAPnkAQDx5QEA+uUBAFDpAQBZ6QEA8PsBAPn7AQBhc3NpZ25lZGFzY2lpAAAApAIiAGYAAAD9AQAAQAAAAEFTQ0lJQXNzaWduZWRBbnmkAiIAZgAAAAYCAAAuAAAAYWdlYWhleEFTQ0lJX0hleF9EaWdpdEFscGhhYmV0aWNhbHBoYWJldGljYXNjaWloZXhkaWdpdGJjQmlkaV9DbGFzc2JpZGljQmlkaV9Db250cm9sYmlkaWNsYXNzYmlkaWNvbnRyb2xiaWRpbUJpZGlfTWlycm9yZWRiaWRpbWlycm9yZWRiaWRpbWlycm9yaW5nZ2x5cGhCaWRpX01pcnJvcmluZ19HbHlwaGJpZGlwYWlyZWRicmFja2V0QmlkaV9QYWlyZWRfQnJhY2tldGJpZGlwYWlyZWRicmFja2V0dHlwZUJpZGlfUGFpcmVkX0JyYWNrZXRfVHlwZWJsa2JtZ2JwYmJwdGNhbm9uaWNhbGNvbWJpbmluZ2NsYXNzQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc2Nhc2VkQ2FzZWRjYXNlZm9sZGluZ0Nhc2VfRm9sZGluZ2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2hhbmdlc3doZW5jYXNlZm9sZGVkQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbmNhc2VtYXBwZWRDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZGNoYW5nZXN3aGVubG93ZXJjYXNlZENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkY2hhbmdlc3doZW5uZmtjY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbnRpdGxlY2FzZWRDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZGNoYW5nZXN3aGVudXBwZXJjYXNlZENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkY2ljamthY2NvdW50aW5nbnVtZXJpY2tBY2NvdW50aW5nTnVtZXJpY2Nqa2NvbXBhdGliaWxpdHl2YXJpYW50a0NvbXBhdGliaWxpdHlWYXJpYW50Y2praWljb3Jla0lJQ29yZWNqa2lyZ2dzb3VyY2VrSVJHX0dTb3VyY2Vjamtpcmdoc291cmNla0lSR19IU291cmNlY2praXJnanNvdXJjZWtJUkdfSlNvdXJjZWNqa2lyZ2twc291cmNla0lSR19LUFNvdXJjZWNqa2lyZ2tzb3VyY2VrSVJHX0tTb3VyY2Vjamtpcmdtc291cmNla0lSR19NU291cmNlY2praXJnc3NvdXJjZWtJUkdfU1NvdXJjZWNqa2lyZ3Rzb3VyY2VrSVJHX1RTb3VyY2Vjamtpcmd1a3NvdXJjZWtJUkdfVUtTb3VyY2Vjamtpcmd1c291cmNla0lSR19VU291cmNlY2praXJndnNvdXJjZWtJUkdfVlNvdXJjZWNqa290aGVybnVtZXJpY2tPdGhlck51bWVyaWNjamtwcmltYXJ5bnVtZXJpY2tQcmltYXJ5TnVtZXJpY2Nqa3JzdW5pY29kZWtSU1VuaWNvZGVjb21wZXhGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbmNvbXBvc2l0aW9uZXhjbHVzaW9uY3djZmN3Y21jd2tjZmN3bGN3dGN3dWRhc2hEYXNoZGVjb21wb3NpdGlvbm1hcHBpbmdEZWNvbXBvc2l0aW9uX01hcHBpbmdkZWNvbXBvc2l0aW9udHlwZURlY29tcG9zaXRpb25fVHlwZWRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnREZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50ZGVwRGVwcmVjYXRlZGRlcHJlY2F0ZWRkaWRpYURpYWNyaXRpY2RpYWNyaXRpY2RtZHRlYUVhc3RfQXNpYW5fV2lkdGhlYXN0YXNpYW53aWR0aGViYXNlRW1vamlfTW9kaWZpZXJfQmFzZWVjb21wRW1vamlfQ29tcG9uZW50ZW1vZEVtb2ppX01vZGlmaWVyZW1vamlFbW9qaWVtb2ppY29tcG9uZW50ZW1vamltb2RpZmllcmVtb2ppbW9kaWZpZXJiYXNlZW1vamlwcmVzZW50YXRpb25FbW9qaV9QcmVzZW50YXRpb25lcHJlc2VxdWlkZW9FcXVpdmFsZW50X1VuaWZpZWRfSWRlb2dyYXBoZXF1aXZhbGVudHVuaWZpZWRpZGVvZ3JhcGhleHBhbmRzb25uZmNFeHBhbmRzX09uX05GQ2V4cGFuZHNvbm5mZEV4cGFuZHNfT25fTkZEZXhwYW5kc29ubmZrY0V4cGFuZHNfT25fTkZLQ2V4cGFuZHNvbm5ma2RFeHBhbmRzX09uX05GS0RleHRFeHRlbmRlcmV4dGVuZGVkcGljdG9ncmFwaGljRXh0ZW5kZWRfUGljdG9ncmFwaGljZXh0ZW5kZXJleHRwaWN0ZmNuZmtjRkNfTkZLQ19DbG9zdXJlZmNuZmtjY2xvc3VyZWZ1bGxjb21wb3NpdGlvbmV4Y2x1c2lvbmdjZ2NiZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbXBhdG1hdGhjb250aW51ZUlEX0NvbXBhdF9NYXRoX0NvbnRpbnVlaWRjb21wYXRtYXRoc3RhcnRJRF9Db21wYXRfTWF0aF9TdGFydGlkY29udGludWVpZGVvSWRlb2dyYXBoaWNpZGVvZ3JhcGhpY2lkc0lEX1N0YXJ0aWRzYklEU19CaW5hcnlfT3BlcmF0b3JpZHNiaW5hcnlvcGVyYXRvcmlkc3RJRFNfVHJpbmFyeV9PcGVyYXRvcmlkc3RhcnRpZHN0cmluYXJ5b3BlcmF0b3JpZHN1SURTX1VuYXJ5X09wZXJhdG9yaWRzdW5hcnlvcGVyYXRvcmluY2JJbmRpY19Db25qdW5jdF9CcmVha2luZGljY29uanVuY3RicmVha2luZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtlaGNhdGtFSF9DYXRrZWhkZXNja0VIX0Rlc2NrZWhoZ2tFSF9IR2tlaGlmYW9rRUhfSUZBT2tlaGpzZXNoa0VIX0pTZXNoa2Vobm9taXJyb3JrRUhfTm9NaXJyb3JrZWhub3JvdGF0ZWtFSF9Ob1JvdGF0ZWtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha0xvd2VyY2FzZV9NYXBwaW5nbGluZWJyZWFrbG9lTG9naWNhbF9PcmRlcl9FeGNlcHRpb25sb2dpY2Fsb3JkZXJleGNlcHRpb25sb3dlckxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG1jbU1vZGlmaWVyX0NvbWJpbmluZ19NYXJrbW9kaWZpZXJjb21iaW5pbmdtYXJrbmFOYW1lbmExVW5pY29kZV8xX05hbWVuYW1lYWxpYXNOYW1lX0FsaWFzbmNoYXJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludG5mY3FjTkZDX1F1aWNrX0NoZWNrbmZjcXVpY2tjaGVja25mZHFjTkZEX1F1aWNrX0NoZWNrbmZkcXVpY2tjaGVja25ma2NjYXNlZm9sZE5GS0NfQ2FzZWZvbGRuZmtjY2ZuZmtjcWNORktDX1F1aWNrX0NoZWNrbmZrY3F1aWNrY2hlY2tuZmtjc2NmTkZLQ19TaW1wbGVfQ2FzZWZvbGRuZmtjc2ltcGxlY2FzZWZvbGRuZmtkcWNORktEX1F1aWNrX0NoZWNrbmZrZHF1aWNrY2hlY2tub25jaGFyYWN0ZXJjb2RlcG9pbnRudE51bWVyaWNfVHlwZW51bWVyaWN0eXBlbnVtZXJpY3ZhbHVlTnVtZXJpY19WYWx1ZW52b2FscGhhT3RoZXJfQWxwaGFiZXRpY29jb21tZW50b2RpT3RoZXJfRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludG9ncmV4dE90aGVyX0dyYXBoZW1lX0V4dGVuZG9pZGNPdGhlcl9JRF9Db250aW51ZW9pZHNPdGhlcl9JRF9TdGFydG9sb3dlck90aGVyX0xvd2VyY2FzZW9tYXRoT3RoZXJfTWF0aG90aGVyYWxwaGFiZXRpY290aGVyZGVmYXVsdGlnbm9yYWJsZWNvZGVwb2ludG90aGVyZ3JhcGhlbWVleHRlbmRvdGhlcmlkY29udGludWVvdGhlcmlkc3RhcnRvdGhlcmxvd2VyY2FzZW90aGVybWF0aG90aGVydXBwZXJjYXNlT3RoZXJfVXBwZXJjYXNlb3VwcGVycGF0c3luUGF0dGVybl9TeW50YXhwYXR0ZXJuc3ludGF4cGF0dGVybndoaXRlc3BhY2VQYXR0ZXJuX1doaXRlX1NwYWNlcGF0d3NwY21QcmVwZW5kZWRfQ29uY2F0ZW5hdGlvbl9NYXJrcHJlcGVuZGVkY29uY2F0ZW5hdGlvbm1hcmtxbWFya1F1b3RhdGlvbl9NYXJrcXVvdGF0aW9ubWFya3JhZGljYWxSYWRpY2FscmVnaW9uYWxpbmRpY2F0b3JSZWdpb25hbF9JbmRpY2F0b3JyaXNic2NmU2ltcGxlX0Nhc2VfRm9sZGluZ3NjcmlwdGV4dGVuc2lvbnNzY3hzZFNvZnRfRG90dGVkc2VudGVuY2VicmVha3NlbnRlbmNldGVybWluYWxTZW50ZW5jZV9UZXJtaW5hbHNmY3NpbXBsZWNhc2Vmb2xkaW5nc2ltcGxlbG93ZXJjYXNlbWFwcGluZ1NpbXBsZV9Mb3dlcmNhc2VfTWFwcGluZ3NpbXBsZXRpdGxlY2FzZW1hcHBpbmdTaW1wbGVfVGl0bGVjYXNlX01hcHBpbmdzaW1wbGV1cHBlcmNhc2VtYXBwaW5nU2ltcGxlX1VwcGVyY2FzZV9NYXBwaW5nc2xjc29mdGRvdHRlZHNwYWNlV2hpdGVfU3BhY2VzdGNzdGVybXN1Y3RjVGl0bGVjYXNlX01hcHBpbmd0ZXJtVGVybWluYWxfUHVuY3R1YXRpb250ZXJtaW5hbHB1bmN0dWF0aW9udGl0bGVjYXNlbWFwcGluZ3VjVXBwZXJjYXNlX01hcHBpbmd1aWRlb1VuaWZpZWRfSWRlb2dyYXBodW5pY29kZTFuYW1ldW5pY29kZXJhZGljYWxzdHJva2V1bmlmaWVkaWRlb2dyYXBodXBwZXJVcHBlcmNhc2V1cHBlcmNhc2V1cHBlcmNhc2VtYXBwaW5ndXJzdmFyaWF0aW9uc2VsZWN0b3JWYXJpYXRpb25fU2VsZWN0b3J2ZXJ0aWNhbG9yaWVudGF0aW9uVmVydGljYWxfT3JpZW50YXRpb252b3Zzd2J3aGl0ZXNwYWNld29yZGJyZWFrd3NwYWNleGlkY1hJRF9Db250aW51ZXhpZGNvbnRpbnVleGlkc1hJRF9TdGFydHhpZHN0YXJ0eG9uZmN4b25mZHhvbmZrY3hvbmZrZGQfIgADAAAAeAMiAAMAAABnHyIABAAAAGsfIgAPAAAAQEomAAUAAAB6HyIACgAAAIQfIgAKAAAAeh8iAAoAAACOHyIADQAAAGsfIgAPAAAAmx8iAAIAAACdHyIACgAAAKcfIgAFAAAArB8iAAwAAAC4HyIACQAAAJ0fIgAKAAAAwR8iAAsAAACsHyIADAAAAMwfIgAFAAAA0R8iAA0AAADeHyIADAAAANEfIgANAAAA6h8iABIAAAD8HyIAFAAAABAgIgARAAAAISAiABMAAAA0ICIAFQAAAEkgIgAYAAAAYSAiAAMAAAA3xCYABQAAAIPFJgAFAAAAN8QmAAUAAABkICIAAwAAAPwfIgAUAAAAZyAiAAMAAAAhICIAEwAAAGogIgADAAAASSAiABgAAABtICIAFwAAAIQgIgAZAAAAnSAiAAUAAACiICIABQAAAKcgIgALAAAAsiAiAAwAAAC+ICIADQAAAMsgIgAOAAAA2SAiAAMAAACEICIAGQAAANwgIgACAAAA3iAiABUAAAByAyIAAgAAALIgIgAMAAAA8yAiABUAAAAIISIAFwAAAB8hIgAVAAAANCEiABcAAABLISIAFQAAAGAhIgAXAAAAdyEiABkAAACQISIAHAAAAKwhIgAVAAAAwSEiABcAAADYISIAFQAAAO0hIgAXAAAABCIiAAIAAADLICIADgAAAAYiIgAUAAAAGiIiABIAAAAsIiIAFwAAAEMiIgAVAAAAWCIiAAkAAABhIiIABwAAAGgiIgANAAAAdSIiAAwAAACBIiIADQAAAI4iIgAMAAAAmiIiAA0AAACnIiIADAAAALMiIgAOAAAAwSIiAA0AAADOIiIADQAAANsiIgAMAAAA5yIiAA0AAAD0IiIADAAAAAAjIgANAAAADSMiAAwAAAAZIyIADQAAACYjIgAMAAAAMiMiAA4AAABAIyIADQAAAE0jIgANAAAAWiMiAAwAAABmIyIADQAAAHMjIgAMAAAAfyMiAA8AAACOIyIADQAAAJsjIgARAAAArCMiAA8AAAC7IyIADAAAAMcjIgAKAAAA0SMiAAYAAADXIyIAGgAAAPEjIgAUAAAA3iAiABUAAAAFJCIABAAAAAghIgAXAAAACSQiAAQAAAA0ISIAFwAAAA0kIgAFAAAAkCEiABwAAAASJCIAAwAAAGAhIgAXAAAAFSQiAAMAAADBISIAFwAAABgkIgADAAAA7SEiABcAAAAbJCIABAAAAB8kIgAEAAAAIyQiABQAAAA3JCIAFQAAAEwkIgARAAAAXSQiABIAAABvJCIAGQAAAIgkIgAcAAAApCQiAAMAAACnJCIACgAAALEkIgAKAAAApyQiAAoAAAC7JCIAAgAAAIgkIgAcAAAAvSQiAAMAAADAJCIACQAAAMkkIgAJAAAAwCQiAAkAAADSJCIAAgAAADckIgAVAAAA1CQiAAIAAABdJCIAEgAAANYkIgACAAAA2CQiABAAAADoJCIADgAAANgkIgAQAAAA9iQiAAUAAAD7JCIAEwAAAA4lIgAFAAAAEyUiAA8AAAAiJSIABAAAACYlIgAOAAAANCUiAAUAAAA5JSIABQAAAD4lIgAOAAAAEyUiAA8AAABMJSIADQAAACYlIgAOAAAAWSUiABEAAAD7JCIAEwAAAGolIgARAAAAeyUiABIAAACNJSIABQAAAHslIgASAAAAkiUiAAcAAACZJSIAHAAAALUlIgAaAAAAmSUiABwAAADPJSIADAAAANslIgAOAAAA6SUiAAwAAAD1JSIADgAAAAMmIgANAAAAECYiAA8AAAAfJiIADQAAACwmIgAPAAAAOyYiAAMAAAA+JiIACAAAAEYmIgAUAAAAWiYiABUAAABvJiIACAAAAD4mIgAIAAAAdyYiAAcAAABaJiIAFQAAAH4mIgAGAAAAhCYiAA8AAACTJiIADQAAAIQmIgAPAAAAoCYiABgAAADXIyIAGgAAALgmIgACAAAAXAMiABAAAAC6JiIAAwAAAIwDIgAWAAAAvSYiAA8AAABcAyIAEAAAAMwmIgAMAAAA2CYiAA0AAADlJiIAFAAAAIwDIgAWAAAA+SYiAA4AAAAHJyIADwAAABYnIgAMAAAAIiciAA0AAAAvJyIABgAAANgmIgANAAAANSciAAUAAAAHJyIADwAAADonIgAGAAAAIiciAA0AAABAJyIAEgAAAFInIgAUAAAAZiciAAMAAABpJyIACQAAAHInIgAIAAAAaSciAAkAAAB6JyIAAwAAAFInIgAUAAAAfSciAAYAAACDJyIABgAAAIknIgADAAAAjCciAAsAAACXJyIAFAAAAKsnIgAXAAAAwiciABEAAADTJyIAFAAAAOcnIgAKAAAAjCciAAsAAADxJyIABAAAAPUnIgALAAAAACgiAAsAAAD1JyIACwAAAAsoIgADAAAADigiAAgAAAAWKCIABAAAABooIgATAAAALSgiABEAAAAaKCIAEwAAAD4oIgAEAAAAQigiABQAAABWKCIABwAAAA4oIgAIAAAAXSgiABIAAABCKCIAFAAAAG8oIgAEAAAAcygiABIAAACFKCIAEAAAAHMoIgASAAAAlSgiAAQAAACZKCIAFAAAAK0oIgASAAAAmSgiABQAAAC/KCIAFwAAANYoIgAZAAAA7ygiABUAAAAEKSIAFwAAABspIgAEAAAA1igiABkAAAAfKSIABAAAAAQpIgAXAAAAIykiAAMAAAAmKSIACwAAADEpIgANAAAAPikiAA8AAABNKSIAAgAAAE8pIgANAAAAXCkiAAUAAABhKSIADAAAAG0pIgALAAAAYSkiAAwAAAB4KSIADAAAAE8pIgAN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bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJkaWdpdGVuY2xvc2luZ21hcmtFbmNsb3NpbmdfTWFya2ZpbmFscHVuY3R1YXRpb25GaW5hbF9QdW5jdHVhdGlvbmZvcm1hdGluaXRpYWxwdW5jdHVhdGlvbkluaXRpYWxfUHVuY3R1YXRpb25sTGV0dGVybGV0dGVybGV0dGVybnVtYmVyTGV0dGVyX051bWJlcmxpbmVzZXBhcmF0b3JMaW5lX1NlcGFyYXRvcmxsTG93ZXJjYXNlX0xldHRlcmxtTW9kaWZpZXJfTGV0dGVybG9PdGhlcl9MZXR0ZXJsb3dlcmNhc2VsZXR0ZXJUaXRsZWNhc2VfTGV0dGVybHVVcHBlcmNhc2VfTGV0dGVybW1hcmttYXRoc3ltYm9sTWF0aF9TeW1ib2xtY1NwYWNpbmdfTWFya21lbW5Ob25zcGFjaW5nX01hcmttb2RpZmllcmxldHRlcm1vZGlmaWVyc3ltYm9sTW9kaWZpZXJfU3ltYm9sbmRubG5vT3RoZXJfTnVtYmVybm9uc3BhY2luZ21hcmtvcGVucHVuY3R1YXRpb25PcGVuX1B1bmN0dWF0aW9ub3RoZXJvdGhlcmxldHRlcm90aGVybnVtYmVyb3RoZXJwdW5jdHVhdGlvbk90aGVyX1B1bmN0dWF0aW9ub3RoZXJzeW1ib2xPdGhlcl9TeW1ib2xwUHVuY3R1YXRpb25wYXJhZ3JhcGhzZXBhcmF0b3JQYXJhZ3JhcGhfU2VwYXJhdG9ycGNwZHBlcGZwb3ByaXZhdGV1c2Vwc3B1bmN0cHVuY3R1YXRpb25zc2VwYXJhdG9yU2VwYXJhdG9yc2tzbXNvc3BhY2VzZXBhcmF0b3JTcGFjZV9TZXBhcmF0b3JzcGFjaW5nbWFya3N1cnJvZ2F0ZXRpdGxlY2FzZWxldHRlcnVwcGVyY2FzZWxldHRlcnp6bHpwenMAlXcmAAEAAABOLiYABQAAAHxHIgALAAAAh0ciAAwAAACTRyIAAgAAAJVHIgAHAAAAcgMiAAIAAACcRyIABgAAAKJHIgAQAAAAskciABEAAADDRyIAAgAAAItDIgAKAAAAxUciAAUAAACV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bGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2FyYUdhcmF5Z2FyYXlnZW9yR2VvcmdpYW5nZW9yZ2lhbmdsYWdHbGFnb2xpdGljZ2xhZ29saXRpY2dvbmdHdW5qYWxhX0dvbmRpZ29ubU1hc2FyYW1fR29uZGlnb3RoR290aGljZ290aGljZ3JhbkdyYW50aGFncmFudGhhZ3JlZWtHcmVla2dyZWtndWphcmF0aUd1amFyYXRpZ3Vqcmd1a2hHdXJ1bmdfS2hlbWFndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWd1cnVuZ2toZW1haGFuSGFuaGFuZ0hhbmd1bGhhbmd1bGhhbmloYW5pZmlyb2hpbmd5YUhhbmlmaV9Sb2hpbmd5YWhhbm9IYW51bm9vaGFudW5vb2hhdHJIYXRyYW5oYXRyYW5oZWJySGVicmV3aGVicmV3aGlyYUhpcmFnYW5haGlyYWdhbmFobHV3aG1uZ1BhaGF3aF9IbW9uZ2htbnBOeWlha2VuZ19QdWFjaHVlX0htb25naHJrdEthdGFrYW5hX09yX0hpcmFnYW5haHVuZ09sZF9IdW5nYXJpYW5pbXBlcmlhbGFyYW1haWNpbmhlcml0ZWRJbmhlcml0ZWRpbnNjcmlwdGlvbmFscGFobGF2aUluc2NyaXB0aW9uYWxfUGFobGF2aWluc2NyaXB0aW9uYWxwYXJ0aGlhbkluc2NyaXB0aW9uYWxfUGFydGhpYW5pdGFsT2xkX0l0YWxpY2phdmFKYXZhbmVzZWphdmFuZXNla2FpdGhpS2FpdGhpa2FsaUtheWFoX0xpa2FuYUthdGFrYW5ha2FubmFkYUthbm5hZGFrYXRha2FuYWthdGFrYW5hb3JoaXJhZ2FuYWthd2lLYXdpa2F5YWhsaWtoYXJLaGFyb3NodGhpa2hhcm9zaHRoaWtoaXRhbnNtYWxsc2NyaXB0S2hpdGFuX1NtYWxsX1NjcmlwdGtobWVyS2htZXJraG1ya2hvaktob2praWtob2praWtodWRhd2FkaUtodWRhd2FkaWtpcmF0cmFpS2lyYXRfUmFpa2l0c2tuZGFrcmFpa3RoaWxhbmFUYWlfVGhhbWxhb0xhb2xhb29sYXRpbkxhdGlubGF0bmxlcGNMZXBjaGFsZXBjaGFsaW1iTGltYnVsaW1idWxpbmFMaW5lYXJfQWxpbmJMaW5lYXJfQmxpbmVhcmFsaW5lYXJibGlzdUxpc3VseWNpTHljaWFubHljaWFubHlkaUx5ZGlhbmx5ZGlhbm1haGFqYW5pTWFoYWphbmltYWhqbWFrYU1ha2FzYXJtYWthc2FybWFsYXlhbGFtTWFsYXlhbGFtbWFuZE1hbmRhaWNtYW5kYWljbWFuaU1hbmljaGFlYW5tYW5pY2hhZWFubWFyY01hcmNoZW5tYXJjaGVubWFzYXJhbWdvbmRpbWVkZWZhaWRyaW5NZWRlZmFpZHJpbm1lZGZtZWV0ZWltYXlla01lZXRlaV9NYXlla21lbmRNZW5kZV9LaWtha3VpbWVuZGVraWtha3VpbWVyY01lcm9pdGljX0N1cnNpdmVtZXJvTWVyb2l0aWNfSGllcm9nbHlwaHNtZXJvaXRpY2N1cnNpdmVtZXJvaXRpY2hpZXJvZ2x5cGhzbWlhb01pYW9tbHltbW9kaU1vZGltb25nTW9uZ29saWFubW9uZ29saWFubXJvTXJvbXJvb210ZWltdWx0TXVsdGFuaW11bHRhbmlteWFubWFyTXlhbm1hcm15bXJuYWJhdGFlYW5OYWJhdGFlYW5uYWdtTmFnX011bmRhcmluYWdtdW5kYXJpbmFuZE5hbmRpbmFnYXJpbmFuZGluYWdhcmluYXJiT2xkX05vcnRoX0FyYWJpYW5uYmF0bmV3YU5ld2FuZXd0YWlsdWVOZXdfVGFpX0x1ZW5rb05rb25rb29uc2h1TnVzaHVudXNodW55aWFrZW5ncHVhY2h1ZWhtb25nb2dhbU9naGFtb2doYW1vbGNoaWtpT2xfQ2hpa2lvbGNrb2xkaHVuZ2FyaWFub2xkaXRhbGljb2xkbm9ydGhhcmFiaWFub2xkcGVybWljT2xkX1Blcm1pY29sZHBlcnNpYW5PbGRfUGVyc2lhbm9sZHNvZ2RpYW5PbGRfU29nZGlhbm9sZHNvdXRoYXJhYmlhbk9sZF9Tb3V0aF9BcmFiaWFub2xkdHVya2ljT2xkX1R1cmtpY29sZHV5Z2h1ck9sZF9VeWdodXJvbG9uYWxPbF9PbmFsb25hb29yaXlhT3JpeWFvcmtob3J5YW9zYWdlT3NhZ2Vvc2dlb3NtYU9zbWFueWFvc21hbnlhb3VncnBhaGF3aGhtb25ncGFsbVBhbG15cmVuZXBhbG15cmVuZXBhdWNQYXVfQ2luX0hhdXBhdWNpbmhhdXBlcm1waGFnUGhhZ3NfUGFwaGFnc3BhcGhsaXBobHBQc2FsdGVyX1BhaGxhdmlwaG54UGhvZW5pY2lhbnBob2VuaWNpYW5wbHJkcHJ0aXBzYWx0ZXJwYWhsYXZpcWFhY3FhYWlyZWphbmdSZWphbmdyam5ncm9oZ3J1bmljUnVuaWNydW5yc2FtYXJpdGFuU2FtYXJpdGFuc2FtcnNhcmJzYXVyU2F1cmFzaHRyYXNhdXJhc2h0cmFzZ253U2lnbldyaXRpbmdzaGFyYWRhU2hhcmFkYXNoYXZpYW5TaGF2aWFuc2hhd3NocmRzaWRkU2lkZGhhbXNpZGRoYW1zaWdud3JpdGluZ3NpbmRzaW5oU2luaGFsYXNpbmhhbGFzb2dkU29nZGlhbnNvZ2RpYW5zb2dvc29yYVNvcmFfU29tcGVuZ3NvcmFzb21wZW5nc295b1NveW9tYm9zb3lvbWJvc3VuZFN1bmRhbmVzZXN1bmRhbmVzZXN1bnVTdW51d2Fyc3VudXdhcnN5bG9TeWxvdGlfTmFncmlzeWxvdGluYWdyaXN5cmNTeXJpYWNzeXJpYWN0YWdhbG9nVGFnYWxvZ3RhZ2JUYWdiYW53YXRhZ2JhbndhdGFpbGVUYWlfTGV0YWl0aGFtdGFpdmlldFRhaV9WaWV0dGFrclRha3JpdGFrcml0YWxldGFsdXRhbWlsVGFtaWx0YW1sdGFuZ1Rhbmd1dHRhbmdzYVRhbmdzYXRhbmd1dHRhdnR0ZWx1VGVsdWd1dGVsdWd1dGZuZ1RpZmluYWdodGdsZ3RoYWFUaGFhbmF0aGFhbmF0aGFpVGhhaXRpYmV0YW5UaWJldGFudGlidHRpZmluYWdodGlyaFRpcmh1dGF0aXJodXRhdG5zYXRvZGhyaVRvZGhyaXRvZHJ0b3RvVG90b3R1bHV0aWdhbGFyaVR1bHVfVGlnYWxhcml0dXRndWdhclVnYXJpdGljdWdhcml0aWN2YWlWYWl2YWlpdml0aFZpdGhrdXFpdml0aGt1cWl3YW5jaG9XYW5jaG93YXJhV2FyYW5nX0NpdGl3YXJhbmdjaXRpd2Nob3hwZW94c3V4eWV6aVllemlkaXllemlkaXlpWWl5aWlpemFuYWJhemFyc3F1YXJlWmFuYWJhemFyX1NxdWFyZXphbmJ6aW5oenl5eXp6enoAmFIiAAUAAACdUiIABQAAAKJSIgAEAAAAnVIiAAUAAACmUiIABAAAAKpSIgASAAAAvFIiAAQAAADAUiIABAAAAMRSIgAUAAAA2FIiABUAAADtUiIABAAAAPFSIgAGAAAA91IiAAYAAADxUiIABgAAAP1SIgAIAAAABVMiAAgAAAANUyIABAAAABFTIgAQAAAAIVMiAAQAAAAFUyIACAAAACVTIgAHAAAALFMiAAcAAAAzUyIABAAAACxTIgAHAAAAN1MiAAQAAAA7UyIACAAAAENTIgAIAAAAO1MiAAgAAABLUyIABAAAAE9TIgAFAAAAVFMiAAUAAABPUyIABQAAAFlTIgAEAAAAXVMiAAkAAABmUyIACAAAAF1TIgAJAAAAblMiAAUAAABzUyIABQAAAHhTIgAEAAAAc1MiAAUAAAB8UyIABAAAAIBTIgAHAAAAh1MiAAcAAACAUyIABwAAAI5TIgAJAAAAl1MiAAkAAACgUyIABAAAAJdTIgAJAAAApFMiAAQAAACoUyIACAAAALBTIgAIAAAAqFMiAAgAAAC4UyIABAAAALxTIgAGAAAAwlMiAAYAAAC8UyIABgAAAMhTIgAEAAAAzFMiAAcAAADTUyIABwAAAMxTIgAHAAAA2lMiAAQAAADeUyIACAAAAOZTIgAIAAAA3lMiAAgAAADuUyIABAAAAPJTIgAFAAAA91MiAAUAAADyUyIABQAAAPxTIgAEAAAAAFQiAAYAAAAGVCIAEgAAABhUIgATAAAAK1QiAAQAAAAYVCIAEwAAAC9UIgAEAAAAM1QiAAYAAAA5VCIABgAAADNUIgAGAAAAP1QiABEAAACqUiIAEgAAAFBUIgAGAAAAAFQiAAYAAABWVCIABAAAAFpUIgAEAAAAXlQiAAQAAABiVCIACAAAAGpUIgAIAAAAYlQiAAgAAAByVCIACgAAAHxUIgAKAAAAhlQiAAQAAAB8VCIACgAAAIpUIgAGAAAAkFQiAAYAAACWVCIABAAAAJpUIgAGAAAAoFQiAAYAAACaVCIABgAAAKZUIgAEAAAAqlQiAAwAAAC2VCIABAAAALpUIgAHAAAAwVQiAAkAAADKVCIACQAAANNUIgAHAAAAulQiAAcAAADaVCIACwAAAKpUIgAMAAAA5VQiAAgAAADtVCIACAAAAPVUIgAEAAAA7VQiAAgAAAD5VCIABwAAAABVIgAHAAAAB1UiAAQAAAALVSIACgAAABVVIgAKAAAAC1UiAAoAAAAfVSIABAAAACNVIgALAAAALlUiAAoAAAAjVSIACwAAADhVIgAEAAAAPFUiAAUAAABBVSIABQAAADxVIgAFAAAARlUiAAQAAAAAVSIABwAAAEpVIgAEAAAATlUiAAgAAABWVSIACAAAAE5VIgAIAAAAXlUiAAQAAABiVSIAFAAAAHZVIgATAAAAYlUiABQAAACJVSIABAAAAI1VIgAHAAAAlFUiAAcAAACNVSIABwAAAJtVIgAEAAAAn1UiAAcAAACmVSIABwAAAJ9VIgAHAAAArVUiAAQAAACxVSIACAAAALlVIgAIAAAAsVUiAAgAAADBVSIABAAAAMVVIgAFAAAAylUiAAUAAADFVSIABQAAAM9VIgAEAAAA01UiAAgAAADbVSIACAAAANNVIgAIAAAA41UiAAQAAADnVSIACgAAAPFVIgAKAAAA51UiAAoAAAD7VSIABAAAAP9VIgANAAAADFYiAAQAAAAQViIADQAAAB1WIgAEAAAAIVYiAAYAAAAnViIABgAAACFWIgAGAAAALVYiAAQAAAAxViIABwAAADhWIgAHAAAAMVYiAAcAAAA/ViIABQAAAERWIgAFAAAASVYiAAQAAABEViIABQAAAE1WIgAIAAAAVVYiAAgAAABdViIABAAAAFVWIgAIAAAAYVYiAAQAAABlViIADAAAAHFWIgAMAAAA/1UiAA0AAAB9ViIACAAAAIVWIgAIAAAAjVYiAAQAAACFViIACAAAAJFWIgALAAAAZVYiAAwAAACcViIAAwAAAJ9WIgADAAAAolYiAAQAAACmViIABgAAAKxWIgAGAAAAplYiAAYAAACyViIABAAAAJ9WIgADAAAAtlYiAA4AAADEViIADwAAANNWIgAEAAAA11YiAAcAAADeViIABwAAANdWIgAHAAAA5VYiAAQAAADpViIABgAAAO9WIgAGAAAA6VYiAAYAAAD1ViIABAAAAPlWIgAGAAAA/1YiAAYAAAD5ViIABgAAAAVXIgAEAAAACVciAAgAAAARVyIACAAAAAlXIgAIAAAAGVciAAQAAADYUiIAFQAAAB1XIgAEAAAAIVciAAwAAAAtVyIABAAAADFXIgAWAAAAR1ciAAQAAABLVyIAFAAAAF9XIgAEAAAAY1ciAA0AAABwVyIADwAAABFTIgAQAAAAf1ciAAkAAACIVyIACQAAAJFXIgAUAAAApVciABUAAAC6VyIAFQAAAM9XIgAWAAAA5VciAAQAAADpVyIACgAAAPNXIgAEAAAA91ciAAgAAAD/VyIACAAAAPdXIgAIAAAAB1giAAYAAAANWCIABgAAABNYIgAEAAAAF1giAAgAAAAfWCIABAAAACNYIgAIAAAAK1giAAcAAAAyWCIABwAAADlYIgAIAAAAI1giAAgAAABBWCIAEgAAAEtXIgAUAAAAU1giAAQAAABXWCIABAAAAFtYIgAHAAAAF1giAAgAAABiWCIABAAAAGZYIgAKAAAAcFgiAAoAAABmWCIACgAAAHpYIgARAAAAi1giABMAAACeWCIABQAAAKNYIgAFAAAAqFgiAAQAAACjWCIABQAAAKxYIgAEAAAAsFgiAAYAAAC2WCIABgAAALBYIgAGAAAAvFgiAAkAAADFWCIACQAAAM5YIgAIAAAA1lgiAAkAAADfWCIABAAAAItYIgATAAAA41giAAQAAAAyWCIABwAAAOdYIgAEAAAA1lgiAAkAAADrWCIABAAAAA1YIgAGAAAA71giAAQAAADzWCIACAAAAPtYIgADAAAA/lgiAAMAAAABWSIABAAAAP5YIgADAAAABVkiAAUAAAAKWSIABQAAAA9ZIgAEAAAAClkiAAUAAAATWSIABAAAABdZIgAGAAAAHVkiAAYAAAAXWSIABgAAACNZIgAEAAAAJ1kiAAUAAAAsWSIABQAAACdZIgAFAAAAMVkiAAQAAAA1WSIACAAAAD1ZIgAEAAAAQVkiAAgAAABJWSIABwAAADVZIgAIAAAAUFkiAAcAAABBWSIACAAAAFdZIgAEAAAAW1kiAAQAAABfWSIABAAAAGNZIgAGAAAAaVkiAAYAAABjWSIABgAAAG9ZIgAEAAAAc1kiAAYAAAB5WSIABgAAAHNZIgAGAAAAf1kiAAgAAACHWSIACAAAAI9ZIgAEAAAAh1kiAAgAAACTWSIABAAAAJdZIgAHAAAAnlkiAAcAAACXWSIABwAAAKVZIgAJAAAArlkiAAkAAAC3WSIABAAAALtZIgAHAAAAwlkiAAcAAAC7WSIABwAAAMlZIgAEAAAAzVkiAAoAAADXWSIACgAAAM1ZIgAKAAAA4VkiAAQAAADlWSIABwAAAOxZIgAHAAAA5VkiAAcAAADzWSIADAAAABBWIgANAAAA/1kiAAsAAAAKWiIACwAAABVaIgAEAAAACloiAAsAAAAZWiIACwAAACRaIgAMAAAAMFoiAAQAAAA0WiIADQAAAEFaIgAMAAAANFoiAA0AAABNWiIABAAAAFFaIgAQAAAAYVoiAAQAAABlWiIAFAAAAHlaIgAPAAAAUVoiABAAAACIWiIAEwAAAGVaIgAUAAAAm1oiAAQAAACfWiIABAAAAKNaIgAEAAAArlkiAAkAAACnWiIABAAAAKtaIgAEAAAAr1oiAAQAAACzWiIACQAAALxaIgAJAAAAs1oiAAkAAADFWiIAAwAAAMhaIgADAAAAy1oiAAQAAADIWiIAAwAAAM9aIgAEAAAAJFoiAAwAAADTWiIABAAAANdaIgAHAAAA3loiAAcAAADXWiIABwAAAOVaIgAHAAAA7FoiAAcAAADzWiIABAAAAOxaIgAHAAAA91oiAAkAAAAAWyIACQAAAAlbIgAEAAAADVsiAAsAAAAYWyIACgAAAA1bIgALAAAAIlsiAAQAAAAmWyIACwAAADFbIgALAAAAJlsiAAsAAAA8WyIABAAAAEBbIgARAAAAUVsiAAQAAAAAWyIACQAAAFVbIgAEAAAAWVsiAAQAAABdWyIACQAAAGZbIgALAAAAcVsiAAMAAAB0WyIAAwAAAHdbIgAEAAAAdFsiAAMAAAB7WyIABAAAAH9bIgAFAAAAhFsiAAUAAAB/WyIABQAAAIlbIgAUAAAAMVciABYAAACdWyIABAAAAKFbIgAFAAAAplsiAAUAAAChWyIABQAAAKtbIgAHAAAAslsiAAgAAAC6WyIABAAAALJbIgAIAAAAvlsiAAwAAABjVyIADQAAAMpbIgAJAAAA6VciAAoAAADTWyIADwAAAEBbIgARAAAA4lsiAAkAAADrWyIACgAAAPVbIgAKAAAA/1siAAsAAAAKXCIACgAAABRcIgALAAAAH1wiAA8AAAAuXCIAEQAAAD9cIgAJAAAASFwiAAoAAABSXCIACQAAAFtcIgAKAAAAZVwiAAYAAABrXCIABwAAAHJcIgAEAAAAa1wiAAcAAAB2XCIABQAAAHtcIgAFAAAAgFwiAAQAAABIXCIACgAAAIRcIgAEAAAAe1wiAAUAAACIXCIABQAAAI1cIgAFAAAAklwiAAQAAACNXCIABQAAAJZcIgAEAAAAmlwiAAcAAAChXCIABwAAAJpcIgAHAAAAqFwiAAQAAABbXCIACgAAAKxcIgALAAAAIVciAAwAAAC3XCIABAAAALtcIgAJAAAAxFwiAAkAAAC7XCIACQAAAM1cIgAEAAAA0VwiAAsAAADcXCIACQAAANFcIgALAAAA5VwiAAQAAADrWyIACgAAAOlcIgAEAAAA7VwiAAgAAAD1XCIABwAAAO1cIgAIAAAA/FwiAAQAAAClVyIAFQAAAABdIgAEAAAABF0iAA8AAAATXSIABAAAABddIgAKAAAAIV0iAAoAAAAXXSIACgAAACtdIgAEAAAAn1oiAAQAAAAvXSIABAAAAM9XIgAWAAAAM10iAA4AAAAEXSIADwAAAEFdIgAEAAAAmlQiAAYAAABFXSIABAAAAIhXIgAJAAAASV0iAAYAAABPXSIABgAAAFVdIgAEAAAAT10iAAYAAABZXSIABAAAAMRWIgAPAAAAXV0iAAUAAABiXSIABQAAAGddIgAEAAAAYl0iAAUAAABrXSIACQAAAHRdIgAJAAAAfV0iAAQAAAB0XSIACQAAAIFdIgAEAAAALlwiABEAAACFXSIABAAAAIldIgAKAAAAk10iAAoAAACJXSIACgAAAJ1dIgAEAAAAoV0iAAsAAACsXSIABwAAALNdIgAHAAAAul0iAAcAAADBXSIABwAAAMhdIgAEAAAAwV0iAAcAAADMXSIABAAAALNdIgAHAAAA0F0iAAQAAADUXSIABwAAANtdIgAHAAAA1F0iAAcAAADiXSIACwAAAKFdIgALAAAA7V0iAAQAAADFWCIACQAAAPFdIgAEAAAA9V0iAAcAAAD8XSIABwAAAPVdIgAHAAAAA14iAAQAAAAHXiIABwAAAA5eIgAHAAAAB14iAAcAAAAVXiIABAAAABRcIgALAAAAGV4iAAQAAAAdXiIADAAAACleIgALAAAAHV4iAAwAAAA0XiIABAAAADheIgAHAAAAP14iAAcAAAA4XiIABwAAAEZeIgAEAAAASl4iAAkAAABTXiIACQAAAEpeIgAJAAAAXF4iAAQAAABgXiIABwAAAGdeIgAHAAAAYF4iAAcAAABuXiIABAAAAHJeIgAMAAAAfl4iAAsAAAByXiIADAAAAIleIgAEAAAAjV4iAAYAAACTXiIABgAAAI1eIgAGAAAAmV4iAAcAAACgXiIABwAAAKdeIgAEAAAAq14iAAgAAACzXiIACAAAAKteIgAIAAAAu14iAAUAAADAXiIABgAAAMZeIgAHAAAA81giAAgAAADNXiIABwAAANReIgAIAAAA3F4iAAQAAADgXiIABQAAAOVeIgAFAAAA4F4iAAUAAADqXiIABAAAAMBeIgAGAAAA7l4iAAQAAABmWyIACwAAAPJeIgAFAAAA914iAAUAAAD8XiIABAAAAPdeIgAFAAAAAF8iAAQAAAAEXyIABgAAAApfIgAGAAAAEF8iAAYAAAAWXyIABgAAAARfIgAGAAAAHF8iAAQAAADUXiIACAAAACBfIgAEAAAAJF8iAAYAAAAqXyIABgAAACRfIgAGAAAAMF8iAAQAAAA0XyIACAAAADxfIgAEAAAAoF4iAAcAAABAXyIABAAAAERfIgAGAAAASl8iAAYAAABEXyIABgAAAFBfIgAEAAAAVF8iAAQAAABYXyIABwAAAF9fIgAHAAAAZl8iAAQAAABfXyIABwAAAGpfIgAIAAAANF8iAAgAAAByXyIABAAAAHZfIgAHAAAAfV8iAAcAAAB2XyIABwAAAIRfIgAEAAAAEF8iAAYAAACIXyIABgAAAI5fIgAGAAAAlF8iAAQAAACOXyIABgAAAJhfIgAEAAAAnF8iAAQAAACgXyIADAAAAKxfIgANAAAAuV8iAAQAAACsXyIADQAAAL1fIgAEAAAAwV8iAAgAAADJXyIACAAAAMFfIgAIAAAAC/omAAcAAACLCycABwAAANFfIgADAAAA1F8iAAMAAADXXyIABAAAANRfIgADAAAA218iAAQAAADfXyIACAAAAOdfIgAIAAAA318iAAgAAADvXyIABgAAAPVfIgAGAAAA+18iAAQAAAD/XyIACwAAAApgIgAKAAAA/18iAAsAAAAUYCIABAAAAPVfIgAGAAAAGGAiAAQAAAD/WyIACwAAABxgIgAEAAAAylQiAAkAAAAgYCIABAAAACRgIgAGAAAAKmAiAAYAAAAkYCIABgAAADBgIgACAAAAMmAiAAIAAAA0YCIABAAAADJgIgACAAAAOGAiAA8AAABHYCIAEAAAAFdgIgAEAAAAR2AiABAAAABbYCIABAAAAIhXIgAJAAAAX2AiAAQAAACQVCIABgAAAGNgIgAEAAAAiwsnAAcAAABhdEFUZXJtYXRlcm1jbENsb3NlY2xvc2Vmb09MZXR0ZXJMb3dlck51bWVyaWNudW1lcmljb2xldHRlclNDb250aW51ZXNjb250aW51ZXNlU2Vwc2Vwc3BTcHN0U1Rlcm11cFVwcGVyAIh1IgACAAAAinUiAAUAAACPdSIABQAAAIp1IgAFAAAAlHUiAAIAAACWdSIABQAAAJt1IgAFAAAAlnUiAAUAAABEUCIAAgAAAEZQIgACAAAAelAiAAIAAAB8UCIABgAAAIJQIgAGAAAAfFAiAAYAAACgdSIAAgAAAJxHIgAGAAAAt0giAAYAAACcRyIABgAAAO9LJgACAAAAonUiAAcAAACmUCIAAgAAAKhQIgACAAAARkkiAAIAAACpdSIABQAAADkrIgAFAAAAqXUiAAUAAAB3SiYAAgAAAK51IgAHAAAAtXUiAAcAAACudSIABwAAALx1IgAHAAAAonUiAAcAAAAqSiIABQAAAE4uJgAFAAAAdAMiAAIAAADDdSIACQAAAMx1IgAJAAAAw3UiAAkAAADVdSIAAgAAANd1IgADAAAA2nUiAAMAAADXdSIAAwAAAN11IgACAAAA33UiAAIAAADhdSIAAgAAAON1IgAFAAAANDAiAAUAAADjdSIABQAAAOh1IgACAAAA6nUiAAUAAADjMCIABQAAAOp1IgAFAAAA01AiAAIAAABOLiYABQAAAGFsZXR0ZXJBTGV0dGVyZG91YmxlcXVvdGVEb3VibGVfUXVvdGVkcUV4dGVuZE51bUxldGV4dGVuZG51bWxldGhlYnJld2xldHRlckhlYnJld19MZXR0ZXJobGthbWJNaWROdW1MZXRtaWRsZXR0ZXJNaWRMZXR0ZXJtaWRudW1NaWROdW1taWRudW1sZXRtbG5ld2xpbmVOZXdsaW5lc2luZ2xlcXVvdGVTaW5nbGVfUXVvdGVzcXdzZWdzcGFjZVdTZWdTcGFjZQAAAKB3IgAHAAAAp3ciAAcAAABEUCIAAgAAAEZQIgACAAAArnciAAsAAAC5dyIADAAAAMV3IgACAAAAuXciAAwAAABIUCIAAgAAAEpQIgAGAAAA9iQiAAUAAABKUCIABgAAAFBQIgAIAAAAWFAiAAoAAABiUCIAAwAAAFhQIgAKAAAAZVAiAAIAAABnUCIACgAAAHFQIgAJAAAAZ1AiAAoAAAB6UCIAAgAAAMd3IgAMAAAAglAiAAYAAAB8UCIABgAAANN3IgAMAAAAx3ciAAwAAACgdSIAAgAAAJxHIgAGAAAAt0giAAYAAACcRyIABgAAAIhQIgADAAAAi1AiAA4AAACZUCIADAAAAItQIgAOAAAA33ciAAwAAADrdyIADQAAAPh3IgACAAAA63ciAA0AAAD6dyIAAgAAACNYIgAIAAAAOVgiAAgAAAAjWCIACAAAAO9LJgACAAAAp3ciAAcAAACmUCIAAgAAAKhQIgACAAAA/HciAAIAAAD+dyIACQAAAAd4IgAJAAAAEHgiAAkAAAAZeCIABgAAAB94IgAGAAAAJXgiAAkAAAD+dyIACQAAAC54IgACAAAAEHgiAAkAAACvSSIAAgAAAB94IgAGAAAAMHgiAAcAAAA3eCIABwAAAO1JIgACAAAAN3giAAcAAAB3SiYAAgAAAK51IgAHAAAAtXUiAAcAAACudSIABwAAACpKIgAFAAAATi4mAAUAAADrLiIAEQAAAPwuIgASAAAADi8iAAIAAAD8LiIAEgAAAD54IgALAAAASXgiAAwAAABVeCIAAgAAAEl4IgAMAAAAV3giAAkAAABgeCIACQAAANNQIgACAAAATi4mAAUAAADMSiYAAwAAANVQIgADAAAAeAMiAAMAAAD8QyIAOAAAAFwDIgAQAAAAREsiAFAAAACMAyIAFgAAANhQIgAcAAAAbAMiAAYAAABoYCIAUgEAAHsDIgARAAAAaGAiAFIBAACiAyIADgAAAPB1IgAbAAAAsAMiAAoAAABseCIAKQAAAKQCIgBmAAAAaAIAABYAAAAAAAAA9QEAAPoBAAAXAgAAUAIAAKgCAACwAgAA3gIAAOACAADpAgAAAAMAAEUDAABgAwAAYQMAAHQDAAB1AwAAegMAAHoDAAB+AwAAfgMAAIQDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAADOAwAA0AMAANYDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADzAwAAAQQAAAwEAAAOBAAATwQAAFEEAABcBAAAXgQAAIYEAACQBAAAxAQAAMcEAADIBAAAywQAAMwEAADQBAAA6wQAAO4EAAD1BAAA+AQAAPkEAAAxBQAAVgUAAFkFAABfBQAAYQUAAIcFAACJBQAAiQUAALAFAAC5BQAAuwUAAMMFAADQBQAA6gUAAPAFAAD0BQAADAYAAAwGAAAbBgAAGwYAAB8GAAAfBgAAIQYAADoGAABABgAAUgYAAGAGAABtBgAAcAYAALcGAAC6BgAAvgYAAMAGAADOBgAA0AYAAO0GAADwBgAA+QYAAAEJAAADCQAABQkAADkJAAA8CQAATQkAAFAJAABUCQAAWAkAAHAJAACBCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAAC8CQAAvgkAAMQJAADHCQAAyAkAAMsJAADNCQAA1wkAANcJAADcCQAA3QkAAN8JAADjCQAA5gkAAPoJAAACCgAAAgoAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABZCgAAXAoAAF4KAABeCgAAZgoAAHQKAACBCgAAgwoAAIUKAACLCgAAjQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvAoAAMUKAADHCgAAyQoAAMsKAADNCgAA0AoAANAKAADgCgAA4AoAAOYKAADvCgAAAQsAAAMLAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANgsAADkLAAA8CwAAQwsAAEcLAABICwAASwsAAE0LAABWCwAAVwsAAFwLAABdCwAAXwsAAGELAABmCwAAcAsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC1CwAAtwsAALkLAAC+CwAAwgsAAMYLAADICwAAygsAAM0LAADXCwAA1wsAAOcLAADyCwAAAQwAAAMMAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAMwwAADUMAAA5DAAAPgwAAEQMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABgDAAAYQwAAGYMAABvDAAAggwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvgwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADeDAAA3gwAAOAMAADhDAAA5gwAAO8MAAACDQAAAw0AAAUNAAAMDQAADg0AABANAAASDQAAKA0AACoNAAA5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EgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAoBMAAPUTAAD4EwAA/RMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA8RYAAPgWAAAAFwAAERcAAB8XAAAxFwAAQBcAAFEXAABgFwAAbBcAAG4XAABwFwAAgBcAALMXAADXFwAA1xcAANwXAADcFwAAIBgAAHgYAACAGAAAhBgAAIcYAACoGAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAApxoAAKcaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA6RwAAOwcAADuHAAA8xwAAPUcAAD2HAAA+hwAAPocAAAAHQAAvx0AAAAeAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAALyEAADkhAAA8IQAAPyEAAEUhAABJIQAATiEAAE4hAACDIQAAhCEAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAAAvLgAALy4AAAUwAAAGMAAAMTAAADUwAAA7MAAAPDAAAEEwAACWMAAAnTAAAJ8wAAChMAAA+jAAAPwwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/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6QEAS+kBAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BAAAAAgDfpgIAAKcCADm3AgBAtwIAHbgCACC4AgChzgIAsM4CAODrAgDw6wIAXe4CAAD4AgAd+gIAAAADAEoTAwBQEwMAryMDAO4WAADwFgAAYCEAAIIhAACFIQAAiCEAAAcwAAAHMAAAITAAACkwAAA4MAAAOjAAAOamAADvpgAAQAEBAHQBAQBBAwEAQQMBAEoDAQBKAwEA0QMBANUDAQAAJAEAbiQBACggAAAoIAAAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAArwIAAHEDAABxAwAAcwMAAHMDAAB3AwAAdwMAAHsDAAB9AwAAkAMAAJADAACsAwAAzgMAANADAADRAwAA1QMAANcDAADZAwAA2QMAANsDAADbAwAA3QMAAN0DAADfAwAA3wMAAOEDAADhAwAA4wMAAOMDAADlAwAA5QMAAOcDAADnAwAA6QMAAOkDAADrAwAA6wMAAO0DAADtAwAA7wMAAPMDAAD1AwAA9QMAAPgDAAD4AwAA+wMAAPwDAAAwBAAAXwQAAGEEAABhBAAAYwQAAGMEAABlBAAAZQQAAGcEAABnBAAAaQQAAGkEAABrBAAAawQAAG0EAABtBAAAbwQAAG8EAABxBAAAcQQAAHMEAABzBAAAdQQAAHUEAAB3BAAAdwQAAHkEAAB5BAAAewQAAHsEAAB9BAAAfQQAAH8EAAB/BAAAgQQAAIEEAACLBAAAiwQAAI0EAACNBAAAjwQAAI8EAACRBAAAkQQAAJMEAACTBAAAlQQAAJUEAACXBAAAlwQAAJkEAACZBAAAmwQAAJsEAACdBAAAnQQAAJ8EAACfBAAAoQQAAKEEAACjBAAAowQAAKUEAAClBAAApwQAAKcEAACpBAAAqQQAAKsEAACrBAAArQQAAK0EAACvBAAArwQAALEEAACxBAAAswQAALMEAAC1BAAAtQQAALcEAAC3BAAAuQQAALkEAAC7BAAAuwQAAL0EAAC9BAAAvwQAAL8EAADCBAAAwgQAAMQEAADEBAAAxgQAAMYEAADIBAAAyAQAAMoEAADKBAAAzAQAAMwEAADOBAAAzwQAANEEAADRBAAA0wQAANMEAADVBAAA1QQAANcEAADXBAAA2QQAANkEAADbBAAA2wQAAN0EAADdBAAA3wQAAN8EAADhBAAA4QQAAOMEAADjBAAA5QQAAOUEAADnBAAA5wQAAOkEAADpBAAA6wQAAOsEAADtBAAA7QQAAO8EAADvBAAA8QQAAPEEAADzBAAA8wQAAPUEAAD1BAAA9wQAAPcEAAD5BAAA+QQAAPsEAAD7BAAA/QQAAP0EAAD/BAAA/wQAAAEFAAABBQAAAwUAAAMFAAAFBQAABQUAAAcFAAAHBQAACQUAAAkFAAALBQAACwUAAA0FAAANBQAADwUAAA8FAAARBQAAEQUAABMFAAATBQAAFQUAABUFAAAXBQAAFwUAABkFAAAZBQAAGwUAABsFAAAdBQAAHQUAAB8FAAAfBQAAIQUAACEFAAAjBQAAIwUAACUFAAAlBQAAJwUAACcFAAApBQAAKQUAACsFAAArBQAALQUAAC0FAAAvBQAALwUAAGAFAACIBQAA0BAAAPoQAAD9EAAA/xAAAPgTAAD9EwAAgBwAAIgcAACKHAAAihwAAAAdAAArHQAAax0AAHcdAAB5HQAAmh0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAIQhAACEIQAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB7LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHGnAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA9qcAAPanAAD6pwAA+qcAADCrAABaqwAAYKsAAGirAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAMAQDyDAEAcA0BAIUNAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfVAQBS1QEAa9UBAIbVAQCf1QEAutUBANPVAQDu1QEAB9YBACLWAQA71gEAVtYBAG/WAQCK1gEApdYBAMLWAQDa1gEA3NYBAOHWAQD81gEAFNcBABbXAQAb1wEANtcBAE7XAQBQ1wEAVdcBAHDXAQCI1wEAitcBAI/XAQCq1wEAwtcBAMTXAQDJ1wEAy9cBAMvXAQAA3wEACd8BAAvfAQAe3wEAJd8BACrfAQAi6QEAQ+kBAAADAABvAwAAgwQAAIkEAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAAEAYAABoGAABLBgAAXwYAAHAGAABwBgAA1gYAANwGAADfBgAA5AYAAOcGAADoBgAA6gYAAO0GAAARBwAAEQcAADAHAABKBwAApgcAALAHAADrBwAA8wcAAP0HAAD9BwAAFggAABkIAAAbCAAAIwgAACUIAAAnCAAAKQgAAC0IAABZCAAAWwgAAJcIAACfCAAAyggAAOEIAADjCAAAAwkAADoJAAA8CQAAPgkAAE8JAABRCQAAVwkAAGIJAABjCQAAgQkAAIMJAAC8CQAAvAkAAL4JAADECQAAxwkAAMgJAADLCQAAzQkAANcJAADXCQAA4gkAAOMJAAD+CQAA/gkAAAEKAAADCgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAgwoAALwKAAC8CgAAvgoAAMUKAADHCgAAyQoAAMsKAADNCgAA4goAAOMKAAD6CgAA/woAAAELAAADCwAAPAsAADwLAAA+CwAARAsAAEcLAABICwAASwsAAE0LAABVCwAAVwsAAGILAABjCwAAggsAAIILAAC+CwAAwgsAAMYLAADICwAAygsAAM0LAADXCwAA1wsAAAAMAAAEDAAAPAwAADwMAAA+DAAARAwAAEYMAABI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BQAAjAUAAJAFAACQBQAAyAUAAM8FAADrBQAA7gUAAPUFAAAFBgAAHAYAABwGAADdBgAA3QYAAA4HAAAPBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACWCAAA4ggAAOIIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADODAAA1AwAANcMAADc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AwAAogMAAKIDAAAwBQAAMAUAAFcFAABYBQAAiwUAAIwFAACQBQAAkAUAAMgFAADPBQAA6wUAAO4FAAD1BQAA/wUAAA4HAAAOBwAASwcAAEwHAACyBwAAvwcAAPsHAAD8BwAALggAAC8IAAA/CAAAPwgAAFwIAABdCAAAXwgAAF8IAABrCAAAbwgAAI8IAACPCAAAkggAAJYIAACECQAAhAkAAI0JAACOCQAAkQkAAJIJAACpCQAAqQkAALEJAACxCQAAswkAALUJAAC6CQAAuwkAAMUJAADGCQAAyQkAAMoJAADPCQAA1gkAANgJAADbCQAA3gkAAN4JAADkCQAA5QkAAP8JAAAACgAABAoAAAQKAAALCgAADgoAABEKAAASCgAAKQoAACkKAAAxCgAAMQoAADQKAAA0CgAANwoAADcKAAA6CgAAOwoAAD0KAAA9CgAAQwoAAEYKAABJCgAASgoAAE4KAABQCgAAUgoAAFgKAABdCgAAXQoAAF8KAABlCgAAdwoAAIAKAACECgAAhAoAAI4KAACOCgAAkgoAAJIKAACpCgAAqQoAALEKAACxCgAAtAoAALQKAAC6CgAAuwoAAMYKAADGCgAAygoAAMoKAADOCgAAzwoAANEKAADfCgAA5AoAAOUKAADyCgAA+AoAAAALAAAACwAABAsAAAQLAAANCwAADgsAABELAAASCwAAKQsAACkLAAAxCwAAMQsAADQLAAA0CwAAOgsAADsLAABFCwAARgsAAEkLAABKCwAATgsAAFQLAABYCwAAWwsAAF4LAABeCwAAZAsAAGULAAB4CwAAgQsAAIQLAACECwAAiwsAAI0LAACRCwAAkQsAAJYLAACYCwAAmwsAAJsLAACdCwAAnQsAAKALAACiCwAApQsAAKcLAACrCwAArQsAALoLAAC9CwAAwwsAAMULAADJCwAAyQsAAM4LAADPCwAA0QsAANYLAADYCwAA5QsAAPsLAAD/CwAADQwAAA0MAAARDAAAEQwAACkMAAApDAAAOgwAADsMAABFDAAARQwAAEkMAABJDAAATgwAAFQMAABXDAAAVwwAAFsMAABcDAAAXgwAAF8MAABkDAAAZQwAAHAMAAB2DAAAjQwAAI0MAACRDAAAkQwAAKkMAACpDAAAtAwAALQMAAC6DAAAuwwAAMUMAADFDAAAyQwAAMkMAADO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AQAAdAEAAHYBAAB2AQAAeAEAAHkBAAB7AQAAewEAAH0BAAB9AQAAgQEAAIIBAACEAQAAhAEAAIYBAACHAQAAiQEAAIsBAACOAQAAkQEAAJMBAACUAQAAlgEAAJgBAACcAQAAnQEAAJ8BAACgAQAAogEAAKIBAACkAQAApAEAAKYBAACnAQAAqQEAAKkBAACsAQAArAEAAK4BAACvAQAAsQEAALMBAAC1AQAAtQEAALcBAAC4AQAAvAEAALwBAADEAQAAxAEAAMcBAADHAQAAygEAAMoBAADNAQAAzQEAAM8BAADPAQAA0QEAANEBAADTAQAA0wEAANUBAADVAQAA1wEAANcBAADZAQAA2QEAANsBAADbAQAA3gEAAN4BAADgAQAA4AEAAOIBAADiAQAA5AEAAOQBAADmAQAA5gEAAOgBAADoAQAA6gEAAOoBAADsAQAA7AEAAO4BAADuAQAA8QEAAPEBAAD0AQAA9AEAAPYBAAD4AQAA+gEAAPoBAAD8AQAA/AEAAP4BAAD+AQAAAAIAAAACAAACAgAAAgIAAAQCAAAEAgAABgIAAAYCAAAIAgAACAIAAAoCAAAKAgAADAIAAAwCAAAOAgAADgIAABACAAAQAgAAEgIAABICAAAUAgAAFAIAABYCAAAWAgAAGAIAABgCAAAaAgAAGgIAABwCAAAcAgAAHgIAAB4CAAAgAgAAIAIAACICAAAiAgAAJAIAACQCAAAmAgAAJgIAACgCAAAoAgAAKgIAACoCAAAsAgAALAIAAC4CAAAuAgAAMAIAADACAAAyAgAAMgIAADoCAAA7AgAAPQIAAD4CAABBAgAAQQIAAEMCAABGAgAASAIAAEgCAABKAgAASgIAAEwCAABMAgAATgIAAE4CAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAM8DAADPAwAA0gMAANQDAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAgyEAAIMhAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc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AAAAQQAAAFoAAABhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAMAAAADWAAAA2AAAAPYAAAD4AAAAwQIAAMYCAADRAgAA4AIAAOQCAADsAgAA7AIAAO4CAADuAgAARQMAAEUDAABjAwAAdAMAAHYDAAB3AwAAegMAAH0DAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIoEAAAvBQAAMQUAAFYFAABZBQAAWQUAAGAFAACIBQAAsAUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAANAFAADqBQAA7wUAAPIFAAAQBgAAGgYAACAGAABXBgAAWQYAAF8GAABuBgAA0wYAANUGAADcBgAA4QYAAOgGAADtBgAA7wYAAPoGAAD8BgAA/wYAAP8GAAAQBwAAPwcAAE0HAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABcIAAAaCAAALAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAlwgAAJcIAACgCAAAyQgAANQIAADfCAAA4wgAAOkIAADwCAAAOwkAAD0JAABMCQAATgkAAFAJAABVCQAAYwkAAHEJAACDCQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAMQJAADHCQAAyAkAAMsJAADMCQAAzgkAAM4JAADXCQAA1wkAANwJAADdCQAA3wkAAOMJAADwCQAA8QkAAPwJAAD8CQAAAQoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABCCgAARwoAAEgKAABLCgAATAoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAHAKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAxQoAAMcKAADJCgAAywoAAMwKAADQCgAA0AoAAOAKAADjCgAA+QoAAPwKAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAABECwAARwsAAEgLAABLCwAATAsAAFYLAABXCwAAXAsAAF0LAABfCwAAYwsAAHELAABxCwAAggsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC+CwAAwgsAAMYLAADICwAAygsAAMwLAADQCwAA0AsAANcLAADXCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAARAwAAEYMAABIDAAASgwAAEwMAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAIAMAACDDAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAADEDAAAxgwAAMgMAADKDAAAzAwAANUMAADWDAAA3QwAAN4MAADgDAAA4wwAAPEMAADzDAAAAA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAEQNAABGDQAASA0AAEoNAABMDQAATg0AAE4NAABUDQAAVw0AAF8NAABjDQAAeg0AAH8NAACBDQAAgw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAEYOAABNDgAATQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAuQ4AALsOAAC9DgAAwA4AAMQOAADGDgAAxg4AAM0OAADNDgAA3A4AAN8OAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAABxDwAAgw8AAIgPAACXDwAAmQ8AALwPAAAAEAAANhAAADgQAAA4EAAAOxAAAD8QAABQEAAAjxAAAJoQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAIATAACPEwAAoBMAAPUTAAD4EwAA/RMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA7hYAAPgWAAAAFwAAExcAAB8XAAAzFwAAQBcAAFMXAABgFwAAbBcAAG4XAABwFwAAchcAAHMXAACAFwAAsxcAALYXAADIFwAA1xcAANcXAADcFwAA3BcAACAYAAB4GAAAgBgAAKoYAACwGAAA9RgAAAAZAAAeGQAAIBkAACsZAAAwGQAAOBkAAFAZAABtGQAAcBkAAHQZAACAGQAAqxkAALAZAADJGQAAABoAABsaAAAgGgAAXhoAAGEaAAB0GgAApxoAAKcaAAC/GgAAwBoAAMwaAADOGgAAABsAADMbAAA1GwAAQxsAAEUbAABMGwAAgBsAAKkbAACsGwAArxsAALobAADlGwAA5xsAAPEbAAAAHAAANhwAAE0cAABPHAAAWhwAAH0cAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAADpHAAA7BwAAO4cAADzHAAA9RwAAPYcAAD6HAAA+hwAAAAdAAC/HQAA0x0AAPQdAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAAC8hAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAC2JAAA6SQAAAAsAADkLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAACALQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAADgLQAA/y0AAC8uAAAvLgAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABB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FwAAFBcAADIXAAAzFwAAUhcAAFMXAAByFwAAcxcAALQXAAC1FwAAtxcAAL0XAADGFwAAxhcAAMkXAADTFwAA1xcAANcXAADdFwAA3RcAAAsYAAAPGAAAQxgAAEMYAACFGAAAhhgAAKkYAACpGAAAIBkAACIZAAAnGQAAKBkAADIZAAAyGQAAORkAADsZAAAXGgAAGBoAABsaAAAbGgAAVhoAAFYaAABYGgAAXhoAAGAaAABgGgAAYhoAAGIaAABlGgAAbBoAAHMaAAB8GgAAfxoAAH8aAACnGgAApxoAALAaAADOGgAAABsAAAMbAAA0GwAANBsAADYbAAA6GwAAPBsAADwbAABCGwAAQhsAAGsbAABzGwAAgBsAAIEbAACiGwAApRsAAKgbAACpGwAAqxsAAK0bAADmGwAA5hsAAOgbAADpGwAA7RsAAO0bAADvGwAA8RsAACwcAAAzHAAANhwAADccAAB4HAAAfRwAANAcAADSHAAA1BwAAOAcAADiHAAA6BwAAO0cAADtHAAA9BwAAPQcAAD4HAAA+RwAACwdAABqHQAAeB0AAHgdAACbHQAA/x0AAL0fAAC9HwAAvx8AAMEfAADNHwAAzx8AAN0fAADfHwAA7R8AAO8fAAD9HwAA/h8AAAsgAAAPIAAAGCAAABkgAAAkIAAAJCAAACcgAAAnIAAAKiAAAC4gAABgIAAAZCAAAGYgAABvIAAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAA0CAAAPAgAAB8LAAAfSwAAO8sAADxLAAAby0AAG8tAAB/LQAAfy0AAOAtAAD/LQAALy4AAC8uAAAFMAAABTAAACowAAAtMAAAMTAAADUwAAA7MAAAOzAAAJkwAACeMAAA/DAAAP4wAAAVoAAAFaAAAPikAAD9pAAADKYAAAymAABvpgAAcqYAAHSmAAB9pgAAf6YAAH+mAACcpgAAn6YAAPCmAADxpgAAAKcAACGnAABwpwAAcKcAAIinAACKpwAA8qcAAPSnAAD4pwAA+acAAAKoAAACqAAABqgAAAaoAAALqAAAC6gAACWoAAAmqAAALKgAACyoAADEqAAAxagAAOCoAADxqAAA/6gAAP+oAAAmqQAALakAAEepAABRqQAAgKkAAIKpAACzqQAAs6kAALapAAC5qQAAvKkAAL2pAADPqQAAz6kAAOWpAADm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1QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAADfAQAJ3wEAC98BAB7fAQAl3wEAKt8BADDgAQBt4AEAAOkBAEPpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQBBAAAAWgAAALUAAAC1AAAAwAAAANYAAADYAAAA3wAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEkBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAAB/AQAAfwEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAARQMAAEUDAABwAwAAcAMAAHIDAAByAwAAdgMAAHYDAAB/AwAAfwMAAIYDAACGAwAAiAMAAIoDAACMAwAAjAMAAI4DAACPAwAAkQMAAKEDAACjAwAAqwMAAMIDAADCAwAAzwMAANEDAADVAwAA1gMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPADAADxAwAA9AMAAPUDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAIcFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA+BMAAP0TAACAHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACaHgAAmx4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAACAHwAArx8AALIfAAC0HwAAtx8AALwfAADCHwAAxB8AAMcfAADMHwAA2B8AANsfAADoHwAA7B8AAPIfAAD0HwAA9x8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAQQAAAFoAAABhAAAAegAAALUAAAC1AAAAwAAAANYAAADYAAAA9gAAAPgAAAA3AQAAOQEAAIwBAACOAQAAqQEAAKwBAAC5AQAAvAEAAL0BAAC/AQAAvwEAAMQBAAAgAgAAIgIAADMCAAA6AgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcAMAAHMDAAB2AwAAdwMAAHsDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAADRAwAA1QMAAPUDAAD3AwAA+wMAAP0DAACBBAAAigQAAC8FAAAxBQAAVgUAAGEFAACHBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD9EAAA/xAAAKATAAD1EwAA+BMAAP0TAACAHAAAihwAAJAcAAC6HAAAvRwAAL8cAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAAAHgAAmx4AAJ4eAACeHgAAoB4AABUfAAAYHwAAHR8AACAfAABFHwAASB8AAE0fAABQHwAAVx8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAAB9HwAAgB8AALQfAAC2HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAzB8AANAfAADTHwAA1h8AANsfAADgHwAA7B8AAPIfAAD0HwAA9h8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABOIQAATiEAAGAhAAB/IQAAgyEAAIQhAAC2JAAA6SQAAAAsAABwLAAAciwAAHMsAAB1LAAAdiwAAH4sAADjLAAA6ywAAO4sAADyLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAECmAABtpgAAgKYAAJumAAAipwAAL6cAADKnAABvpwAAeacAAIenAACLpwAAjacAAJCnAACUpwAAlqcAAK6nAACwpwAAzacAANCnAADRpwAA1qcAANynAAD1pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAIf8AADr/AABB/wAAWv8AAAAEAQBPBAEAsAQBANMEAQDYBAEA+wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQCADAEAsgwBAMAMAQDyDAEAUA0BAGUNAQBwDQEAhQ0BAKAYAQDfGAEAQG4BAH9uAQAA6QEAQ+kBAEEAAABaAAAAwAAAANYAAADYAAAA3gAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADFAQAAxwEAAMgBAADKAQAAywEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8gEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADYAwAA2AMAANoDAADaAwAA3AMAANwDAADeAwAA3gMAAOADAADgAwAA4gMAAOIDAADkAwAA5AMAAOYDAADmAwAA6AMAAOgDAADqAwAA6gMAAOwDAADsAwAA7gMAAO4DAAD0AwAA9AMAAPcDAAD3AwAA+QMAAPoDAAD9AwAALwQAAGAEAABgBAAAYgQAAGIEAABkBAAAZAQAAGYEAABmBAAAaAQAAGgEAABqBAAAagQAAGwEAABsBAAAbgQAAG4EAABwBAAAcAQAAHIEAAByBAAAdAQAAHQEAAB2BAAAdgQAAHgEAAB4BAAAegQAAHoEAAB8BAAAfAQAAH4EAAB+BAAAgAQAAIAEAACKBAAAigQAAIwEAACMBAAAjgQAAI4EAACQBAAAkAQAAJIEAACSBAAAlAQAAJQEAACWBAAAlgQAAJgEAACYBAAAmgQAAJoEAACcBAAAnAQAAJ4EAACeBAAAoAQAAKAEAACiBAAAogQAAKQEAACkBAAApgQAAKYEAACoBAAAqAQAAKoEAACqBAAArAQAAKwEAACuBAAArgQAALAEAACwBAAAsgQAALIEAAC0BAAAtAQAALYEAAC2BAAAuAQAALgEAAC6BAAAugQAALwEAAC8BAAAvgQAAL4EAADABAAAwQQAAMMEAADDBAAAxQQAAMUEAADHBAAAxwQAAMkEAADJBAAAywQAAMsEAADNBAAAzQQAANAEAADQBAAA0gQAANIEAADUBAAA1AQAANYEAADWBAAA2AQAANgEAADaBAAA2gQAANwEAADcBAAA3gQAAN4EAADgBAAA4AQAAOIEAADiBAAA5AQAAOQEAADmBAAA5gQAAOgEAADoBAAA6gQAAOoEAADsBAAA7AQAAO4EAADuBAAA8AQAAPAEAADyBAAA8gQAAPQEAAD0BAAA9gQAAPYEAAD4BAAA+AQAAPoEAAD6BAAA/AQAAPwEAAD+BAAA/gQAAAAFAAAABQAAAgUAAAIFAAAEBQAABAUAAAYFAAAGBQAACAUAAAgFAAAKBQAACgUAAAwFAAAMBQAADgUAAA4FAAAQBQAAEAUAABIFAAASBQAAFAUAABQFAAAWBQAAFgUAABgFAAAYBQAAGgUAABoFAAAcBQAAHAUAAB4FAAAeBQAAIAUAACAFAAAiBQAAIgUAACQFAAAkBQAAJgUAACYFAAAoBQAAKAUAACoFAAAqBQAALAUAACwFAAAuBQAALgUAADEFAABWBQAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAAoBMAAPUTAACJHAAAiRwAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAAy6cAAMynAADQpwAA0KcAANanAADWpwAA2KcAANinAADapwAA2qcAANynAADcpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAUA0BAGUNAQCgGAEAvxgBAEBuAQBfbgEAAOkBACHpAQBhAAAAegAAALUAAAC1AAAA3wAAAPYAAAD4AAAA/wAAAAEBAAABAQAAAwEAAAMBAAAFAQAABQEAAAcBAAAHAQAACQEAAAkBAAALAQAACwEAAA0BAAANAQAADwEAAA8BAAARAQAAEQEAABMBAAATAQAAFQEAABUBAAAXAQAAFwEAABkBAAAZAQAAGwEAABsBAAAdAQAAHQEAAB8BAAAfAQAAIQEAACEBAAAjAQAAIwEAACUBAAAlAQAAJwEAACcBAAApAQAAKQEAACsBAAArAQAALQEAAC0BAAAvAQAALwEAADEBAAAxAQAAMwEAADMBAAA1AQAANQEAADcBAAA3AQAAOgEAADoBAAA8AQAAPAEAAD4BAAA+AQAAQAEAAEABAABCAQAAQgEAAEQBAABEAQAARgEAAEYBAABIAQAASQEAAEsBAABLAQAATQEAAE0BAABPAQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjAEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC5AQAAvQEAAL0BAAC/AQAAvwEAAMQBAADEAQAAxgEAAMcBAADJAQAAygEAAMwBAADMAQAAzgEAAM4BAADQAQAA0AEAANIBAADSAQAA1AEAANQBAADWAQAA1gEAANgBAADYAQAA2gEAANoBAADcAQAA3QEAAN8BAADfAQAA4QEAAOEBAADjAQAA4wEAAOUBAADlAQAA5wEAAOcBAADpAQAA6QEAAOsBAADrAQAA7QEAAO0BAADvAQAA8QEAAPMBAADzAQAA9QEAAPUBAAD5AQAA+QEAAPsBAAD7AQAA/QEAAP0BAAD/AQAA/wEAAAECAAABAgAAAwIAAAMCAAAFAgAABQIAAAcCAAAHAgAACQIAAAkCAAALAgAACwIAAA0CAAANAgAADwIAAA8CAAARAgAAEQIAABMCAAATAgAAFQIAABUCAAAXAgAAFwIAABkCAAAZAgAAGwIAABsCAAAdAgAAHQIAAB8CAAAfAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAAzAgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAVAIAAFYCAABXAgAAWQIAAFkCAABbAgAAXAIAAGACAABhAgAAYwIAAGYCAABoAgAAbAIAAG8CAABvAgAAcQIAAHICAAB1AgAAdQIAAH0CAAB9AgAAgAIAAIACAACCAgAAgwIAAIcCAACMAgAAkgIAAJICAACdAgAAngIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAewMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA+wMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYQUAAIcFAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACRpwAAkacAAJOnAACUpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADXpwAA16cAANmnAADZpwAA26cAANunAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BACLpAQBD6QEAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAANwEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAIwBAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAArQEAAK0BAACwAQAAsAEAALQBAAC0AQAAtgEAALYBAAC5AQAAuQEAAL0BAAC9AQAAvwEAAL8BAADFAQAAxgEAAMgBAADJAQAAywEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8gEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAjAgAAIwIAACUCAAAlAgAAJwIAACcCAAApAgAAKQIAACsCAAArAgAALQIAAC0CAAAvAgAALwIAADECAAAxAgAAMwIAADMCAAA8AgAAPAIAAD8CAABAAgAAQgIAAEICAABHAgAARwIAAEkCAABJAgAASwIAAEsCAABNAgAATQIAAE8CAABUAgAAVgIAAFcCAABZAgAAWQIAAFsCAABcAgAAYAIAAGECAABjAgAAZgIAAGgCAABsAgAAbwIAAG8CAABxAgAAcgIAAHUCAAB1AgAAfQIAAH0CAACAAgAAgAIAAIICAACDAgAAhwIAAIwCAACSAgAAkgIAAJ0CAACeAgAARQMAAEUDAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB7AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD7AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABhBQAAhwUAANAQAAD6EAAA/RAAAP8QAAD4EwAA/RMAAIAcAACIHAAAihwAAIocAAB5HQAAeR0AAH0dAAB9HQAAjh0AAI4dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJseAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAAC0HwAAth8AALcfAAC8HwAAvB8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AAMwfAADMHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAPwfAAD8HwAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABzLAAAcywAAHYsAAB2LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA4ywAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAAC+nAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABT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IQAAOSEAAJQhAACZIQAAqSEAAKohAAAaIwAAGyMAACgjAAAoIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/8QEAAfIBAALyAQAa8gEAGvIBAC/yAQAv8gEAMvIBADryAQBQ8gEAUfIBAADzAQAh8wEAJPMBAJPzAQCW8wEAl/MBAJnzAQCb8wEAnvMBAPDzAQDz8wEA9fMBAPfzAQD99AEA//QBAD31AQBJ9QEATvUBAFD1AQBn9QEAb/UBAHD1AQBz9QEAevUBAIf1AQCH9QEAivUBAI31AQCQ9QEAkPUBAJX1AQCW9QEApPUBAKX1AQCo9QEAqPUBALH1AQCy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CQAAvQkAAL8JAADACQAAxwkAAMgJAADLCQAAzAkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAOYJAAD9CQAAAwoAAAMKAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAD4KAABACgAAWQoAAFwKAABeCgAAXgoAAGYKAABvCgAAcgoAAHQKAAB2CgAAdgoAAIMKAACDCgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAMAKAADJCgAAyQoAAMsKAADMCgAA0AoAANAKAADgCgAA4QoAAOYKAADxCgAA+QoAAPkKAAACCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAQAsAAEALAABHCwAASAsAAEsLAABMCwAAXAsAAF0LAABfCwAAYQsAAGYLAAB3CwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAAC/CwAAvwsAAMELAADCCwAAxgsAAMgLAADKCwAAzAsAANALAADQCwAA5gsAAPoLAAABDAAAAwwAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABBDAAARAwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAGYMAABvDAAAdwwAAIAMAACCDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL4MAADBDAAAwQwAAMMMAADEDAAA3QwAAN4MAADgDAAA4QwAAOYMAADvDAAA8QwAAPMMAAACDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAD8NAABADQAARg0AAEgNAABKDQAATA0AAE4NAABPDQAAVA0AAFYNAABYDQAAYQ0AAGYNAAB/DQAAgg0AAIMNAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAA0A0AANENAADYDQAA3g0AAOYNAADvDQAA8g0AAPQNAAABDgAAMA4AADIOAAAz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FgEAOxYBADwWAQA+FgEAPhYBAEEWAQBEFgEAUBYBAFkWAQBgFgEAbBYBAIAWAQCqFgEArBYBAKwWAQCuFgEArxYBALgWAQC5FgEAwBYBAMkWAQDQFgEA4xYBAAAXAQAaFwEAHhcBAB4XAQAgFwEAIRcBACYXAQAmFwEAMBcBAEYXAQAAGAEALhgBADgYAQA4GAEAOxgBADsYAQCgGAEA8hgBAP8YAQAGGQEACRkBAAkZAQAMGQEAExkBABUZAQAWGQEAGBkBAC8ZAQAxGQEANRkBADcZAQA4GQEAPxkBAEIZAQBEGQEARhkBAFAZAQBZGQEAoBkBAKcZAQCqGQEA0xkBANwZAQDfGQEA4RkBAOQZAQAAGgEAABoBAAsaAQAyGgEAORoBADoaAQA/GgEARhoBAFAaAQBQGgEAVxoBAFgaAQBcGgEAiRoBAJcaAQCXGgEAmhoBAKIaAQCwGgEA+BoBAAAbAQAJGwEAwBsBAOEbAQDwGwEA+RsBAAAcAQAIHAEAChwBAC8cAQA+HAEAPhwBAEAcAQBFHAEAUBwBAGwcAQBwHAEAjxwBAKkcAQCpHAEAsRwBALEcAQC0HAEAtBwBAAAdAQAGHQEACB0BAAkdAQALHQEAMB0BAEYdAQBGHQEAUB0BAFkdAQBgHQEAZR0BAGcdAQBoHQEAah0BAI4dAQCTHQEAlB0BAJYdAQCWHQEAmB0BAJgdAQCgHQEAqR0BAOAeAQDyHgEA9R4BAPgeAQACHwEAEB8BABIfAQA1HwEAPh8BAD8fAQBDHwEAWR8BALAfAQCwHwEAwB8BAPEfAQD/HwEAmSMBAAAkAQBuJAEAcCQBAHQkAQCAJAEAQyUBAJAvAQDyLwEAADABAC80AQBBNAEARjQBAGA0AQD6QwEAAEQBAEZGAQAAYQEAHWEBACphAQAsYQEAMGEBADlhAQAAaAEAOGoBAEBqAQBeagEAYGoBAGlqAQBuagEAvmoBAMBqAQDJagEA0GoBAO1qAQD1agEA9WoBAABrAQAvawEAN2sBAEVrAQBQawEAWWsBAFtrAQBhawEAY2sBAHdrAQB9awEAj2sBAEBtAQB5bQEAQG4BAJpuAQAAbwEASm8BAFBvAQCHbwEAk28BAJ9vAQDgbwEA428BAABwAQD3hwEAAIgBANWMAQD/jAEACI0BAPCvAQDzrwEA9a8BAPuvAQD9rwEA/q8BAACwAQAisQEAMrEBADKxAQBQsQEAUrEBAFWxAQBVsQEAZLEBAGexAQBwsQEA+7IBAAC8AQBqvAEAcLwBAHy8AQCAvAEAiLwBAJC8AQCZvAEAnLwBAJy8AQCfvAEAn7wBAADMAQD5zAEAAM0BALPOAQBQzwEAw88BAADQAQD10AEAANEBACbRAQAp0QEAZNEBAGrRAQBs0QEAg9EBAITRAQCM0QEAqdEBAK7RAQDq0QEAANIBAEHSAQBF0gEARdIBAMDSAQDT0gEA4NIBAPPSAQAA0wEAVtMBAGDTAQB40wEAANQBAFTUAQBW1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQAe1QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAUtUBAKXWAQCo1gEAy9cBAM7XAQD/2QEAN9oBADraAQBt2gEAdNoBAHbaAQCD2gEAhdoBAIvaAQAA3wEAHt8BACXfAQAq3wEAMOABAG3gAQAA4QEALOEBADfhAQA94QEAQOEBAEnhAQBO4QEAT+EBAJDiAQCt4gEAwOIBAOviAQDw4gEA+eIBAP/iAQD/4gEA0OQBAOvkAQDw5AEA+eQBANDlAQDt5QEA8OUBAPrlAQD/5QEA/+UBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQDH6AEAz+gBAADpAQBD6QEAS+kBAEvpAQBQ6QEAWekBAF7pAQBf6QEAcewBALTsAQAB7QEAPe0BAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BAPDuAQDx7gEAAPABACvwAQAw8AEAk/ABAKDwAQCu8AEAsfABAL/wAQDB8AEAz/ABANHwAQD18AEAAPEBAK3xAQDm8QEAAvIBABDyAQA78gEAQPIBAEjyAQBQ8gEAUfIBAGDyAQBl8gEAAPMBANf2AQDc9gEA7PYBAPD2AQD89gEAAPcBAHb3AQB79wEA2fcBAOD3AQDr9wEA8PcBAPD3AQAA+AEAC/gBABD4AQBH+AEAUPgBAFn4AQBg+AEAh/gBAJD4AQCt+AEAsPgBALv4AQDA+AEAwfgBAAD5AQBT+gEAYPoBAG36AQBw+gEAfPoBAID6AQCJ+gEAj/oBAMb6AQDO+gEA3PoBAN/6AQDp+gEA8PoBAPj6AQAA+wEAkvsBAJT7AQD5+wEAAAACAN+mAgAApwIAObcCAEC3AgAduAIAILgCAKHOAgCwzgIA4OsCAPDrAgBd7gIAAPgCAB36AgAAAAMAShMDAFATAwCvIwMAAAMAAG8DAACDBAAAiQQAAJEFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAAQBgAAGgYAAEsGAABfBgAAcAYAAHAGAADWBgAA3AYAAN8GAADkBgAA5wYAAOgGAADqBgAA7QYAABEHAAARBwAAMAcAAEoHAACmBwAAsAcAAOsHAADzBwAA/QcAAP0HAAAWCAAAGQgAABsIAAAjCAAAJQgAACcIAAApCAAALQgAAFkIAABbCAAAlwgAAJ8IAADKCAAA4QgAAOMIAAACCQAAOgkAADoJAAA8CQAAPAkAAEEJAABICQAATQkAAE0JAABRCQAAVwkAAGIJAABjCQAAgQkAAIEJAAC8CQAAvAkAAL4JAAC+CQAAwQkAAMQJAADNCQAAzQkAANcJAADXCQAA4gkAAOMJAAD+CQAA/gkAAAEKAAACCgAAPAoAADwKAABBCgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAggoAALwKAAC8CgAAwQoAAMUKAADHCgAAyAoAAM0KAADNCgAA4goAAOMKAAD6CgAA/woAAAELAAABCwAAPAsAADwLAAA+CwAAPwsAAEELAABECwAATQsAAE0LAABVCwAAVwsAAGILAABjCwAAggsAAIILAAC+CwAAvgsAAMALAADACwAAzQsAAM0LAADXCwAA1wsAAAAMAAAADAAABAwAAAQMAAA8DAAAPAwAAD4MAABADAAARgwAAEgMAABKDAAATQwAAFUMAABWDAAAYgwAAGMMAACBDAAAgQwAALwMAAC8DAAAvwwAAMAMAADCDAAAwgwAAMYMAADIDAAAygwAAM0MAADVDAAA1gwAAOIMAADjDAAAAA0AAAENAAA7DQAAPA0AAD4NAAA+DQAAQQ0AAEQNAABNDQAATQ0AAFcNAABXDQAAYg0AAGMNAACBDQAAgQ0AAMoNAADKDQAAzw0AAM8NAADSDQAA1A0AANYNAADWDQAA3w0AAN8NAAAxDgAAMQ4AADQOAAA6DgAARw4AAE4OAACxDgAAsQ4AALQOAAC8DgAAyA4AAM4OAAAYDwAAGQ8AADUPAAA1DwAANw8AADcPAAA5DwAAOQ8AAHEPAAB+DwAAgA8AAIQPAACGDwAAhw8AAI0PAACXDwAAmQ8AALwPAADGDwAAxg8AAC0QAAAwEAAAMhAAADcQAAA5EAAAOhAAAD0QAAA+EAAAWBAAAFkQAABeEAAAYBAAAHEQAAB0EAAAghAAAIIQAACFEAAAhhAAAI0QAACNEAAAnRAAAJ0QAABdEwAAXxMAABIXAAAVFwAAMhcAADQXAABSFwAAUxcAAHIXAABzFwAAtBcAALUXAAC3FwAAvRcAAMYXAADGFwAAyRcAANMXAADdFwAA3RcAAAsYAAANGAAADxgAAA8YAACFGAAAhhgAAKkYAACpGAAAIBkAACIZAAAnGQAAKBkAADIZAAAyGQAAORkAADsZAAAXGgAAGBoAABsaAAAbGgAAVhoAAFYaAABYGgAAXhoAAGAaAABgGgAAYhoAAGIaAABlGgAAbBoAAHMaAAB8GgAAfxoAAH8aAACwGgAAzhoAAAAbAAADGwAANBsAAD0bAABCGwAARBsAAGsbAABzGwAAgBsAAIEbAACiGwAApRsAAKgbAACtGwAA5hsAAOYbAADoGwAA6RsAAO0bAADtGwAA7xsAAPMbAAAsHAAAMxwAADYcAAA3HAAA0BwAANIcAADUHAAA4BwAAOIcAADoHAAA7RwAAO0cAAD0HAAA9BwAAPgcAAD5HAAAwB0AAP8dAAAMIAAADCAAANAgAADwIAAA7ywAAPEsAAB/LQAAfy0AAOAtAAD/LQAAKjAAAC8wAACZMAAAmjAAAG+mAABypgAAdKYAAH2mAACepgAAn6YAAPCmAADxpgAAAqgAAAKoAAAGqAAABqgAAAuoAAALqAAAJagAACaoAAAsqAAALKgAAMSoAADFqAAA4KgAAPGoAAD/qAAA/6gAACapAAAtqQAAR6kAAFGpAABTqQAAU6kAAICpAACCqQAAs6kAALOpAAC2qQAAuakAALypAAC9qQAAwKkAAMCpAADlqQAA5akAACmqAAAuqgAAMaoAADKqAAA1qgAANqoAAEOqAABDqgAATKoAAEyqAAB8qgAAfKoAALCqAACwqgAAsqoAALSqAAC3qgAAuKoAAL6qAAC/qgAAwaoAAMGqAADsqgAA7aoAAPaqAAD2qgAA5asAAOWrAADoqwAA6KsAAO2rAADtqwAAHvsAAB77AAAA/gAAD/4AACD+AAAv/gAAnv8AAJ//AAD9AQEA/QEBAOACAQDgAgEAdgMBAHoDAQABCgEAAwoBAAUKAQAGCgEADAoBAA8KAQA4CgEAOgoBAD8KAQA/CgEA5QoBAOYKAQAkDQEAJw0BAGkNAQBtDQEAqw4BAKwOAQD8DgEA/w4BAEYPAQBQDwEAgg8BAIUPAQABEAEAARABADgQAQBGEAEAcBABAHAQAQBzEAEAdBABAH8QAQCBEAEAsxABALYQAQC5EAEAuhABAMIQAQDCEAEAABEBAAIRAQAnEQEAKxEBAC0RAQA0EQEAcxEBAHMRAQCAEQEAgREBALYRAQC+EQEAwBEBAMARAQDJEQEAzBEBAM8RAQDPEQEALxIBADESAQA0EgEANxIBAD4SAQA+EgEAQRIBAEESAQDfEgEA3xIBAOMSAQDqEgEAABMBAAETAQA7EwEAPBMBAD4TAQA+EwEAQBMBAEATAQBNEwEATRMBAFcTAQBXEwEAZhMBAGwTAQBwEwEAdBMBALgTAQC4EwEAuxMBAMATAQDCEwEAwhMBAMUTAQDFEwEAxxMBAMkTAQDOEwEA0BMBANITAQDSEwEA4RMBAOITAQA4FAEAPxQBAEIUAQBEFAEARhQBAEYUAQBeFAEAXhQBALAUAQCwFAEAsxQBALgUAQC6FAEAuhQBAL0UAQC9FAEAvxQBAMAUAQDCFAEAwxQBAK8VAQCvFQEAshUBALUVAQC8FQEAvRUBAL8VAQDAFQEA3BUBAN0VAQAzFgEAOhYBAD0WAQA9FgEAPxYBAEAWAQCrFgEAqxYBAK0WAQCtFgEAsBYBALcWAQAdFwEAHRcBAB8XAQAfFwEAIhcBACUXAQAnFwEAKxcBAC8YAQA3GAEAORgBADoYAQAwGQEAMBkBADsZAQA+GQEAQxkBAEMZAQDUGQEA1xkBANoZAQDbGQEA4BkBAOAZAQABGgEAChoBADMaAQA4GgEAOxoBAD4aAQBHGgEARxoBAFEaAQBWGgEAWRoBAFsaAQCKGgEAlhoBAJgaAQCZGgEAMBwBADYcAQA4HAEAPRwBAD8cAQA/HAEAkhwBAKccAQCqHAEAsBwBALIcAQCzHAEAtRwBALYcAQAxHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARR0BAEcdAQBHHQEAkB0BAJEdAQCVHQEAlR0BAJcdAQCXHQEA8x4BAPQeAQAAHwEAAR8BADYfAQA6HwEAQB8BAEIfAQBaHwEAWh8BAEA0AQBANAEARzQBAFU0AQAeYQEAKWEBAC1hAQAvYQEA8GoBAPRqAQAwawEANmsBAE9vAQBPbwEAj28BAJJvAQDkbwEA5G8BAPBvAQDxbwEAnbwBAJ68AQAAzwEALc8BADDPAQBGzwEAZdEBAGnRAQBt0QEActEBAHvRAQCC0QEAhdEBAIvRAQCq0QEArdEBAELSAQBE0gEAANoBADbaAQA72gEAbNoBAHXaAQB12gEAhNoBAITaAQCb2gEAn9oBAKHaAQCv2gEAAOABAAbgAQAI4AEAGOABABvgAQAh4AEAI+ABACTgAQAm4AEAKuABAI/gAQCP4AEAMOEBADbhAQCu4gEAruIBAOziAQDv4gEA7OQBAO/kAQDu5QEA7+UBANDoAQDW6AEAROkBAErpAQAgAA4AfwAOAAABDgDvAQ4ATQkAAE0JAADNCQAAzQkAAE0KAABNCgAAzQoAAM0KAABNCwAATQsAAM0LAADNCwAATQwAAE0MAADNDAAAzQwAADsNAAA8DQAATQ0AAE0NAADKDQAAyg0AADoOAAA6DgAAug4AALoOAACEDwAAhA8AADkQAAA6EAAAFBcAABUXAAA0FwAANBcAANIXAADSFwAAYBoAAGAaAABEGwAARBsAAKobAACrGwAA8hsAAPMbAAB/LQAAfy0AAAaoAAAGqAAALKgAACyoAADEqAAAxKgAAFOpAABTqQAAwKkAAMCpAAD2qgAA9qoAAO2rAADtqwAAPwoBAD8KAQBGEAEARhABAHAQAQBwEAEAfxABAH8QAQC5EAEAuRABADMRAQA0EQEAwBEBAMARAQA1EgEANRIBAOoSAQDqEgEATRMBAE0TAQDOEwEA0BMBAEIUAQBCFAEAwhQBAMIUAQC/FQEAvxUBAD8WAQA/FgEAthYBALYWAQArFwEAKxcBADkYAQA5GAEAPRkBAD4ZAQDgGQEA4BkBADQaAQA0GgEARxoBAEcaAQCZGgEAmRoBAD8cAQA/HAEARB0BAEUdAQCXHQEAlx0BAEEfAQBCHwEAL2EBAC9hAQAwAAAAOQAAAEEAAABGAAAAYQAAAGYAAAAQ/wAAGf8AACH/AAAm/wAAQf8AAEb/AAAtAAAALQAAAK0AAACtAAAAigUAAIoFAAAGGAAABhgAABAgAAARIAAAFy4AABcuAAD7MAAA+zAAAGP+AABj/gAADf8AAA3/AABl/wAAZf8AAPAvAADxLwAA9C8AAP0vAADvMQAA7zEAAPIvAADzLwAA/i8AAP8vAACyAAAAswAAALkAAAC5AAAAcCAAAHAgAAB0IAAAfiAAAIAgAACOIAAAAiIAAAIiAAAHIgAAByIAAB4iAAAeIgAAwdYBAMHWAQDb1gEA29YBAPvWAQD71gEAFdcBABXXAQA11wEANdcBAE/XAQBP1wEAb9cBAG/XAQCJ1wEAidcBAKnXAQCp1wEAw9cBAMPXAQACIgAAAiIAAAciAAAHIgAAHiIAAB4iAADB1gEAwdYBANvWAQDb1gEA+9YBAPvWAQAV1wEAFdcBADXXAQA11wEAT9cBAE/XAQBv1wEAb9cBAInXAQCJ1wEAqdcBAKnXAQDD1wEAw9cBADAAAAA5AAAAQQAAAFoAAABfAAAAXwAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALcAAAC3AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB6AwAAfQMAAH8DAAB/AwAAhgMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIMEAACHBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAaRMAAHETAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABUXAAAfFwAANBcAAEAXAABTFwAAYBcAAGwXAABuFwAAcBcAAHIXAABzFwAAgBcAANMXAADXFwAA1xcAANwXAADdFwAA4BcAAOkXAAALGAAADRgAAA8YAAAZGAAAIBgAAHgYAACAGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAgGQAAKxkAADAZAAA7GQAARhkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAADQGQAA2hkAAAAaAAAbGgAAIBoAAF4aAABgGgAAfBoAAH8aAACJGgAAkBoAAJkaAACnGgAApxoAALAaAAC9GgAAvxoAAM4aAAAAGwAATBsAAFAbAABZGwAAaxsAAHMbAACAGwAA8xsAAAAcAAA3HAAAQBwAAEkcAABNHAAAfRwAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAANAcAADSHAAA1BwAAPocAAAAHQAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAAwgAAANIAAAPyAAAEAgAABUIAAAVCAAAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAANAgAADcIAAA4SAAAOEgAADlIAAA8CAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGCEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAACwAAOQsAADrLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAAB/LQAAli0AAKAtAACmLQAAqC0AAK4tAACwLQAAti0AALgtAAC+LQAAwC0AAMYtAADILQAAzi0AANAtAADWLQAA2C0AAN4tAADgLQAA/y0AAAUwAAAHMAAAITAAAC8wAAAxMAAANTAAADgwAAA8MAAAQTAAAJYwAACZMAAAnzAAAKEwAAD/MAAABTEAAC8xAAAxMQAAjjEAAKAxAAC/MQAA8DEAAP8xAAAANAAAv00AAABOAACMpAAA0KQAAP2kAAAApQAADKYAABCmAAArpgAAQKYAAG+mAAB0pgAAfaYAAH+mAADxpgAAF6cAAB+nAAAipwAAiKcAAIunAADNpwAA0KcAANGnAADTpwAA06cAANWnAADcpwAA8qcAACeoAAAsqAAALKgAAECoAABzqAAAgKgAAMWoAADQqAAA2agAAOCoAAD3qAAA+6gAAPuoAAD9qAAALakAADCpAABTqQAAYKkAAHypAACAqQAAwKkAAM+pAADZqQAA4KkAAP6pAAAAqgAANqoAAECqAABNqgAAUKoAAFmqAABgqgAAdqoAAHqqAADCqgAA26oAAN2qAADgqgAA76oAAPKqAAD2qgAAAasAAAarAAAJqwAADqsAABGrAAAWqwAAIKsAACarAAAoqwAALqsAADCrAABaqwAAXKsAAGmrAABwqwAA6qsAAOyrAADtqwAA8KsAAPmrAAAArAAAo9cAALDXAADG1wAAy9cAAPvXAAAA+QAAbfoAAHD6AADZ+gAAAPsAAAb7AAAT+wAAF/sAAB37AAAo+wAAKvsAADb7AAA4+wAAPPsAAD77AAA++wAAQPsAAEH7AABD+wAARPsAAEb7AACx+wAA0/sAAD39AABQ/QAAj/0AAJL9AADH/QAA8P0AAPv9AAAA/gAAD/4AACD+AAAv/gAAM/4AADT+AABN/gAAT/4AAHD+AAB0/gAAdv4AAPz+AAAQ/wAAGf8AACH/AAA6/wAAP/8AAD//AABB/wAAWv8AAGX/AAC+/wAAwv8AAMf/AADK/wAAz/8AANL/AADX/wAA2v8AANz/AAAAAAEACwABAA0AAQAmAAEAKAABADoAAQA8AAEAPQABAD8AAQBNAAEAUAABAF0AAQCAAAEA+gABAEABAQB0AQEA/QEBAP0BAQCAAgEAnAIBAKACAQDQAgEA4AIBAOACAQAAAwEAHwMBAC0DAQBKAwEAUAMBAHoDAQCAAwEAnQMBAKADAQDDAwEAyAMBAM8DAQDRAwEA1QMBAAAEAQCdBAEAoAQBAKkEAQCwBAEA0wQBANgEAQD7BAEAAAUBACcFAQAwBQEAYwUBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDABQEA8wUBAAAGAQA2BwEAQAcBAFUHAQBgBwEAZwcBAIAHAQCFBwEAhwcBALAHAQCyBwEAugcBAAAIAQAFCAEACAgBAAgIAQAKCAEANQgBADcIAQA4CAEAPAgBADwIAQA/CAEAVQgBAGAIAQB2CAEAgAgBAJ4IAQDgCAEA8ggBAPQIAQD1CAEAAAkBABUJAQAgCQEAOQkBAIAJAQC3CQEAvgkBAL8JAQAACgEAAwoBAAUKAQAGCgEADAoBABMKAQAVCgEAFwoBABkKAQA1CgEAOAoBADoKAQA/CgEAPwoBAGAKAQB8CgEAgAoBAJwKAQDACgEAxwoBAMkKAQDmCgEAAAsBADULAQBACwEAVQsBAGALAQByCwEAgAsBAJELAQAADAEASAwBAIAMAQCyDAEAwAwBAPIMAQAADQEAJw0BADANAQA5DQEAQA0BAGUNAQBpDQEAbQ0BAG8NAQCFDQEAgA4BAKkOAQCrDgEArA4BALAOAQCxDgEAwg4BAMQOAQD8DgEAHA8BACcPAQAnDwEAMA8BAFAPAQBwDwEAhQ8BALAPAQDEDwEA4A8BAPYPAQAAEAEARhABAGYQAQB1EAEAfxABALoQAQDCEAEAwhABANAQAQDoEAEA8BABAPkQAQAAEQEANBEBADYRAQA/EQEARBEBAEcRAQBQEQEAcxEBAHYRAQB2EQEAgBEBAMQRAQDJEQEAzBEBAM4RAQDaEQEA3BEBANwRAQAAEgEAERIBABMSAQA3EgEAPhIBAEESAQCAEgEAhhIBAIgSAQCIEgEAihIBAI0SAQCPEgEAnRIBAJ8SAQCoEgEAsBIBAOoSAQDwEgEA+RIBAAATAQADEwEABRMBAAwTAQAPEwEAEBMBABMTAQAoEwEAKhMBADATAQAyEwEAMxMBADUTAQA5EwEAOxMBAEQTAQBHEwEASBMBAEsTAQBNEwEAUBMBAFATAQBXEwEAVxMBAF0TAQBjEwEAZhMBAGwTAQBwEwEAdBMBAIATAQCJEwEAixMBAIsTAQCOEwEAjhMBAJATAQC1EwEAtxMBAMATAQDCEwEAwhMBAMUTAQDFEwEAxxMBAMoTAQDMEwEA0xMBAOETAQDiEwEAABQBAEoUAQBQFAEAWRQBAF4UAQBhFAEAgBQBAMUUAQDHFAEAxxQBANAUAQDZFAEAgBUBALUVAQC4FQEAwBUBANgVAQDdFQEAABYBAEAWAQBEFgEARBYBAFAWAQBZFgEAgBYBALgWAQDAFgEAyRYBANAWAQDjFgEAABcBABoXAQAdFwEAKxcBADAXAQA5FwEAQBcBAEYXAQAAGAEAOhgBAKAYAQDpGAEA/xgBAAYZAQAJGQEACRkBAAwZAQATGQEAFRkBABYZAQAYGQEANRkBADcZAQA4GQEAOxkBAEMZAQBQGQEAWRkBAKAZAQCnGQEAqhkBANcZAQDaGQEA4RkBAOMZAQDkGQEAABoBAD4aAQBHGgEARxoBAFAaAQCZGgEAnRoBAJ0aAQCwGgEA+BoBAMAbAQDgGwEA8BsBAPkbAQAAHAEACBwBAAocAQA2HAEAOBwBAEAcAQBQHAEAWRwBAHIcAQCPHAEAkhwBAKccAQCpHAEAthwBAAAdAQAGHQEACB0BAAkdAQALHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARx0BAFAdAQBZHQEAYB0BAGUdAQBnHQEAaB0BAGodAQCOHQEAkB0BAJEdAQCTHQEAmB0BAKAdAQCpHQEA4B4BAPYeAQAAHwEAEB8BABIfAQA6HwEAPh8BAEIfAQBQHwEAWh8BALAfAQCwHwEAACABAJkjAQAAJAEAbiQBAIAkAQBDJQEAkC8BAPAvAQAAMAEALzQBAEA0AQBVNAEAYDQBAPpDAQAARAEARkYBAABhAQA5YQEAAGgBADhqAQBAagEAXmoBAGBqAQBpagEAcGoBAL5qAQDAagEAyWoBANBqAQDtagEA8GoBAPRqAQAAawEANmsBAEBrAQBDawEAUGsBAFlrAQBjawEAd2sBAH1rAQCPawEAQG0BAGxtAQBwbQEAeW0BAEBuAQB/bgEAAG8BAEpvAQBPbwEAh28BAI9vAQCfbwEA4G8BAOFvAQDjbwEA5G8BAPBvAQDxbwEAAHABAPeHAQAAiAEA1YwBAP+MAQAIjQEA8K8BAPOvAQD1rwEA+68BAP2vAQD+rwEAALABACKxAQAysQEAMrEBAFCxAQBSsQEAVbEBAFWxAQBksQEAZ7EBAHCxAQD7sgEAALwBAGq8AQBwvAEAfLwBAIC8AQCIvAEAkLwBAJm8AQCdvAEAnrwBAPDMAQD5zAEAAM8BAC3PAQAwzwEARs8BAGXRAQBp0QEAbdEBAHLRAQB70QEAgtEBAIXRAQCL0QEAqtEBAK3RAQBC0gEARNIBAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD61gEA/NYBABTXAQAW1wEANNcBADbXAQBO1wEAUNcBAG7XAQBw1wEAiNcBAIrXAQCo1wEAqtcBAMLXAQDE1wEAy9cBAM7XAQD/1wEAANoBADbaAQA72gEAbNoBAHXaAQB12gEAhNoBAITaAQCb2gEAn9oBAKHaAQCv2gEAAN8BAB7fAQAl3wEAKt8BAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQAw4AEAbeABAI/gAQCP4AEAAOEBACzhAQAw4QEAPeEBAEDhAQBJ4QEATuEBAE7hAQCQ4gEAruIBAMDiAQD54gEA0OQBAPnkAQDQ5QEA+uUBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQDQ6AEA1ugBAADpAQBL6QEAUOkBAFnpAQAA7gEAA+4BAAXuAQAf7gEAIe4BACLuAQAk7gEAJO4BACfuAQAn7gEAKe4BADLuAQA07gEAN+4BADnuAQA57gEAO+4BADvuAQBC7gEAQu4BAEfuAQBH7gEASe4BAEnuAQBL7gEAS+4BAE3uAQBP7gEAUe4BAFLuAQBU7gEAVO4BAFfuAQBX7gEAWe4BAFnuAQBb7gEAW+4BAF3uAQBd7gEAX+4BAF/uAQBh7gEAYu4BAGTuAQBk7gEAZ+4BAGruAQBs7gEAcu4BAHTuAQB37gEAee4BAHzuAQB+7gEAfu4BAIDuAQCJ7gEAi+4BAJvuAQCh7gEAo+4BAKXuAQCp7gEAq+4BALvuAQDw+wEA+fsBAAAAAgDfpgIAAKcCADm3AgBAtwIAHbgCACC4AgChzgIAsM4CAODrAgDw6wIAXe4CAAD4AgAd+gIAAAADAEoTAwBQEwMAryMDAAABDgDvAQ4AQQAAAFoAAABhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAMAAAADWAAAA2AAAAPYAAAD4AAAAwQIAAMYCAADRAgAA4AIAAOQCAADsAgAA7AIAAO4CAADuAgAAcAMAAHQDAAB2AwAAdwMAAHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAoQMAAKMDAAD1AwAA9wMAAIEEAACKBAAALwUAADEFAABWBQAAWQUAAFkFAABgBQAAiAUAANAFAADqBQAA7wUAAPIFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACF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AwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACXCAAAnwgAAMoIAADhCAAA4wgAAAIJAAAVCQAAOgkAADwJAAA8CQAAQQkAAEgJAABNCQAATQkAAFEJAABfCQAAYgkAAGMJAAB4CQAAfwkAAIEJAACBCQAAlQkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC8CQAAvAkAAL4JAAC+CQAAwQkAAMQJAADNCQAAzQkAANcJAADXCQAA3AkAAN0JAADfCQAA3wkAAOIJAADjCQAA8AkAAPEJAAD+CQAA/gkAAAEKAAACCgAAPAoAADwKAABBCgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAggoAAJUKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvAoAALwKAADBCgAAxQoAAMcKAADICgAAzQoAAM0KAADiCgAA4woAAPkKAAD/CgAAAQsAAAELAAAVCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAADwLAAA8CwAAPgsAAD8LAABBCwAARAsAAE0LAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABfCwAAYgsAAGMLAABxCwAAcQsAAIILAACCCwAAvgsAAL4LAADACwAAwAsAAM0LAADNCwAA1wsAANcLAAAADAAAAAwAAAQMAAAEDAAAFQwAACgMAAAqDAAAOQwAADwMAAA8DAAAPgwAAEAMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABYDAAAWgwAAGIMAABjDAAAgQwAAIEMAAC8DAAAvAwAAL8MAADADAAAwgwAAMIMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADiDAAA4wwAAAANAAABDQAAFQ0AADwNAAA+DQAAPg0AAEENAABEDQAATQ0AAE0NAABXDQAAVw0AAGINAABj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AQAATwEAAFEBAABRAQAAUwEAAFMBAABVAQAAVQEAAFcBAABXAQAAWQEAAFkBAABbAQAAWwEAAF0BAABdAQAAXwEAAF8BAABhAQAAYQEAAGMBAABjAQAAZQEAAGUBAABnAQAAZwEAAGkBAABpAQAAawEAAGsBAABtAQAAbQEAAG8BAABvAQAAcQEAAHEBAABzAQAAcwEAAHUBAAB1AQAAdwEAAHcBAAB6AQAAegEAAHwBAAB8AQAAfgEAAIABAACDAQAAgwEAAIUBAACFAQAAiAEAAIgBAACMAQAAjQEAAJIBAACSAQAAlQEAAJUBAACZAQAAmwEAAJ4BAACeAQAAoQEAAKEBAACjAQAAowEAAKUBAAClAQAAqAEAAKgBAACqAQAAqwEAAK0BAACtAQAAsAEAALABAAC0AQAAtAEAALYBAAC2AQAAuQEAALoBAAC9AQAAvwEAAMYBAADGAQAAyQEAAMkBAADMAQAAzAEAAM4BAADOAQAA0AEAANABAADSAQAA0gEAANQBAADUAQAA1gEAANYBAADYAQAA2AEAANoBAADaAQAA3AEAAN0BAADfAQAA3wEAAOEBAADhAQAA4wEAAOMBAADlAQAA5QEAAOcBAADnAQAA6QEAAOkBAADrAQAA6wEAAO0BAADtAQAA7wEAAPABAADzAQAA8wEAAPUBAAD1AQAA+QEAAPkBAAD7AQAA+wEAAP0BAAD9AQAA/wEAAP8BAAABAgAAAQIAAAMCAAADAgAABQIAAAUCAAAHAgAABwIAAAkCAAAJAgAACwIAAAsCAAANAgAADQIAAA8CAAAPAgAAEQIAABECAAATAgAAEwIAABUCAAAVAgAAFwIAABcCAAAZAgAAGQIAABsCAAAbAgAAHQIAAB0CAAAfAgAAHwIAACECAAAhAgAAIwIAACMCAAAlAgAAJQIAACcCAAAnAgAAKQIAACkCAAArAgAAKwIAAC0CAAAtAgAALwIAAC8CAAAxAgAAMQIAADMCAAA5AgAAPAIAADwCAAA/AgAAQAIAAEICAABCAgAARwIAAEcCAABJAgAASQIAAEsCAABLAgAATQIAAE0CAABPAgAAkwIAAJUCAAC4AgAAwAIAAMECAADgAgAA5AIAAEUDAABFAwAAcQMAAHEDAABzAwAAcwMAAHcDAAB3AwAAegMAAH0DAACQAwAAkAMAAKwDAADOAwAA0AMAANEDAADVAwAA1wMAANkDAADZAwAA2wMAANsDAADdAwAA3QMAAN8DAADfAwAA4QMAAOEDAADjAwAA4wMAAOUDAADlAwAA5wMAAOcDAADpAwAA6QMAAOsDAADrAwAA7QMAAO0DAADvAwAA8wMAAPUDAAD1AwAA+AMAAPgDAAD7AwAA/AMAADAEAABfBAAAYQQAAGEEAABjBAAAYwQAAGUEAABlBAAAZwQAAGcEAABpBAAAaQQAAGsEAABrBAAAbQQAAG0EAABvBAAAbwQAAHEEAABxBAAAcwQAAHMEAAB1BAAAdQQAAHcEAAB3BAAAeQQAAHkEAAB7BAAAewQAAH0EAAB9BAAAfwQAAH8EAACBBAAAgQQAAIsEAACLBAAAjQQAAI0EAACPBAAAjwQAAJEEAACRBAAAkwQAAJMEAACVBAAAlQQAAJcEAACXBAAAmQQAAJkEAACbBAAAmwQAAJ0EAACdBAAAnwQAAJ8EAAChBAAAoQQAAKMEAACjBAAApQQAAKUEAACnBAAApwQAAKkEAACpBAAAqwQAAKsEAACtBAAArQQAAK8EAACvBAAAsQQAALEEAACzBAAAswQAALUEAAC1BAAAtwQAALcEAAC5BAAAuQQAALsEAAC7BAAAvQQAAL0EAAC/BAAAvwQAAMIEAADCBAAAxAQAAMQEAADGBAAAxgQAAMgEAADIBAAAygQAAMoEAADMBAAAzAQAAM4EAADPBAAA0QQAANEEAADTBAAA0wQAANUEAADVBAAA1wQAANcEAADZBAAA2QQAANsEAADbBAAA3QQAAN0EAADfBAAA3wQAAOEEAADhBAAA4wQAAOMEAADlBAAA5QQAAOcEAADnBAAA6QQAAOkEAADrBAAA6wQAAO0EAADtBAAA7wQAAO8EAADxBAAA8QQAAPMEAADzBAAA9QQAAPUEAAD3BAAA9wQAAPkEAAD5BAAA+wQAAPsEAAD9BAAA/QQAAP8EAAD/BAAAAQUAAAEFAAADBQAAAwUAAAUFAAAFBQAABwUAAAcFAAAJBQAACQUAAAsFAAALBQAADQUAAA0FAAAPBQAADwUAABEFAAARBQAAEwUAABMFAAAVBQAAFQUAABcFAAAXBQAAGQUAABkFAAAbBQAAGwUAAB0FAAAdBQAAHwUAAB8FAAAhBQAAIQUAACMFAAAjBQAAJQUAACUFAAAnBQAAJwUAACkFAAApBQAAKwUAACsFAAAtBQAALQUAAC8FAAAvBQAAYAUAAIgFAADQEAAA+hAAAPwQAAD/EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAMOABAG3gAQAi6QEAQ+kBACsAAAArAAAAPAAAAD4AAABeAAAAXgAAAHwAAAB8AAAAfgAAAH4AAACsAAAArAAAALEAAACxAAAA1wAAANcAAAD3AAAA9wAAANADAADSAwAA1QMAANUDAADwAwAA8QMAAPQDAAD2AwAABgYAAAgGAAAWIAAAFiAAADIgAAA0IAAAQCAAAEAgAABEIAAARCAAAFIgAABSIAAAYSAAAGQgAAB6IAAAfiAAAIogAACOIAAA0CAAANwgAADhIAAA4SAAAOUgAADmIAAA6yAAAO8gAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABghAAAdIQAAJCEAACQhAAAoIQAAKSEAACwhAAAtIQAALyEAADEhAAAzIQAAOCEAADwhAABJIQAASyEAAEshAACQIQAApyEAAKkhAACuIQAAsCEAALEhAAC2IQAAtyEAALwhAADbIQAA3SEAAN0hAADkIQAA5SEAAPQhAAD/IgAACCMAAAsjAAAgIwAAISMAAHwjAAB8IwAAmyMAALUjAAC3IwAAtyMAANAjAADQIwAA3CMAAOIjAACgJQAAoSUAAK4lAAC3JQAAvCUAAMElAADGJQAAxyUAAMolAADLJQAAzyUAANMlAADiJQAA4iUAAOQlAADkJQAA5yUAAOwlAAD4JQAA/yUAAAUmAAAGJgAAQCYAAEAmAABCJgAAQiYAAGAmAABjJgAAbSYAAG8mAADAJwAA/ycAAAApAAD/KgAAMCsAAEQrAABHKwAATCsAACn7AAAp+wAAYf4AAGb+AABo/gAAaP4AAAv/AAAL/wAAHP8AAB7/AAA8/wAAPP8AAD7/AAA+/wAAXP8AAFz/AABe/wAAXv8AAOL/AADi/wAA6f8AAOz/AACODQEAjw0BAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMvXAQDO1wEA/9cBAADuAQAD7gEABe4BAB/uAQAh7gEAIu4BACTuAQAk7gEAJ+4BACfuAQAp7gEAMu4BADTuAQA37gEAOe4BADnuAQA77gEAO+4BAELuAQBC7gEAR+4BAEfuAQBJ7gEASe4BAEvuAQBL7gEATe4BAE/uAQBR7gEAUu4BAFTuAQBU7gEAV+4BAFfuAQBZ7gEAWe4BAFvuAQBb7gEAXe4BAF3uAQBf7gEAX+4BAGHuAQBi7gEAZO4BAGTuAQBn7gEAau4BAGzuAQBy7gEAdO4BAHfuAQB57gEAfO4BAH7uAQB+7gEAgO4BAInuAQCL7gEAm+4BAKHuAQCj7gEApe4BAKnuAQCr7gEAu+4BAPDuAQDx7gEAVAYAAFUGAABYBgAAWAYAANwGAADcBgAA4wYAAOMGAADnBgAA6AYAAMoIAADLCAAAzQgAAM8IAADTCAAA0wgAAPMIAADzCAAA0P0AAO/9AAD+/wAA//8AAP7/AQD//wEA/v8CAP//AgD+/wMA//8DAP7/BAD//wQA/v8FAP//BQD+/wYA//8GAP7/BwD//wcA/v8IAP//CAD+/wkA//8JAP7/CgD//woA/v8LAP//CwD+/wwA//8MAP7/DQD//w0A/v8OAP//DgD+/w8A//8PAP7/EAD//xAARQMAAEUDAABjAwAAbwMAALAFAAC9BQAAvwUAAL8FAADBBQAAwgUAAMQFAADFBQAAxwUAAMcFAAAQBgAAGgYAAEsGAABXBgAAWQYAAF8GAABwBgAAcAYAANYGAADcBgAA4QYAAOQGAADnBgAA6AYAAO0GAADtBgAAEQcAABEHAAAwBwAAPwcAAKYHAACwBwAAFggAABcIAAAbCAAAIwgAACUIAAAnCAAAKQgAACwIAACXCAAAlwgAANQIAADfCAAA4wgAAOkIAADwCAAAAwkAADoJAAA7CQAAPgkAAEwJAABOCQAATwkAAFUJAABXCQAAYgkAAGMJAACBCQAAgwkAAL4JAADECQAAxwkAAMgJAADLCQAAzAkAANcJAADXCQAA4gkAAOMJAAABCgAAAwoAAD4KAABCCgAARwoAAEgKAABLCgAATAoAAFEKAABRCgAAcAoAAHEKAAB1CgAAdQoAAIEKAACDCgAAvgoAAMUKAADHCgAAyQoAAMsKAADMCgAA4goAAOMKAAD6CgAA/AoAAAELAAADCwAAPgsAAEQLAABHCwAASAsAAEsLAABMCwAAVgsAAFcLAABiCwAAYwsAAIILAACCCwAAvgsAAMILAADGCwAAyAsAAMoLAADMCwAA1wsAANcLAAAADAAABAwAAD4MAABEDAAARgwAAEgMAABKDAAATAwAAFUMAABWDAAAYgwAAGMMAACBDAAAgwwAAL4MAADEDAAAxgwAAMgMAADKDAAAzAwAANUMAADWDAAA4gwAAOMMAADzDAAA8wwAAAANAAADDQAAPg0AAEQNAABGDQAASA0AAEoNAABMDQAAVw0AAFcNAABiDQAAYw0AAIENAACDDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA8g0AAPMNAAAxDgAAMQ4AADQOAAA6DgAATQ4AAE0OAACxDgAAsQ4AALQOAAC5DgAAuw4AALwOAADNDgAAzQ4AAHEPAACDDwAAjQ8AAJcPAACZDwAAvA8AACsQAAA2EAAAOBAAADgQAAA7EAAAPhAAAFYQAABZEAAAXhAAAGAQAABiEAAAZBAAAGcQAABtEAAAcRAAAHQQAACC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EAAA/BAAACwdAABqHQAAeB0AAHgdAACbHQAAvx0AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAHAhAAB/IQAA0CQAAOkkAAB8LAAAfSwAAJymAACdpgAAcKcAAHCnAADypwAA9KcAAPinAAD5pwAAXKsAAF+rAABpqwAAaasAAIAHAQCABwEAgwcBAIUHAQCHBwEAsAcBALIHAQC6BwEAMOABAG3gAQBeAAAAXgAAANADAADSAwAA1QMAANUDAADwAwAA8QMAAPQDAAD1AwAAFiAAABYgAAAyIAAANCAAAEAgAABAIAAAYSAAAGQgAAB9IAAAfiAAAI0gAACOIAAA0CAAANwgAADhIAAA4SAAAOUgAADmIAAA6yAAAO8gAAACIQAAAiEAAAchAAAHIQAACiEAABMhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAoIQAAKSEAACwhAAAtIQAALyEAADEhAAAzIQAAOCEAADwhAAA/IQAARSEAAEkhAACVIQAAmSEAAJwhAACfIQAAoSEAAKIhAACkIQAApSEAAKchAACnIQAAqSEAAK0hAACwIQAAsSEAALYhAAC3IQAAvCEAAM0hAADQIQAA0SEAANMhAADTIQAA1SEAANshAADdIQAA3SEAAOQhAADlIQAACCMAAAsjAAC0IwAAtSMAALcjAAC3IwAA0CMAANAjAADiIwAA4iMAAKAlAAChJQAAriUAALYlAAC8JQAAwCUAAMYlAADHJQAAyiUAAMslAADPJQAA0yUAAOIlAADiJQAA5CUAAOQlAADnJQAA7CUAAAUmAAAGJgAAQCYAAEAmAABCJgAAQiYAAGAmAABjJgAAbSYAAG4mAADFJwAAxicAAOYnAADvJwAAgykAAJgpAADYKQAA2ykAAPwpAAD9KQAAYf4AAGH+AABj/gAAY/4AAGj+AABo/gAAPP8AADz/AAA+/wAAPv8AAADUAQBU1AEAVtQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQAF1QEAB9UBAArVAQAN1QEAFNUBABbVAQAc1QEAHtUBADnVAQA71QEAPtUBAEDVAQBE1QEARtUBAEbVAQBK1QEAUNUBAFLVAQCl1gEAqNYBAMDWAQDC1gEA2tYBANzWAQD6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AQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8QEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAIkcAACJHAAAkBwAALocAAC9HAAAvxwAAAAeAAAAHgAAAh4AAAIeAAAEHgAABB4AAAYeAAAGHgAACB4AAAgeAAAKHgAACh4AAAweAAAMHgAADh4AAA4eAAAQHgAAEB4AABIeAAASHgAAFB4AABQeAAAWHgAAFh4AABgeAAAYHgAAGh4AABoeAAAcHgAAHB4AAB4eAAAeHgAAIB4AACAeAAAiHgAAIh4AACQeAAAkHgAAJh4AACYeAAAoHgAAKB4AACoeAAAqHgAALB4AACweAAAuHgAALh4AADAeAAAwHgAAMh4AADIeAAA0HgAANB4AADYeAAA2HgAAOB4AADgeAAA6HgAAOh4AADweAAA8HgAAPh4AAD4eAABAHgAAQB4AAEIeAABCHgAARB4AAEQeAABGHgAARh4AAEgeAABIHgAASh4AAEoeAABMHgAATB4AAE4eAABOHgAAUB4AAFAeAABSHgAAUh4AAFQeAABUHgAAVh4AAFYeAABYHgAAWB4AAFoeAABaHgAAXB4AAFweAABeHgAAXh4AAGAeAABgHgAAYh4AAGIeAABkHgAAZB4AAGYeAABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAAMunAADMpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA2qcAANqnAADcpwAA3KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAFANAQBlDQEAoBgBAL8YAQBAbgEAX24BAADUAQAZ1AEANNQBAE3UAQBo1AEAgdQBAJzUAQCc1AEAntQBAJ/UAQCi1AEAotQBAKXUAQCm1AEAqdQBAKzUAQCu1AEAtdQBANDUAQDp1AEABNUBAAXVAQAH1QEACtUBAA3VAQAU1QEAFtUBABzVAQA41QEAOdUBADvVAQA+1QEAQNUBAETVAQBG1QEARtUBAErVAQBQ1QEAbNUBAIXVAQCg1QEAudUBANTVAQDt1QEACNYBACHWAQA81gEAVdYBAHDWAQCJ1gEAqNYBAMDWAQDi1gEA+tYBABzXAQA01wEAVtcBAG7XAQCQ1wEAqNcBAMrXAQDK1wEAAOkBACHpAQAw8QEASfEBAFDxAQBp8QEAcPEBAInxAQALGAAADRgAAA8YAAAPGAAAAP4AAA/+AAAAAQ4A7wEOADAAAAA5AAAAQQAAAFoAAABfAAAAXwAAAGEAAAB6AAAAqgAAAKoAAAC1AAAAtQAAALcAAAC3AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAAMECAADGAgAA0QIAAOACAADkAgAA7AIAAOwCAADuAgAA7gIAAAADAAB0AwAAdgMAAHcDAAB7AwAAfQMAAH8DAAB/AwAAhgMAAIoDAACMAwAAjAMAAI4DAAChAwAAowMAAPUDAAD3AwAAgQQAAIMEAACHBAAAigQAAC8FAAAxBQAAVgUAAFkFAABZBQAAYAUAAIgFAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAA0AUAAOoFAADvBQAA8gUAABAGAAAaBgAAIAYAAGkGAABuBgAA0wYAANUGAADcBgAA3wYAAOgGAADqBgAA/AYAAP8GAAD/BgAAEAcAAEoHAABNBwAAsQcAAMAHAAD1BwAA+gcAAPoHAAD9BwAA/QcAAAAIAAAtCAAAQAgAAFsIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACXCAAA4QgAAOMIAABjCQAAZgkAAG8JAABxCQAAgwkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAALwJAADECQAAxwkAAMgJAADLCQAAzgkAANcJAADXCQAA3AkAAN0JAADfCQAA4wkAAOYJAADxCQAA/AkAAPwJAAD+CQAA/gkAAAEKAAADCgAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAAA8CgAAPAoAAD4KAABCCgAARwoAAEgKAABLCgAATQoAAFEKAABRCgAAWQoAAFwKAABeCgAAXgoAAGYKAAB1CgAAgQoAAIMKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC8CgAAxQoAAMcKAADJCgAAywoAAM0KAADQCgAA0AoAAOAKAADjCgAA5goAAO8KAAD5CgAA/woAAAELAAADCwAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPAsAAEQLAABHCwAASAsAAEsLAABNCwAAVQsAAFcLAABcCwAAXQsAAF8LAABjCwAAZgsAAG8LAABxCwAAcQsAAIILAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAAvgsAAMILAADGCwAAyAsAAMoLAADNCwAA0AsAANALAADXCwAA1wsAAOYLAADvCwAAAAwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA8DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAFgMAABaDAAAXQwAAF0MAABgDAAAYwwAAGYMAABvDAAAgAwAAIMMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvAwAAMQMAADGDAAAyAwAAMoMAADNDAAA1QwAANYMAADdDAAA3gwAAOAMAADjDAAA5gwAAO8MAADxDAAA8wwAAAANAAAMDQAADg0AABANAAASDQAARA0AAEYNAABIDQAASg0AAE4NAABUDQAAVw0AAF8NAABjDQAAZg0AAG8NAAB6DQAAfw0AAIENAACDDQAAhQ0AAJYNAACaDQAAsQ0AALMNAAC7DQAAvQ0AAL0NAADADQAAxg0AAMoNAADKDQAAzw0AANQNAADWDQAA1g0AANgNAADfDQAA5g0AAO8NAADyDQAA8w0AAAEOAAA6DgAAQA4AAE4OAABQDgAAWQ4AAIEOAACCDgAAhA4AAIQOAACGDgAAig4AAIwOAACjDgAApQ4AAKUOAACnDgAAvQ4AAMAOAADEDgAAxg4AAMYOAADIDgAAzg4AANAOAADZDgAA3A4AAN8OAAAADwAAAA8AABgPAAAZDwAAIA8AACkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAARw8AAEkPAABsDwAAcQ8AAIQPAACGDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAAAEAAASRAAAFAQAACdEAAAoBAAAMUQAADHEAAAxxAAAM0QAADNEAAA0BAAAPoQAAD8EAAASBIAAEoSAABNEgAAUBIAAFYSAABYEgAAWBIAAFoSAABdEgAAYBIAAIgSAACKEgAAjRIAAJASAACwEgAAshIAALUSAAC4EgAAvhIAAMASAADAEgAAwhIAAMUSAADIEgAA1hIAANgSAAAQEwAAEhMAABUTAAAYEwAAWhMAAF0TAABfEwAAaRMAAHETAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABUXAAAfFwAANBcAAEAXAABTFwAAYBcAAGwXAABuFwAAcBcAAHIXAABzFwAAgBcAANMXAADXFwAA1xcAANwXAADdFwAA4BcAAOkXAAALGAAADRgAAA8YAAAZGAAAIBgAAHgYAACAGAAAqhgAALAYAAD1GAAAABkAAB4ZAAAgGQAAKxkAADAZAAA7GQAARhkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAADQGQAA2hkAAAAaAAAbGgAAIBoAAF4aAABgGgAAfBoAAH8aAACJGgAAkBoAAJkaAACnGgAApxoAALAaAAC9GgAAvxoAAM4aAAAAGwAATBsAAFAbAABZGwAAaxsAAHMbAACAGwAA8xsAAAAcAAA3HAAAQBwAAEkcAABNHAAAfRwAAIAcAACKHAAAkBwAALocAAC9HAAAvxwAANAcAADSHAAA1BwAAPocAAAAHQAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAH0fAACAHwAAtB8AALYfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADMHwAA0B8AANMfAADWHwAA2x8AAOAfAADsHwAA8h8AAPQfAAD2HwAA/B8AAAwgAAANIAAAPyAAAEAgAABUIAAAVCAAAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAANAgAADcIAAA4SAAAOEgAADlIAAA8CAAAAIhAAACIQAAByEAAAchAAAKIQAAEyEAABUhAAAVIQAAGCEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAAOSEAADwhAAA/IQAARSEAAEkhAABOIQAATiEAAGAhAACIIQAAACwAAOQsAADrLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AADAtAABnLQAAby0AAG8tAAB/LQAAli0AAKAtAACm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GAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAApxoAAKcaAAAFGwAAMxsAAEUbAABMGwAAgxsAAKAbAACuGwAArxsAALobAADlGwAAABwAACMcAABNHAAATxwAAFocAAB9HAAAgBwAAIocAACQHAAAuhwAAL0cAAC/HAAA6RwAAOwcAADuHAAA8xwAAPUcAAD2HAAA+hwAAPocAAAAHQAAvx0AAAAeAAAVHwAAGB8AAB0fAAAgHwAARR8AAEgfAABNHwAAUB8AAFcfAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAfR8AAIAfAAC0HwAAth8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMwfAADQHwAA0x8AANYfAADbHwAA4B8AAOwfAADyHwAA9B8AAPYfAAD8HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAAAiEAAAIhAAAHIQAAByEAAAohAAATIQAAFSEAABUhAAAYIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAA5IQAAPCEAAD8hAABFIQAASSEAAE4hAABOIQAAYCEAAIghAAAALAAA5CwAAOssAADuLAAA8iwAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAAAwLQAAZy0AAG8tAABvLQAAgC0AAJYtAACgLQAApi0AAKgtAACuLQAAsC0AALYtAAC4LQAAvi0AAMAtAADGLQAAyC0AAM4tAADQLQAA1i0AANgtAADeLQAABTAAAAcwAAAhMAAAKTAAADEwAAA1MAAAODAAADwwAABBMAAAljAAAJ0wAACfMAAAoTAAAPowAAD8MAAA/zAAAAUxAAAvMQAAMTEAAI4xAACgMQAAvzEAAPAxAAD/MQAAADQAAL9NAAAATgAAjKQAANCkAAD9pAAAAKUAAAymAAAQpgAAH6YAACqmAAArpgAAQKYAAG6mAAB/pgAAnaYAAKCmAADvpgAAF6cAAB+nAAAipwAAiKcAAIunAADNpwAA0KcAANGnAADTpwAA06cAANWnAADcpwAA8qcAAAGoAAADqAAABagAAAeoAAAKqAAADKgAACKoAABAqAAAc6gAAIKoAACzqAAA8qgAAPeoAAD7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rAAAjKwAAKisAACorAAAxKwAAMSsAADgrAAA4KwAAPysAAD8rAAAGK0AABitAAA0rQAANK0AAFCtAABQrQAAbK0AAGytAACIrQAAiK0AAKStAACkrQAAwK0AAMCtAADcrQAA3K0AAPitAAD4rQAAFK4AABSuAAAwrgAAMK4AAEyuAABMrgAAaK4AAGiuAACErgAAhK4AAKCuAACgrgAAvK4AALyuAADYrgAA2K4AAPSuAAD0rgAAEK8AABCvAAAsrwAALK8AAEivAABIrwAAZK8AAGSvAACArwAAgK8AAJyvAACcrwAAuK8AALivAADUrwAA1K8AAPCvAADwrwAADLAAAAywAAAosAAAKLAAAESwAABEsAAAYLAAAGCwAAB8sAAAfLAAAJiwAACYsAAAtLAAALSwAADQsAAA0LAAAOywAADssAAACLEAAAixAAAksQAAJLEAAECxAABAsQAAXLEAAFyxAAB4sQAAeLEAAJSxAACUsQAAsLEAALCxAADMsQAAzLEAAOixAADosQAABLIAAASyAAAgsgAAILIAADyyAAA8sgAAWLIAAFiyAAB0sgAAdLIAAJCyAACQsgAArLIAAKyyAADIsgAAyLIAAOSyAADksgAAALMAAACzAAAcswAAHLMAADizAAA4swAAVLMAAFSzAABwswAAcLMAAIyzAACMswAAqLMAAKizAADEswAAxLMAAOCzAADgswAA/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/RAACh0QAAu9EAAL3RAADX0QAA2dEAAPPRAAD10QAAD9IAABHSAAAr0gAALdIAAEfSAABJ0gAAY9IAAGXSAAB/0gAAgdIAAJvSAACd0gAAt9IAALnSAADT0gAA1dIAAO/SAADx0gAAC9MAAA3TAAAn0wAAKdMAAEPTAABF0wAAX9MAAGHTAAB70wAAfdMAAJfTAACZ0wAAs9MAALXTAADP0wAA0dMAAOvTAADt0wAAB9QAAAnUAAAj1AAAJdQAAD/UAABB1AAAW9QAAF3UAAB31AAAedQAAJPUAACV1AAAr9QAALHUAADL1AAAzdQAAOfUAADp1AAAA9UAAAXVAAAf1QAAIdUAADvVAAA91QAAV9UAAFnVAABz1QAAddUAAI/VAACR1QAAq9UAAK3VAADH1QAAydUAAOPVAADl1QAA/9UAAAHWAAAb1gAAHdYAADfWAAA51gAAU9YAAFXWAABv1gAAcdYAAIvWAACN1gAAp9YAAKnWAADD1gAAxdYAAN/WAADh1gAA+9YAAP3WAAAX1wAAGdcAADPXAAA11wAAT9cAAFHXAABr1wAAbdcAAIfXAACJ1wAAo9cAAAAGAAAFBgAA3QYAAN0GAAAPBwAADwcAAJAIAACRCAAA4ggAAOIIAABODQAATg0AAL0QAQC9EAEAzRABAM0QAQDCEQEAwxEBANETAQDREwEAPxkBAD8ZAQBBGQEAQRkBADoaAQA6GgEAhBoBAIkaAQBGHQEARh0BAAIfAQACHwEAAwkAAAMJAAA7CQAAOwkAAD4JAABACQAASQkAAEwJAABOCQAATwkAAIIJAACDCQAAvwkAAMAJAADHCQAAyAkAAMsJAADMCQAAAwoAAAMKAAA+CgAAQAoAAIMKAACDCgAAvgoAAMAKAADJCgAAyQoAAMsKAADMCgAAAgsAAAMLAABACwAAQAsAAEcLAABICwAASwsAAEwLAAC/CwAAvwsAAMELAADCCwAAxgsAAMgLAADKCwAAzAsAAAEMAAADDAAAQQwAAEQMAACCDAAAgwwAAL4MAAC+DAAAwQwAAMEMAADDDAAAxAwAAPMMAADzDAAAAg0AAAMNAAA/DQAAQA0AAEYNAABIDQAASg0AAEwNAACCDQAAgw0AANANAADRDQAA2A0AAN4NAADyDQAA8w0AADMOAAAzDgAAsw4AALMOAAA+DwAAPw8AAH8PAAB/DwAAMRAAADEQAAA7EAAAPBAAAFYQAABXEAAAhBAAAIQQAAC2FwAAthcAAL4XAADFFwAAxxcAAMgXAAAjGQAAJhkAACkZAAArGQAAMBkAADEZAAAzGQAAOBkAABkaAAAaGgAAVRoAAFUaAABXGgAAVxoAAG0aAAByGgAABBsAAAQbAAA+GwAAQRsAAIIbAACCGwAAoRsAAKEbAACmGwAApxsAAOcbAADnGwAA6hsAAOwbAADuGwAA7hsAACQcAAArHAAANBwAADUcAADhHAAA4RwAAPccAAD3HAAAI6gAACSoAAAnqAAAJ6gAAICoAACBqAAAtKgAAMOoAABSqQAAUqkAAIOpAACDqQAAtKkAALWpAAC6qQAAu6kAAL6pAAC/qQAAL6oAADCqAAAzqgAANKoAAE2qAABNqgAA66oAAOuqAADuqgAA76oAAPWqAAD1qgAA46sAAOSrAADmqwAA56sAAOmrAADqqwAA7KsAAOyrAAAAEAEAABABAAIQAQACEAEAghABAIIQAQCwEAEAshABALcQAQC4EAEALBEBACwRAQBFEQEARhEBAIIRAQCCEQEAsxEBALURAQC/EQEAvxEBAM4RAQDOEQEALBIBAC4SAQAyEgEAMxIBAOASAQDiEgEAAhMBAAMTAQA/EwEAPxMBAEETAQBEEwEARxMBAEgTAQBLEwEATBMBAGITAQBjEwEAuRMBALoTAQDKEwEAyhMBAMwTAQDNEwEANRQBADcUAQBAFAEAQRQBAEUUAQBFFAEAsRQBALIUAQC5FAEAuRQBALsUAQC8FAEAvhQBAL4UAQDBFAEAwRQBALAVAQCxFQEAuBUBALsVAQC+FQEAvhUBADAWAQAyFgEAOxYBADwWAQA+FgEAPhYBAKwWAQCsFgEArhYBAK8WAQAeFwEAHhcBACYXAQAmFwEALBgBAC4YAQA4GAEAOBgBADEZAQA1GQEANxkBADgZAQBAGQEAQBkBAEIZAQBCGQEA0RkBANMZAQDcGQEA3xkBAOQZAQDkGQEAORoBADkaAQBXGgEAWBoBAJcaAQCXGgEALxwBAC8cAQA+HAEAPhwBAKkcAQCpHAEAsRwBALEcAQC0HAEAtBwBAIodAQCOHQEAkx0BAJQdAQCWHQEAlh0BAPUeAQD2HgEAAx8BAAMfAQA0HwEANR8BAD4fAQA/HwEAKmEBACxhAQBRbwEAh28BAKgRAAD/EQAAy9cAAPvXAABgEQAApxEAALDXAADG1wAAY20BAGNtAQBnbQEAam0BAA0gAAANIAAARlAiAAIAAAAITyUAAQAAAJVHIgAHAAAAEE8lABMAAAB8UCIABgAAAKhPJQB4AQAApVAiAAEAAABoWyUAAgAAAKhQIgACAAAAeFslAAEAAACsUCIAAgAAAIBbJQCPAQAAsVAiAAMAAAD4ZyUAjwEAALZQIgAHAAAAcHQlABAAAAD8LiIAEgAAAPj/JAABAAAAxFAiAAsAAADwdCUAmwAAANBQIgABAAAAyHklAAIAAADSUCIAAQAAANh5JQAEAAAA1VAiAAMAAAD4eSUAAQAAAEEAAABaAAAAYQAAAHoAAACqAAAAqgAAALUAAAC1AAAAugAAALoAAADAAAAA1gAAANgAAAD2AAAA+AAAANcCAADeAgAA/wIAAHADAAB0AwAAdgMAAHcDAAB6AwAAfQMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAKEDAACjAwAA9QMAAPcDAACBBAAAigQAAC8FAAAxBQAAVgUAAFkFAABcBQAAXgUAAF4FAABgBQAAiAUAAIoFAACKBQAA8wUAAPMFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAADwcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAAS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4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBAO7lAQDv5QEA0OgBANboAQBE6QEASukBACAADgB/AA4AAAEOAO8BDgCtAAAArQAAABwGAAAcBgAADwcAAA8HAAAOGAAADhgAAAsgAAALIAAADiAAAA8gAAAqIAAALiAAAGAgAABkIAAAZiAAAG8gAAD//gAA//4AAPn/AAD7/wAAMDQBAD80AQCgvAEAo7wBAHPRAQB60QEAAQAOAAEADgBhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAAOAEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEABAABAAQAAQgEAAEIBAABEAQAARAEAAEYBAABGAQAASAEAAEkBAABLAQAASwEAAE0BAABNAQAATwEAAE8BAABRAQAAUQEAAFMBAABTAQAAVQEAAFUBAABXAQAAVwEAAFkBAABZAQAAWwEAAFsBAABdAQAAXQEAAF8BAABfAQAAYQEAAGEBAABjAQAAYwEAAGUBAABlAQAAZwEAAGcBAABpAQAAaQEAAGsBAABrAQAAbQEAAG0BAABvAQAAbwEAAHEBAABxAQAAcwEAAHMBAAB1AQAAdQEAAHcBAAB3AQAAegEAAHoBAAB8AQAAfAEAAH4BAACAAQAAgwEAAIMBAACFAQAAhQEAAIgBAACIAQAAjAEAAI0BAACSAQAAkgEAAJUBAACVAQAAmQEAAJsBAACeAQAAngEAAKEBAAChAQAAowEAAKMBAAClAQAApQEAAKgBAACoAQAAqgEAAKsBAACtAQAArQEAALABAACwAQAAtAEAALQBAAC2AQAAtgEAALkBAAC6AQAAvQEAAL8BAADGAQAAxgEAAMkBAADJAQAAzAEAAMwBAADOAQAAzgEAANABAADQAQAA0gEAANIBAADUAQAA1AEAANYBAADWAQAA2AEAANgBAADaAQAA2gEAANwBAADdAQAA3wEAAN8BAADhAQAA4QEAAOMBAADjAQAA5QEAAOUBAADnAQAA5wEAAOkBAADpAQAA6wEAAOsBAADtAQAA7QEAAO8BAADwAQAA8wEAAPMBAAD1AQAA9QEAAPkBAAD5AQAA+wEAAPsBAAD9AQAA/QEAAP8BAAD/AQAAAQIAAAECAAADAgAAAwIAAAUCAAAFAgAABwIAAAcCAAAJAgAACQIAAAsCAAALAgAADQIAAA0CAAAPAgAADwIAABECAAARAgAAEwIAABMCAAAVAgAAFQIAABcCAAAXAgAAGQIAABkCAAAbAgAAGwIAAB0CAAAdAgAAHwIAAB8CAAAhAgAAIQIAACMCAAAjAgAAJQIAACUCAAAnAgAAJwIAACkCAAApAgAAKwIAACsCAAAtAgAALQIAAC8CAAAvAgAAMQIAADECAAAzAgAAOQIAADwCAAA8AgAAPwIAAEACAABCAgAAQgIAAEcCAABHAgAASQIAAEkCAABLAgAASwIAAE0CAABNAgAATwIAAJMCAACVAgAAuAIAAMACAADBAgAA4AIAAOQCAABxAwAAcQMAAHMDAABzAwAAdwMAAHcDAAB6AwAAfQMAAJADAACQAwAArAMAAM4DAADQAwAA0QMAANUDAADXAwAA2QMAANkDAADbAwAA2wMAAN0DAADdAwAA3wMAAN8DAADhAwAA4QMAAOMDAADjAwAA5QMAAOUDAADnAwAA5wMAAOkDAADpAwAA6wMAAOsDAADtAwAA7QMAAO8DAADzAwAA9QMAAPUDAAD4AwAA+AMAAPsDAAD8AwAAMAQAAF8EAABhBAAAYQQAAGMEAABjBAAAZQQAAGUEAABnBAAAZwQAAGkEAABpBAAAawQAAGsEAABtBAAAbQQAAG8EAABvBAAAcQQAAHEEAABzBAAAcwQAAHUEAAB1BAAAdwQAAHcEAAB5BAAAeQQAAHsEAAB7BAAAfQQAAH0EAAB/BAAAfwQAAIEEAACBBAAAiwQAAIsEAACNBAAAjQQAAI8EAACPBAAAkQQAAJEEAACTBAAAkwQAAJUEAACVBAAAlwQAAJcEAACZBAAAmQQAAJsEAACbBAAAnQQAAJ0EAACfBAAAnwQAAKEEAAChBAAAowQAAKMEAAClBAAApQQAAKcEAACnBAAAqQQAAKkEAACrBAAAqwQAAK0EAACtBAAArwQAAK8EAACxBAAAsQQAALMEAACzBAAAtQQAALUEAAC3BAAAtwQAALkEAAC5BAAAuwQAALsEAAC9BAAAvQQAAL8EAAC/BAAAwgQAAMIEAADEBAAAxAQAAMYEAADGBAAAyAQAAMgEAADKBAAAygQAAMwEAADMBAAAzgQAAM8EAADRBAAA0QQAANMEAADTBAAA1QQAANUEAADXBAAA1wQAANkEAADZBAAA2wQAANsEAADdBAAA3QQAAN8EAADfBAAA4QQAAOEEAADjBAAA4wQAAOUEAADlBAAA5wQAAOcEAADpBAAA6QQAAOsEAADrBAAA7QQAAO0EAADvBAAA7wQAAPEEAADxBAAA8wQAAPMEAAD1BAAA9QQAAPcEAAD3BAAA+QQAAPkEAAD7BAAA+wQAAP0EAAD9BAAA/wQAAP8EAAABBQAAAQUAAAMFAAADBQAABQUAAAUFAAAHBQAABwUAAAkFAAAJBQAACwUAAAsFAAANBQAADQUAAA8FAAAPBQAAEQUAABEFAAATBQAAEwUAABUFAAAVBQAAFwUAABcFAAAZBQAAGQUAABsFAAAbBQAAHQUAAB0FAAAfBQAAHwUAACEFAAAhBQAAIwUAACMFAAAlBQAAJQUAACcFAAAnBQAAKQUAACkFAAArBQAAKwUAAC0FAAAtBQAALwUAAC8FAABgBQAAiAUAAPwQAAD8EAAA+BMAAP0TAACAHAAAiBwAAIocAACKHAAAAB0AAL8dAAABHgAAAR4AAAMeAAADHgAABR4AAAUeAAAHHgAABx4AAAkeAAAJHgAACx4AAAseAAANHgAADR4AAA8eAAAPHgAAER4AABEeAAATHgAAEx4AABUeAAAVHgAAFx4AABceAAAZHgAAGR4AABseAAAbHgAAHR4AAB0eAAAfHgAAHx4AACEeAAAhHgAAIx4AACMeAAAlHgAAJR4AACceAAAnHgAAKR4AACkeAAArHgAAKx4AAC0eAAAtHgAALx4AAC8eAAAxHgAAMR4AADMeAAAzHgAANR4AADUeAAA3HgAANx4AADkeAAA5HgAAOx4AADseAAA9HgAAPR4AAD8eAAA/HgAAQR4AAEEeAABDHgAAQx4AAEUeAABFHgAARx4AAEceAABJHgAASR4AAEseAABLHgAATR4AAE0eAABPHgAATx4AAFEeAABRHgAAUx4AAFMeAABVHgAAVR4AAFceAABXHgAAWR4AAFkeAABbHgAAWx4AAF0eAABdHgAAXx4AAF8eAABhHgAAYR4AAGMeAABjHgAAZR4AAGUeAABnHgAAZx4AAGkeAABpHgAAax4AAGseAABtHgAAbR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAABwIQAAfyEAAIQhAACEIQAA0CQAAOkkAAAwLAAAXywAAGEsAABhLAAAZSwAAGYsAABoLAAAaCwAAGosAABqLAAAbCwAAGwsAABxLAAAcSwAAHMsAAB0LAAAdiwAAH0sAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADkLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJ2mAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAMacAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAAM2nAADNpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAANunAADbpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAHANAQCFDQEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAMOABAG3gAQAi6QEAQ+kBADAAAAA5AAAAAAYAAAUGAABgBgAAaQYAAGsGAABsBgAA3QYAAN0GAADwBgAA+QYAAMAHAADJBwAAkAgAAJEIAADiCAAA4ggAAGYJAABvCQAA5gkAAO8JAABmCgAAbwoAAOYKAADvCgAAZgsAAG8LAADmCwAA7wsAAGYMAABvDAAA5gwAAO8MAABmDQAAbw0AAOYNAADvDQAAUA4AAFkOAADQDgAA2Q4AACAPAAApDwAAQBAAAEkQAACQEAAAmRAAAOAXAADpFwAAEBgAABkYAABGGQAATxkAANAZAADaGQAAgBoAAIkaAACQGgAAmRoAAFAbAABZGwAAsBsAALkbAABAHAAASRwAAFAcAABZHAAAIKYAACmmAADQqAAA2agAAACpAAAJqQAA0KkAANmpAADwqQAA+akAAFCqAABZqgAA8KsAAPmrAAAQ/wAAGf8AAKAEAQCpBAEAMA0BADkNAQBADQEASQ0BAGYQAQBvEAEAvRABAL0QAQDNEAEAzRABAPAQAQD5EAEANhEBAD8RAQDQEQEA2REBAPASAQD5EgEAUBQBAFkUAQDQFAEA2RQBAFAWAQBZFgEAwBYBAMkWAQDQFgEA4xYBADAXAQA5FwEA4BgBAOkYAQBQGQEAWRkBAPAbAQD5GwEAUBwBAFkcAQBQHQEAWR0BAKAdAQCpHQEAUB8BAFkfAQAwYQEAOWEBAGBqAQBpagEAwGoBAMlqAQBQawEAWWsBAHBtAQB5bQEA8MwBAPnMAQDO1wEA/9cBAEDhAQBJ4QEA8OIBAPniAQDw5AEA+eQBAPHlAQD65QEAUOkBAFnpAQDw+wEA+fsBALsBAAC7AQAAwAEAAMMBAACUAgAAlAIAALkCAAC/AgAAxgIAANECAADsAgAA7AIAAO4CAADuAgAAdAMAAHQDAABZBQAAWQUAANAFAADqBQAA7wUAAPMFAAAgBgAASgYAAG4GAABvBgAAcQYAANMGAADVBgAA1QYAAOUGAADmBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAPQHAAD1BwAA+gcAAPoHAAAACAAAFQgAABoIAAAaCAAAJAgAACQIAAAoCAAAKAgAAEAIAABYCAAAYAgAAGoIAABwCAAAhwgAAIkIAACOCAAAoAgAAMkIAAAECQAAOQkAAD0JAAA9CQAAUAkAAFAJAABYCQAAYQkAAHEJAACACQAAhQkAAIwJAACPCQAAkAkAAJMJAACoCQAAqgkAALAJAACyCQAAsgkAALYJAAC5CQAAvQkAAL0JAADOCQAAzgkAANwJAADdCQAA3wkAAOEJAADwCQAA8QkAAPwJAAD8CQAABQoAAAoKAAAPCgAAEAoAABMKAAAoCgAAKgoAADAKAAAyCgAAMwoAADUKAAA2CgAAOAoAADkKAABZCgAAXAoAAF4KAABeCgAAcgoAAHQKAACFCgAAjQoAAI8KAACRCgAAkwoAAKgKAACqCgAAsAoAALIKAACzCgAAtQoAALkKAAC9CgAAvQoAANAKAADQCgAA4AoAAOEKAAD5CgAA+QoAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAAD0LAAA9CwAAXAsAAF0LAABfCwAAYQsAAHELAABxCwAAgwsAAIMLAACFCwAAigsAAI4LAACQCwAAkgsAAJULAACZCwAAmgsAAJwLAACcCwAAngsAAJ8LAACjCwAApAsAAKgLAACqCwAArgsAALkLAADQCwAA0AsAAAUMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPQwAAD0MAABYDAAAWgwAAF0MAABdDAAAYAwAAGEMAACADAAAgAwAAIUMAACMDAAAjgwAAJAMAACSDAAAqAwAAKoMAACzDAAAtQwAALkMAAC9DAAAvQwAAN0MAADeDAAA4AwAAOEMAADxDAAA8gwAAAQNAAAMDQAADg0AABANAAASDQAAOg0AAD0NAAA9DQAATg0AAE4NAABUDQAAVg0AAF8NAABhDQAAeg0AAH8NAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9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AQAADAEAAAwBAAAOAQAADgEAABABAAAQAQAAEgEAABIBAAAUAQAAFAEAABYBAAAWAQAAGAEAABgBAAAaAQAAGgEAABwBAAAcAQAAHgEAAB4BAAAgAQAAIAEAACIBAAAiAQAAJAEAACQBAAAmAQAAJgEAACgBAAAoAQAAKgEAACoBAAAsAQAALAEAAC4BAAAuAQAAMAEAADABAAAyAQAAMgEAADQBAAA0AQAANgEAADYBAAA5AQAAOQEAADsBAAA7AQAAPQEAAD0BAAA/AQAAPwEAAEEBAABBAQAAQwEAAEMBAABFAQAARQEAAEcBAABHAQAASgEAAEoBAABMAQAATAEAAE4BAABOAQAAUAEAAFABAABSAQAAUgEAAFQBAABUAQAAVgEAAFYBAABYAQAAWAEAAFoBAABaAQAAXAEAAFwBAABeAQAAXgEAAGABAABgAQAAYgEAAGIBAABkAQAAZAEAAGYBAABmAQAAaAEAAGgBAABqAQAAagEAAGwBAABsAQAAbgEAAG4BAABwAQAAcAEAAHIBAAByAQAAdAEAAHQBAAB2AQAAdgEAAHgBAAB5AQAAewEAAHsBAAB9AQAAfQEAAIEBAACCAQAAhAEAAIQBAACGAQAAhwEAAIkBAACLAQAAjgEAAJEBAACTAQAAlAEAAJYBAACYAQAAnAEAAJ0BAACfAQAAoAEAAKIBAACiAQAApAEAAKQBAACmAQAApwEAAKkBAACpAQAArAEAAKwBAACuAQAArwEAALEBAACzAQAAtQEAALUBAAC3AQAAuAEAALwBAAC8AQAAxAEAAMUBAADHAQAAyAEAAMoBAADLAQAAzQEAAM0BAADPAQAAzwEAANEBAADRAQAA0wEAANMBAADVAQAA1QEAANcBAADXAQAA2QEAANkBAADbAQAA2wEAAN4BAADeAQAA4AEAAOABAADiAQAA4gEAAOQBAADkAQAA5gEAAOYBAADoAQAA6AEAAOoBAADqAQAA7AEAAOwBAADuAQAA7gEAAPEBAADyAQAA9AEAAPQBAAD2AQAA+AEAAPoBAAD6AQAA/AEAAPwBAAD+AQAA/gEAAAACAAAAAgAAAgIAAAICAAAEAgAABAIAAAYCAAAGAgAACAIAAAgCAAAKAgAACgIAAAwCAAAMAgAADgIAAA4CAAAQAgAAEAIAABICAAASAgAAFAIAABQCAAAWAgAAFgIAABgCAAAYAgAAGgIAABoCAAAcAgAAHAIAAB4CAAAeAgAAIAIAACACAAAiAgAAIgIAACQCAAAkAgAAJgIAACYCAAAoAgAAKAIAACoCAAAqAgAALAIAACwCAAAuAgAALgIAADACAAAwAgAAMgIAADICAAA6AgAAOwIAAD0CAAA+AgAAQQIAAEECAABDAgAARgIAAEgCAABIAgAASgIAAEoCAABMAgAATAIAAE4CAABOAgAAcAMAAHADAAByAwAAcgMAAHYDAAB2AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwDAACOAwAAjwMAAJEDAAChAwAAowMAAKsDAADPAwAAzwMAANIDAADUAwAA2AMAANgDAADaAwAA2gMAANwDAADcAwAA3gMAAN4DAADgAwAA4AMAAOIDAADiAwAA5AMAAOQDAADmAwAA5gMAAOgDAADoAwAA6gMAAOoDAADsAwAA7AMAAO4DAADuAwAA9AMAAPQDAAD3AwAA9wMAAPkDAAD6AwAA/QMAAC8EAABgBAAAYAQAAGIEAABiBAAAZAQAAGQEAABmBAAAZgQAAGgEAABoBAAAagQAAGoEAABsBAAAbAQAAG4EAABuBAAAcAQAAHAEAAByBAAAcgQAAHQEAAB0BAAAdgQAAHYEAAB4BAAAeAQAAHoEAAB6BAAAfAQAAHwEAAB+BAAAfgQAAIAEAACABAAAigQAAIoEAACMBAAAjAQAAI4EAACOBAAAkAQAAJAEAACSBAAAkgQAAJQEAACUBAAAlgQAAJYEAACYBAAAmAQAAJoEAACaBAAAnAQAAJwEAACeBAAAngQAAKAEAACgBAAAogQAAKIEAACkBAAApAQAAKYEAACmBAAAqAQAAKgEAACqBAAAqgQAAKwEAACsBAAArgQAAK4EAACwBAAAsAQAALIEAACyBAAAtAQAALQEAAC2BAAAtgQAALgEAAC4BAAAugQAALoEAAC8BAAAvAQAAL4EAAC+BAAAwAQAAMEEAADDBAAAwwQAAMUEAADFBAAAxwQAAMcEAADJBAAAyQQAAMsEAADLBAAAzQQAAM0EAADQBAAA0AQAANIEAADSBAAA1AQAANQEAADWBAAA1gQAANgEAADYBAAA2gQAANoEAADcBAAA3AQAAN4EAADeBAAA4AQAAOAEAADiBAAA4gQAAOQEAADkBAAA5gQAAOYEAADoBAAA6AQAAOoEAADqBAAA7AQAAOwEAADuBAAA7gQAAPAEAADwBAAA8gQAAPIEAAD0BAAA9AQAAPYEAAD2BAAA+AQAAPgEAAD6BAAA+gQAAPwEAAD8BAAA/gQAAP4EAAAABQAAAAUAAAIFAAACBQAABAUAAAQFAAAGBQAABgUAAAgFAAAIBQAACgUAAAoFAAAMBQAADAUAAA4FAAAOBQAAEAUAABAFAAASBQAAEgUAABQFAAAUBQAAFgUAABYFAAAYBQAAGAUAABoFAAAaBQAAHAUAABwFAAAeBQAAHgUAACAFAAAgBQAAIgUAACIFAAAkBQAAJAUAACYFAAAmBQAAKAUAACgFAAAqBQAAKgUAACwFAAAsBQAALgUAAC4FAAAxBQAAVgUAAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAAKATAAD1EwAAiRwAAIkcAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABu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AAAACAAAAAQAAAB4BQAAeQUAAHoFAAB1bml0YSBib29sZWFuYSBzdHJpbmdieXRlIGFycmF5Ym9vbGVhbiBgOx0mAAkAAADg+SYAAQAAAGludGVnZXIgYAAAAFQdJgAJAAAA4PkmAAEAAABmbG9hdGluZyBwb2ludCBgcB0mABAAAADg+SYAAQAAAGNoYXJhY3RlciBgAJAdJgALAAAA4PkmAAEAAABzdHJpbmcgAKwdJgAHAAAAdW5pdCB2YWx1ZU9wdGlvbiB2YWx1ZW5ld3R5cGUgc3RydWN0c2VxdWVuY2V1bml0IHZhcmlhbnRuZXd0eXBlIHZhcmlhbnR0dXBsZSB2YXJpYW50c3RydWN0IHZhcmlhbnQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9jb3JlLTEuMC4yMjUvc3JjL2RlL21vZC5ycwAeHiYAZQAAACUJAAASAAAA4PkmAAEAAADg+SYAAQAAAGAgb3IgYAAA4PkmAAEAAACkHiYABgAAAOD5JgABAAAAb25lIG9mIC4wAAAAewUAAAwAAAAEAAAAfAUAAH0FAAB+BQAAAAAAAAAAAAABAAAAzQMAAKAWJwBPAAAAOQYAABQAAACgFicATwAAADkGAAAhAAAAoBYnAE8AAAAtBgAAFAAAAKAWJwBPAAAALQYAACEAAABDFicASwAAADIIAAAeAAAAoBYnAE8AAAC6BAAAJAAAAEVPRiB3aGlsZSBwYXJzaW5nIGEgbGlzdEVPRiB3aGlsZSBwYXJzaW5nIGFuIG9iamVjdEVPRiB3aGlsZSBwYXJzaW5nIGEgc3RyaW5nRU9GIHdoaWxlIHBhcnNpbmcgYSB2YWx1ZWV4cGVjdGVkIGA6YGV4cGVjdGVkIGAsYCBvciBgXWBleHBlY3RlZCBgLGAgb3IgYH1gZXhwZWN0ZWQgaWRlbnRleHBlY3RlZCB2YWx1ZWV4cGVjdGVkIGAiYGludmFsaWQgZXNjYXBlaW52YWxpZCBudW1iZXJudW1iZXIgb3V0IG9mIHJhbmdlaW52YWxpZCB1bmljb2RlIGNvZGUgcG9pbnRjb250cm9sIGNoYXJhY3RlciAoXHUwMDAwLVx1MDAxRikgZm91bmQgd2hpbGUgcGFyc2luZyBhIHN0cmluZ2tleSBtdXN0IGJlIGEgc3RyaW5naW52YWxpZCB2YWx1ZTogZXhwZWN0ZWQga2V5IHRvIGJlIGEgbnVtYmVyIGluIHF1b3Rlc2Zsb2F0IGtleSBtdXN0IGJlIGZpbml0ZSAoZ290IE5hTiBvciArLy1pbmYpbG9uZSBsZWFkaW5nIHN1cnJvZ2F0ZSBpbiBoZXggZXNjYXBldHJhaWxpbmcgY29tbWF0cmFpbGluZyBjaGFyYWN0ZXJzdW5leHBlY3RlZCBlbmQgb2YgaGV4IGVzY2FwZXJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZCBhdCBsaW5lICBjb2x1bW4gAAAAAQAAAAAAAACMISYACQAAAJUhJgAIAAAARXJyb3IoLCBsaW5lOiAsIGNvbHVtbjoguCEmAAYAAAC+ISYACAAAAMYhJgAKAAAAXIInAAEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZV9qc29uLTEuMC4xNDAvc3JjL2Vycm9yLnJz8CEmAGQAAAD3AQAAIQAAAPAhJgBkAAAA+wEAAAwAAADwISYAZAAAAAICAAAhAAAA8CEmAGQAAAALAgAAKgAAAPAhJgBkAAAADwIAACwAAAB7BQAADAAAAAQAAAB8BQAAfQUAAH4FAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAAvCImAA4AAADKIiYACwAAAAAAAAAAAAAAAQAAAH8FAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5yc/giJgBoAAAANQAAAA4AAAAAAAAAAAAAAAEAAABWBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5yc4AjJgBkAAAAKwAAACsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zbWFydHN0cmluZy0xLjAuMS9zcmMvYm94ZWQucnMA9CMmAGMAAABBAAAADgAAAPQjJgBjAAAAdgAAACQAAAA6IAAAAAAAAAQAAAAEAAAAgAUAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjgvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZACMJCYAKQAAAKwEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAjCQmACkAAACyBAAADQAAAHVzZSBvZiBzdGQ6OnRocmVhZDo6Y3VycmVudCgpIGlzIG5vdCBwb3NzaWJsZSBhZnRlciB0aGUgdGhyZWFkJ3MgbG9jYWwgZGF0YSBoYXMgYmVlbiBkZXN0cm95ZWQAADQlJgBeAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9jdXJyZW50LnJzAAAAnCUmACEAAAABAQAACQAAAEFjY2Vzc0Vycm9yY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbjogANslJgBIAAAAbGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkSSYmADcAAAAsJiYAHQAAAKkEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAAmCYmACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnN1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UAzCYmABwAAACKAQAAHQAAAIEFAAAQAAAABAAAAIIFAACDBQAAV291bGRCbG9ja2VudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVxdW90YSBleGNlZWRlZGZpbGUgdG9vIGxhcmdlcmVzb3VyY2UgYnVzeWV4ZWN1dGFibGUgZmlsZSBidXN5ZGVhZGxvY2tjcm9zcy1kZXZpY2UgbGluayBvciByZW5hbWV0b28gbWFueSBsaW5rc2ludmFsaWQgZmlsZW5hbWVhcmd1bWVudCBsaXN0IHRvbyBsb25nb3BlcmF0aW9uIGludGVycnVwdGVkdW5zdXBwb3J0ZWR1bmV4cGVjdGVkIGVuZCBvZiBmaWxlb3V0IG9mIG1lbW9yeWluIHByb2dyZXNzb3RoZXIgZXJyb3J1bmNhdGVnb3JpemVkIGVycm9yT3Njb2RlS2luZEN1c3RvbSAob3MgZXJyb3IgAAABAAAAAAAAADsqJgALAAAAXIInAAEAAABsaWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwBgKiYAFwAAANMCAAAhAAAAYComABcAAAD6AgAALAAAAGAqJgAXAAAA/AIAACYAAABgKiYAFwAAAAkDAAAnAAAAYComABcAAAAVAwAAJwAAAGAqJgAXAAAAfwMAACkAAABgKiYAFwAAAIADAAArAAAAYComABcAAACVAwAALwAAAGAqJgAXAAAAjQMAAC8AAABgKiYAFwAAAJsDAAArAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMYKyYALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAVCsmACMAAADWAAAAFAAAADx1bmtub3duPu+/vWxpYnJhcnkvc3RkL3NyYy8uLi8uLi9iYWNrdHJhY2Uvc3JjL3N5bWJvbGl6ZS9tb2QucnOUKyYANAAAAGcBAAAwAAAAAQAAAAAAAAB4JCYAAgAAAAIAAAAAAAAAAAAEAAAAAAAAAAAAIAAA6CAtIAABAAAAAAAAAAAsJgADAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAgAADoICAgICAgICAgICAgICAgICAgIGF0IAAA4BUnAAEAAABOb3RGb3VuZFBlcm1pc3Npb25EZW5pZWRDb25uZWN0aW9uUmVmdXNlZENvbm5lY3Rpb25SZXNldEhvc3RVbnJlYWNoYWJsZU5ldHdvcmtVbnJlYWNoYWJsZUNvbm5lY3Rpb25BYm9ydGVkTm90Q29ubmVjdGVkQWRkckluVXNlQWRkck5vdEF2YWlsYWJsZU5ldHdvcmtEb3duQnJva2VuUGlwZUFscmVhZHlFeGlzdHNOb3RBRGlyZWN0b3J5SXNBRGlyZWN0b3J5RGlyZWN0b3J5Tm90RW1wdHlSZWFkT25seUZpbGVzeXN0ZW1GaWxlc3lzdGVtTG9vcFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVJbnZhbGlkSW5wdXRJbnZhbGlkRGF0YVRpbWVkT3V0V3JpdGVaZXJvU3RvcmFnZUZ1bGxOb3RTZWVrYWJsZVF1b3RhRXhjZWVkZWRGaWxlVG9vTGFyZ2VSZXNvdXJjZUJ1c3lFeGVjdXRhYmxlRmlsZUJ1c3lEZWFkbG9ja0Nyb3NzZXNEZXZpY2VzVG9vTWFueUxpbmtzSW52YWxpZEZpbGVuYW1lQXJndW1lbnRMaXN0VG9vTG9uZ0ludGVycnVwdGVkVW5zdXBwb3J0ZWRVbmV4cGVjdGVkRW9mT3V0T2ZNZW1vcnlJblByb2dyZXNzT3RoZXJVbmNhdGVnb3JpemVkb3BlcmF0aW9uIHN1Y2Nlc3NmdWxPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAAHQuJgAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHmoLiYAOAAAAIQFAAAMAAAABAAAAIUFAACGBQAAhwUAAAAAAAAAAAAAAQAAAM0DAAAAAAAABAAAAAQAAACIBQAAAAAAAAAAAAABAAAAigUAAIsFAACMBQAAQAAnAGgAAAAEAQAAIAAAAEAAJwBoAAAAJQEAACcAAABAACcAaAAAACoBAAA0AAAAQAAnAGgAAABKAQAAMQAAADogYnBvcyA9IDsgbGluZWJwb3MgPSAAAAEAAAAAAAAAeC8mAAkAAACBLyYADQAAALgPJwABAAAAQAAnAGgAAABLAQAAEQAAAEAAJwBoAAAAYQEAABkAAABAACcAaAAAAIMBAABGAAAAQAAnAGgAAADeAwAANQAAAEAAJwBoAAAA5QMAADYAAABtYXAuc3RhcnRfcG9zID0gOyB0b3RhbF9leHRyYV9ieXRlcyA9IDsgYnBvcyA9IAAAMCYAEAAAABAwJgAWAAAAJjAmAAkAAABAACcAaAAAAOwDAAAJAAAAQAAnAGgAAAAZBAAAEAAAAEAAJwBoAAAAygQAADAAAABAACcAaAAAALYEAAAwAAAAQAAnAGgAAACnBQAAEAAAAG5vIGVycm9ycyBlbmNvdW50ZXJlZCBldmVuIHRob3VnaCBgZGVsYXlfc3Bhbl9idWdgIGlzc3VlZAAAAJgwJgA5AAAAhDomAGgAAACaAQAAEQAAAGVuY291bnRlcmVkIGVycm9yIHdpdGggYC1aIHRyZWF0X2Vycl9hc19idWcA7DAmACsAAACEOiYAaAAAAGcCAAANAAAAFgAAAE1lc3NhZ2VTdWJEaWFnbm9zdGljbGV2ZWxyZW5kZXJfc3BhbkJ1Z0ZhdGFsUGhhc2VGYXRhbFdhcm5pbmdOb3RlSGVscENhbmNlbGxlZEZhaWx1cmVOb3RlL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL2Vycm9ycy9kaWFnbm9zdGljX2J1aWxkZXIucnNFcnJvciBjb25zdHJ1Y3RlZCBidXQgbm90IGVtaXR0ZWQAAACNMSYAdwAAAF0BAAANAAAAAAAAAAAAAAABAAAAjQUAAI4FAACPBQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdW5pY29kZS13aWR0aC0wLjEuMTQvc3JjL3RhYmxlcy5ycwBQMiYAZwAAAJEAAAAVAAAAUDImAGcAAACXAAAAGQAAAAAAAAAMAAAABAAAAJAFAACRBQAAAAAAAAwAAAAEAAAAkgUAAJMFAABhc3NlcnRpb24gZmFpbGVkOiBzdGFydCA8PSBlbmQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfY29tbW9uLTE1LjAuMC9zcmMvaW5wdXQucnMAAAAeMyYAYwAAAB8AAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc291cmNlX2ZpbGVfZW5kID49IGxhc3RfbGluZV9zdGFydC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zeW50YXhfcG9zL2FuYWx5emVfc291cmNlX2ZpbGUucnPIMyYAfAAAACoAAAAJAAAAyDMmAHwAAABqAAAAGAAAAMgzJgB8AAAAagAAAC0AAADIMyYAfAAAAHUAAAAiAAAAyDMmAHwAAAB9AAAAIgAAAMgzJgB8AAAAVQAAAB8AAADIMyYAfAAAAFkAAAAbAAAAyDMmAHwAAABdAAAAGwAAAMgzJgB8AAAAYAAAACYAAADIMyYAfAAAAGMAAAAmAAAAAAAAAAQAAAAEAAAAlAUAAAAAAAAEAAAABAAAAAkBAAABAAAAAAAAAODoJgACAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL3N5bnRheF9wb3MucnMgbWFjcm9zPswAJwABAAAAfDUmAAgAAAA8cXVvdGUgZXhwYW5zaW9uPgAAAJQ1JgARAAAAPGFub24+AACwNSYABgAAADxtYWNybyBleHBhbnNpb24+AAAAwDUmABEAAAA8cHJvYy1tYWNybyBzb3VyY2UgY29kZT7cNSYAGAAAAMwAJwABAAAAywAnAAEAAAAUNSYAaAAAAFMCAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9pbmRleCA8IGFuYWx5c2lzLmxpbmVzLmxlbigpIGFzIGlzaXplFDUmAGgAAACpAwAACQAAABUAAABQcmltYXJ5U3BhbkxhYmVsTXVsdGlTcGFucHJpbWFyeV9zcGFuc3NwYW5fbGFiZWxzQnl0ZVBvc01haW5IZWFkZXJNc2dIZWFkZXJNc2dMaW5lQW5kQ29sdW1uTGluZU51bWJlclF1b3RhdGlvblVuZGVybGluZVByaW1hcnlVbmRlcmxpbmVTZWNvbmRhcnlMYWJlbFByaW1hcnlMYWJlbFNlY29uZGFyeU9sZFNjaG9vbE5vdGVUZXh0Tm9TdHlsZUxldmVsSGlnaGxpZ2h0b3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybTw3JgAoAAAAJAAAAAIAAABkNyYAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXh4NyYAIAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJzoDcmAFwAAAATAAAACQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvc3RkL3NyYy9wYXRoLnJzAAw4JgBHAAAAuAwAABsAAAAMOCYARwAAANsMAAAhAAAADDgmAEcAAADODAAAIgAAAAWWJgBwAAAAaQEAAA0AAAC4AScAAQAAAE1hcmsAAAAAAAAAAAEAAAB0BAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2NvbW1vbi0xNS4wLjAvc3JjL2NvbW1lbnRzLnJzAACwOCYAZgAAAKcBAAAW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AAAAIQEAAMEFAAAMAAAABAAAAMIFAADDBQAABAAAAAQAAADEBQAAZmFpbGVkIHRvIHBhcnNlIHN0cmluZyBhcyBudW1iZXKAhCYAcgAAALADAAAvAAAAZmFpbGVkIHRvIHBhcnNlIG51bWJlciBhcyBjaGFyAACAhCYAcgAAALIDAAAOAAAAbWVzc2FnZXF1b3RhbXBhcG9zbHRndG5ic3BpZXhjbGNlbnRwb3VuZGN1cnJlbnllbmJydmJhcnNlY3R1bWxjb3B5b3JkZmxhcXVvbm90c2h5cmVnbWFjcmRlZ3BsdXNtbnN1cDJzdXAzYWN1dGVtaWNyb3BhcmFtaWRkb3RjZWRpbHN1cDFvcmRtcmFxdW9mcmFjMTRmcmFjMTJmcmFjMzRpcXVlc3RBZ3JhdmVBYWN1dGVBY2lyY0F0aWxkZUF1bWxBcmluZ0FFbGlnQ2NlZGlsRWdyYXZlRWFjdXRlRWNpcmNFdW1sSWdyYXZlSWFjdXRlSWNpcmNJdW1sRVRITnRpbGRlT2dyYXZlT2FjdXRlT2NpcmNPdGlsZGVPdW1sdGltZXNPc2xhc2hVZ3JhdmVVYWN1dGVVY2lyY1V1bWxZYWN1dGVUSE9STnN6bGlnYWdyYXZlYWFjdXRlYWNpcmNhdGlsZGVhdW1sYXJpbmdhZWxpZ2NjZWRpbGVncmF2ZWVhY3V0ZWVjaXJjZXVtbGlncmF2ZWlhY3V0ZWljaXJjaXVtbGV0aG50aWxkZW9ncmF2ZW9hY3V0ZW9jaXJjb3RpbGRlb3VtbGRpdmlkZW9zbGFzaHVncmF2ZXVhY3V0ZXVjaXJjdXVtbHlhY3V0ZXRob3JueXVtbE9FbGlnb2VsaWdTY2Fyb25zY2Fyb25ZdW1sZm5vZmNpcmN0aWxkZUFscGhhQmV0YUdhbW1hRGVsdGFFcHNpbG9uWmV0YUV0YVRoZXRhSW90YUthcHBhTGFtYmRhTXVOdVhpT21pY3JvblBpUmhvU2lnbWFUYXVVcHNpbG9uUGhpQ2hpUHNpT21lZ2FhbHBoYWJldGFnYW1tYWRlbHRhZXBzaWxvbnpldGFldGF0aGV0YWlvdGFrYXBwYWxhbWJkYW11bnV4aW9taWNyb25waXJob3NpZ21hZnNpZ21hdGF1dXBzaWxvbnBoaWNoaXBzaW9tZWdhdGhldGFzeW11cHNpaHBpdmVuc3BlbXNwdGhpbnNwenduanp3amxybXJsbW5kYXNobWRhc2hsc3F1b3JzcXVvc2JxdW9sZHF1b3JkcXVvYmRxdW9kYWdnZXJEYWdnZXJidWxsaGVsbGlwcGVybWlscHJpbWVQcmltZWxzYXF1b3JzYXF1b29saW5lZnJhc2xldXJvaW1hZ2V3ZWllcnByZWFsdHJhZGVhbGVmc3ltbGFycnVhcnJyYXJyZGFycmhhcnJjcmFycmxBcnJ1QXJyckFycmRBcnJoQXJyZm9yYWxscGFydGV4aXN0ZW1wdHluYWJsYWlzaW5ub3Rpbm5pcHJvZHN1bW1pbnVzbG93YXN0cmFkaWNpbmZpbmFuZ2FuZG9yY2FwY3VwaW50dGhlcmU0c2ltY29uZ2FzeW1wbmVlcXVpdmxlZ2VzdWJzdXBuc3Vic3ViZXN1cGVvcGx1c290aW1lc3BlcnBzZG90bGNlaWxyY2VpbGxmbG9vcnJmbG9vcmxhbmdyYW5nbG96c3BhZGVzY2x1YnNoZWFydHNkaWFtc3N0cnVjdCBUc1N5bnRheAAAxQUAACAAAAAIAAAAHQEAAMYFAAAEAAAABAAAAJUBAADHBQAABAAAAAQAAAAeAQAAAAAAAAEAAAABAAAAIAAAAKsFAAAMAAAABAAAAEgCAAAAAAAAAQAAAAEAAADIBQAAyQUAAAQAAAAEAAAAygUAAAAAAAABAAAAAQAAAMsFAADMBQAADAAAAAQAAADNBQAAzgUAABgAAAAEAAAAtgUAAM8FAAAQAAAACAAAANAFAADRBQAAIAAAAAgAAADSBQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL3V0aWwucnMBAAAAAAAAAMgAJwABAAAAAQAAAAAAAADgFScAAQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IFVzaW5nIGlzIG5vdCBhIHZhbGlkIGRlY2xhcmF0aW9uIGZvciBgZGVjbGFyZWAga2V5d29yZLRNJgBgAAAAIE0mAHQAAABZAAAAHAAAAAAAAAABAAAAAQAAANQFAAAAAAAAAQAAAAEAAABlBQAAqwUAAAwAAAAEAAAASAIAAFBhcnNlSW50RXJyb3IAAADVBQAABAAAAAQAAACCAQAA1gUAAAwAAAAEAAAAQwIAAAAAAAABAAAAAQAAAMgFAAAAAAAAAQAAAAEAAAAgAAAAAAAAAAQAAAAEAAAA1wUAANgFAAAYAAAACAAAAKYBAADZBQAABAAAAAQAAADaBQAAAAAAAAQAAAAEAAAA2wUAAAAAAAABAAAAAQAAANwFAADdBQAAMAAAAAgAAADeBQAAAAAAAAQAAAAEAAAASwEAAN8FAAAEAAAABAAAAB4BAAAAAAAABAAAAAQAAABNAgAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vbGV4ZXIvbnVtYmVyLnJzAAAAPE8mAHUAAAA6AAAAJAAAADxPJgB1AAAARgAAACMAAAA8TyYAdQAAAFIAAAAjAAAAPE8mAHUAAABcAAAAGgAAADxPJgB1AAAAWgAAABoAAABVbmV4cGVjdGVkIGVvZi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvZXJyb3IucnNEZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gZm9yLWluIGxvb3BVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgZW5hYmxlZC4gU2V0IGpzYy5wYXJzZXIuZXhwbGljaXRSZXNvdXJjZU1hbmFnZW1lbnQgdG8gdHJ1ZVVzaW5nIGRlY2xhcmF0aW9uIG9ubHkgYWxsb3dzIGlkZW50aWZpZXJzVXNpbmcgZGVjbGFyYXRpb24gcmVxdWlyZXMgaW5pdGlhbGl6ZXJwcml2YXRlIG5hbWVzIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcmZhY2VJbnZhbGlkIGBzdXBlcigpYEludmFsaWQgYWNjZXNzIHRvIHN1cGVySW5kZXggc3VwZXIgd2l0aCBwcml2YXRlIG5hbWUgaXMgbm90IGFsbG93ZWQnbmV3LnRhcmdldCcgaXMgb25seSBhbGxvd2VkIGluIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGZ1bmN0aW9uIGV4cHJlc3Npb24sIG9yIGNsYXNzLkltcG9ydCBpcyBub3QgYWxsb3dlZCBoZXJlQW4gYXJyb3cgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgaGVyZWBleHBvcnRgIGlzIG5vdCBhbGxvd2VkIGhlcmVBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgcmVhZG9ubHlBIGdldHRlciBvciBhIHNldHRlciBjYW5ub3QgYmUgb3B0aW9uYWxBIGBnZXRgIGFjY2Vzc29yIGNhbm5vdCBoYXZlIHBhcmFtZXRlcnNBIGBzZXRgIGFjY2Vzc29yIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJ0b3AgbGV2ZWwgYXdhaXQgaXMgb25seSBhbGxvd2VkIGluIG1vZHVsZUxlZ2FjeSBkZWNpbWFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlTGVnYWN5IG9jdGFsIGVzY2FwZSBpcyBub3QgcGVybWl0dGVkIGluIHN0cmljdCBtb2RlSW52YWxpZCBjaGFyYWN0ZXIgaW4gaWRlbnRpZmllcmEgYmluYXJ5YW4gb2N0YWxhIGRlY2ltYWxhIGhleGFkZWNpbWFsRXhwZWN0ZWQgIGRpZ2l0AAAAOlQmAAkAAABDVCYABgAAABJQJgBnAAAAQAEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW5leHBlY3RlZCBlc2NhcGUgc2VxdWVuY2UgaW4gcmVzZXJ2ZWQgd29yZDogAAZVJgAtAAAAVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlclVuZXhwZWN0ZWQgY2hhcmFjdGVyIItVJgAVAAAASW52YWxpZCBzdHJpbmcgZXNjYXBlSW52YWxpZCB1bmljb2RlIGVzY2FwZUJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLCBleHBlY3RlZCAA01UmACgAAABFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZQDg+SYAAQAAAFdWJgAwAAAAYGF3YWl0YCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIGFuIGFzeW5jIGNvbnRleHQnZXZhbCcgYW5kICdhcmd1bWVudHMnIGNhbm5vdCBiZSB1c2VkIGFzIGEgYmluZGluZyBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlJ2FyZ3VtZW50cycgaXMgb25seSBhbGxvd2VkIGluIGZ1bmN0aW9ucyBhbmQgY2xhc3MgbWV0aG9kc0lsbGVnYWwgJ3VzZSBzdHJpY3QnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QuJyoqJyBjYW5ub3QgYmUgYXBwbGllZCB0byB1bmFyeS9hd2FpdCBleHByZXNzaW9uLlVuZXhwZWN0ZWQgdG9rZW4gJyMnTGluZUJyZWFrIGNhbm5vdCBmb2xsb3cgJ3Rocm93J1VuZXhwZWN0ZWQgbGluZSBicmVhayBiZXR3ZWVuIGFycm93IGhlYWQgYW5kIGFycm93VW5leHBlY3RlZCB0b2tlbiBgYC4gRXhwZWN0ZWQgADlYJgASAAAAS1gmAAwAAAAgLCBvciAAAGtYJgADAAAAIG9yIFVuZXhwZWN0ZWQgdG9rZW4uIERpZCB5b3UgbWVhbiAAfFgmAB8AAACnDCcAAQAAAGNhbm5vdCBpbXBvcnQgYXMgcmVzZXJ2ZWQgd29yZGFzc2lnbm1lbnQgcHJvcGVydHkgaXMgaW52YWxpZCBzeW50YXhFeHBlY3RlZCAnJywgZ290ICcnAADvWCYACgAAAPlYJgAIAAAAAVkmAAEAAABFeHBlY3RlZCAnOycsICd9JyBvciA8ZW9mPmF3YWl0KiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFzeW5jIGZ1bmN0aW9ucyBwcm9wb3NhbC4gVXNlIFByb21pc2UuYWxsKCkgaW5zdGVhZC5DYW5ub3QgdXNlIGEgcmVzZXJ2ZWQgd29yZCBhcyBhIHNob3J0aGFuZCBwcm9wZXJ0eU51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnNBIHN3aXRjaCBibG9jayBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0c1RyYWlsaW5nIGNvbW1hIGlzbid0IHBlcm1pdHRlZCBhZnRlciBhIHJlc3QgZWxlbWVudFJlc3QgZWxlbWVudCBtdXN0IGJlIGZpbmFsIGVsZW1lbnRQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gc3ByZWFkIG9wZXJhdG9yUGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBiZSBlbXB0eU5vdCBhIHBhdHRlcm5Ob3QgYW4gZXhwcmVzc2lvbkNhbm5vdCBhc3NpZ24gdG8gdGhpc0ludmFsaWQgYXNzaWdubWVudCB0YXJnZXRFeHBlY3RlZCBpZGVudEV4cGVjdGVkICc7JyBvciBsaW5lIGJyZWFrTGFiZWwgIGlzIGFscmVhZHkgZGVjbGFyZWQAAABjWyYABgAAAGlbJgAUAAAAQW4gYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGdlbmVyYXRvcidpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgYXJlIG5vdCBwZXJtaXR0ZWQgaGVyZSdpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZSdpbXBvcnQubWV0YScgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZS5EZXN0cnVjdHVyaW5nIGJpbmRpbmdzIHJlcXVpcmUgaW5pdGlhbGl6ZXJzV2l0aCBzdGF0ZW1lbnQgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlUmV0dXJuIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCBoZXJlRXhwZWN0ZWQgb25lIHZhcmlhYmxlIGJpbmRpbmdVbmV4cGVjdGVkIGluaXRpYWxpemVyIGluIGZvciBpbi9vZiBsb29wR2VuZXJhdG9yIG9yIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZEZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZCBpbiBzdHJpY3QgbW9kZSd5aWVsZCcgY2Fubm90IGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2l0aGluIGdlbmVyYXRvcmBhd2FpdGAgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIuZm9yIGF3YWl0IHN5bnRheCBpcyB2YWxpZCBvbmx5IGZvciBmb3Itb2Ygc3RhdGVtZW50YXdhaXQgaXNuJ3QgYWxsb3dlZCBpbiBub24tYXN5bmMgZnVuY3Rpb25VbnRlcm1pbmF0ZWQgSlNYIGNvbnRlbnRzSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb25KU1ggdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBhbiBleHByZXNzaW9uIG9yIGEgcXVvdGVkIEpTWCB0ZXh0RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDw+RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDwAAAD5XiYALAAAAMsAJwABAAAATGVhZGluZyBkZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBkZWNsYXJhdGlvblVzaW5nIHRoZSBleHBvcnQga2V5d29yZCBiZXR3ZWVuIGEgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIGBleHBvcnQgQGRlYyBjbGFzc2AgaW5zdGVhZC5BIHJlcXVpcmVkIGVsZW1lbnQgY2Fubm90IGZvbGxvdyBhbiBvcHRpb25hbCBlbGVtZW50LlR5cGVzY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IG11c3QgYmUgYW4gaWRlbnRpZmllciBvciBhc3NpZ25tZW50IHBhdHRlcm5VbmV4cGVjdGVkIHNwYWNlIGJldHdlZW4gIyBhbmQgaWRlbnRpZmllckNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFzeW5jIGZ1bmN0aW9uQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBub24tc3RhdGljIGZpZWxkIG5hbWVkICdjb25zdHJ1Y3RvcidDbGFzc2VzIGNhbid0IGhhdmUgYSBwcml2YXRlIGZpZWxkIG5hbWVkICcjY29uc3RydWN0b3InLicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllcgAAAAFZJgABAAAAImEmADMAAABDbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YCBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGBmcm9tYCBjbGF1c2UAAOD5JgABAAAANGMmACYAAABgLi4uYCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgaW4gZGVjbGFyYXRpb24gY29udGV4dHNBIG51bWVyaWMgc2VwYXJhdG9yIGlzIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIHR3byBkaWdpdHNBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGltcG9ydGVkIGJpbmRpbmcuCi0gRGlkIHlvdSBtZWFuIGBpbXBvcnQgeyAiIiBhcyBmb28gfWA/AOFjJgBSAAAAM2QmAAwAAABBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBgZnJvbWAuJ2NvbnN0JyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZER1cGxpY2F0ZWQgcmVndWxhciBleHByZXNzaW9uIGZsYWcgJycuvmQmACQAAADiZCYAAgAAAFVua25vd24gcmVndWxhciBleHByZXNzaW9uIGZsYWdzLkV4cGVjdGVkIGFuIGlkZW50aWZpZXJFeHBlY3RlZCBhIHNlbWljb2xvblRyYWlsaW5nIGNvbW1hIGlzIG5vdCBhbGxvd2VkQSByZXN0IHBhcmFtZXRlciBtdXN0IGJlIGxhc3QgaW4gYSBwYXJhbWV0ZXIgbGlzdFBhcmFtZXRlciBjYW5ub3QgaGF2ZSBxdWVzdGlvbiBtYXJrIGFuZCBpbml0aWFsaXplcicgbW9kaWZpZXIgbXVzdCBwcmVjZWRlICcnIG1vZGlmaWVyLgFZJgABAAAAwGUmABkAAADZZSYACwAAACcgbW9kaWZpZXIgYWxyZWFkeSBzZWVuLgFZJgABAAAA/GUmABgAAABgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlcicgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uAAAAAVkmAAEAAACgZyYANQAAAFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb24nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJwAAAAFZJgABAAAAEW0mACAAAADZZSYACwAAAEFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5BYnN0cmFjdCBtZXRob2QgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24uQWJzdHJhY3QgcHJvcGVydHkgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIAAAABWSYAAQAAAOFtJgAsAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcwAAAVkmAAEAAAAgbiYAUgAAACcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGNsYXNzAAAAAVkmAAEAAACEbiYATQAAAFRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUeXBlc2NyaXB0IG5vbi1udWxsIGFzc2VydGlvbiBvcGVyYXRvciBpcyBub3QgYWxsb3dlZCB3aXRoICcAv3MmADwAAAABWSYAAQAAAFRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIFVzZSBhbiBgYXNgIGV4cHJlc3Npb24gaW5zdGVhZC5UaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBBZGQgYSB0cmFpbGluZyBjb21tYSwgYXMgaW4gYDxULD4oKSA9PiAuLi5gLlRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcGFydCBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudHByZXZpb3VzIGRlZmF1bHQgY2FzZSBpcyBkZWNsYXJlZCBhdCBoZXJlRW9mRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkVXNpbmdEZWNsTm90QWxsb3dlZEZvckZvckluTG9vcFVzaW5nRGVjbE5vdEVuYWJsZWRJbnZhbGlkTmFtZUluVXNpbmdEZWNsSW5pdFJlcXVpcmVkRm9yVXNpbmdEZWNsUHJpdmF0ZU5hbWVJbkludGVyZmFjZUludmFsaWRTdXBlckNhbGxJbnZhbGlkU3VwZXJJbnZhbGlkU3VwZXJQcml2YXRlTmFtZUludmFsaWROZXdUYXJnZXRJbnZhbGlkSW1wb3J0QXJyb3dOb3RBbGxvd2VkRXhwb3J0Tm90QWxsb3dlZEdldHRlclNldHRlckNhbm5vdEJlUmVhZG9ubHlHZXR0ZXJTZXR0ZXJDYW5ub3RCZU9wdGlvbmFsR2V0dGVyUGFyYW1TZXR0ZXJQYXJhbVRvcExldmVsQXdhaXRJblNjcmlwdExlZ2FjeURlY2ltYWxMZWdhY3lPY3RhbEludmFsaWRJZGVudENoYXJFeHBlY3RlZERpZ2l0cmFkaXhTZXR0ZXJQYXJhbVJlcXVpcmVkUmVzdFBhdEluU2V0dGVyVW50ZXJtaW5hdGVkQmxvY2tDb21tZW50VW50ZXJtaW5hdGVkU3RyTGl0RXhwZWN0ZWRVbmljb2RlRXNjYXBlRXNjYXBlSW5SZXNlcnZlZFdvcmR3b3JkVW50ZXJtaW5hdGVkUmVnRXhwVW50ZXJtaW5hdGVkVHBsSWRlbnRBZnRlck51bVVuZXhwZWN0ZWRDaGFyY0ludmFsaWRTdHJFc2NhcGVJbnZhbGlkVW5pY29kZUVzY2FwZUJhZENoYXJhY3RlckVzY2FwZVNlcXVlbmNlZXhwZWN0ZWROdW1MaXRUZXJtaW5hdGVkV2l0aEV4cExlZ2FjeUNvbW1lbnRJbk1vZHVsZUludmFsaWRJZGVudEluU3RyaWN0SW52YWxpZElkZW50SW5Bc3luY0V2YWxBbmRBcmd1bWVudHNJblN0cmljdEFyZ3VtZW50c0luQ2xhc3NGaWVsZElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmVVbmFyeUluRXhwbGVmdF9zcGFuSGFzaExpbmVCcmVha0luVGhyb3dMaW5lQnJlYWtCZWZvcmVBcnJvd1VuZXhwZWN0ZWRnb3RVbmV4cGVjdGVkVG9rZW5XaXRoU3VnZ2VzdGlvbnNjYW5kaWRhdGVfbGlzdFJlc2VydmVkV29yZEluSW1wb3J0QXNzaWduUHJvcGVydHlFeHBlY3RlZEV4cGVjdGVkU2VtaUZvckV4cHJTdG10QXdhaXRTdGFyUmVzZXJ2ZWRXb3JkSW5PYmpTaG9ydGhhbmRPclBhdE51bGxpc2hDb2FsZXNjaW5nV2l0aExvZ2ljYWxPcE11bHRpcGxlRGVmYXVsdHByZXZpb3VzQ29tbWFBZnRlclJlc3RFbGVtZW50Tm9uTGFzdFJlc3RQYXJhbVNwcmVhZEluUGFyZW5FeHByRW1wdHlQYXJlbkV4cHJJbnZhbGlkUGF0SW52YWxpZEV4cHJOb3RTaW1wbGVBc3NpZ25JbnZhbGlkQXNzaWduVGFyZ2V0RXhwZWN0ZWRJZGVudEV4cGVjdGVkU2VtaUR1cGxpY2F0ZUxhYmVsQXN5bmNHZW5lcmF0b3JOb25Ub3BMZXZlbEltcG9ydEV4cG9ydEltcG9ydEV4cG9ydEluU2NyaXB0SW1wb3J0TWV0YUluU2NyaXB0UGF0VmFyV2l0aG91dEluaXRXaXRoSW5TdHJpY3RSZXR1cm5Ob3RBbGxvd2VkVG9vTWFueVZhckluRm9ySW5IZWFkVmFySW5pdGlhbGl6ZXJJbkZvckluSGVhZExhYmVsbGVkR2VuZXJhdG9yT3JBc3luY0xhYmVsbGVkRnVuY3Rpb25JblN0cmljdFlpZWxkUGFyYW1JbkdlbkF3YWl0UGFyYW1JbkFzeW5jQXdhaXRGb3JTdG10QXdhaXRJbkZ1bmN0aW9uVW50ZXJtaW5hdGVkSlNYQ29udGVudHNFbXB0eUpTWEF0dHJJbnZhbGlkSlNYVmFsdWVKU1hFeHBlY3RlZENsb3NpbmdUYWdGb3JMdEd0SlNYRXhwZWN0ZWRDbG9zaW5nVGFnSW52YWxpZExlYWRpbmdEZWNvcmF0b3JEZWNvcmF0b3JPbkV4cG9ydFRzUmVxdWlyZWRBZnRlck9wdGlvbmFsVHNJbnZhbGlkUGFyYW1Qcm9wUGF0U3BhY2VCZXR3ZWVuSGFzaEFuZElkZW50QXN5bmNDb25zdHJ1Y3RvclByb3BlcnR5TmFtZWRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvclByaXZhdGVOYW1lTW9kaWZpZXJDb25zdHJ1Y3RvckFjY2Vzc29yUmVhZE9ubHlNZXRob2RHZW5lcmF0b3JDb25zdHJ1Y3RvckR1cGxpY2F0ZUNvbnN0cnVjdG9yVHNCaW5kaW5nUGF0Q2Fubm90QmVPcHRpb25hbFN1cGVyQ2FsbE9wdGlvbmFsT3B0Q2hhaW5DYW5ub3RGb2xsb3dDb25zdHJ1Y3RvckNhbGxUYWdnZWRUcGxJbk9wdENoYWluVHJhaWxpbmdDb21tYUluc2lkZUltcG9ydEV4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRT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bGV4aW5nIGVycm9yOiAACJEmAA8AAADLACcAAQAAAOwUJwBuAAAARwQAABUAAAA8ZW9mPgAAAOwUJwBuAAAAMAUAABUAAABXb3JkVGVtcGxhdGXwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADwBQAA8AUAAPAFAADxBQAA8gUAAPMFAAD0BQAA9QUAAPYFAADyBQAA9wUAAPgFAAD5BQAA+gUAAPsFAAD8BQAA/QUAAP4FAAD/BQAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAQYAAAIGAAADBgAABAYAAAUGAAAGBgAABwYAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAA9AUAAPQFAAD0BQAACAYAAPQFAAAJBgAACgYAAPQFAAALBgAADAYAAA0GAAAOBgAADwYAABAGAAARBgAAEgYAAPQFAAATBgAA9AUAABQGAAAVBgAAFgYAABcGAAAYBgAAGQYAAPQFAAAaBgAAGwYAABwGAAAdBgAAHgYAAB8GAAD0BQAAIAYAAPQFAAAhBgAAIgYAACMGAAAkBgAA8AUAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAJQYAACUGAAAlBgAAcGFja2FnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAABPa0Vyci9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zeW50YXhfcG9zL2h5Z2llbmUucnMAAAAFliYAcAAAALcBAAA2AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI4LjAuMS9zcmMvaGVscGVycy9tb2QucnMAiJYmAHcAAAD7AAAAAQAAAF9hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcl9hcnJheV9saWtlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2FycmF5X2xpa2VfdG9fYXJyYXlfYXJyYXlfd2l0aF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRoX2hvbGVzX2FycmF5X3dpdGhvdXRfaG9sZXNAc3djL2hlbHBlcnMvXy9fYXJyYXlfd2l0aG91dF9ob2xlc19hc3NlcnRfdGhpc19pbml0aWFsaXplZEBzd2MvaGVscGVycy9fL19hc3NlcnRfdGhpc19pbml0aWFsaXplZF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfZ2VuZXJhdG9yX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZUBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfZGVsZWdhdGVfYXN5bmNfaXRlcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfaXRlcmF0b3JfYXN5bmNfdG9fZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX3RvX2dlbmVyYXRvcl9hd2FpdF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXdhaXRfYXN5bmNfZ2VuZXJhdG9yX2F3YWl0X3ZhbHVlQHN3Yy9oZWxwZXJzL18vX2F3YWl0X3ZhbHVlX2NhbGxfc3VwZXJAc3djL2hlbHBlcnMvXy9fY2FsbF9zdXBlcl9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25Ac3djL2hlbHBlcnMvXy9fY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZV9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZV9jbGFzc19jYWxsX2NoZWNrQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NhbGxfY2hlY2tfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfbmFtZV90ZHpfZXJyb3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfbmFtZV90ZHpfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdF9jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5X2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0X2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9pbml0X2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZV9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9fY29uc3RydWN0X2NyZWF0ZV9jbGFzc0Bzd2MvaGVscGVycy9fL19jcmVhdGVfY2xhc3NfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fZGVjb3JhdGVfZGVmYXVsdHNAc3djL2hlbHBlcnMvXy9fZGVmYXVsdHNfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19kZWZpbmVfcHJvcGVydHlfZXhwb3J0X3N0YXJAc3djL2hlbHBlcnMvXy9fZXhwb3J0X3N0YXJfZXh0ZW5kc0Bzd2MvaGVscGVycy9fL19leHRlbmRzX2dldEBzd2MvaGVscGVycy9fL19nZXRfZ2V0X3Byb3RvdHlwZV9vZkBzd2MvaGVscGVycy9fL19nZXRfcHJvdG90eXBlX29mX2luaGVyaXRzQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2luaGVyaXRzX2xvb3NlQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2xvb3NlX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlfaW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJAc3djL2hlbHBlcnMvXy9faW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJfaW5zdGFuY2VvZkBzd2MvaGVscGVycy9fL19pbnN0YW5jZW9mX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0QHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0X2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZEBzd2MvaGVscGVycy9fL19pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRfaXNfbmF0aXZlX2Z1bmN0aW9uQHN3Yy9oZWxwZXJzL18vX2lzX25hdGl2ZV9mdW5jdGlvbl9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9pdGVyYWJsZV90b19hcnJheV9saW1pdEBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZV9qc3hAc3djL2hlbHBlcnMvXy9fanN4X25ld19hcnJvd19jaGVja0Bzd2MvaGVscGVycy9fL19uZXdfYXJyb3dfY2hlY2tfbm9uX2l0ZXJhYmxlX3Jlc3RAc3djL2hlbHBlcnMvXy9fbm9uX2l0ZXJhYmxlX3Jlc3Rfbm9uX2l0ZXJhYmxlX3NwcmVhZEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfc3ByZWFkX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5QHN3Yy9oZWxwZXJzL18vX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5X29iamVjdF9zcHJlYWRAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9vYmplY3Rfc3ByZWFkX3Byb3BzQHN3Yy9oZWxwZXJzL18vX29iamVjdF9zcHJlYWRfcHJvcHNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZV9vdmVybG9hZF95aWVsZEBzd2MvaGVscGVycy9fL19vdmVybG9hZF95aWVsZF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5Ac3djL2hlbHBlcnMvXy9fcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuX3JlYWRfb25seV9lcnJvckBzd2MvaGVscGVycy9fL19yZWFkX29ubHlfZXJyb3Jfc2V0QHN3Yy9oZWxwZXJzL18vX3NldF9zZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3NldF9wcm90b3R5cGVfb2Zfc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dEBzd2MvaGVscGVycy9fL19za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0X3NsaWNlZF90b19hcnJheUBzd2MvaGVscGVycy9fL19zbGljZWRfdG9fYXJyYXlfc2xpY2VkX3RvX2FycmF5X2xvb3NlQHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9sb29zZV9zdXBlcl9wcm9wX2Jhc2VAc3djL2hlbHBlcnMvXy9fc3VwZXJfcHJvcF9iYXNlX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlX3Rocm93QHN3Yy9oZWxwZXJzL18vX3Rocm93X3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3RvX2FycmF5X3RvX2NvbnN1bWFibGVfYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fY29uc3VtYWJsZV9hcnJheV90b19wcmltaXRpdmVAc3djL2hlbHBlcnMvXy9fdG9fcHJpbWl0aXZlX3RvX3Byb3BlcnR5X2tleUBzd2MvaGVscGVycy9fL190b19wcm9wZXJ0eV9rZXlfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX3VwZGF0ZV90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3R5cGVfb2ZfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlfd3JhcF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fd3JhcF9hc3luY19nZW5lcmF0b3Jfd3JhcF9uYXRpdmVfc3VwZXJAc3djL2hlbHBlcnMvXy9fd3JhcF9uYXRpdmVfc3VwZXJfd3JpdGVfb25seV9lcnJvckBzd2MvaGVscGVycy9fL193cml0ZV9vbmx5X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0X2NyZWF0ZV9zdXBlckBzd2MvaGVscGVycy9fL19jcmVhdGVfc3VwZXJfY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VfdHNfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fdHNfZGVjb3JhdGVfdHNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3RzX2dlbmVyYXRvcl90c19tZXRhZGF0YUBzd2MvaGVscGVycy9fL190c19tZXRhZGF0YV90c19wYXJhbUBzd2MvaGVscGVycy9fL190c19wYXJhbV90c192YWx1ZXNAc3djL2hlbHBlcnMvXy9fdHNfdmFsdWVzX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlQHN3Yy9oZWxwZXJzL18vX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzQHN3Yy9oZWxwZXJzL18vX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzX3RzX3Jld3JpdGVfcmVsYXRpdmVfaW1wb3J0X2V4dGVuc2lvbkBzd2MvaGVscGVycy9fL190c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25fYXBwbHlfZGVjc18yMjAzX3JAc3djL2hlbHBlcnMvXy9fYXBwbHlfZGVjc18yMjAzX3JfaWRlbnRpdHlAc3djL2hlbHBlcnMvXy9faWRlbnRpdHlfZGlzcG9zZUBzd2MvaGVscGVycy9fL19kaXNwb3NlX3VzaW5nQHN3Yy9oZWxwZXJzL18vX3VzaW5nX3VzaW5nX2N0eEBzd2MvaGVscGVycy9fL191c2luZ19jdHhhcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcmFycmF5X2xpa2VfdG9fYXJyYXlhcnJheV93aXRoX2hvbGVzYXJyYXlfd2l0aG91dF9ob2xlc2Fzc2VydF90aGlzX2luaXRpYWxpemVkYXN5bmNfZ2VuZXJhdG9yYXN5bmNfZ2VuZXJhdG9yX2RlbGVnYXRlYXN5bmNfaXRlcmF0b3Jhc3luY190b19nZW5lcmF0b3Jhd2FpdF9hc3luY19nZW5lcmF0b3Jhd2FpdF92YWx1ZWNhbGxfc3VwZXJjaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXRjbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldGNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlY2xhc3NfY2FsbF9jaGVja2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JjbGFzc19uYW1lX3Rkel9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZ2V0Y2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0Y2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9rZXljbGFzc19wcml2YXRlX2ZpZWxkX3NldGNsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0Y2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdGNsYXNzX3ByaXZhdGVfbWV0aG9kX3NldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfZ2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF91cGRhdGVjb25zdHJ1Y3RjcmVhdGVfY2xhc3NkZWNvcmF0ZWRlZmF1bHRzZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc2RlZmluZV9wcm9wZXJ0eWV4cG9ydF9zdGFyZ2V0X3Byb3RvdHlwZV9vZmluaGVyaXRzaW5oZXJpdHNfbG9vc2Vpbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlpbml0aWFsaXplcl93YXJuaW5nX2hlbHBlcmludGVyb3BfcmVxdWlyZV9kZWZhdWx0aW50ZXJvcF9yZXF1aXJlX3dpbGRjYXJkaXNfbmF0aXZlX2Z1bmN0aW9uaXRlcmFibGVfdG9fYXJyYXlpdGVyYWJsZV90b19hcnJheV9saW1pdGl0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlanN4bmV3X2Fycm93X2NoZWNrbm9uX2l0ZXJhYmxlX3Jlc3Rub25faXRlcmFibGVfc3ByZWFkb2JqZWN0X2Rlc3RydWN0dXJpbmdfZW1wdHlvYmplY3Rfc3ByZWFkb2JqZWN0X3NwcmVhZF9wcm9wc29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3Nlb3ZlcmxvYWRfeWllbGRwb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5yZWFkX29ubHlfZXJyb3JzZXRfcHJvdG90eXBlX29mc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dHNsaWNlZF90b19hcnJheXNsaWNlZF90b19hcnJheV9sb29zZXN1cGVyX3Byb3BfYmFzZXRhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsdGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWxfbG9vc2V0b19hcnJheXRvX2NvbnN1bWFibGVfYXJyYXl0b19wcmltaXRpdmV0b19wcm9wZXJ0eV9rZXl0eXBlX29mdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXl3cmFwX2FzeW5jX2dlbmVyYXRvcndyYXBfbmF0aXZlX3N1cGVyd3JpdGVfb25seV9lcnJvcmNsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRjbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3Npc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RjcmVhdGVfc3VwZXJjcmVhdGVfZm9yX29mX2l0ZXJhdG9yX2hlbHBlcl9sb29zZXRzX2RlY29yYXRldHNfZ2VuZXJhdG9ydHNfbWV0YWRhdGF0c19wYXJhbXRzX3ZhbHVlc3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNldHNfZGlzcG9zZV9yZXNvdXJjZXN0c19yZXdyaXRlX3JlbGF0aXZlX2ltcG9ydF9leHRlbnNpb25hcHBseV9kZWNzXzIyMDNfcmlkZW50aXR5ZGlzcG9zZXVzaW5nX2N0eEBzd2MvaGVscGVycy9fL18AAADZtSYAEAAAACYGAABNYXJrZXIgcHJvdmlkZWQgdG8gcmVzb2x2ZXIgc2hvdWxkIG5vdCBiZSB0aGUgcm9vdCBtYXJrAPi1JgA3AAAArL4mAHgAAACHAAAABQAAAFN1cGVyRm5FeHByQmluRXhwck5ld0V4cHJjYWxsZWVhcmdzT3B0Q2FsbFNlcUV4cHJBcnJheUxpdENhbGxFeHByQ29uZEV4cHJUaGlzRXhwcgAAACcGAAAMAAAABAAAACgGAAApBgAABAAAAAQAAAAqBgAAAAAAAAEAAAABAAAAuQIAACsGAAAEAAAABAAAAFMDAAA0ziYABAAAAKjMJgAEAAAAlMsmAAYAAACayyYABAAAAPzFJgAIAAAA8MUmAAwAAAALxSYACwAAAATGJgALAAAAQXJyb3dFeHByQXdhaXRFeHByQ2xhc3NFeHByUGFyZW5FeHBydGFndHBsVW5hcnlFeHByWWllbGRFeHByZGVsZWdhdGVBc3NpZ25FeHByTWVtYmVyRXhwclRwbEVsZW1lbnR0YWlsY29va2VkVXBkYXRlRXhwcnByZWZpeFNpbXBsZUV4cHJPclNwcmVhZHNwcmVhZE1ldGFQcm9wRXhwck9wdENoYWluRXhwcmJhc2VTcHJlYWRQcm9wU3VwZXJQcm9wRXhwcmNhbGxlZCBleHBlY3Qgb24g47cmABEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9hc3QtMTYuMC4wL3NyYy9wYXQucnMA/LcmAGMAAAANAAAAFAAAACwGAAAEAAAABAAAAHsCAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjguMC4xL3NyYy9maXhlci5ycwAAAIC4JgBxAAAAxgAAAEAAAACAuCYAcQAAAG8DAAAjAAAAgLgmAHEAAAB/AwAAMQAAAIC4JgBxAAAAiwMAACkAAADjHScASgAAAKgBAAAfAAAAy9UmAGUAAABsBgAAFAAAAC0GAAAEAAAABAAAAHsCAABUc0FzRXhwci4GAAAMAAAABAAAADsDAABUc0ZuVHlwZWxpdHR5cGVfbmFtZWVsZW1fdHlwZXR5cGVfcGFyYW1Uc0VudGl0eU5hbWVUc0V4dGVybmFsTW9kdWxlUmVmAAAvBgAADAAAAAQAAAAkAwAAAAAAAAEAAAABAAAAMAYAAAAAAAABAAAAAQAAALkCAAAAAAAABAAAAAQAAAAxBgAANM4mAAQAAADNySYACgAAANfJJgANAAAA+skmAAsAAAA0HCcACAAAAN6/JgAFAAAAZWxlbV90eXBlcwAAMgYAABgAAAAIAAAAtAIAADMGAAAEAAAABAAAADQGAAAAAAAABAAAAAQAAAA1BgAAaXNfaW5pc19vdXRjb25zdHJhaW50AAAANM4mAAQAAABVziYABAAAAHC6JgAFAAAAdbomAAYAAAC+xyYACAAAAHu6JgAKAAAABAMnAAcAAABUc1R5cGVQYXJhbWV4cHJfbmFtZVRzVW5pb25UeXBldHlwZXNUc0VudW1NZW1iZXJxdWFsaWZpZXJhdHRyaWJ1dGVzAAAAAAABAAAAAQAAADYGAAA3BgAAMAAAAAgAAAA4BgAAbmFtZV90eXBlAAAANM4mAAQAAAA0HCcACAAAAJm5JgAKAAAAJLsmAAkAAACszCYACAAAAMjMJgAIAAAAVHNUcGxMaXRUeXBlUHJvdGVjdGVkVHJ1ZVBsdXNNaW51c1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzVHVwbGVFbGVtZW50dHlvcFRzSW50ZXJmYWNlQm9keVRzU2F0aXNmaWVzRXhwcnBhcmFtX25hbWUAADkGAAAEAAAABAAAADwDAABjaGVja190eXBlZXh0ZW5kc190eXBldHJ1ZV90eXBlZmFsc2VfdHlwZVRzQ29uc3RydWN0b3JUeXBlY29tcHV0ZWRUc0FueUtleXdvcmRUc1Vua25vd25LZXl3b3JkVHNOdW1iZXJLZXl3b3JkVHNPYmplY3RLZXl3b3JkVHNCb29sZWFuS2V5d29yZFRzQmlnSW50S2V5d29yZFRzU3RyaW5nS2V5d29yZFRzU3ltYm9sS2V5d29yZFRzVm9pZEtleXdvcmRUc1VuZGVmaW5lZEtleXdvcmRUc051bGxLZXl3b3JkVHNOZXZlcktleXdvcmRUc0ludHJpbnNpY0tleXdvcmQAAAAAAAAABAAAAAQAAABQAwAANM4mAAQAAAAdzSYAAwAAAIa8JgAIAAAArMwmAAgAAACUyyYABgAAAMjMJgAIAAAAC8UmAAsAAABUc0V4cHJXaXRoVHlwZUFyZ3NUc0ludGVyc2VjdGlvblR5cGVUc0ltcG9ydENhbGxPcHRpb25zb2JqX3R5cGVpbmRleF90eXBlAAAANM4mAAQAAAA0HCcACAAAAB3NJgADAAAAhrwmAAgAAACszCYACAAAAMjMJgAIAAAAVHNOYW1lc3BhY2VFeHBvcnREZWNsRm5EZWNsaWRlbnRDbGFzc0RlY2xBc3NpZ25Qcm9wR2V0dGVyUHJvcE1ldGhvZFByb3BTZXR0ZXJQcm9wdGhpc19wYXJhbUtleVZhbHVlUHJvcFZhckRlY2xhcmF0b3JDb21wdXRlZFByb3BOYW1lVM0mAGMAAAA7AAAAIwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3Jlc29sdmVyL21vZC5yc6y+JgB4AAAA1AYAADYAAABJZlN0bXR0ZXN0Y29uc2FsdFBhdEZvclN0bXRpbml0dXBkYXRlRXhwclN0bXRXaXRoU3RtdEJyZWFrU3RtdGxhYmVsRW1wdHlTdG10Rm9ySW5TdG10Rm9yT2ZTdG10VGhyb3dTdG10V2hpbGVTdG10UmV0dXJuU3RtdFN3aXRjaENhc2VTd2l0Y2hTdG10ZGlzY3JpbWluYW50Y2FzZXNDYXRjaENsYXVzZXBhcmFtRG9XaGlsZVN0bXRMYWJlbGVkU3RtdE1vZHVsZURlY2xTdG10Q29udGludWVTdG10RGVidWdnZXJTdG10L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTI4LjAuMS9zcmMvcmVuYW1lL2FuYWx5emVyL3JldmVyc2VfbWFwLnJzAAAfwCYAhwAAAA4AAAAsAAAAUGFyYW1wYXRUc1BhcmFtUHJvcC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3JlbmFtZS9hbmFseXplci9tb2QucnMAAMvAJgB/AAAAKQAAABsAAADLwCYAfwAAADQAAAA3AAAAy8AmAH8AAACEAAAAHQAAADoGAAAEAAAABAAAAEIDAAAAAAAAAQAAAAEAAAC5AgAARXhwb3J0QWxsc3JjdHlwZV9vbmx5RXhwb3J0RGVjbGRlY2wAOwYAAAwAAAAEAAAAPAYAAD0GAAAEAAAABAAAAD4GAAAAAAAABAAAAAQAAADNAgAAc3BlY2lmaWVyc3BoYXNlADTOJgAEAAAA8MEmAAoAAAClwSYAAwAAAKjBJgAJAAAAQgInAAQAAAD6wSYABQAAAEltcG9ydERlY2xJbXBvcnRFeHBvcnROYW1lZEV4cG9ydERlZmF1bHREZWNsRXhwb3J0RGVmYXVsdEV4cHJUc0ltcG9ydEVxdWFsc1RzRXhwb3J0QXNzaWdubWVudFRzTmFtZXNwYWNlRXhwb3J0RXZhbHVhdGlvblNvdXJjZURlZmVyTmFtZWRFeHBvcnROYW1lc3BhY2VEZWZhdWx0TmFtZWRFeHBvcnROYW1lZFNwZWNpZmllcm9yaWdleHBvcnRlZEltcG9ydE5hbWVkU3BlY2lmaWVybG9jYWxpbXBvcnRlZEltcG9ydFN0YXJBc1NwZWNpZmllckV4cG9ydERlZmF1bHRTcGVjaWZpZXJJbXBvcnREZWZhdWx0U3BlY2lmaWVyRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyVHBsZXhwcnNxdWFzaXNUaGlzVW5hcnlVcGRhdGVCaW5NZW1iZXJTdXBlclByb3BDb25kQ2FsbE5ld1NlcVRhZ2dlZFRwbEFycm93WWllbGRNZXRhUHJvcEF3YWl0UGFyZW5KU1hNZW1iZXJKU1hFbXB0eVRzVHlwZUFzc2VydGlvblRzQ29uc3RBc3NlcnRpb25Uc05vbk51bGxUc0FzVHNJbnN0YW50aWF0aW9uVHNTYXRpc2ZpZXNPcHRDaGFpblNob3J0aGFuZEJsb2NrRGVidWdnZXJXaXRoUmV0dXJuTGFiZWxlZEJyZWFrQ29udGludWVJZlN3aXRjaFRocm93VHJ5V2hpbGVEb1doaWxlRm9yRm9ySW5Gb3JPZkRlY2wALwYAAAwAAAAEAAAAJAMAAD8GAAAMAAAABAAAAEAGAABBBgAABAAAAAQAAADUAgAAAAAAAAEAAAABAAAAuQIAACsGAAAEAAAABAAAAFMDAABCBgAABAAAAAQAAAB8AgAAAAAAAAQAAAAEAAAAQwYAAHN1cGVyX2NsYXNzdHlwZV9wYXJhbXNzdXBlcl90eXBlX3BhcmFtcwA0ziYABAAAAKjMJgAEAAAAzckmAAoAAACayyYABAAAAADFJgALAAAA5MkmAAsAAAALxSYACwAAABbFJgARAAAAaPImAAoAAABWYXJEZWNsZGVjbHNUcnlTdG10YmxvY2toYW5kbGVyZmluYWxpemVyVXNpbmdEZWNsaXNfYXdhaXRPYmplY3RMaXRCbG9ja1N0bXRzdG10c0QGAAAMAAAABAAAAEUGAABGBgAAGAAAAAQAAABHBgAAAAAAAAQAAAAEAAAAtQIAAGlzX2dlbmVyYXRvcmlzX2FzeW5jcmV0dXJuX3R5cGUAlMsmAAYAAADNySYACgAAADTOJgAEAAAAqMwmAAQAAACayyYABAAAAPDFJgAMAAAA/MUmAAgAAAALxSYACwAAAATGJgALAAAARnVuY3Rpb25Uc0tleXdvcmRUeXBlVHNUaGlzVHlwZVRzRm5PckNvbnN0cnVjdG9yVHlwZVRzVHlwZVJlZlRzVHlwZVF1ZXJ5VHNUeXBlTGl0VHNBcnJheVR5cGVUc1R1cGxlVHlwZVRzT3B0aW9uYWxUeXBlVHNSZXN0VHlwZVRzVW5pb25PckludGVyc2VjdGlvblR5cGVUc0NvbmRpdGlvbmFsVHlwZVRzSW5mZXJUeXBlVHNQYXJlbnRoZXNpemVkVHlwZVRzVHlwZU9wZXJhdG9yVHNJbmRleGVkQWNjZXNzVHlwZVRzTWFwcGVkVHlwZVRzTGl0VHlwZVRzVHlwZVByZWRpY2F0ZVRzSW1wb3J0VHlwZVRzVHlwZUFubkpTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3Npbmd0eXBlX2FyZ3MyBgAAGAAAAAgAAAC0AgAAVHNFbnVtRGVjbGlzX2NvbnN0bWVtYmVyc1RzUXVhbGlmaWVkTmFtZUgGAAAgAAAACAAAAO8CAAAAAAAABAAAAAQAAABJBgAANM4mAAQAAACqDCcABwAAANr5JgAGAAAAy/kmAAkAAAA0zSYAAgAAAJrLJgAEAAAAVHNNb2R1bGVEZWNsSgYAAAwAAAAEAAAASwYAAAAAAAAEAAAABAAAAEwGAAA0ziYABAAAADTNJgACAAAAqgwnAAcAAAALxSYACwAAALz5JgAHAAAAmssmAAQAAABUc0ludGVyZmFjZURlY2xUc01vZHVsZUJsb2NrVHNOYW1lc3BhY2VEZWNsVHNUeXBlQWxpYXNEZWNsVHNUeXBlUGFyYW1EZWNsVHNJbXBvcnRFcXVhbHNEZWNsaXNfZXhwb3J0aXNfdHlwZV9vbmx5bW9kdWxlX3JlZlRzVHlwZVBhcmFtSW5zdGFudGlhdGlvbmFyZ3VtZW50cwBUzSYAYwAAADMAAAAPAAAAUHJpdmF0ZVB1YmxpYwAAAAAAAAAIAAAABAAAAAsBAABNBgAAIAAAAAgAAABhAwAATgYAAAQAAAAEAAAA1AIAAE8GAAAEAAAABAAAADwDAAAAAAAAAQAAAAEAAAC5AgAALwYAAAwAAAAEAAAAJAMAAAAAAAABAAAAAQAAADAGAAAAAAAABAAAAAQAAACnAAAAaXNfc3RhdGljZGVjb3JhdG9yc2FjY2Vzc2liaWxpdHlpc19hYnN0cmFjdGlzX29wdGlvbmFsaXNfb3ZlcnJpZGVkZWZpbml0ZQAAADTOJgAEAAAAHc0mAAMAAAA4ziYABQAAAMjMJgAIAAAAxMkmAAkAAADNySYACgAAANfJJgANAAAA5MkmAAsAAADvySYACwAAAPrJJgALAAAANBwnAAgAAACqDCcABwAAAAXKJgAIAAAAQ2xhc3NQcm9wRGVjb3JhdG9yTWV0aG9kR2V0dGVyU2V0dGVyQ29uc3RydWN0b3JQcml2YXRlTWV0aG9kUHJpdmF0ZVByb3BUc0luZGV4U2lnbmF0dXJlRW1wdHlTdGF0aWNCbG9ja0F1dG9BY2Nlc3NvcgBQBgAABAAAAAQAAABRBgAAAAAAAAEAAAABAAAAUgYAAGtpbmQ0ziYABAAAAB3NJgADAAAACwMnAAgAAAAMyyYABAAAAMTJJgAJAAAA18kmAA0AAADkySYACwAAAO/JJgALAAAA+skmAAsAAABDbGFzc01ldGhvZAAAAAAABAAAAAQAAACIAQAAUwYAAAwAAAAEAAAAVAYAAEYGAAAYAAAABAAAAEcGAABwYXJhbXNib2R5AAA0ziYABAAAAKjMJgAEAAAAHc0mAAMAAACUyyYABgAAAJrLJgAEAAAA18kmAA0AAADvySYACwAAAFUGAAAQAAAACAAAAFYGAAA0ziYABAAAAKjMJgAEAAAAHc0mAAMAAAA4ziYABQAAAMjMJgAIAAAAxMkmAAkAAADNySYACgAAANfJJgANAAAA78kmAAsAAAD6ySYACwAAADQcJwAIAAAABcomAAgAAABXBgAAIAAAAAgAAABYBgAANM4mAAQAAAAdzSYAAwAAADjOJgAFAAAAyMwmAAgAAADEySYACQAAAM3JJgAKAAAA18kmAA0AAADkySYACwAAAPrJJgALAAAABcomAAgAAABjdHh0b3B0aW9uYWxSZXN0UGF0ZG90M190b2tlbmFyZ3R5cGVfYW5uQXJyYXlQYXRlbGVtc0Fzc2lnblBhdGxlZnRyaWdodE9iamVjdFBhdHByb3BzQ29tcHV0ZWRQcml2YXRlTmFtZUFzc2lnblBhdFByb3BrZXlLZXlWYWx1ZUJpbmRpbmdJZGVudGlkS2V5VmFsdWVQYXRQcm9waW5kZXggbm90IGZvdW5kL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvaW5kZXhtYXAtMi45LjAvc3JjL21hcC9jb3JlLnJzAFTNJgBjAAAASwAAAAoAAABUzSYAYwAAABYCAAANAAAAVM0mAGMAAACIAgAALAAAAFTNJgBjAAAAYAIAACIAAABUzSYAYwAAAE8BAAAWAAAAVM0mAGMAAABbAQAAOAAAAFN0ckJvb2xOdW1CaWdJbnRSZWdleEpTWFRleHRzcGFudmFsdWVyYXdleHBmbGFnc051bWJlckpTWEF0dHJuYW1lSlNYRW1wdHlFeHBySlNYTWVtYmVyRXhwcklkZW50TmFtZXN5bUpTWE5hbWVzcGFjZWROYW1lSlNYRnJhZ21lbnRvcGVuaW5nY2hpbGRyZW5jbG9zaW5nTGl0SlNYRXhwckNvbnRhaW5lckpTWEVsZW1lbnRvYmpwcm9wSlNYU3ByZWFkQ2hpbGRleHByU3ByZWFkRWxlbWVudEpTWENsb3NpbmdFbGVtZW50bnNKU1hDbG9zaW5nRnJhZ21lbnRKU1hPcGVuaW5nRnJhZ21lbnRDbGFzc0ZuVmFyVXNpbmdUc0ludGVyZmFjZVRzVHlwZUFsaWFzVHNFbnVtVHNNb2R1bGUAAABw1iYAewAAAO8AAAAXAAAAcNYmAHsAAAAKAQAAEgAAAHDWJgB7AAAAUgEAACgAAABw1iYAewAAAFMBAAAtAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuIGluc2lkZSBUc1BhcmFtZXRlclByb3BlcnR5AACgzyYAWgAAAHDWJgB7AAAAQQEAACEAAABw1iYAewAAAHABAAASAAAAcNYmAHsAAABDAgAAJwAAAHDWJgB7AAAAQAIAADIAAABw1iYAewAAAEgDAAANAAAAcNYmAHsAAACoAwAAHwAAAHDWJgB7AAAAqQMAAB8AAABw1iYAewAAANEDAAAfAAAAy/UmACoAAABw1iYAewAAANkDAAAdAAAAcNYmAHsAAAD1AwAAIwAAAHDWJgB7AAAAoQMAADEAAABw1iYAewAAAGkEAAAjAAAAcNYmAHsAAAA/BAAAKwAAAHDWJgB7AAAASwQAAFEAAABw1iYAewAAAE4EAAAfAAAAcNYmAHsAAABYBAAAVgAAAHDWJgB7AAAAWgQAAB8AAABleHBvcnRzAHDWJgB7AAAAkAUAACMAAABw1iYAewAAAJQFAAAfAAAAcNYmAHsAAABLBQAAGgAAAHDWJgB7AAAATQUAABoAAABfY3JlYXRlUmVxdWlyZV9fcmVxdWlyZWNyZWF0ZVJlcXVpcmVcBgAAKAAAAAgAAABdBgAAcNYmAHsAAAC0AwAAQAAAAE9ubHkgYW1iaWVudCBtb2R1bGVzIGNhbiB1c2UgcXVvdGVkIG5hbWVzLgAAcNYmAHsAAAD5BQAADgAAAEltcG9ydCBkZWNsYXJhdGlvbnMgaW4gYSBuYW1lc3BhY2UgY2Fubm90IHJlZmVyZW5jZSBhIG1vZHVsZS5FU00tc3R5bGUgbW9kdWxlIGRlY2xhcmF0aW9ucyBhcmUgbm90IHBlcm1pdHRlZCBpbiBhIG5hbWVzcGFjZS5JbXBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBpbXBvcnQgKiBhcyBucyBmcm9tICJtb2QiYCwgYGltcG9ydCB7YX0gZnJvbSAibW9kImAsIGBpbXBvcnQgZCBmcm9tICJtb2QiYCwgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuRXhwb3J0IGFzc2lnbm1lbnQgY2Fubm90IGJlIHVzZWQgd2hlbiB0YXJnZXRpbmcgRUNNQVNjcmlwdCBtb2R1bGVzLiBDb25zaWRlciB1c2luZyBgZXhwb3J0IGRlZmF1bHRgIG9yIGFub3RoZXIgbW9kdWxlIGZvcm1hdCBpbnN0ZWFkLi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3R5cGVzY3JpcHQucnMAAKbTJgB8AAAAQgAAACwAAACm0yYAfAAAAGgAAAAQAAAAXgYAAAQAAAAEAAAAggEAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3N0cmlwX3R5cGUucnNU1CYAfAAAANUAAAApAAAAXwYAAAwAAAAEAAAAYAYAAGEGAACHBQAAAAAAAAAAAAABAAAAYgYAAE5hTkluZmluaXR5L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTMxLjAuMC9zcmMvdHNfZW51bS5ycxPVJgB5AAAAsAAAABIAAAABAAAAAAAAAAEAAAAAAAAAE9UmAHkAAADaAAAAGgAAAG5vdCBpbXBsZW1lbnRlZC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3V0aWxzLTIyLjAuMC9zcmMvbGliLnJzy9UmAGUAAADxCQAAPgAAAGQGAAAEAAAABAAAAIIBAADL1SYAZQAAAP8JAAA8AAAAy9UmAGUAAADeCQAAJgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC0zMS4wLjAvc3JjL3RyYW5zZm9ybS5ycwBw1iYAewAAAMYCAAA4AAAAXwYAAAwAAAAEAAAAYAYAAGEGAACHBQAAAAAAAAAAAAABAAAAYgYAAFN5bWJvbF8AAQAAAAAAAAAq1yYAAQAAAHN1cGVyXwAAPNcmAAYAAAAq1yYAAQAAAGNhcGFjaXR5IG92ZXJmbG93AAAAVNcmABEAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvbW9kLnJzcNcmAEwAAABWCgAAJAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvcHRyL21vZC5ycwDM1yYASwAAAAwCAAABAAAAY29uc3RydWN0b3Igc2hvdWxkIGhhdmUgYSBib2R5L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfdXRpbHMtMjIuMC4wL3NyYy9jb25zdHJ1Y3Rvci5ycwBG2CYAbQAAAA4AAAAgAAAAAAAAAAwAAAAEAAAAZQYAAGYGAACgFicATwAAAAoCAAA3AAAAyQMAAAwAAAAEAAAAygMAAMsDAADMAwAAAAAAAAAAAAABAAAAzQMAAGgGAAAsAAAABAAAAGkGAABqBgAAawYAAGwGAABtBgAAbgYAAEQEAABAACcAaAAAAHoCAAAUAAAAQAAnAGgAAACiAgAAPAAAAEAAJwBoAAAAkQIAAD4AAACqGicAXgAAADQAAAAFAAAAbwYAAAwAAAAEAAAAhQUAAHAGAACHBQAAAAAAAAAAAAABAAAAzQMAAG8GAAAMAAAABAAAAIUFAABwBgAAhwUAAAAAAAAAAAAAAQAAAM0DAABodHRwOmh0dHBzOgABAAAAAAAAAJkVJwABAAAAJHNlcmRlX2pzb246OnByaXZhdGU6OlJhd1ZhbHVlAABvBgAADAAAAAQAAACFBQAAowUAAIcFAAAAAAAAAAAAAAEAAADNAwAAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1Jhd1NlY3Rpb25PZmZzZXRsaW5lY29sdW1uUmF3U2VjdGlvbm9mZnNldHVybG1hcEZhY2Vib29rU2NvcGVNYXBwaW5nbmFtZXNtYXBwaW5nc1Jhd1NvdXJjZU1hcHZlcnNpb25maWxlc291cmNlc3NvdXJjZVJvb3Rzb3VyY2VzQ29udGVudHNlY3Rpb25zcmFuZ2VNYXBwaW5nc2lnbm9yZUxpc3R4X2ZhY2Vib29rX29mZnNldHN4X21ldHJvX21vZHVsZV9wYXRoc3hfZmFjZWJvb2tfc291cmNlc2RlYnVnX2lkZGVidWdJZC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC91bnN0YWJsZS9xdWlja3NvcnQucnMAAFnbJgBhAAAAOQAAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2Nfc291cmNlbWFwLTkuMy40L3NyYy9idWlsZGVyLnJzAMzbJgBnAAAAaQAAABoAAADM2yYAZwAAAGoAAAAiAAAAQ2Fubm90IHNldCBzb3VyY2VzIGZvciB0b21ic3RvbmUgc291cmNlIGlkAADM2yYAZwAAAIAAAAAJAAAAzNsmAGcAAACEAAAAHQAAAMzbJgBnAAAABwEAABUAAAB1OC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAAAAstwmAF8AAADGAAAAJwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5ycyTdJgBgAAAAoQEAAC4AAABhc3NlcnRpb24gZmFpbGVkOiBpZHggPCBDQVBBQ0lUWS9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25vZGUucnMAtN0mAFsAAACVAgAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYuaGVpZ2h0IC0gMbTdJgBbAAAArQIAAAkAAAC03SYAWwAAALECAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3JjLmxlbigpID09IGRzdC5sZW4oKbTdJgBbAAAASgcAAAUAAAC03SYAWwAAAMcEAAAjAAAAtN0mAFsAAADLBAAAIwAAALTdJgBbAAAACgUAACQAAABhc3NlcnRpb24gZmFpbGVkOiBlZGdlLmhlaWdodCA9PSBzZWxmLm5vZGUuaGVpZ2h0IC0gMQAAALTdJgBbAAAA+gMAAAkAAACy3CYAXwAAAFgCAAAwAAAAstwmAF8AAAAWAgAALwAAALLcJgBfAAAAoQAAACQAAABJbmNsdWRlZEV4Y2x1ZGVkVW5ib3VuZGVkaW5kZXggIG91dCBvZiByYW5nZTogAABp3yYABgAAAG/fJgAPAAAADOEmAF4AAAAxBgAAAwAAAHJhbmdlICBvdXQgb2YgYm91bmRzOiAAAKDfJgAGAAAApt8mABAAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlL2FwaS5ycwAAyN8mAGIAAACOCgAAAQAAAHEGAAAUAAAABAAAAHIGAAAAAAAACAAAAAQAAABzBgAAY2Fubm90ICBiaXRzIGZyb20gYSAtYml0IHJlZ2lvbgBc4CYABwAAAKoSJwABAAAAY+AmAA0AAABw4CYACwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2JpdHZlYy0xLjAuMS9zcmMvZmllbGQucnMAAJzgJgBeAAAADgIAAAIAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlLnJzAAAM4SYAXgAAAPcAAAAfAAAADOEmAF4AAABPAQAAIwAAAGxvYWRCaXRTcGFuRXJyb3I8Pjo6kOEmAA0AAACd4SYAAwAAAE51bGxNaXNhbGlnbmVkVG9vTG9uZ1Rvb0hpZ2gvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2Nfc291cmNlbWFwLTkuMy40L3NyYy9lbmNvZGVyLnJzAMzhJgBnAAAANwAAAA0AAABpbnZhbGlkIGJ5dGXM4SYAZwAAACMAAAASAAAAaW52YWxpZCB1dGY4zOEmAGcAAABmAAAAIQAAAMzhJgBnAAAAWAAAABEAAABiYWQganNvbjogAACM4iYACgAAAGxlZnRvdmVyIGN1ci9zaGlmdCBpbiB2bHEgZGVjb2RloOImACAAAAB2bHEgZGVjb2RlIGRpZCBub3QgcHJvZHVjZSBhbnkgdmFsdWVzAAAAyOImACUAAAB2bHEgZGVjb2RlIGNhdXNlZCBhbiBvdmVyZmxvdwAAAPjiJgAdAAAAZ290ICBzZWdtZW50cywgZXhwZWN0ZWQgNCBvciA1AAAg4yYABAAAACTjJgAaAAAAYmFkIHJlZmVyZW5jZSB0byBzb3VyY2UgIwAAAFDjJgAZAAAAYmFkIHJlZmVyZW5jZSB0byBuYW1lICMAdOMmABcAAABlbmNvdW50ZXJlZCBpbmNvbXBhdGlibGUgc291cmNlbWFwIGZvcm1hdAAAAJTjJgApAAAAdGhlIHByb3ZpZGVkIGRhdGEgVVJMIGlzIGludmFsaWTI4yYAIAAAAGNhbm5vdCBmbGF0dGVuIHRoZSBpbmRleGVkIHNvdXJjZW1hcDogAADw4yYAJgAAAGludmFsaWQgbWFnaWMgbnVtYmVyIGZvciByYW0gYnVuZGxlACDkJgAjAAAAaW52YWxpZCBtb2R1bGUgaW5kZXggaW4gcmFtIGJ1bmRsZQAATOQmACIAAABpbnZhbGlkIHJhbSBidW5kbGUgbW9kdWxlIGVudHJ5AHjkJgAfAAAAbm90IGEgcmFtIGJ1bmRsZaDkJgAQAAAAaW52YWxpZCByYW5nZSBtYXBwaW5nIGluZGV4OiAAAAC45CYAHQAAAGludmFsaWQgYmFzZTY0IGNoYXJhY3RlcjogAADg5CYAGgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3J1c3RjLWhhc2gtMi4xLjEvc3JjL2xpYi5ycwTlJgBg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AAAAYW4gaWRlbnRpZmllciwgWyBmb3IgYW4gYXJyYXkgcGF0dGVybiwgeyBmb3IgYW4gb2JqZWN0IHBhdHRlciBvciAuLi4gZm9yIGEgcmVzdCBwYXR0ZXJuAKTpJgB6AAAAKgEAABMAAABnbG9iYWwgb3IgYSBzdHJpbmcgbGl0ZXJhbAAA3P0mAHQAAABsAgAAJgAAANz9JgB0AAAAgQIAADYAAAAoIG9yIGAAANz9JgB0AAAAtQIAACoAAADc/SYAdAAAAKkCAAAmAAAAZmFpbMkDAAAMAAAABAAAADAEAAB0BgAAzAMAAAAAAAAAAAAAAQAAAM0DAADc/SYAdAAAACIBAAAjAAAA3P0mAHQAAAAzAQAAHQAAAAUOJwB0AAAARgMAACIAAAAFDicAdAAAAF8DAAAqAAAABQ4nAHQAAABAAwAAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9tb2QucnMAvO0mAHMAAAC7AQAAFwAAAGlkZW50aWZpZXIsIHN0cmluZyBsaXRlcmFsLCBudW1lcmljIGxpdGVyYWwgb3IgWyBmb3IgdGhlIGNvbXB1dGVkIGtleQAAALztJgBzAAAAfgEAAB8AAAB0ZW1wbGF0ZSB0b2tlbkFuIGV4cHJlc3Npb24gc2hvdWxkIGZvbGxvdyAnLi4uJy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9vYmplY3QucnMAAADH7iYAdgAAACQAAAAZAAAAx+4mAHYAAAAnAAAAEwAAAMfuJgB2AAAApwEAAB4AAAAcAy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci9qc3gvbW9kLnJzAHLvJgBxAAAAMwEAABkAAABy7yYAcQAAAD0BAAATAAAAPCAoanN4IHRhZyBzdGFydCksIGpzeCB0ZXh0IG9yIHty7yYAcQAAAOAAAAASAAAAanN4IGlkZW50aWZpZXISEBMAAABy7yYAcQAAAKMAAAAYAAAAcu8mAHEAAACpAAAAEgAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IEpTWE5hbWVzcGFjZWROYW1lIC0+IEpTWE9iamVjdGjwJgBIAAAAcu8mAHEAAABgAAAAGgAAAGB9YC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci90cGwucnPL8CYAbQAAAHgAAAATAAAAy/AmAG0AAAB7AAAAFAAAAMvwJgBtAAAA6AAAABEAAADL8CYAbQAAAOsAAAAUAAAAdmFybGV0PT0hPT09PSE9PTw9Pj08PD4+Pj4+JXxeJnx8JiYqKj8/APD0JgBnAAAAiwMAABIAAADw9CYAZwAAAAECAABIAAAA8PQmAGcAAAACAgAAKAAAAPD0JgBnAAAAygAAAEwAAADw9CYAZwAAAM0AAAAnAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL2xpdC5ycwDw8SYAZwAAAP4AAAA0AAAAaW1wbGVtZW50cy8vLyoqL35kZWxldGUrPS09Kj0vPSU9PDw9Pj49Pj4+PXw9Xj0mPSoqPSYmPXx8PT8/PSsrLS0vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9pdGVyLnJzdW5leHBlY3RlZCByZWdleCBmaW5kIGVycm9yOiAKdG8gaGFuZGxlIGZpbmQgZXJyb3JzLCB1c2UgJ3RyeScgb3IgJ3NlYXJjaCcgbWV0aG9kcwAAABPzJgAdAAAAMPMmADUAAACp8iYAagAAAH4BAAAZAAAAbPsmAGoAAABeAgAAHAAAAGz7JgBqAAAAawIAADIAAABs+yYAagAAAG8CAAAXAAAAAgAAAGz7JgBqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9yZWdleC1hdXRvbWF0YS0wLjQuOS9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAAOPQmAA0AAABF9CYAGAAAAMzzJgBsAAAAqgEAAAkAAABjbGFzcy9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAACF9CYAWAAAANMHAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL2xpYi5ycwDw9CYAZwAAABAIAAAiAAAA8PQmAGcAAAATCAAAIQAAAHN1cGVyAAAA8PQmAGcAAACCBwAAFwAAAA0KAADw9CYAZwAAAEMIAAAyAAAA8PQmAGcAAAA8CAAAMAAAAG5ldy50YXJnZXRpbXBvcnQubWV0YT8uaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAADL9SYAKgAAAPX1JgAXAAAADPYmABYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMjguMC4xL3NyYy9yZW5hbWUvbW9kLnJzAAA89iYAdgAAABABAAAZAAAAZXZhbEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3fI9iYAHAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2hhc2hicm93bi0wLjE0LjUvc3JjL3Jhdy9tb2QucnPs9iYAZAAAAFYAAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL2NsYXNzX2FuZF9mbi5yc2D3JgB8AAAA4wUAABUAAABg9yYAfAAAAPsFAAAPAAAAYPcmAHwAAADpBQAAEwAAAGD3JgB8AAAAZQAAABQAAABg9yYAfAAAAFsGAAARAAAAkQ8nAAYAAACp+SYACQAAALL5JgAHAAAAHAsnAAIAAAC5+SYAAwAAAJ0PJwAIAAAANBwnAAgAAAAkHCcACAAAAJcPJwAGAAAAYPcmAHwAAAD/BAAAEgAAACogZm9yIGdlbmVyYXRvciwgcHJpdmF0ZSBrZXksIGlkZW50aWZpZXIgb3IgYXN5bmNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpc19jb25zdHJ1Y3RvcigpIHJldHVybnMgZmFsc2UgZm9yIFByaXZhdGVOYW1lAAAAtfgmAFgAAABg9yYAfAAAAE4EAAAaAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3R5cGVzY3JpcHQucnNuZXc9PmNvbnN0ZW51bWluZmVycHJvdGVjdGVkcHJpdmF0ZW91dGV4dGVuZHN0eXBlb2YrLW5hbWVzcGFjZW1vZHVsZWdsb2JhbGAAAAAo+SYAbgAAABUCAAAiAAAAJHsAACj5JgBuAAAAGAIAACEAAABhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHZvaWR1bmRlZmluZWRuZXZlcmludHJpbnNpY2tleW9mdW5pcXVlc2F0aXNmaWVzYXNzZXJ0c2lzcmVxdWlyZS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0yOC4wLjEvc3JjL3JlbmFtZS9vcHMucnN2+iYAdgAAAEoCAAAXAAAAdvomAHYAAABPAgAAEQAAAHb6JgB2AAAAHgEAABkAAAB2+iYAdgAAAEcBAAAZAAAAdvomAHYAAAB7AQAAHAAAAHb6JgB2AAAAuwEAABcAAAB2+iYAdgAAAMABAAARAAAAdvomAHYAAAB+AgAAEgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3JlZ2V4LWF1dG9tYXRhLTAuNC45L3NyYy91dGlsL3Bvb2wucnMAAGz7JgBqAAAAPQIAABwAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yNC4wLjEvc3JjL2NvbW1vbi9wYXJzZXIvbW9kdWxlX2l0ZW0ucnMA6PsmAHsAAAB5AQAAOAAAAOj7JgB7AAAAZAIAABgAAADo+yYAewAAAH0CAAAYAAAA6PsmAHsAAACaAgAAGAAAAOj7JgB7AAAAIAMAABoAAADo+yYAewAAAEIDAAAaAAAA6PsmAHsAAABcAwAAGAAAAOj7JgB7AAAAcAMAABwAAADo+yYAewAAAGkDAAAYAAAAYSBzdHJpbmcgbGl0ZXJhbOj7JgB7AAAAiwMAABIAAADo+yYAewAAAA0DAAAWAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogaGFuZGxlX2ltcG9ydF9leHBvcnQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaWYgY3VycmVudCB0b2tlbiBpc24ndCBpbXBvcnQgbm9yIGV4cG9ydCT9JgB8AAAA6PsmAHsAAAAwAAAACQAAAOj7JgB7AAAAUgAAABIAAAAAAAAADAAAAAQAAAB2BgAAdwYAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9leHByLnJz3P0mAHQAAABKAAAAFQAAANz9JgB0AAAAUwAAAA8AAADc/SYAdAAAAE8AAAATAAAA3P0mAHQAAADHAgAAGwAAAGAuYCBvciBgKGAAANz9JgB0AAAA+wIAACcAAABtZXRhVHJpZWQgdG8gcGFyc2UgYW4gYXJndW1lbnQgb2YgeWllbGQA3P0mAHQAAADRBwAAEwAAANz9JgB0AAAAywcAABMAAADc/SYAdAAAANcHAAAYAAAA3P0mAHQAAADrBwAAEwAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgcGF0dGVybjogRXhwcigU/yYAQAAAAFyCJwABAAAA3P0mAHQAAACwBwAAKAAAANz9JgB0AAAAiQcAABoAAADc/SYAdAAAAMQIAAA9AAAA3P0mAHQAAADTCAAAGQAAANz9JgB0AAAA4ggAAB8AAADc/SYAdAAAAOMIAAAeAAAA3P0mAHQAAADaCAAANAAAAHRhcmdldGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHBhcnNlX2xpdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgANr/JgBNAAAA3P0mAHQAAAAQAQAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19jb21tb24tMTUuMC4wL3NyYy9zb3VyY2VfbWFwLnJzQAAnAGgAAAA1BQAASgAAAEAAJwBoAAAAYgUAACYAAAAuPC8+PDwvPjw+L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3N0bXQucnNpZmVsc2Vmb3J0cnlmaW5hbGx5YnJlYWtvZnRocm93d2hpbGVyZXR1cm5jYXNl0gAnAGgAAAADAQAAHQAAANIAJwBoAAAABgEAAEEAAABzd2l0Y2hjYXRjaGRvY29udGludWVkZWJ1Z2dlcgAAAAAAAAAEAAAABAAAAIgFAAAjTm9GaWxlRm9yL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL21vZHVsZV9kZWNscy5yc3R5cGVhc2V4cG9ydGZyb213aXRoYXNzZXJ0aW1wb3J0ZGVmZXIAwgEnAHAAAAChAAAAIAAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuc3BlY2lmaWVycy5sZW4oKSA8PSAywgEnAHAAAACvAAAAFQAAAMIBJwBwAAAAZQEAACgAAABub3QgaW1wbGVtZW50ZWQ6IGNvZGVnZW4gb2YgYGV4cG9ydCBkZWZhdWx0IGZyb20gJ2Zvbyc7YLQCJwA4AAAAwgEnAHAAAAAHAQAAEQAAAGRlZmF1bHRmdW5jdGlvbiMhaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogTW9kdWxlIGlzIGhhbmRsZWQgYWJvdmUAABUDJwBBAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfcGFyc2VyLTI1LjAuMC9zcmMvcGFyc2VyL21vZC5ycwAAAGADJwBtAAAAKAEAADIAAAAgICAgeAYAAAwAAAAEAAAAygMAAMsDAADMAwAAAAAAAAAAAAABAAAAzQMAAGRlc2NyaXB0aW9uKCkgaXMgZGVwcmVjYXRlZDsgdXNlIERpc3BsYXkAAAAABAAAAAQAAAAhAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQB5BgAACAAAAAQAAAB6BgAAewYAAAwAAAAEAAAAfAYAAHsGAAAMAAAABAAAAMMDAAB8BgAAgAQnAEQEAAB9BgAARgQAAH4GAABHBAAAVXRmOEVycm9ydmFsaWRfdXBfdG9lcnJvcl9sZW5Gcm9tVXRmOEVycm9yYnl0ZXNlcnJvcklvVXRmOEJhZEpzb25WbHFMZWZ0b3ZlclZscU5v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AAAAgAAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9wYXJzZXItMjUuMC4wL3NyYy9sZXhlci9jYXB0dXJpbmcucnMAACAMJwByAAAAOAAAAAsAAAAuLi4/e31kZWNsYXJlIWNvbnN0cnVjdG9yYWNjZXNzb3JtaWQgPiBsZW4AAMUMJwAJAAAAL3J1c3RjLzJlNjg4MmFjNWJlMjdhNzMyOTNkNmY3YWU1NjM5N2ZkZjMyODQ4ZGUvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9kcmlmdC5ycwDYDCcAWwAAAP8AAAAZAAAA2AwnAFsAAADyAAAAEgAAANgMJwBbAAAAzgAAACQAAADYDCcAWwAAANEAAAAkAAAA2AwnAFsAAABAAAAAIgAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvcXVpY2tzb3J0LnJzAIQNJwBfAAAATgAAAB8AAACEDScAXwAAAEgAAAAXAAAAQC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX2xleGVyLTI0LjAuMS9zcmMvY29tbW9uL3BhcnNlci9zdG10LnJzVHJpZWQgdG8gcGFyc2UgdGhlIGNvbmRpdGlvbiBmb3IgYW4gaWYgc3RhdGVtZW50dXNpbmcAAAUOJwB0AAAAiAEAACIAAAAFDicAdAAAAIsBAAAjAAAABQ4nAHQAAACRAQAANAAAAAUOJwB0AAAAmwEAADIAAAAFDicAdAAAANEAAAAJAAAABQ4nAHQAAAD8AAAAFQAAAAUOJwB0AAAAFQEAAA8AAAAFDicAdAAAAFgFAAAVAAAAInVzZSBzdHJpY3QiJ3VzZSBzdHJpY3QnBQ4nAHQAAAB4BQAAEwAAAAUOJwB0AAAAUgEAAA8AAAAFDicAdAAAANgDAAAWAAAABQ4nAHQAAADbAwAAEwAAAGludGVyZmFjZXB1YmxpY3N0YXRpY2Fic3RyYWN0AAAABQ4nAHQAAACWAAAAEgAAADsAAADsFCcAbgAAANwCAAARAAAArwYAALAGAACxBgAAsgYAALMGAAC0BgAAtQYAALYGAAC3BgAAuAYAALkGAAC6BgAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50LnJzAPwPJwBjAAAAbAMAAA8AAAAAAAAABAAAAAAAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L2NvbnZlcnQucnN8ECcAbAAAAPABAAAWAAAAY2Fubm90IGFjY2VzcyBhIHNjb3BlZCB0aHJlYWQgbG9jYWwgdmFyaWFibGUgd2l0aG91dCBjYWxsaW5nIGBzZXRgIGZpcnN0L2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2NvcGVkLXRscy0xLjAuMS9zcmMvbGliLnJzQBEnAGAAAACoAAAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL3BhcnNlci9pbnB1dC5ycwCwEScAbwAAAAEBAAAoAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfY29kZWdlbi0xOC4wLjAvc3JjL3RleHRfd3JpdGVyL2Jhc2ljX2ltcGwucnMgL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc3djX2VjbWFfbGV4ZXItMjQuMC4xL3NyYy9jb21tb24vcGFyc2VyL2lkZW50LnJzaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZasSJwB1AAAA1AAAAAkAAABhd2FpdHlpZWxkbGV0IGlzIHJlc2VydmVkIGluIGNvbnN0LCBsZXQsIGNsYXNzIGRlY2xhcmF0aW9uaWRlbnRpZmllciBvciBzdHJpbmcvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9zd2NfZWNtYV9sZXhlci0yNC4wLjEvc3JjL2NvbW1vbi9wYXJzZXIvYnVmZmVyLnJzphMnAHYAAABjAAAAIAAAALARJwBvAAAAKgAAAA0AAACwEScAbwAAAGAAAAANAAAAsBEnAG8AAABRAAAADQAAALARJwBvAAAASQAAAA0AAACwEScAbwAAADkAAAANAAAAsBEnAG8AAABBAAAADQAAALARJwBvAAAAWQAAAA0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiB0b2tlbl92YWx1ZTogAJwUJwA3AAAAsBEnAG8AAAAxAAAADQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3N3Y19lY21hX3BhcnNlci0yNS4wLjAvc3JjL2xleGVyL3Rva2VuLnJzAADsFCcAbgAAABkDAAAkAAAAMBInAHoAAAByAAAAGgAAADASJwB6AAAAiwAAABgAAABmYWxzZXRydWVudWxsL3VzZSBzdHJpY3RzY3JpcHRcdXs8IS0tXHgzYyEtLS0tPi0tXHgzZW4tMHgAAADCFScAAwAAADB4AADQFScAAgAAAD0oKiw6W10AyQMAAAwAAAAEAAAAygMAADQEAADMAwAAAAAAAAAAAAABAAAAzQMAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAEMWJwBLAAAA8AoAAA4AAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAKAWJwBPAAAA4gUAABQAAACgFicATwAAAOIFAAAhAAAAoBYnAE8AAADWBQAAIQAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvbW9kLnJzAAAAIBcnAE0AAADsAwAAKwAAAEVycm9yAAAAQxYnAEsAAADoAQAAFwAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL2JvcnJvdy5ycwCYFycASwAAABUBAAAlAAAAPGludmFsaWQ+Tm9uZVNvbWUAAAAAAAAABAAAAAQAAAC7BgAAvAYAAL0GAACgFicATwAAAGYEAAAkAAAAoBYnAE8AAADOAQAANwAAAKAGAAAIAAAABAAAAKEGAACiBgAAowYAAKQGAAClBgAApgYAAKcGAACoBgAAqQYAAKoGAACrBgAArAYAAK0GAACuBgAAVW5zdXBwb3J0ZWQgc3ludGF4YG1vZHVsZWAga2V5d29yZCBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYG5hbWVzcGFjZWAgaW5zdGVhZC5VbnN1cHBvcnRlZFN5bnRheFR5cGVTY3JpcHQgZXhwb3J0IGFzc2lnbm1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGltcG9ydCBlcXVhbHMgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGVudW0gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZVR5cGVTY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVGhl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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////////////////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//////////////z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMDBAUGBwgJCgsMDQ4DAwMDAwMDDwMDAwMDAwMPCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ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VVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVX/////f1VVVVBVAABVVVVVVVVVVVVVBQAAAAAAAAAAAAAAAABAVVVVVVVVVVVVVVVVVUVUAQBUUQEAVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVUQBVFVRVRVVVQVVVVVVVVVFQVVVVVVVVVVVVVVVVVVVVEEVFFBRVVVVVVVVVVBRVVVBVVVVVVVVVVVVVVVVVVVUARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVUFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVVVVVVUFVVVVf//99//911931tXXVRAAUFVFAQAAVVdRVVVVVVVVVVVVVRUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVxUUVVVVVVVVVVVVVVVVVVVFAEBEAQBUFQAAFFVVVVVVVVVVVVVVVQAAAAAAAABAVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVQAAUAVVVVVVVVVVVVUVAABVVVVQVVVVVVVVVQVQEFBVVVVVVVVVVVVVVVVVRVARUFVVVVVVVVVVVVVVVVVVAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAABABUUVVUUFVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAFVVFQBVVVVVVVUFQFVVVVVVVVVVVVVVVQAAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAFRVVVVVVVVVVVX1VVVVaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/VfXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX1VVVVVVV9VVVVVVVVVVVVVVVX///9VVVVVVVVVVVVV1VVVVVXVVVVVXVX1VVVVVX1VX1V1VVdVVVVVdVX1XXVdVV31VVVVVVVVVVdVVVVVVVVVVXfV31VVVVVVVVVVVVVVVVVVVf1VVVVVVVVXVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVXVVVVVVVVVVVVVVVVV11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVX9////////////////X1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVVVVVVVVVVVVqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVV9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAAAAAAAAAAAAAAAAVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAA8KqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFamqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlZVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVVVqmpVVQAAVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQFUBQVUAVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVVVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEAFVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUVAEBVVVVVVVBVVVVVVVVVVVVVVVVVFURUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBRAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVAABBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRUEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAEQFUVVVUBQAFVVVVVVVVVVVVVAAAAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAABBVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBQEUQAABVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVAVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVpVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqmqaaqqqqqqqqqqalVVVWVVVVVVVVVVallVVVWqVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRFQBQAAAABAAQBVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAEAVAAAAAAAAAAAAAAAAVFVRVVVVVFVVVVUVAAEAAABVVVVVVVVVVVVVVVVVVVVVVVVVVQBAAAAAABQAEARAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9Vf9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9XVf//////////////3/9fVfX///9V//9XVf//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVZVWlWqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqqqqqqqqqqqqVVVVqqqqqqVaVVWaqlpVpaVVWlqllqVaVVVVpVpVlVVVVX1VaVmlVV9VZlVVVVVVVVVVZlX///9VVVWammqaVVVV1VVVVVXVVVWlXVX1VVVVVb1Vr6q6qquqqppVuqr6rrquVV31VVVVVVVVVVdVVVVVWVVVVXfV31VVVVVVVVWlqqpVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqalWqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIDBAUGBwgJCgsMDQICAgICAgIOAgICAgICAg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgICAgMCAgQCBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHQICHgICAgICAgIfICEiIwIkJSYnKCkCKgICAgIrLAICAgItLgICAi8wMTIzAgICAgICNAICNTY3Ajg5Ojs8PT4/OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUACAkFCAgJDREVGR0gCSTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUoCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI5OTk5SwICAgICTE1OTwICAlACUVICAgICAgICAgICAgICU1QCAlUCVgICV1hZWltcXV5fYGFiYwJkZWZnAmgCaWprbAICbW5vcAJxcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAICAgICAgICAgICAgICAgICAnV2AgICdwICAnh5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTl6OTk5OTk5OTk5e3wCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn05OX45OX8CAgICAgICAgICAgICAgICAgICgAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoECAgKCg4QChQICAgICAgICAgICAgKGhwICAgICAgICAgKIiXYCAooCAgKLAowCAgICAo2OAgICAgICAgICAgICAo+QApGSApOUlZaXmJmaApsCApydnp8CAgICAgICAgICOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5oB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoQICAgKiowIEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0CAh4CAgICAgICHyAhIiMCJCUmJygpAioCAgICpKWmp6ipqi6rOaytrq+wsQICAgICArICAjU2NwI4OTo7PD0+szk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUsCAgICArRNTrWIiXYCAooCAgKLAowCAgICAo2OAgICAgICAgICAgICAo+QtreSApOUlZaXmJmaApsCApydnp8CAgICAgICAgICVVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVVUVAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBAAAAAAAAAAAAABBBEFVVVVVVV1VVVVVVVVVVVVFVVQAAQFT13VVVVVVVVVVVFQAAAAAAVVVVVfxdVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFABQAFARQVVVVVVVVVRVRVVVVVVVVVQAAAAAAAEBVVVVVVVVVVVXVV1VVVVVVVVVVVVVVBQAAVFVVVVVVVVVVVVVVVVUVAABVVVFVVVVVVQUQAAABAVBVVVVVVVVVVVVVAVVVVVVV/////39VVVVQFQAAVVVVVVVVVVVVVQUAAAAAAAAAAAAAAAAAQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVQVVVVVVVVVVVVVVVVVVVVAEQVFFVVVVVBVVVVVVVBQBRVVVVVVVVVVVVVVVVVVUEAVRVUVUBVVUFVVVVVVVVVUVVVVVVVVVVVVVVVVVVVUVUVVVRVRVVVVVVVVVVVVVVVFRVVVVVVVVVVVVVVVVVBFQFBFBVQVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVUURAUEUFVBVVUFVVVVVVVVVVBVVVVVVVVVVVVVVVVVFUQBVFVBVRVVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVRRUFRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAEBVVRUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAAFRVVQBAVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVRFRVVVVVVVVVVVVVVVVVQEAAEAABFUBAAABAAAAAAAAAABUVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQQAQUFVVVVVVVVQBVRVVVUBVFVVRUFVUVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVBVBVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVX///ff//ddfd9bV11UQAFBVRQEAAFVXUVVVVVVVVVVVVVUVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcVFFVVVVVVVVVVVVVVVVVVRQBARAEAVBUAABRVVVVVVVVVVVVVVVUAAAAAAAAAQFVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVUAAFAFVFVVVVVVVVVVFQAAVVVVUFVVVVVVVVUFUABQVVVVVVVVVVVVVVVVVUVQEQBVVVVVVVVVVVVVVVVVVQAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQAAAAAQAVFFVVFBVVVVVVVVVVVVVVVVVVVVVVQAAAAAAAAAAAAAAAAAAAABVVRUAVVVVVVVVBUBVVVVVVVVVVVVVVVUAAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAABUVVVVVVVVVVVV9VVVVWlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf1X11VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV9VVVVVVVfVVVVVVVVqqpVVVVV////VVVVVVVVVVVVVdVVVaWq1VVVVV1V9VVVVVV9VV9VdVVXVVVVVXVV9V11XVVd9VVVVVVVVVVXVVVVVVVVVVV31d9VVVVVVVVVVVVVVVVVVVX9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVddVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQVVVVVVVVVVVVVVVVVVVV/f///////////////19V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAAAAAAAAAAKqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVVVVVVVVqqqqqqqqqqqqqqqqqqoKAKqqqmqpqqqqqqqqqqqqqqqqqqqqqqqqqqpqgaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVqaqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqKqqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaVZWqqqqqqqqqqqqqqmqqqqqqqqqqqqqqVVWqqqqqqqqqqqqqqqqqqqpWqqqqqqqqqqqqqqqqqmpVVVVVVVVVVVVVVVVVX1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVAAABQVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVFRRVVVVVVVVVBVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVQAAAABQVUUVVVVVVVVVVVVVBQBQVVVVVVUVAAAQVVVVqqqqqqqqqlZAVVVVVVVVVVVVVVUVBVBQVFVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVUBQEFBVVUVVVVUVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVBBRUBVFVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVRRVVVVVaqqqqqqqqqqqlVVVQAAAAAAQBUAAAAAAAAAAAAAAABVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUMAADwqqpaVQAAAACqqqqqqqqqqmqqqqqqaqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVlVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVAVQFBVQBVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVAVBVVVVVVVVVVVVVVVVVVRVUVVVVVVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVUAAABAVVVVVVVVVVVVVRRUVRVQVVVVVVVVVVVVVVUVQEFVRVVVVVVVVVVVVVVVVVVVVUBVVVVVVVVVVRUAAQBUVVVVVVVVVVVVVVVVVVUVVVVVUFVVVVVVVVVVVVVVVQUAQARVARRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVQAFVFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFRUAQFVVVVVVUFVVVVVVVVVVVVVVVVUVRFRVVVFVFVVVVQUAVABUVVVVVVVVVVVVVVVVVVVVVRQARBFQBUBVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAFRFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVFABEEQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUFUFUQVFVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVRUAQBFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVRAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEQUQAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFUVABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUABVVUVVVVVVVVVQEAQFVVVVVVVVVVVRUABEBVFVVVAUABVVVVVVVVVVVVVQAAAABAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVVVVVVVVVVVVVVVVVVVVVVUFAAAAAAAFAARBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAUBFEAAAVVVVVVVVVVVVVVVVVVVVVVVVUBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVQFVVVVVVVVVVVVVVVQVAVUBVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVBUAAABQVVVVVVVVVVVVVVVVVVVVVVUFAABQAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBUVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVUVQFVVVVVVVVVVVVVVVVVVVVVVVVWqVFVVUFVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVVZWqqlZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqappqqqqqqqqqqpqVVVVZVVVVVVVVVVqWVVVVapVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVVVVVVVVBAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAABQAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAVABAAAAAEABAFVVVVVVVVUFUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqpqVVWqqqqqqmpVVQAAAAAAAAAAAAAAAABAFQAAAAAAAAAAAAAAAFRVUVVVVVRVVVVVFQABAAAAVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAAAAAUABAEQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQBAVVVVVVVVVVVVVVVVVVVXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVdVVVVVVVVVVVVVVVVVVVVV1/f9/VVVVVVVVVVVVVVVVVVVVVVVV9f///////25VVVWqqrqqqqqq6vq/v1WqqlZVX1VVVapaVVVVVVVV//////////9XVVX9/9////////////////////////f//////1VVVf////////////9/1f9VVVX/////V1f//////////////////////3/3/////////////////////////////////////////////////////////////9f///////////////////9fVVXVf////////1VVVVV1VVVVVVVVfVVVVVdVVVVVVVVVVVVVVVVVVVVVVVVVVdX///////////////////////////9VVVVVVVVVVVVVVVX//////////////////////19VV3/9Vf9VVdVXVf//V1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf///1VXVVVVVVVV//////////////9////f/////////////////////////////////////////////////////////////1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX///9X//9f1f////////////////9/VfX////X//9fVf//V1WqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqWlVVVVVVVVVVWZZVYaqlWapVVVVVVZVVVVVVVVVVlVVVAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAFVVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQCWalpaaqoFQKZZlWVVVVVVVVVVVQAAAABVVlVVqVZVVVVVVVVVVVVWVVVVVVVVVVUAAAAAAAAAAFRVVVWVWVlVVWVVVWlVVVVVVVVVVVVVVaqqqmqqqqpVqqpaVVVVWVWqqqpVVVVVZVVVWlVVVVWlZVZVVVWVVVVVVVVVppaalllZZamWqqpmVapVWllVWlZlVVVVaqqlpVpVVVWlqlpVVVlZVVVZVVVVVVWVVVVVVVVVVVVVVVVVVVVVVVVVVVVlVfVVVVVpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVaqqqqqqqqqqqlZVVaqqqqqlWlVVmqpaVaWlVVpapZalWlVVVaVaVZVVVVV9VWlZpVWvVWZVVVVVqqpVVWZV////VVVVmppqmlVVVdVVVaWq1VVVpV1V9VVVVVW9Va+quqqrqqqaVbqq+q66rlVd9VVVVVVVVVVXVVVVVVlVVVV31d9VVVVVVVVVpaqqqqqqqqr9VVVVVVVVV1VV1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVXVV1VVVVVVVVVVVVVVVVetWlVVVVVVVVVVVaqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAwAAwKqqWlUAAAAAqqqqqqqqqqpqqqqqqmqqVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUWaqqqlaqqqqqqqqqWqqqqqqqqqqqqqqqqqqqWlWqqqqqqqqquv7/v6qqqqpWVVVVVVVVVVVVVVVVVfX///////++BgAADAAAAAQAAACFBQAAcAYAAIcFAAAwMTIzNDU2Nzg5YWJjZGVmL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvdXVpZC0xLjE3LjAvc3JjL2ZtdC5ycwCogScAWwAAALsAAAANAAAAqIEnAFsAAACzAAAAFQAAAKiBJwBbAAAAtgAAAA0AAACogScAWwAAALcAAAANAAAAFIMnAFAAAAAuAgAAEQAAAEpzVmFsdWUoKQAAAFSCJwAIAAAAXIInAAEAAAD//////////3CCJwAAAAAAAAAAAAAAAAAvcnVzdGMvMmU2ODgyYWM1YmUyN2E3MzI5M2Q2ZjdhZTU2Mzk3ZmRmMzI4NDhkZS9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAIiCJwBPAAAAGQEAABkAAABUcmllZCB0byBzaHJpbmsgdG8gYSBsYXJnZXIgY2FwYWNpdHnogicAJAAAAC9ydXN0Yy8yZTY4ODJhYzViZTI3YTczMjkzZDZmN2FlNTYzOTdmZGYzMjg0OGRlL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzFIMnAFAAAAC5AgAACQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5ycy9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jYWNoZS9pbnRlcm4ucnPjgycAbQAAABoAAAArAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjUwL3NyYy9xdWV1ZS5ycwAAAGCEJwBtAAAAJQAAAC4AAABghCcAbQAAACgAAAApAAAAYIQnAG0AAAA+AAAAGgAAAGCEJwBtAAAAPgAAACcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNTAvc3JjL3Rhc2svc2luZ2xldGhyZWFkLnJzAAAAEIUnAHkAAAAiAAAAFQAAAMEGAADCBgAAwwYAAMQGAAAQhScAeQAAAGcAAAAlAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWQAAMUGAAAEAAAABAAAAMYGAADHBgAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAAEhicAKgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycziGJwBgAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAqIYnAA4AAAA4hicAYAAAAHoCAAANAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAgIAAAABAQICAggAAAANAAAADwAAALz8IADE/CAA0fwgAAgAAAANAAAADwAAALz8IADE/CAA0fwgAAgAAAANAAAADwAAALz8IADE/CAA0fwgAAYAAAAGAAAACAAAAAcAAABwhiAAJNcmAHaGIAB+hiAAFIYgACKGIAAwhiAARoYgAA4AAAAOAAAAFgAAABYAAACEtiAAhrYgAIi2IACKtiAAjLYgAI62IACQtiAAkrYgAJS2IACWtiAAmLYgAJq2IACctiAAnrYgAKC2IACitiAApLYgAGC+IABwviAAgL4gAJC+IACQviAAoL4gALC+IADAviAA0L4gAOC+IADwviAAAL8gABC/IAAgvyAAML8gAEC/IABQvyAAYL8gAHC/IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0LYgAOC2IADwtiAAALcgABC3IAAgtyAAMLcgAEC3IABQtyAAYLcgAHC3IACAtyAAkLcgAKC3IACwtyAAwLcgANC3IADgtyAA8LcgAAC4IAAQuCAAILggADC4IABAuCAAQLggAFC4IABguCAAcLggAIC4IACQuCAAoLggALC4IADAuCAA0LggAOC4IADwuCAA8LggAAC5IAAQuSAAILkgADC5IABAuSAAQLkgAFC5IABguSAAcLkgAIC5IACQuSAAoLkgALC5IADAuSAA0LkgAOC5IADguSAA8LkgAAC6IAAQuiAAILogADC6IABAuiAAULogAGC6IABwuiAAgLogAJC6IACguiAAsLogAMC6IADQuiAA4LogAPC6IADwuiAAALsgABC7IAAguyAAMLsgAEC7IABQuyAAULsgAGC7IABwuyAAgLsgAJC7IACguyAAkLkgALC7IADAuyAA0LsgAOC7IADwuyAAALwgABC8IAAgvCAAMLwgAEC8IABQvCAAYLwgAHC8IACAvCAAkLwgAKC8IACwvCAAwLwgANC8IADgvCAA8LwgAAC9IAAQvSAAIL0gADC9IABAvSAAUL0gAGC9IABwvSAAgL0gAJC9IACgvSAAsL0gAMC9IADQvSAA4L0gAPC9IAAAviAAEL4gACC+IAAwviAAQL4gAFC+IAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAH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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIC/IACQvyAAoL8gALC/IADAvyAA0L8gAOC/IADwvyAAAMAgABDAIAAgwCAAMMAgAEDAIABQwCAAYMAgAHDAIACAwCAAkMAgAKDAIACwwCAAwMAgANDAIADgwCAA8MAgAPDAIAAAwSAAEMEgACDBIAAwwSAAQMEgAFDBIABgwSAAcMEgAIDBIACQwSAAoMEgAKDBIACwwSAAwMEgANDBIADgwSAA8MEgAPDBIAAAwiAAEMIgACDCIAAwwiAAQMIgAFDCIABgwiAAcMIgAIDCIACQwiAAkMIgAKDCIACwwiAAwMIgANDCIADgwiAA8MIgAADDIAAQwyAAIMMgADDDIABAwyAAUMMgAGDDIABwwyAAgMMgAJDDIACgwyAAoMMgALDDIADAwyAA0MMgAODDIADwwyAAAMQgAADEIAAQxCAAIMQgADDEIABAxCAAUMQgAEDCIABgxCAAcMQgAIDEIACQxCAAoMQgALDEIADAxCAA0MQgAODEIADwxCAAAMUgABDFIAAgxSAAMMUgAEDFIABQxSAAYMUgAHDFIACAxSAAkMUgAKDFIACwxSAAwMUgANDFIADgxSAA8MUgAADGIAAQxiAAIMYgADDGIABAxiAAUMYgAGDGIABwxiAAgMYgAJDGIACgxiAAsMYgAMDGIADQxiAA4MYgAPDGIAAAxyAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAESyIABMsiAAVLIgAFyyIABksiAAbLIgAHSyIAB8siAAhLIgAIyyIACUsiAAnLIgAKSyIACssiAAtLIgALyyIADEsiAAzLIgANSyIADcsiAA5LIgAOyyIAD0siAA/LIgAASzIAAMsyAAFLMgAByzIAAksyAALLMgADSzIAA8syAARLMgAEyzIABUsyAAXLMgAGSzIABssyAAdLMgAHyzIACEsyAAjLMgAJSzIACcsyAApLMgAKyzIAC0syAAvLMgAMSzIADMsyAA1LMgANyzIADksyAA7LMgAPSzIAD8syAABLQgAAy0IAAUtCAAHLQgACS0IAAstCAANLQgADy0IABEtCAATLQgAFS0IABctCAAZLQgAGy0IAB0tCAAfLQgAIS0IACMtCAAlLQgAJy0IACktCAArLQgALS0IAC8tCAAxLQgAMy0IADUtCAA3LQgAOS0IADstCAA9LQgAPy0IAAEtSAADLUgABS1IAActSAAJLUgACy1IAA0tSAAPLUgAES1IABMtSAAVLUgAFy1IABktSAAbLUgAHS1IAB8tSAAhLUgAIy1IACUtSAAnLUgAKS1IACstSAAtLUgALy1IADEtSAAzLUgANS1IADctSAA5LUgAOy1IAD0tSAA/LUgAAS2IAAMtiAAFLYgABy2IAAktiAALLYgADS2IAA8tiAAsq4gALiuIAC+riAAxK4gAMquIADQriAA1q4gANyuIADiriAA6K4gAO6uIAD1riAA/K4gAAOvIAAKryAAEa8gABivIAAfryAAJq8gAC2vIAA0ryAAO68gAEKvIABJryAAUK8gAFevIABeryAAZa8gAGyvIABzryAAeq8gAIGvIACIryAAj68gAJavIACdryAApK8gAKuvIACyryAAua8gAMCvIADHryAAzq8gANWvIADcryAA468gAOqvIADxryAA+K8gAP+vIAAGsCAADbAgABSwIAAbsCAAIrAgACmwIAAwsCAAN7AgAD6wIABFsCAATLAgAFOwIABasCAAYbAgAGiwIABvsCAAdrAgAH2wIACEsCAAi7AgAJKwIACZsCAAoLAgAKewIACusCAAtbAgALywIADDsCAAyrAgANGwIADYsCAA37AgAOawIADtsCAA9LAgAPuwIAACsSAACbEgABCxIAAXsSAAHrEgACWxIAAs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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 4d090f02af9387..edae7b89a05eba 100644 --- a/deps/amaro/dist/package.json +++ b/deps/amaro/dist/package.json @@ -4,7 +4,7 @@ "강동윤 " ], "description": "wasm module for swc", - "version": "1.13.20", + "version": "1.13.21", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/deps/amaro/lib/wasm.d.ts b/deps/amaro/lib/wasm.d.ts index 3f7ffbacc3fda3..0fb4e65fd58414 100644 --- a/deps/amaro/lib/wasm.d.ts +++ b/deps/amaro/lib/wasm.d.ts @@ -30,7 +30,7 @@ interface TransformConfig { * Don't create `export {}`. * By default, strip creates `export {}` for modules to preserve module * context. - * + * * @see https://github.com/swc-project/swc/issues/1698 */ noEmptyExport?: boolean; @@ -39,7 +39,7 @@ interface TransformConfig { * Disables an optimization that inlines TS enum member values * within the same module that assumes the enum member values * are never modified. - * + * * Defaults to false. */ tsEnumIsMutable?: boolean; @@ -53,7 +53,7 @@ interface TransformConfig { interface JsxConfig { /** * How to transform JSX. - * + * * @default "react-jsx" */ transform?: "react-jsx" | "react-jsxdev"; diff --git a/deps/amaro/package.json b/deps/amaro/package.json index 657b215681fef0..b80444ce5e789b 100644 --- a/deps/amaro/package.json +++ b/deps/amaro/package.json @@ -1,6 +1,6 @@ { "name": "amaro", - "version": "1.1.4", + "version": "1.1.5", "description": "Node.js TypeScript wrapper", "license": "MIT", "type": "commonjs", diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md index fdf937785ca5d4..6dfcc2549a5f8a 100644 --- a/deps/corepack/CHANGELOG.md +++ b/deps/corepack/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [0.34.2](https://github.com/nodejs/corepack/compare/v0.34.1...v0.34.2) (2025-10-31) + + +### Bug Fixes + +* bump package manager versions ([#754](https://github.com/nodejs/corepack/issues/754)) ([35e3869](https://github.com/nodejs/corepack/commit/35e3869f3f4d21bbfccdf78ea564ab0723d6f36f)) +* fix potential race condition in `node-tar` ([#757](https://github.com/nodejs/corepack/pull/757)) ([78808a7](78808a72691655fe5140c02ae41d4baef88cd9fa)) + +## [0.34.1](https://github.com/nodejs/corepack/compare/v0.34.0...v0.34.1) (2025-10-17) + + +### Bug Fixes + +* incorrect registry origin check ([#743](https://github.com/nodejs/corepack/issues/743)) ([cc840b2](https://github.com/nodejs/corepack/commit/cc840b2d232a29c225d2436d350640f0035ed28b)) +* update package manager versions ([#728](https://github.com/nodejs/corepack/issues/728)) ([78ce029](https://github.com/nodejs/corepack/commit/78ce0297a9152bb5c68f724821a9a0095b408334)) + ## [0.34.0](https://github.com/nodejs/corepack/compare/v0.33.0...v0.34.0) (2025-07-19) diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs index 78fb4372832e3b..51a8bc86fe820e 100644 --- a/deps/corepack/dist/lib/corepack.cjs +++ b/deps/corepack/dist/lib/corepack.cjs @@ -15,11 +15,11 @@ var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; -var __copyProps = (to, from, except, desc) => { +var __copyProps = (to, from, except, desc2) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + __defProp(to, key, { get: () => from[key], enumerable: !(desc2 = __getOwnPropDesc(from, key)) || desc2.enumerable }); } return to; }; @@ -604,12 +604,12 @@ function as(value, validator, { coerce = false, errors: storeErrors, throw: thro } function fn(validators, fn2) { const isValidArgList = isTuple(validators); - return (...args) => { + return ((...args) => { const check = isValidArgList(args); if (!check) throw new TypeAssertionError(); return fn2(...args); - }; + }); } function hasMinLength(length) { return makeValidator({ @@ -1090,18 +1090,20 @@ var require_node = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/debug.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js var require_debug = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/debug.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/debug.js"(exports2, module2) { + "use strict"; var debug2 = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => { }; module2.exports = debug2; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/constants.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js var require_constants = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/constants.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/constants.js"(exports2, module2) { + "use strict"; var SEMVER_SPEC_VERSION = "2.0.0"; var MAX_LENGTH = 256; var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */ @@ -1130,9 +1132,10 @@ var require_constants = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/re.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js var require_re = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/re.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/re.js"(exports2, module2) { + "use strict"; var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, @@ -1173,8 +1176,8 @@ var require_re = __commonJS({ createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`); createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`); createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`); - createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`); - createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`); + createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`); createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`); createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`); createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`); @@ -1217,9 +1220,10 @@ var require_re = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/parse-options.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js var require_parse_options = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/parse-options.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/parse-options.js"(exports2, module2) { + "use strict"; var looseOption = Object.freeze({ loose: true }); var emptyOpts = Object.freeze({}); var parseOptions = (options) => { @@ -1235,11 +1239,15 @@ var require_parse_options = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/identifiers.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js var require_identifiers = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/identifiers.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/identifiers.js"(exports2, module2) { + "use strict"; var numeric = /^[0-9]+$/; var compareIdentifiers = (a, b) => { + if (typeof a === "number" && typeof b === "number") { + return a === b ? 0 : a < b ? -1 : 1; + } const anum = numeric.test(a); const bnum = numeric.test(b); if (anum && bnum) { @@ -1256,40 +1264,41 @@ var require_identifiers = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/semver.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js var require_semver = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/semver.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/semver.js"(exports2, module2) { + "use strict"; var debug2 = require_debug(); var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants(); - var { safeRe: re, safeSrc: src, t } = require_re(); + var { safeRe: re, t } = require_re(); var parseOptions = require_parse_options(); var { compareIdentifiers } = require_identifiers(); var SemVer3 = class _SemVer { - constructor(version3, options) { + constructor(version2, options) { options = parseOptions(options); - if (version3 instanceof _SemVer) { - if (version3.loose === !!options.loose && version3.includePrerelease === !!options.includePrerelease) { - return version3; + if (version2 instanceof _SemVer) { + if (version2.loose === !!options.loose && version2.includePrerelease === !!options.includePrerelease) { + return version2; } else { - version3 = version3.version; + version2 = version2.version; } - } else if (typeof version3 !== "string") { - throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version3}".`); + } else if (typeof version2 !== "string") { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`); } - if (version3.length > MAX_LENGTH) { + if (version2.length > MAX_LENGTH) { throw new TypeError( `version is longer than ${MAX_LENGTH} characters` ); } - debug2("SemVer", version3, options); + debug2("SemVer", version2, options); this.options = options; this.loose = !!options.loose; this.includePrerelease = !!options.includePrerelease; - const m = version3.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); + const m = version2.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]); if (!m) { - throw new TypeError(`Invalid Version: ${version3}`); + throw new TypeError(`Invalid Version: ${version2}`); } - this.raw = version3; + this.raw = version2; this.major = +m[1]; this.minor = +m[2]; this.patch = +m[3]; @@ -1345,7 +1354,25 @@ var require_semver = __commonJS({ if (!(other instanceof _SemVer)) { other = new _SemVer(other, this.options); } - return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); + if (this.major < other.major) { + return -1; + } + if (this.major > other.major) { + return 1; + } + if (this.minor < other.minor) { + return -1; + } + if (this.minor > other.minor) { + return 1; + } + if (this.patch < other.patch) { + return -1; + } + if (this.patch > other.patch) { + return 1; + } + return 0; } comparePre(other) { if (!(other instanceof _SemVer)) { @@ -1406,8 +1433,7 @@ var require_semver = __commonJS({ throw new Error("invalid increment argument: identifier is empty"); } if (identifier) { - const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`); - const match = `-${identifier}`.match(r); + const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]); if (!match || match[1] !== identifier) { throw new Error(`invalid identifier: ${identifier}`); } @@ -1517,34 +1543,37 @@ var require_semver = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/compare.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js var require_compare = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/compare.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/compare.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); var compare = (a, b, loose) => new SemVer3(a, loose).compare(new SemVer3(b, loose)); module2.exports = compare; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/rcompare.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js var require_rcompare = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/rcompare.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/rcompare.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var rcompare = (a, b, loose) => compare(b, a, loose); module2.exports = rcompare; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/parse.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js var require_parse = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/parse.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/parse.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); - var parse5 = (version3, options, throwErrors = false) => { - if (version3 instanceof SemVer3) { - return version3; + var parse4 = (version2, options, throwErrors = false) => { + if (version2 instanceof SemVer3) { + return version2; } try { - return new SemVer3(version3, options); + return new SemVer3(version2, options); } catch (er) { if (!throwErrors) { return null; @@ -1552,25 +1581,27 @@ var require_parse = __commonJS({ throw er; } }; - module2.exports = parse5; + module2.exports = parse4; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/valid.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js var require_valid = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/valid.js"(exports2, module2) { - var parse5 = require_parse(); - var valid = (version3, options) => { - const v = parse5(version3, options); + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/valid.js"(exports2, module2) { + "use strict"; + var parse4 = require_parse(); + var valid = (version2, options) => { + const v = parse4(version2, options); return v ? v.version : null; }; module2.exports = valid; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/lrucache.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js var require_lrucache = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/internal/lrucache.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/internal/lrucache.js"(exports2, module2) { + "use strict"; var LRUCache = class { constructor() { this.max = 1e3; @@ -1605,63 +1636,70 @@ var require_lrucache = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/eq.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js var require_eq = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/eq.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/eq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var eq = (a, b, loose) => compare(a, b, loose) === 0; module2.exports = eq; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/neq.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js var require_neq = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/neq.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/neq.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var neq = (a, b, loose) => compare(a, b, loose) !== 0; module2.exports = neq; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gt.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js var require_gt = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gt.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var gt = (a, b, loose) => compare(a, b, loose) > 0; module2.exports = gt; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gte.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js var require_gte = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/gte.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/gte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var gte = (a, b, loose) => compare(a, b, loose) >= 0; module2.exports = gte; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lt.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js var require_lt = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lt.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lt.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var lt = (a, b, loose) => compare(a, b, loose) < 0; module2.exports = lt; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lte.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js var require_lte = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/lte.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/lte.js"(exports2, module2) { + "use strict"; var compare = require_compare(); var lte = (a, b, loose) => compare(a, b, loose) <= 0; module2.exports = lte; } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/cmp.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js var require_cmp = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/cmp.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/cmp.js"(exports2, module2) { + "use strict"; var eq = require_eq(); var neq = require_neq(); var gt = require_gt(); @@ -1708,9 +1746,10 @@ var require_cmp = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/comparator.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js var require_comparator = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/comparator.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/comparator.js"(exports2, module2) { + "use strict"; var ANY = Symbol("SemVer ANY"); var Comparator = class _Comparator { static get ANY() { @@ -1756,19 +1795,19 @@ var require_comparator = __commonJS({ toString() { return this.value; } - test(version3) { - debug2("Comparator.test", version3, this.options.loose); - if (this.semver === ANY || version3 === ANY) { + test(version2) { + debug2("Comparator.test", version2, this.options.loose); + if (this.semver === ANY || version2 === ANY) { return true; } - if (typeof version3 === "string") { + if (typeof version2 === "string") { try { - version3 = new SemVer3(version3, this.options); + version2 = new SemVer3(version2, this.options); } catch (er) { return false; } } - return cmp(version3, this.operator, this.semver, this.options); + return cmp(version2, this.operator, this.semver, this.options); } intersects(comp, options) { if (!(comp instanceof _Comparator)) { @@ -1820,9 +1859,10 @@ var require_comparator = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/range.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js var require_range = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/classes/range.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/classes/range.js"(exports2, module2) { + "use strict"; var SPACE_CHARACTERS = /\s+/g; var Range3 = class _Range { constructor(range, options) { @@ -1891,7 +1931,7 @@ var require_range = __commonJS({ parseRange(range) { const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE); const memoKey = memoOpts + ":" + range; - const cached = cache.get(memoKey); + const cached = cache2.get(memoKey); if (cached) { return cached; } @@ -1925,7 +1965,7 @@ var require_range = __commonJS({ rangeMap.delete(""); } const result = [...rangeMap.values()]; - cache.set(memoKey, result); + cache2.set(memoKey, result); return result; } intersects(range, options) { @@ -1943,19 +1983,19 @@ var require_range = __commonJS({ }); } // if ANY of the sets match ALL of its comparators, then pass - test(version3) { - if (!version3) { + test(version2) { + if (!version2) { return false; } - if (typeof version3 === "string") { + if (typeof version2 === "string") { try { - version3 = new SemVer3(version3, this.options); + version2 = new SemVer3(version2, this.options); } catch (er) { return false; } } for (let i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version3, this.options)) { + if (testSet(this.set[i], version2, this.options)) { return true; } } @@ -1964,7 +2004,7 @@ var require_range = __commonJS({ }; module2.exports = Range3; var LRU = require_lrucache(); - var cache = new LRU(); + var cache2 = new LRU(); var parseOptions = require_parse_options(); var Comparator = require_comparator(); var debug2 = require_debug(); @@ -1992,6 +2032,7 @@ var require_range = __commonJS({ return result; }; var parseComparator = (comp, options) => { + comp = comp.replace(re[t.BUILD], ""); debug2("comp", comp, options); comp = replaceCarets(comp, options); debug2("caret", comp); @@ -2169,13 +2210,13 @@ var require_range = __commonJS({ } return `${from} ${to}`.trim(); }; - var testSet = (set, version3, options) => { + var testSet = (set, version2, options) => { for (let i = 0; i < set.length; i++) { - if (!set[i].test(version3)) { + if (!set[i].test(version2)) { return false; } } - if (version3.prerelease.length && !options.includePrerelease) { + if (version2.prerelease.length && !options.includePrerelease) { for (let i = 0; i < set.length; i++) { debug2(set[i].semver); if (set[i].semver === Comparator.ANY) { @@ -2183,7 +2224,7 @@ var require_range = __commonJS({ } if (set[i].semver.prerelease.length > 0) { const allowed = set[i].semver; - if (allowed.major === version3.major && allowed.minor === version3.minor && allowed.patch === version3.patch) { + if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) { return true; } } @@ -2195,9 +2236,10 @@ var require_range = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/ranges/valid.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js var require_valid2 = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/ranges/valid.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/ranges/valid.js"(exports2, module2) { + "use strict"; var Range3 = require_range(); var validRange = (range, options) => { try { @@ -2223,7 +2265,7 @@ var require_ms = __commonJS({ options = options || {}; var type = typeof val; if (type === "string" && val.length > 0) { - return parse5(val); + return parse4(val); } else if (type === "number" && isFinite(val)) { return options.long ? fmtLong(val) : fmtShort(val); } @@ -2231,7 +2273,7 @@ var require_ms = __commonJS({ "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) ); }; - function parse5(str) { + function parse4(str) { str = String(str); if (str.length > 100) { return; @@ -2326,9 +2368,9 @@ var require_ms = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/common.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js var require_common = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/common.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/common.js"(exports2, module2) { function setup(env2) { createDebug.debug = createDebug; createDebug.default = createDebug; @@ -2429,7 +2471,7 @@ var require_common = __commonJS({ createDebug.namespaces = namespaces; createDebug.names = []; createDebug.skips = []; - const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(" ", ",").split(",").filter(Boolean); + const split = (typeof namespaces === "string" ? namespaces : "").trim().replace(/\s+/g, ",").split(",").filter(Boolean); for (const ns of split) { if (ns[0] === "-") { createDebug.skips.push(ns.slice(1)); @@ -2503,9 +2545,9 @@ var require_common = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/browser.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js var require_browser = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/browser.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/browser.js"(exports2, module2) { exports2.formatArgs = formatArgs; exports2.save = save; exports2.load = load; @@ -2647,7 +2689,7 @@ var require_browser = __commonJS({ function load() { let r; try { - r = exports2.storage.getItem("debug"); + r = exports2.storage.getItem("debug") || exports2.storage.getItem("DEBUG"); } catch (error) { } if (!r && typeof process !== "undefined" && "env" in process) { @@ -2673,7 +2715,7 @@ var require_browser = __commonJS({ } }); -// .yarn/cache/supports-color-npm-10.0.0-6cd1bb42a6-0e7884dfd0.zip/node_modules/supports-color/index.js +// .yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js var supports_color_exports = {}; __export(supports_color_exports, { createSupportsColor: () => createSupportsColor, @@ -2767,11 +2809,17 @@ function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) { if (env.TERM === "xterm-kitty") { return 3; } + if (env.TERM === "xterm-ghostty") { + return 3; + } + if (env.TERM === "wezterm") { + return 3; + } if ("TERM_PROGRAM" in env) { - const version3 = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + const version2 = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); switch (env.TERM_PROGRAM) { case "iTerm.app": { - return version3 >= 3 ? 3 : 2; + return version2 >= 3 ? 3 : 2; } case "Apple_Terminal": { return 2; @@ -2798,7 +2846,7 @@ function createSupportsColor(stream, options = {}) { } var import_node_process, import_node_os, import_node_tty, env, flagForceColor, supportsColor, supports_color_default; var init_supports_color = __esm({ - ".yarn/cache/supports-color-npm-10.0.0-6cd1bb42a6-0e7884dfd0.zip/node_modules/supports-color/index.js"() { + ".yarn/cache/supports-color-npm-10.2.2-e43ac15f9f-fb28dd7e0c.zip/node_modules/supports-color/index.js"() { import_node_process = __toESM(require("node:process"), 1); import_node_os = __toESM(require("node:os"), 1); import_node_tty = __toESM(require("node:tty"), 1); @@ -2816,9 +2864,9 @@ var init_supports_color = __esm({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/node.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js var require_node2 = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/node.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/node.js"(exports2, module2) { var tty2 = require("tty"); var util = require("util"); exports2.init = init; @@ -2990,9 +3038,9 @@ var require_node2 = __commonJS({ } }); -// .yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/index.js +// .yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js var require_src = __commonJS({ - ".yarn/__virtual__/debug-virtual-f48feae4da/0/cache/debug-npm-4.4.0-f6efe76023-db94f1a182.zip/node_modules/debug/src/index.js"(exports2, module2) { + ".yarn/__virtual__/debug-virtual-436baa457e/0/cache/debug-npm-4.4.3-0105c6123a-d79136ec6c.zip/node_modules/debug/src/index.js"(exports2, module2) { if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { module2.exports = require_browser(); } else { @@ -3071,17 +3119,23 @@ var require_proxy_from_env = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/errors.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js var require_errors = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/errors.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/errors.js"(exports2, module2) { "use strict"; + var kUndiciError = Symbol.for("undici.error.UND_ERR"); var UndiciError = class extends Error { constructor(message) { super(message); this.name = "UndiciError"; this.code = "UND_ERR"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kUndiciError] === true; + } + [kUndiciError] = true; }; + var kConnectTimeoutError = Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"); var ConnectTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3089,7 +3143,12 @@ var require_errors = __commonJS({ this.message = message || "Connect Timeout Error"; this.code = "UND_ERR_CONNECT_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kConnectTimeoutError] === true; + } + [kConnectTimeoutError] = true; }; + var kHeadersTimeoutError = Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"); var HeadersTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3097,7 +3156,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Timeout Error"; this.code = "UND_ERR_HEADERS_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersTimeoutError] === true; + } + [kHeadersTimeoutError] = true; }; + var kHeadersOverflowError = Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"); var HeadersOverflowError = class extends UndiciError { constructor(message) { super(message); @@ -3105,7 +3169,12 @@ var require_errors = __commonJS({ this.message = message || "Headers Overflow Error"; this.code = "UND_ERR_HEADERS_OVERFLOW"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHeadersOverflowError] === true; + } + [kHeadersOverflowError] = true; }; + var kBodyTimeoutError = Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"); var BodyTimeoutError = class extends UndiciError { constructor(message) { super(message); @@ -3113,7 +3182,12 @@ var require_errors = __commonJS({ this.message = message || "Body Timeout Error"; this.code = "UND_ERR_BODY_TIMEOUT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBodyTimeoutError] === true; + } + [kBodyTimeoutError] = true; }; + var kResponseStatusCodeError = Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"); var ResponseStatusCodeError = class extends UndiciError { constructor(message, statusCode, headers, body) { super(message); @@ -3125,7 +3199,12 @@ var require_errors = __commonJS({ this.statusCode = statusCode; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseStatusCodeError] === true; + } + [kResponseStatusCodeError] = true; }; + var kInvalidArgumentError = Symbol.for("undici.error.UND_ERR_INVALID_ARG"); var InvalidArgumentError = class extends UndiciError { constructor(message) { super(message); @@ -3133,7 +3212,12 @@ var require_errors = __commonJS({ this.message = message || "Invalid Argument Error"; this.code = "UND_ERR_INVALID_ARG"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidArgumentError] === true; + } + [kInvalidArgumentError] = true; }; + var kInvalidReturnValueError = Symbol.for("undici.error.UND_ERR_INVALID_RETURN_VALUE"); var InvalidReturnValueError = class extends UndiciError { constructor(message) { super(message); @@ -3141,14 +3225,25 @@ var require_errors = __commonJS({ this.message = message || "Invalid Return Value Error"; this.code = "UND_ERR_INVALID_RETURN_VALUE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInvalidReturnValueError] === true; + } + [kInvalidReturnValueError] = true; }; + var kAbortError = Symbol.for("undici.error.UND_ERR_ABORT"); var AbortError = class extends UndiciError { constructor(message) { super(message); this.name = "AbortError"; this.message = message || "The operation was aborted"; + this.code = "UND_ERR_ABORT"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kAbortError] === true; + } + [kAbortError] = true; }; + var kRequestAbortedError = Symbol.for("undici.error.UND_ERR_ABORTED"); var RequestAbortedError = class extends AbortError { constructor(message) { super(message); @@ -3156,7 +3251,12 @@ var require_errors = __commonJS({ this.message = message || "Request aborted"; this.code = "UND_ERR_ABORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestAbortedError] === true; + } + [kRequestAbortedError] = true; }; + var kInformationalError = Symbol.for("undici.error.UND_ERR_INFO"); var InformationalError = class extends UndiciError { constructor(message) { super(message); @@ -3164,7 +3264,12 @@ var require_errors = __commonJS({ this.message = message || "Request information"; this.code = "UND_ERR_INFO"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kInformationalError] === true; + } + [kInformationalError] = true; }; + var kRequestContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"); var RequestContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -3172,7 +3277,12 @@ var require_errors = __commonJS({ this.message = message || "Request body length does not match content-length header"; this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestContentLengthMismatchError] === true; + } + [kRequestContentLengthMismatchError] = true; }; + var kResponseContentLengthMismatchError = Symbol.for("undici.error.UND_ERR_RES_CONTENT_LENGTH_MISMATCH"); var ResponseContentLengthMismatchError = class extends UndiciError { constructor(message) { super(message); @@ -3180,7 +3290,12 @@ var require_errors = __commonJS({ this.message = message || "Response body length does not match content-length header"; this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseContentLengthMismatchError] === true; + } + [kResponseContentLengthMismatchError] = true; }; + var kClientDestroyedError = Symbol.for("undici.error.UND_ERR_DESTROYED"); var ClientDestroyedError = class extends UndiciError { constructor(message) { super(message); @@ -3188,7 +3303,12 @@ var require_errors = __commonJS({ this.message = message || "The client is destroyed"; this.code = "UND_ERR_DESTROYED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientDestroyedError] === true; + } + [kClientDestroyedError] = true; }; + var kClientClosedError = Symbol.for("undici.error.UND_ERR_CLOSED"); var ClientClosedError = class extends UndiciError { constructor(message) { super(message); @@ -3196,7 +3316,12 @@ var require_errors = __commonJS({ this.message = message || "The client is closed"; this.code = "UND_ERR_CLOSED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kClientClosedError] === true; + } + [kClientClosedError] = true; }; + var kSocketError = Symbol.for("undici.error.UND_ERR_SOCKET"); var SocketError = class extends UndiciError { constructor(message, socket) { super(message); @@ -3205,7 +3330,12 @@ var require_errors = __commonJS({ this.code = "UND_ERR_SOCKET"; this.socket = socket; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSocketError] === true; + } + [kSocketError] = true; }; + var kNotSupportedError = Symbol.for("undici.error.UND_ERR_NOT_SUPPORTED"); var NotSupportedError = class extends UndiciError { constructor(message) { super(message); @@ -3213,7 +3343,12 @@ var require_errors = __commonJS({ this.message = message || "Not supported error"; this.code = "UND_ERR_NOT_SUPPORTED"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kNotSupportedError] === true; + } + [kNotSupportedError] = true; }; + var kBalancedPoolMissingUpstreamError = Symbol.for("undici.error.UND_ERR_BPL_MISSING_UPSTREAM"); var BalancedPoolMissingUpstreamError = class extends UndiciError { constructor(message) { super(message); @@ -3221,7 +3356,12 @@ var require_errors = __commonJS({ this.message = message || "No upstream has been added to the BalancedPool"; this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kBalancedPoolMissingUpstreamError] === true; + } + [kBalancedPoolMissingUpstreamError] = true; }; + var kHTTPParserError = Symbol.for("undici.error.UND_ERR_HTTP_PARSER"); var HTTPParserError = class extends Error { constructor(message, code2, data) { super(message); @@ -3229,7 +3369,12 @@ var require_errors = __commonJS({ this.code = code2 ? `HPE_${code2}` : void 0; this.data = data ? data.toString() : void 0; } + static [Symbol.hasInstance](instance) { + return instance && instance[kHTTPParserError] === true; + } + [kHTTPParserError] = true; }; + var kResponseExceededMaxSizeError = Symbol.for("undici.error.UND_ERR_RES_EXCEEDED_MAX_SIZE"); var ResponseExceededMaxSizeError = class extends UndiciError { constructor(message) { super(message); @@ -3237,7 +3382,12 @@ var require_errors = __commonJS({ this.message = message || "Response content exceeded max size"; this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseExceededMaxSizeError] === true; + } + [kResponseExceededMaxSizeError] = true; }; + var kRequestRetryError = Symbol.for("undici.error.UND_ERR_REQ_RETRY"); var RequestRetryError = class extends UndiciError { constructor(message, code2, { headers, data }) { super(message); @@ -3248,7 +3398,12 @@ var require_errors = __commonJS({ this.data = data; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kRequestRetryError] === true; + } + [kRequestRetryError] = true; }; + var kResponseError = Symbol.for("undici.error.UND_ERR_RESPONSE"); var ResponseError = class extends UndiciError { constructor(message, code2, { headers, data }) { super(message); @@ -3259,7 +3414,12 @@ var require_errors = __commonJS({ this.data = data; this.headers = headers; } + static [Symbol.hasInstance](instance) { + return instance && instance[kResponseError] === true; + } + [kResponseError] = true; }; + var kSecureProxyConnectionError = Symbol.for("undici.error.UND_ERR_PRX_TLS"); var SecureProxyConnectionError = class extends UndiciError { constructor(cause, message, options) { super(message, { cause, ...options ?? {} }); @@ -3268,6 +3428,10 @@ var require_errors = __commonJS({ this.code = "UND_ERR_PRX_TLS"; this.cause = cause; } + static [Symbol.hasInstance](instance) { + return instance && instance[kSecureProxyConnectionError] === true; + } + [kSecureProxyConnectionError] = true; }; module2.exports = { AbortError, @@ -3297,9 +3461,9 @@ var require_errors = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/symbols.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js var require_symbols = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/symbols.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/symbols.js"(exports2, module2) { module2.exports = { kClose: Symbol("close"), kDestroy: Symbol("destroy"), @@ -3370,9 +3534,9 @@ var require_symbols = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js var require_constants2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/constants.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/constants.js"(exports2, module2) { "use strict"; var headerNameLowerCasedRecord = {}; var wellknownHeaderNames = [ @@ -3485,9 +3649,9 @@ var require_constants2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/tree.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js var require_tree = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/tree.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/tree.js"(exports2, module2) { "use strict"; var { wellknownHeaderNames, @@ -3625,9 +3789,9 @@ var require_tree = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js var require_util = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/util.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); @@ -4131,9 +4295,9 @@ var require_util = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/readable.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js var require_readable = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/readable.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/readable.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { Readable: Readable2 } = require("node:stream"); @@ -4146,7 +4310,7 @@ var require_readable = __commonJS({ var kAbort = Symbol("kAbort"); var kContentType = Symbol("kContentType"); var kContentLength = Symbol("kContentLength"); - var noop2 = () => { + var noop3 = () => { }; var BodyReadable = class extends Readable2 { constructor({ @@ -4263,7 +4427,7 @@ var require_readable = __commonJS({ if (this._readableState.closeEmitted) { return null; } - return await new Promise((resolve2, reject) => { + return await new Promise((resolve, reject) => { if (this[kContentLength] > limit) { this.destroy(new AbortError()); } @@ -4276,9 +4440,9 @@ var require_readable = __commonJS({ if (signal?.aborted) { reject(signal.reason ?? new AbortError()); } else { - resolve2(null); + resolve(null); } - }).on("error", noop2).on("data", function(chunk) { + }).on("error", noop3).on("data", function(chunk) { limit -= chunk.length; if (limit <= 0) { this.destroy(); @@ -4295,7 +4459,7 @@ var require_readable = __commonJS({ } async function consume(stream, type) { assert5(!stream[kConsume]); - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { if (isUnusable(stream)) { const rState = stream._readableState; if (rState.destroyed && rState.closeEmitted === false) { @@ -4312,7 +4476,7 @@ var require_readable = __commonJS({ stream[kConsume] = { type, stream, - resolve: resolve2, + resolve, reject, length: 0, body: [] @@ -4382,18 +4546,18 @@ var require_readable = __commonJS({ return buffer; } function consumeEnd(consume2) { - const { type, body, resolve: resolve2, stream, length } = consume2; + const { type, body, resolve, stream, length } = consume2; try { if (type === "text") { - resolve2(chunksDecode(body, length)); + resolve(chunksDecode(body, length)); } else if (type === "json") { - resolve2(JSON.parse(chunksDecode(body, length))); + resolve(JSON.parse(chunksDecode(body, length))); } else if (type === "arrayBuffer") { - resolve2(chunksConcat(body, length).buffer); + resolve(chunksConcat(body, length).buffer); } else if (type === "blob") { - resolve2(new Blob(body, { type: stream[kContentType] })); + resolve(new Blob(body, { type: stream[kContentType] })); } else if (type === "bytes") { - resolve2(chunksConcat(body, length)); + resolve(chunksConcat(body, length)); } consumeFinish(consume2); } catch (err) { @@ -4424,9 +4588,9 @@ var require_readable = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js var require_util2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/util.js"(exports2, module2) { var assert5 = require("node:assert"); var { ResponseStatusCodeError @@ -4485,9 +4649,9 @@ var require_util2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-request.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js var require_api_request = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-request.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-request.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { Readable: Readable2 } = require_readable(); @@ -4650,9 +4814,9 @@ var require_api_request = __commonJS({ }; function request(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -4671,9 +4835,9 @@ var require_api_request = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/abort-signal.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js var require_abort_signal = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { var { addAbortListener } = require_util(); var { RequestAbortedError } = require_errors(); var kListener = Symbol("kListener"); @@ -4722,9 +4886,9 @@ var require_abort_signal = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-stream.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js var require_api_stream = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-stream.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-stream.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { finished, PassThrough } = require("node:stream"); @@ -4875,9 +5039,9 @@ var require_api_stream = __commonJS({ }; function stream(opts, factory, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -4895,9 +5059,9 @@ var require_api_stream = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-pipeline.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js var require_api_pipeline = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { "use strict"; var { Readable: Readable2, @@ -5095,9 +5259,9 @@ var require_api_pipeline = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-upgrade.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js var require_api_upgrade = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { "use strict"; var { InvalidArgumentError, SocketError } = require_errors(); var { AsyncResource } = require("node:async_hooks"); @@ -5162,9 +5326,9 @@ var require_api_upgrade = __commonJS({ }; function upgrade(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5187,9 +5351,9 @@ var require_api_upgrade = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-connect.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js var require_api_connect = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/api-connect.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/api-connect.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { AsyncResource } = require("node:async_hooks"); @@ -5256,9 +5420,9 @@ var require_api_connect = __commonJS({ }; function connect(opts, callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5277,9 +5441,9 @@ var require_api_connect = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/index.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js var require_api = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/api/index.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/api/index.js"(exports2, module2) { "use strict"; module2.exports.request = require_api_request(); module2.exports.stream = require_api_stream(); @@ -5289,9 +5453,9 @@ var require_api = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js var require_dispatcher = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher.js"(exports2, module2) { "use strict"; var EventEmitter2 = require("node:events"); var Dispatcher = class extends EventEmitter2 { @@ -5344,9 +5508,9 @@ var require_dispatcher = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js var require_dispatcher_base = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/dispatcher-base.js"(exports2, module2) { "use strict"; var Dispatcher = require_dispatcher(); var { @@ -5388,9 +5552,9 @@ var require_dispatcher_base = __commonJS({ } close(callback) { if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.close((err, data) => { - return err ? reject(err) : resolve2(data); + return err ? reject(err) : resolve(data); }); }); } @@ -5428,12 +5592,12 @@ var require_dispatcher_base = __commonJS({ err = null; } if (callback === void 0) { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.destroy(err, (err2, data) => { return err2 ? ( /* istanbul ignore next: should never error */ reject(err2) - ) : resolve2(data); + ) : resolve(data); }); }); } @@ -5505,9 +5669,9 @@ var require_dispatcher_base = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/fixed-queue.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js var require_fixed_queue = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/fixed-queue.js"(exports2, module2) { "use strict"; var kSize = 2048; var kMask = kSize - 1; @@ -5562,9 +5726,9 @@ var require_fixed_queue = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-stats.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js var require_pool_stats = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-stats.js"(exports2, module2) { var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); var kPool = Symbol("pool"); var PoolStats = class { @@ -5594,9 +5758,9 @@ var require_pool_stats = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-base.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js var require_pool_base = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool-base.js"(exports2, module2) { "use strict"; var DispatcherBase = require_dispatcher_base(); var FixedQueue = require_fixed_queue(); @@ -5689,8 +5853,8 @@ var require_pool_base = __commonJS({ if (this[kQueue].isEmpty()) { await Promise.all(this[kClients].map((c) => c.close())); } else { - await new Promise((resolve2) => { - this[kClosedResolve] = resolve2; + await new Promise((resolve) => { + this[kClosedResolve] = resolve; }); } } @@ -5749,9 +5913,9 @@ var require_pool_base = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/diagnostics.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js var require_diagnostics = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/diagnostics.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/diagnostics.js"(exports2, module2) { "use strict"; var diagnosticsChannel = require("node:diagnostics_channel"); var util = require("node:util"); @@ -5782,36 +5946,36 @@ var require_diagnostics = __commonJS({ const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connecting to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connected to %s using %s%s", `${host}${port ? `:${port}` : ""}`, protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version2, protocol, port, host }, error } = evt; debuglog( "connection to %s using %s%s errored - %s", `${host}${port ? `:${port}` : ""}`, protocol, - version3, + version2, error.message ); }); @@ -5860,31 +6024,31 @@ var require_diagnostics = __commonJS({ const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host } + connectParams: { version: version2, protocol, port, host } } = evt; debuglog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, - version3 + version2 ); }); diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { const { - connectParams: { version: version3, protocol, port, host }, + connectParams: { version: version2, protocol, port, host }, error } = evt; debuglog( @@ -5892,7 +6056,7 @@ var require_diagnostics = __commonJS({ host, port ? `:${port}` : "", protocol, - version3, + version2, error.message ); }); @@ -5934,9 +6098,9 @@ var require_diagnostics = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/request.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js var require_request = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/request.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/request.js"(exports2, module2) { "use strict"; var { InvalidArgumentError, @@ -6258,9 +6422,9 @@ var require_request = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/util/timers.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js var require_timers = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/util/timers.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/util/timers.js"(exports2, module2) { "use strict"; var fastNow = 0; var RESOLUTION_MS = 1e3; @@ -6489,16 +6653,16 @@ var require_timers = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/connect.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js var require_connect = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/core/connect.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/core/connect.js"(exports2, module2) { "use strict"; var net = require("node:net"); var assert5 = require("node:assert"); var util = require_util(); var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); var timers = require_timers(); - function noop2() { + function noop3() { } var tls; var SessionCache; @@ -6623,7 +6787,7 @@ var require_connect = __commonJS({ } var setupConnectTimeout = process.platform === "win32" ? (socketWeakRef, opts) => { if (!opts.timeout) { - return noop2; + return noop3; } let s1 = null; let s2 = null; @@ -6639,7 +6803,7 @@ var require_connect = __commonJS({ }; } : (socketWeakRef, opts) => { if (!opts.timeout) { - return noop2; + return noop3; } let s1 = null; const fastTimer = timers.setFastTimeout(() => { @@ -6669,9 +6833,9 @@ var require_connect = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/utils.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js var require_utils = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/utils.js"(exports2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/utils.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.enumToMap = void 0; @@ -6689,9 +6853,9 @@ var require_utils = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js var require_constants3 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/constants.js"(exports2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/constants.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; @@ -7010,27 +7174,27 @@ var require_constants3 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js var require_llhttp_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer3 } = require("node:buffer"); module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64"); } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js var require_llhttp_simd_wasm = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer3 } = require("node:buffer"); module2.exports = Buffer3.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/constants.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js var require_constants4 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/constants.js"(exports2, module2) { "use strict"; var corsSafeListedMethods = ( /** @type {const} */ @@ -7246,9 +7410,9 @@ var require_constants4 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/global.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js var require_global = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/global.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/global.js"(exports2, module2) { "use strict"; var globalOrigin = Symbol.for("undici.globalOrigin.1"); function getGlobalOrigin() { @@ -7282,9 +7446,9 @@ var require_global = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/data-url.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js var require_data_url = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/data-url.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var encoder = new TextEncoder(); @@ -7634,9 +7798,9 @@ var require_data_url = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/webidl.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js var require_webidl = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/webidl.js"(exports2, module2) { "use strict"; var { types, inspect } = require("node:util"); var { markAsUncloneable } = require("node:worker_threads"); @@ -7839,8 +8003,8 @@ var require_webidl = __commonJS({ } const keys = Reflect.ownKeys(O); for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { + const desc2 = Reflect.getOwnPropertyDescriptor(O, key); + if (desc2?.enumerable) { const typedKey = keyConverter(key, prefix, argument); const typedValue = valueConverter(O[key], prefix, argument); result[typedKey] = typedValue; @@ -8053,9 +8217,9 @@ var require_webidl = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/util.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js var require_util3 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/util.js"(exports2, module2) { "use strict"; var { Transform } = require("node:stream"); var zlib = require("node:zlib"); @@ -8453,8 +8617,8 @@ var require_util3 = __commonJS({ function createDeferredPromise() { let res; let rej; - const promise = new Promise((resolve2, reject) => { - res = resolve2; + const promise = new Promise((resolve, reject) => { + res = resolve; rej = reject; }); return { promise, resolve: res, reject: rej }; @@ -8923,9 +9087,9 @@ var require_util3 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/symbols.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js var require_symbols2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/symbols.js"(exports2, module2) { "use strict"; module2.exports = { kUrl: Symbol("url"), @@ -8937,9 +9101,9 @@ var require_symbols2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/file.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js var require_file = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/file.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/file.js"(exports2, module2) { "use strict"; var { Blob: Blob2, File } = require("node:buffer"); var { kState } = require_symbols2(); @@ -9000,9 +9164,9 @@ var require_file = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js var require_formdata = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata.js"(exports2, module2) { "use strict"; var { isBlobLike, iteratorMixin } = require_util3(); var { kState } = require_symbols2(); @@ -9147,9 +9311,9 @@ var require_formdata = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata-parser.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js var require_formdata_parser = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/formdata-parser.js"(exports2, module2) { "use strict"; var { isUSVString, bufferToLowerCasedHeaderName } = require_util(); var { utf8DecodeBytes } = require_util3(); @@ -9398,9 +9562,9 @@ var require_formdata_parser = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/body.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js var require_body = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/web/fetch/body.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/web/fetch/body.js"(exports2, module2) { "use strict"; var util = require_util(); var { @@ -9430,7 +9594,7 @@ var require_body = __commonJS({ random = (max) => Math.floor(Math.random(max)); } var textEncoder = new TextEncoder(); - function noop2() { + function noop3() { } var hasFinalizationRegistry = globalThis.FinalizationRegistry && process.version.indexOf("v18") !== 0; var streamRegistry; @@ -9438,7 +9602,7 @@ var require_body = __commonJS({ streamRegistry = new FinalizationRegistry((weakRef) => { const stream = weakRef.deref(); if (stream && !stream.locked && !isDisturbed(stream) && !isErrored(stream)) { - stream.cancel("Response object has been garbage collected").catch(noop2); + stream.cancel("Response object has been garbage collected").catch(noop3); } }); } @@ -9508,7 +9672,8 @@ Content-Type: ${value.type || "application/octet-stream"}\r } } } - const chunk = textEncoder.encode(`--${boundary}--`); + const chunk = textEncoder.encode(`--${boundary}--\r +`); blobParts.push(chunk); length += chunk.byteLength; if (hasUnknownSizeValue) { @@ -9586,9 +9751,6 @@ Content-Type: ${value.type || "application/octet-stream"}\r } function cloneBody(instance, body) { const [out1, out2] = body.stream.tee(); - if (hasFinalizationRegistry) { - streamRegistry.register(instance, new WeakRef(out1)); - } body.stream = out1; return { stream: out2, @@ -9714,9 +9876,9 @@ Content-Type: ${value.type || "application/octet-stream"}\r } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h1.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js var require_client_h1 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h1.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var util = require_util(); @@ -10597,12 +10759,12 @@ upgrade: ${upgrade}\r cb(); } } - const waitForDrain = () => new Promise((resolve2, reject) => { + const waitForDrain = () => new Promise((resolve, reject) => { assert5(callback === null); if (socket[kError]) { reject(socket[kError]); } else { - callback = resolve2; + callback = resolve; } }); socket.on("close", onDrain).on("drain", onDrain); @@ -10734,9 +10896,9 @@ ${len.toString(16)}\r } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h2.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js var require_client_h2 = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client-h2.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var { pipeline } = require("node:stream"); @@ -11239,12 +11401,12 @@ var require_client_h2 = __commonJS({ cb(); } } - const waitForDrain = () => new Promise((resolve2, reject) => { + const waitForDrain = () => new Promise((resolve, reject) => { assert5(callback === null); if (socket[kError]) { reject(socket[kError]); } else { - callback = resolve2; + callback = resolve; } }); h2stream.on("close", onDrain).on("drain", onDrain); @@ -11275,9 +11437,9 @@ var require_client_h2 = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/handler/redirect-handler.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js var require_redirect_handler = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/handler/redirect-handler.js"(exports2, module2) { "use strict"; var util = require_util(); var { kBodyUsed } = require_symbols(); @@ -11434,9 +11596,9 @@ var require_redirect_handler = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js var require_redirect_interceptor = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/interceptor/redirect-interceptor.js"(exports2, module2) { "use strict"; var RedirectHandler = require_redirect_handler(); function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { @@ -11456,9 +11618,9 @@ var require_redirect_interceptor = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js var require_client = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/client.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/client.js"(exports2, module2) { "use strict"; var assert5 = require("node:assert"); var net = require("node:net"); @@ -11519,7 +11681,7 @@ var require_client = __commonJS({ var connectH2 = require_client_h2(); var deprecatedInterceptorWarned = false; var kClosedResolve = Symbol("kClosedResolve"); - var noop2 = () => { + var noop3 = () => { }; function getPipelining(client) { return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; @@ -11721,16 +11883,16 @@ var require_client = __commonJS({ return this[kNeedDrain] < 2; } async [kClose]() { - return new Promise((resolve2) => { + return new Promise((resolve) => { if (this[kSize]) { - this[kClosedResolve] = resolve2; + this[kClosedResolve] = resolve; } else { - resolve2(null); + resolve(null); } }); } async [kDestroy](err) { - return new Promise((resolve2) => { + return new Promise((resolve) => { const requests = this[kQueue].splice(this[kPendingIdx]); for (let i = 0; i < requests.length; i++) { const request = requests[i]; @@ -11741,7 +11903,7 @@ var require_client = __commonJS({ this[kClosedResolve](); this[kClosedResolve] = null; } - resolve2(null); + resolve(null); }; if (this[kHTTPContext]) { this[kHTTPContext].destroy(err, callback); @@ -11792,7 +11954,7 @@ var require_client = __commonJS({ }); } try { - const socket = await new Promise((resolve2, reject) => { + const socket = await new Promise((resolve, reject) => { client[kConnector]({ host, hostname, @@ -11804,19 +11966,19 @@ var require_client = __commonJS({ if (err) { reject(err); } else { - resolve2(socket2); + resolve(socket2); } }); }); if (client.destroyed) { - util.destroy(socket.on("error", noop2), new ClientDestroyedError()); + util.destroy(socket.on("error", noop3), new ClientDestroyedError()); return; } assert5(socket); try { client[kHTTPContext] = socket.alpnProtocol === "h2" ? await connectH2(client, socket) : await connectH1(client, socket); } catch (err) { - socket.destroy().on("error", noop2); + socket.destroy().on("error", noop3); throw err; } client[kConnecting] = false; @@ -11956,9 +12118,9 @@ var require_client = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js var require_pool = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/pool.js"(exports2, module2) { "use strict"; var { PoolBase, @@ -12021,6 +12183,14 @@ var require_pool = __commonJS({ this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; this[kFactory] = factory; + this.on("connectionError", (origin2, targets, error) => { + for (const target of targets) { + const idx = this[kClients].indexOf(target); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + } + }); } [kGetDispatcher]() { for (const client of this[kClients]) { @@ -12039,9 +12209,9 @@ var require_pool = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/agent.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js var require_agent = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/agent.js"(exports2, module2) { "use strict"; var { InvalidArgumentError } = require_errors(); var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); @@ -12136,30 +12306,83 @@ var require_agent = __commonJS({ } }); -// .yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/proxy-agent.js +// .yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js var require_proxy_agent = __commonJS({ - ".yarn/cache/undici-npm-6.21.1-0f7fc2c179-d604080e4f.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) { + ".yarn/cache/undici-npm-6.22.0-4664dd0314-47903c489d.zip/node_modules/undici/lib/dispatcher/proxy-agent.js"(exports2, module2) { "use strict"; - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); + var { kProxy, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); var { URL: URL2 } = require("node:url"); var Agent = require_agent(); var Pool = require_pool(); var DispatcherBase = require_dispatcher_base(); var { InvalidArgumentError, RequestAbortedError, SecureProxyConnectionError } = require_errors(); var buildConnector = require_connect(); + var Client = require_client(); var kAgent = Symbol("proxy agent"); var kClient = Symbol("proxy client"); var kProxyHeaders = Symbol("proxy headers"); var kRequestTls = Symbol("request tls settings"); var kProxyTls = Symbol("proxy tls settings"); var kConnectEndpoint = Symbol("connect endpoint function"); + var kTunnelProxy = Symbol("tunnel proxy"); function defaultProtocolPort(protocol) { return protocol === "https:" ? 443 : 80; } function defaultFactory(origin, opts) { return new Pool(origin, opts); } - var noop2 = () => { + var noop3 = () => { + }; + function defaultAgentFactory(origin, opts) { + if (opts.connections === 1) { + return new Client(origin, opts); + } + return new Pool(origin, opts); + } + var Http1ProxyWrapper = class extends DispatcherBase { + #client; + constructor(proxyUrl, { headers = {}, connect, factory }) { + super(); + if (!proxyUrl) { + throw new InvalidArgumentError("Proxy URL is mandatory"); + } + this[kProxyHeaders] = headers; + if (factory) { + this.#client = factory(proxyUrl, { connect }); + } else { + this.#client = new Client(proxyUrl, { connect }); + } + } + [kDispatch](opts, handler) { + const onHeaders = handler.onHeaders; + handler.onHeaders = function(statusCode, data, resume) { + if (statusCode === 407) { + if (typeof handler.onError === "function") { + handler.onError(new InvalidArgumentError("Proxy Authentication Required (407)")); + } + return; + } + if (onHeaders) onHeaders.call(this, statusCode, data, resume); + }; + const { + origin, + path: path16 = "/", + headers = {} + } = opts; + opts.path = origin + path16; + if (!("host" in headers) && !("Host" in headers)) { + const { host } = new URL2(origin); + headers.host = host; + } + opts.headers = { ...this[kProxyHeaders], ...headers }; + return this.#client[kDispatch](opts, handler); + } + async [kClose]() { + return this.#client.close(); + } + async [kDestroy](err) { + return this.#client.destroy(err); + } }; var ProxyAgent2 = class extends DispatcherBase { constructor(opts) { @@ -12171,6 +12394,7 @@ var require_proxy_agent = __commonJS({ if (typeof clientFactory !== "function") { throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); } + const { proxyTunnel = true } = opts; const url = this.#getUrl(opts); const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; this[kProxy] = { uri: href, protocol }; @@ -12178,6 +12402,7 @@ var require_proxy_agent = __commonJS({ this[kRequestTls] = opts.requestTls; this[kProxyTls] = opts.proxyTls; this[kProxyHeaders] = opts.headers || {}; + this[kTunnelProxy] = proxyTunnel; if (opts.auth && opts.token) { throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); } else if (opts.auth) { @@ -12189,9 +12414,22 @@ var require_proxy_agent = __commonJS({ } const connect = buildConnector({ ...opts.proxyTls }); this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + const agentFactory = opts.factory || defaultAgentFactory; + const factory = (origin2, options) => { + const { protocol: protocol2 } = new URL2(origin2); + if (!this[kTunnelProxy] && protocol2 === "http:" && this[kProxy].protocol === "http:") { + return new Http1ProxyWrapper(this[kProxy].uri, { + headers: this[kProxyHeaders], + connect, + factory: agentFactory + }); + } + return agentFactory(origin2, options); + }; this[kClient] = clientFactory(url, { connect }); this[kAgent] = new Agent({ ...opts, + factory, connect: async (opts2, callback) => { let requestedPath = opts2.host; if (!opts2.port) { @@ -12210,7 +12448,7 @@ var require_proxy_agent = __commonJS({ servername: this[kProxyTls]?.servername || proxyHostname }); if (statusCode !== 200) { - socket.on("error", noop2).destroy(); + socket.on("error", noop3).destroy(); callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); } if (opts2.protocol !== "https:") { @@ -13023,10 +13261,10 @@ var init_esm = __esm({ * Return a void Promise that resolves once the stream ends. */ async promise() { - return new Promise((resolve2, reject) => { + return new Promise((resolve, reject) => { this.on(DESTROYED, () => reject(new Error("stream destroyed"))); this.on("error", (er) => reject(er)); - this.on("end", () => resolve2()); + this.on("end", () => resolve()); }); } /** @@ -13050,7 +13288,7 @@ var init_esm = __esm({ return Promise.resolve({ done: false, value: res }); if (this[EOF]) return stop(); - let resolve2; + let resolve; let reject; const onerr = (er) => { this.off("data", ondata); @@ -13064,19 +13302,19 @@ var init_esm = __esm({ this.off("end", onend); this.off(DESTROYED, ondestroy); this.pause(); - resolve2({ value, done: !!this[EOF] }); + resolve({ value, done: !!this[EOF] }); }; const onend = () => { this.off("error", onerr); this.off("data", ondata); this.off(DESTROYED, ondestroy); stop(); - resolve2({ done: true, value: void 0 }); + resolve({ done: true, value: void 0 }); }; const ondestroy = () => onerr(new Error("stream destroyed")); return new Promise((res2, rej) => { reject = rej; - resolve2 = res2; + resolve = res2; this.once(DESTROYED, ondestroy); this.once("error", onerr); this.once("end", onend); @@ -13562,10 +13800,10 @@ var init_esm2 = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/options.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/options.js var argmap, isSyncFile, isAsyncFile, isSyncNoFile, isAsyncNoFile, dealiasKey, dealias; var init_options = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/options.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/options.js"() { argmap = /* @__PURE__ */ new Map([ ["C", "cwd"], ["f", "file"], @@ -13615,10 +13853,10 @@ var init_options = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/make-command.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/make-command.js var makeCommand; var init_make_command = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/make-command.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/make-command.js"() { init_options(); makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { return Object.assign((opt_ = [], entries, cb) => { @@ -13670,10 +13908,10 @@ var init_make_command = __esm({ } }); -// .yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/constants.js +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js var import_zlib, realZlibConstants, constants; var init_constants = __esm({ - ".yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/constants.js"() { + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/constants.js"() { import_zlib = __toESM(require("zlib"), 1); realZlibConstants = import_zlib.default.constants || { ZLIB_VERNUM: 4736 }; constants = Object.freeze(Object.assign(/* @__PURE__ */ Object.create(null), { @@ -13787,29 +14025,35 @@ var init_constants = __esm({ } }); -// .yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/index.js -var import_assert2, import_buffer, import_zlib2, OriginalBufferConcat, _superWrite, ZlibError, _flushFlag, ZlibBase, Zlib, Gzip, Unzip, Brotli, BrotliCompress, BrotliDecompress; +// .yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js +var import_assert2, import_buffer, realZlib2, OriginalBufferConcat, desc, noop, passthroughBufferConcat, _superWrite, ZlibError, _flushFlag, ZlibBase, Zlib, Gzip, Unzip, Brotli, BrotliCompress, BrotliDecompress, Zstd, ZstdCompress, ZstdDecompress; var init_esm3 = __esm({ - ".yarn/cache/minizlib-npm-3.0.1-4bdabd978f-82f8bf70da.zip/node_modules/minizlib/dist/esm/index.js"() { + ".yarn/cache/minizlib-npm-3.1.0-6680befdba-5aad75ab00.zip/node_modules/minizlib/dist/esm/index.js"() { import_assert2 = __toESM(require("assert"), 1); import_buffer = require("buffer"); init_esm(); - import_zlib2 = __toESM(require("zlib"), 1); + realZlib2 = __toESM(require("zlib"), 1); init_constants(); init_constants(); OriginalBufferConcat = import_buffer.Buffer.concat; + desc = Object.getOwnPropertyDescriptor(import_buffer.Buffer, "concat"); + noop = (args) => args; + passthroughBufferConcat = desc?.writable === true || desc?.set !== void 0 ? (makeNoOp) => { + import_buffer.Buffer.concat = makeNoOp ? noop : OriginalBufferConcat; + } : (_) => { + }; _superWrite = Symbol("_superWrite"); ZlibError = class extends Error { code; errno; - constructor(err) { - super("zlib: " + err.message); + constructor(err, origin) { + super("zlib: " + err.message, { cause: err }); this.code = err.code; this.errno = err.errno; if (!this.code) this.code = "ZLIB_ERROR"; this.message = "zlib: " + err.message; - Error.captureStackTrace(this, this.constructor); + Error.captureStackTrace(this, origin ?? this.constructor); } get name() { return "ZlibError"; @@ -13842,10 +14086,13 @@ var init_esm3 = __esm({ this.#flushFlag = opts.flush ?? 0; this.#finishFlushFlag = opts.finishFlush ?? 0; this.#fullFlushFlag = opts.fullFlushFlag ?? 0; + if (typeof realZlib2[mode] !== "function") { + throw new TypeError("Compression method not supported: " + mode); + } try { - this.#handle = new import_zlib2.default[mode](opts); + this.#handle = new realZlib2[mode](opts); } catch (er) { - throw new ZlibError(er); + throw new ZlibError(er, this.constructor); } this.#onError = (err) => { if (this.#sawError) @@ -13919,15 +14166,15 @@ var init_esm3 = __esm({ const originalClose = this.#handle.close; this.#handle.close = () => { }; - import_buffer.Buffer.concat = (args) => args; + passthroughBufferConcat(true); let result = void 0; try { const flushFlag = typeof chunk[_flushFlag] === "number" ? chunk[_flushFlag] : this.#flushFlag; result = this.#handle._processChunk(chunk, flushFlag); - import_buffer.Buffer.concat = OriginalBufferConcat; + passthroughBufferConcat(false); } catch (err) { - import_buffer.Buffer.concat = OriginalBufferConcat; - this.#onError(new ZlibError(err)); + passthroughBufferConcat(false); + this.#onError(new ZlibError(err, this.write)); } finally { if (this.#handle) { ; @@ -13938,7 +14185,7 @@ var init_esm3 = __esm({ } } if (this.#handle) - this.#handle.on("error", (er) => this.#onError(new ZlibError(er))); + this.#handle.on("error", (er) => this.#onError(new ZlibError(er, this.write))); let writeReturn; if (result) { if (Array.isArray(result) && result.length > 0) { @@ -14038,1025 +14285,671 @@ var init_esm3 = __esm({ super(opts, "BrotliDecompress"); } }; + Zstd = class extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.ZSTD_e_continue; + opts.finishFlush = opts.finishFlush || constants.ZSTD_e_end; + opts.fullFlushFlag = constants.ZSTD_e_flush; + super(opts, mode); + } + }; + ZstdCompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdCompress"); + } + }; + ZstdDecompress = class extends Zstd { + constructor(opts) { + super(opts, "ZstdDecompress"); + } + }; } }); -// .yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js -function insertAfter(self2, node, value) { - const prev = node; - const next = node ? node.next : self2.head; - const inserted = new Node(value, prev, next, self2); - if (inserted.next === void 0) { - self2.tail = inserted; - } - if (inserted.prev === void 0) { - self2.head = inserted; - } - self2.length++; - return inserted; -} -function push(self2, item) { - self2.tail = new Node(item, self2.tail, void 0, self2); - if (!self2.head) { - self2.head = self2.tail; - } - self2.length++; -} -function unshift(self2, item) { - self2.head = new Node(item, void 0, self2.head, self2); - if (!self2.tail) { - self2.tail = self2.head; - } - self2.length++; -} -var Yallist, Node; -var init_esm4 = __esm({ - ".yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js"() { - Yallist = class _Yallist { - tail; - head; - length = 0; - static create(list2 = []) { - return new _Yallist(list2); +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/large-numbers.js +var encode, encodePositive, encodeNegative, parse, twos, pos, onesComp, twosComp; +var init_large_numbers = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/large-numbers.js"() { + encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + throw Error("cannot encode number outside of javascript safe integer range"); + } else if (num < 0) { + encodeNegative(num, buf); + } else { + encodePositive(num, buf); } - constructor(list2 = []) { - for (const item of list2) { - this.push(item); - } + return buf; + }; + encodePositive = (num, buf) => { + buf[0] = 128; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 255; + num = Math.floor(num / 256); } - *[Symbol.iterator]() { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value; + }; + encodeNegative = (num, buf) => { + buf[0] = 255; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 255; + num = Math.floor(num / 256); + if (flipped) { + buf[i - 1] = onesComp(byte); + } else if (byte === 0) { + buf[i - 1] = 0; + } else { + flipped = true; + buf[i - 1] = twosComp(byte); } } - removeNode(node) { - if (node.list !== this) { - throw new Error("removing node which does not belong to this list"); - } - const next = node.next; - const prev = node.prev; - if (next) { - next.prev = prev; - } - if (prev) { - prev.next = next; - } - if (node === this.head) { - this.head = next; - } - if (node === this.tail) { - this.tail = prev; - } - this.length--; - node.next = void 0; - node.prev = void 0; - node.list = void 0; - return next; + }; + parse = (buf) => { + const pre = buf[0]; + const value = pre === 128 ? pos(buf.subarray(1, buf.length)) : pre === 255 ? twos(buf) : null; + if (value === null) { + throw Error("invalid base256 encoding"); } - unshiftNode(node) { - if (node === this.head) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - const head = this.head; - node.list = this; - node.next = head; - if (head) { - head.prev = node; + if (!Number.isSafeInteger(value)) { + throw Error("parsed number outside of javascript safe integer range"); + } + return value; + }; + twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } else if (byte === 0) { + f = byte; + } else { + flipped = true; + f = twosComp(byte); } - this.head = node; - if (!this.tail) { - this.tail = node; + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); } - this.length++; } - pushNode(node) { - if (node === this.tail) { - return; - } - if (node.list) { - node.list.removeNode(node); - } - const tail = this.tail; - node.list = this; - node.prev = tail; - if (tail) { - tail.next = node; - } - this.tail = node; - if (!this.head) { - this.head = node; - } - this.length++; - } - push(...args) { - for (let i = 0, l = args.length; i < l; i++) { - push(this, args[i]); + return sum; + }; + pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); } - return this.length; } - unshift(...args) { - for (var i = 0, l = args.length; i < l; i++) { - unshift(this, args[i]); + return sum; + }; + onesComp = (byte) => (255 ^ byte) & 255; + twosComp = (byte) => (255 ^ byte) + 1 & 255; + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/types.js +var isCode, name, code; +var init_types = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/types.js"() { + isCode = (c) => name.has(c); + name = /* @__PURE__ */ new Map([ + ["0", "File"], + // same as File + ["", "OldFile"], + ["1", "Link"], + ["2", "SymbolicLink"], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ["3", "CharacterDevice"], + ["4", "BlockDevice"], + ["5", "Directory"], + ["6", "FIFO"], + // same as File + ["7", "ContiguousFile"], + // pax headers + ["g", "GlobalExtendedHeader"], + ["x", "ExtendedHeader"], + // vendor-specific stuff + // skip + ["A", "SolarisACL"], + // like 5, but with data, which should be skipped + ["D", "GNUDumpDir"], + // metadata only, skip + ["I", "Inode"], + // data = link path of next file + ["K", "NextFileHasLongLinkpath"], + // data = path of next file + ["L", "NextFileHasLongPath"], + // skip + ["M", "ContinuationFile"], + // like L + ["N", "OldGnuLongPath"], + // skip + ["S", "SparseFile"], + // skip + ["V", "TapeVolumeHeader"], + // like x + ["X", "OldExtendedHeader"] + ]); + code = new Map(Array.from(name).map((kv) => [kv[1], kv[0]])); + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/header.js +var import_node_path, Header, splitPrefix, decString, decDate, numToDate, decNumber, nanUndef, decSmallNumber, MAXNUM, encNumber, encSmallNumber, octalString, padOctal, encDate, NULLS, encString; +var init_header = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/header.js"() { + import_node_path = require("node:path"); + init_large_numbers(); + init_types(); + Header = class { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = "Unsupported"; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } else if (data) { + this.#slurp(data); } - return this.length; } - pop() { - if (!this.tail) { - return void 0; - } - const res = this.tail.value; - const t = this.tail; - this.tail = this.tail.prev; - if (this.tail) { - this.tail.next = void 0; - } else { - this.head = void 0; + decode(buf, off, ex, gex) { + if (!off) { + off = 0; } - t.list = void 0; - this.length--; - return res; - } - shift() { - if (!this.head) { - return void 0; + if (!buf || !(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); } - const res = this.head.value; - const h = this.head; - this.head = this.head.next; - if (this.head) { - this.head.prev = void 0; - } else { - this.tail = void 0; + this.path = ex?.path ?? decString(buf, off, 100); + this.mode = ex?.mode ?? gex?.mode ?? decNumber(buf, off + 100, 8); + this.uid = ex?.uid ?? gex?.uid ?? decNumber(buf, off + 108, 8); + this.gid = ex?.gid ?? gex?.gid ?? decNumber(buf, off + 116, 8); + this.size = ex?.size ?? gex?.size ?? decNumber(buf, off + 124, 12); + this.mtime = ex?.mtime ?? gex?.mtime ?? decDate(buf, off + 136, 12); + this.cksum = decNumber(buf, off + 148, 12); + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + const t = decString(buf, off + 156, 1); + if (isCode(t)) { + this.#type = t || "0"; } - h.list = void 0; - this.length--; - return res; - } - forEach(fn2, thisp) { - thisp = thisp || this; - for (let walker = this.head, i = 0; !!walker; i++) { - fn2.call(thisp, walker.value, i, this); - walker = walker.next; + if (this.#type === "0" && this.path.slice(-1) === "/") { + this.#type = "5"; } - } - forEachReverse(fn2, thisp) { - thisp = thisp || this; - for (let walker = this.tail, i = this.length - 1; !!walker; i--) { - fn2.call(thisp, walker.value, i, this); - walker = walker.prev; + if (this.#type === "5") { + this.size = 0; } - } - get(n) { - let i = 0; - let walker = this.head; - for (; !!walker && i < n; i++) { - walker = walker.next; + this.linkpath = decString(buf, off + 157, 100); + if (buf.subarray(off + 257, off + 265).toString() === "ustar\x0000") { + this.uname = ex?.uname ?? gex?.uname ?? decString(buf, off + 265, 32); + this.gname = ex?.gname ?? gex?.gname ?? decString(buf, off + 297, 32); + this.devmaj = ex?.devmaj ?? gex?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0; + this.devmin = ex?.devmin ?? gex?.devmin ?? decNumber(buf, off + 337, 8) ?? 0; + if (buf[off + 475] !== 0) { + const prefix = decString(buf, off + 345, 155); + this.path = prefix + "/" + this.path; + } else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + "/" + this.path; + } + this.atime = ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12); + this.ctime = ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12); + } } - if (i === n && !!walker) { - return walker.value; + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - } - getReverse(n) { - let i = 0; - let walker = this.tail; - for (; !!walker && i < n; i++) { - walker = walker.prev; + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; } - if (i === n && !!walker) { - return walker.value; + this.cksumValid = sum === this.cksum; + if (this.cksum === void 0 && sum === 8 * 32) { + this.nullBlock = true; } } - map(fn2, thisp) { - thisp = thisp || this; - const res = new _Yallist(); - for (let walker = this.head; !!walker; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.next; - } - return res; + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + return !(v === null || v === void 0 || k === "path" && gex || k === "linkpath" && gex || k === "global"); + }))); } - mapReverse(fn2, thisp) { - thisp = thisp || this; - var res = new _Yallist(); - for (let walker = this.tail; !!walker; ) { - res.push(fn2.call(thisp, walker.value, this)); - walker = walker.prev; + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); } - return res; - } - reduce(fn2, initial) { - let acc; - let walker = this.head; - if (arguments.length > 1) { - acc = initial; - } else if (this.head) { - walker = this.head.next; - acc = this.head.value; - } else { - throw new TypeError("Reduce of empty list with no initial value"); + if (this.#type === "Unsupported") { + this.#type = "0"; } - for (var i = 0; !!walker; i++) { - acc = fn2(acc, walker.value, i); - walker = walker.next; + if (!(buf.length >= off + 512)) { + throw new Error("need 512 bytes for header"); } - return acc; - } - reduceReverse(fn2, initial) { - let acc; - let walker = this.tail; - if (arguments.length > 1) { - acc = initial; - } else if (this.tail) { - walker = this.tail.prev; - acc = this.tail.value; + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || "", prefixSize); + const path16 = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path16) || this.needPax; + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write("ustar\x0000", off + 257, 8); + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; } else { - throw new TypeError("Reduce of empty list with no initial value"); - } - for (let i = this.length - 1; !!walker; i--) { - acc = fn2(acc, walker.value, i); - walker = walker.prev; - } - return acc; - } - toArray() { - const arr = new Array(this.length); - for (let i = 0, walker = this.head; !!walker; i++) { - arr[i] = walker.value; - walker = walker.next; - } - return arr; - } - toArrayReverse() { - const arr = new Array(this.length); - for (let i = 0, walker = this.tail; !!walker; i++) { - arr[i] = walker.value; - walker = walker.prev; - } - return arr; - } - slice(from = 0, to = this.length) { - if (to < 0) { - to += this.length; - } - if (from < 0) { - from += this.length; - } - const ret = new _Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; - } - let walker = this.head; - let i = 0; - for (i = 0; !!walker && i < from; i++) { - walker = walker.next; - } - for (; !!walker && i < to; i++, walker = walker.next) { - ret.push(walker.value); - } - return ret; - } - sliceReverse(from = 0, to = this.length) { - if (to < 0) { - to += this.length; - } - if (from < 0) { - from += this.length; - } - const ret = new _Yallist(); - if (to < from || to < 0) { - return ret; - } - if (from < 0) { - from = 0; - } - if (to > this.length) { - to = this.length; + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; } - let i = this.length; - let walker = this.tail; - for (; !!walker && i > to; i--) { - walker = walker.prev; + let sum = 8 * 32; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; } - for (; !!walker && i > from; i--, walker = walker.prev) { - ret.push(walker.value); + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; } - return ret; + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; } - splice(start, deleteCount = 0, ...nodes) { - if (start > this.length) { - start = this.length - 1; - } - if (start < 0) { - start = this.length + start; - } - let walker = this.head; - for (let i = 0; !!walker && i < start; i++) { - walker = walker.next; - } - const ret = []; - for (let i = 0; !!walker && i < deleteCount; i++) { - ret.push(walker.value); - walker = this.removeNode(walker); - } - if (!walker) { - walker = this.tail; - } else if (walker !== this.tail) { - walker = walker.prev; - } - for (const v of nodes) { - walker = insertAfter(this, walker, v); - } - return ret; + get type() { + return this.#type === "Unsupported" ? this.#type : name.get(this.#type); } - reverse() { - const head = this.head; - const tail = this.tail; - for (let walker = head; !!walker; walker = walker.prev) { - const p = walker.prev; - walker.prev = walker.next; - walker.next = p; - } - this.head = tail; - this.tail = head; - return this; + get typeKey() { + return this.#type; } - }; - Node = class { - list; - next; - prev; - value; - constructor(value, prev, next, list2) { - this.list = list2; - this.value = value; - if (prev) { - prev.next = this; - this.prev = prev; - } else { - this.prev = void 0; - } - if (next) { - next.prev = this; - this.next = next; + set type(type) { + const c = String(code.get(type)); + if (isCode(c) || c === "Unsupported") { + this.#type = c; + } else if (isCode(type)) { + this.#type = type; } else { - this.next = void 0; + throw new TypeError("invalid entry type: " + type); } } }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/large-numbers.js -var encode, encodePositive, encodeNegative, parse, twos, pos, onesComp, twosComp; -var init_large_numbers = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/large-numbers.js"() { - encode = (num, buf) => { - if (!Number.isSafeInteger(num)) { - throw Error("cannot encode number outside of javascript safe integer range"); - } else if (num < 0) { - encodeNegative(num, buf); + splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ""; + let ret = void 0; + const root = import_node_path.posix.parse(p).root || "."; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; } else { - encodePositive(num, buf); - } - return buf; - }; - encodePositive = (num, buf) => { - buf[0] = 128; - for (var i = buf.length; i > 1; i--) { - buf[i - 1] = num & 255; - num = Math.floor(num / 256); - } - }; - encodeNegative = (num, buf) => { - buf[0] = 255; - var flipped = false; - num = num * -1; - for (var i = buf.length; i > 1; i--) { - var byte = num & 255; - num = Math.floor(num / 256); - if (flipped) { - buf[i - 1] = onesComp(byte); - } else if (byte === 0) { - buf[i - 1] = 0; - } else { - flipped = true; - buf[i - 1] = twosComp(byte); + prefix = import_node_path.posix.dirname(pp); + pp = import_node_path.posix.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp, prefix, false]; + } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } else { + pp = import_node_path.posix.join(import_node_path.posix.basename(prefix), pp); + prefix = import_node_path.posix.dirname(prefix); + } + } while (prefix !== root && ret === void 0); + if (!ret) { + ret = [p.slice(0, pathSize - 1), "", true]; } } + return ret; }; - parse = (buf) => { - const pre = buf[0]; - const value = pre === 128 ? pos(buf.subarray(1, buf.length)) : pre === 255 ? twos(buf) : null; - if (value === null) { - throw Error("invalid base256 encoding"); - } - if (!Number.isSafeInteger(value)) { - throw Error("parsed number outside of javascript safe integer range"); - } - return value; + decString = (buf, off, size) => buf.subarray(off, off + size).toString("utf8").replace(/\0.*/, ""); + decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); + numToDate = (num) => num === void 0 ? void 0 : new Date(num * 1e3); + decNumber = (buf, off, size) => Number(buf[off]) & 128 ? parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); + nanUndef = (value) => isNaN(value) ? void 0 : value; + decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf.subarray(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), 8)); + MAXNUM = { + 12: 8589934591, + 8: 2097151 }; - twos = (buf) => { - var len = buf.length; - var sum = 0; - var flipped = false; - for (var i = len - 1; i > -1; i--) { - var byte = Number(buf[i]); - var f; - if (flipped) { - f = onesComp(byte); - } else if (byte === 0) { - f = byte; - } else { - flipped = true; - f = twosComp(byte); + encNumber = (buf, off, size, num) => num === void 0 ? false : num > MAXNUM[size] || num < 0 ? (encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); + encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, "ascii"); + octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); + padOctal = (str, size) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join("0") + str + " ") + "\0"; + encDate = (buf, off, size, date) => date === void 0 ? false : encNumber(buf, off, size, date.getTime() / 1e3); + NULLS = new Array(156).join("\0"); + encString = (buf, off, size, str) => str === void 0 ? false : (buf.write(str + NULLS, off, size, "utf8"), str.length !== Buffer.byteLength(str) || str.length > size); + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/pax.js +var import_node_path2, Pax, merge, parseKV, parseKVLine; +var init_pax = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/pax.js"() { + import_node_path2 = require("node:path"); + init_header(); + Pax = class _Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global2 = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global2; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; + } + encode() { + const body = this.encodeBody(); + if (body === "") { + return Buffer.allocUnsafe(0); } - if (f !== 0) { - sum -= f * Math.pow(256, len - i - 1); + const bodyLen = Buffer.byteLength(body); + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + for (let i = 0; i < 512; i++) { + buf[i] = 0; + } + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ("PaxHeader/" + (0, import_node_path2.basename)(this.path ?? "")).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 420, + uid: this.uid, + gid: this.gid, + size: bodyLen, + 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(buf); + buf.write(body, 512, bodyLen, "utf8"); + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; } + return buf; } - return sum; - }; - pos = (buf) => { - var len = buf.length; - var sum = 0; - for (var i = len - 1; i > -1; i--) { - var byte = Number(buf[i]); - if (byte !== 0) { - sum += byte * Math.pow(256, len - i - 1); + 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(field) { + if (this[field] === void 0) { + return ""; } + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1e3 : r; + const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; + const byteLen = Buffer.byteLength(s); + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; + } + const len = digits + byteLen; + return len + s; + } + static parse(str, ex, g = false) { + return new _Pax(merge(parseKV(str), ex), g); } - return sum; }; - onesComp = (byte) => (255 ^ byte) & 255; - twosComp = (byte) => (255 ^ byte) + 1 & 255; + merge = (a, b) => b ? Object.assign({}, b, a) : a; + parseKV = (str) => str.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); + parseKVLine = (set, line) => { + const n = parseInt(line, 10); + if (n !== Buffer.byteLength(line) + 1) { + return set; + } + line = line.slice((n + " ").length); + const kv = line.split("="); + const r = kv.shift(); + if (!r) { + return set; + } + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); + const v = kv.join("="); + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(Number(v) * 1e3) : /^[0-9]+$/.test(v) ? +v : v; + return set; + }; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/types.js -var isCode, name, code; -var init_types = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/types.js"() { - isCode = (c) => name.has(c); - name = /* @__PURE__ */ new Map([ - ["0", "File"], - // same as File - ["", "OldFile"], - ["1", "Link"], - ["2", "SymbolicLink"], - // Devices and FIFOs aren't fully supported - // they are parsed, but skipped when unpacking - ["3", "CharacterDevice"], - ["4", "BlockDevice"], - ["5", "Directory"], - ["6", "FIFO"], - // same as File - ["7", "ContiguousFile"], - // pax headers - ["g", "GlobalExtendedHeader"], - ["x", "ExtendedHeader"], - // vendor-specific stuff - // skip - ["A", "SolarisACL"], - // like 5, but with data, which should be skipped - ["D", "GNUDumpDir"], - // metadata only, skip - ["I", "Inode"], - // data = link path of next file - ["K", "NextFileHasLongLinkpath"], - // data = path of next file - ["L", "NextFileHasLongPath"], - // skip - ["M", "ContinuationFile"], - // like L - ["N", "OldGnuLongPath"], - // skip - ["S", "SparseFile"], - // skip - ["V", "TapeVolumeHeader"], - // like x - ["X", "OldExtendedHeader"] - ]); - code = new Map(Array.from(name).map((kv) => [kv[1], kv[0]])); +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/normalize-windows-path.js +var platform, normalizeWindowsPath; +var init_normalize_windows_path = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/normalize-windows-path.js"() { + platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + normalizeWindowsPath = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/header.js -var import_node_path, Header, splitPrefix, decString, decDate, numToDate, decNumber, nanUndef, decSmallNumber, MAXNUM, encNumber, encSmallNumber, octalString, padOctal, encDate, NULLS, encString; -var init_header = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/header.js"() { - import_node_path = require("node:path"); - init_large_numbers(); - init_types(); - Header = class { - cksumValid = false; - needPax = false; - nullBlock = false; - block; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/read-entry.js +var ReadEntry; +var init_read_entry = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/read-entry.js"() { + init_esm(); + init_normalize_windows_path(); + ReadEntry = class extends Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; path; mode; uid; gid; - size; - cksum; - #type = "Unsupported"; - linkpath; uname; gname; - devmaj = 0; - devmin = 0; + size = 0; + mtime; atime; ctime; - mtime; - charset; - comment; - constructor(data, off = 0, ex, gex) { - if (Buffer.isBuffer(data)) { - this.decode(data, off || 0, ex, gex); - } else if (data) { - this.#slurp(data); - } - } - decode(buf, off, ex, gex) { - if (!off) { - off = 0; - } - if (!buf || !(buf.length >= off + 512)) { - throw new Error("need 512 bytes for header"); - } - this.path = decString(buf, off, 100); - this.mode = decNumber(buf, off + 100, 8); - this.uid = decNumber(buf, off + 108, 8); - this.gid = decNumber(buf, off + 116, 8); - this.size = decNumber(buf, off + 124, 12); - this.mtime = decDate(buf, off + 136, 12); - this.cksum = decNumber(buf, off + 148, 12); - if (gex) - this.#slurp(gex, true); - if (ex) - this.#slurp(ex); - const t = decString(buf, off + 156, 1); - if (isCode(t)) { - this.#type = t || "0"; - } - if (this.#type === "0" && this.path.slice(-1) === "/") { - this.#type = "5"; - } - if (this.#type === "5") { - this.size = 0; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + this.remain = header.size ?? 0; + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (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 = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; } - this.linkpath = decString(buf, off + 157, 100); - if (buf.subarray(off + 257, off + 265).toString() === "ustar\x0000") { - this.uname = decString(buf, off + 265, 32); - this.gname = decString(buf, off + 297, 32); - this.devmaj = decNumber(buf, off + 329, 8) ?? 0; - this.devmin = decNumber(buf, off + 337, 8) ?? 0; - if (buf[off + 475] !== 0) { - const prefix = decString(buf, off + 345, 155); - this.path = prefix + "/" + this.path; - } else { - const prefix = decString(buf, off + 345, 130); - if (prefix) { - this.path = prefix + "/" + this.path; - } - this.atime = decDate(buf, off + 476, 12); - this.ctime = decDate(buf, off + 488, 12); - } + if (!header.path) { + throw new Error("no path provided for tar.ReadEntry"); } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; + this.path = normalizeWindowsPath(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 4095; } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : void 0; + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); } - this.cksumValid = sum === this.cksum; - if (this.cksum === void 0 && sum === 8 * 32) { - this.nullBlock = true; + if (gex) { + this.#slurp(gex, true); } } - #slurp(ex, gex = false) { - Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { - return !(v === null || v === void 0 || k === "path" && gex || k === "linkpath" && gex || k === "global"); - }))); - } - encode(buf, off = 0) { - if (!buf) { - buf = this.block = Buffer.alloc(512); - } - if (this.#type === "Unsupported") { - this.#type = "0"; - } - if (!(buf.length >= off + 512)) { - throw new Error("need 512 bytes for header"); - } - const prefixSize = this.ctime || this.atime ? 130 : 155; - const split = splitPrefix(this.path || "", prefixSize); - const path16 = split[0]; - const prefix = split[1]; - this.needPax = !!split[2]; - this.needPax = encString(buf, off, 100, path16) || this.needPax; - this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; - this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; - this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; - this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; - this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; - buf[off + 156] = this.#type.charCodeAt(0); - this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; - buf.write("ustar\x0000", off + 257, 8); - this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; - this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; - this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; - this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; - this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; - if (buf[off + 475] !== 0) { - this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; - } else { - this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; - this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; - this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); } - let sum = 8 * 32; - for (let i = off; i < off + 148; i++) { - sum += buf[i]; + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; } - for (let i = off + 156; i < off + 512; i++) { - sum += buf[i]; + if (r >= writeLen) { + return super.write(data); } - this.cksum = sum; - encNumber(buf, off + 148, 8, this.cksum); - this.cksumValid = true; - return this.needPax; + return super.write(data.subarray(0, r)); } - get type() { - return this.#type === "Unsupported" ? this.#type : name.get(this.#type); + #slurp(ex, gex = false) { + if (ex.path) + ex.path = normalizeWindowsPath(ex.path); + if (ex.linkpath) + ex.linkpath = normalizeWindowsPath(ex.linkpath); + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + return !(v === null || v === void 0 || k === "path" && gex); + }))); } - get typeKey() { - return this.#type; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/warn-method.js +var warnMethod; +var init_warn_method = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/warn-method.js"() { + warnMethod = (self2, code2, message, data = {}) => { + if (self2.file) { + data.file = self2.file; } - set type(type) { - const c = String(code.get(type)); - if (isCode(c) || c === "Unsupported") { - this.#type = c; - } else if (isCode(type)) { - this.#type = type; - } else { - throw new TypeError("invalid entry type: " + type); - } + if (self2.cwd) { + data.cwd = self2.cwd; } - }; - splitPrefix = (p, prefixSize) => { - const pathSize = 100; - let pp = p; - let prefix = ""; - let ret = void 0; - const root = import_node_path.posix.parse(p).root || "."; - if (Buffer.byteLength(pp) < pathSize) { - ret = [pp, prefix, false]; - } else { - prefix = import_node_path.posix.dirname(pp); - pp = import_node_path.posix.basename(pp); - do { - if (Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp, prefix, false]; - } else if (Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize) { - ret = [pp.slice(0, pathSize - 1), prefix, true]; - } else { - pp = import_node_path.posix.join(import_node_path.posix.basename(prefix), pp); - prefix = import_node_path.posix.dirname(prefix); - } - } while (prefix !== root && ret === void 0); - if (!ret) { - ret = [p.slice(0, pathSize - 1), "", true]; + data.code = message instanceof Error && message.code || code2; + data.tarCode = code2; + if (!self2.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; } + self2.emit("warn", code2, message, data); + } else if (message instanceof Error) { + self2.emit("error", Object.assign(message, data)); + } else { + self2.emit("error", Object.assign(new Error(`${code2}: ${message}`), data)); } - return ret; - }; - decString = (buf, off, size) => buf.subarray(off, off + size).toString("utf8").replace(/\0.*/, ""); - decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); - numToDate = (num) => num === void 0 ? void 0 : new Date(num * 1e3); - decNumber = (buf, off, size) => Number(buf[off]) & 128 ? parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); - nanUndef = (value) => isNaN(value) ? void 0 : value; - decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf.subarray(off, off + size).toString("utf8").replace(/\0.*$/, "").trim(), 8)); - MAXNUM = { - 12: 8589934591, - 8: 2097151 }; - encNumber = (buf, off, size, num) => num === void 0 ? false : num > MAXNUM[size] || num < 0 ? (encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); - encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, "ascii"); - octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); - padOctal = (str, size) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join("0") + str + " ") + "\0"; - encDate = (buf, off, size, date) => date === void 0 ? false : encNumber(buf, off, size, date.getTime() / 1e3); - NULLS = new Array(156).join("\0"); - encString = (buf, off, size, str) => str === void 0 ? false : (buf.write(str + NULLS, off, size, "utf8"), str.length !== Buffer.byteLength(str) || str.length > size); } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pax.js -var import_node_path2, Pax, merge, parseKV, parseKVLine; -var init_pax = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pax.js"() { - import_node_path2 = require("node:path"); - init_header(); - Pax = class _Pax { - atime; - mtime; - ctime; - charset; - comment; - gid; - uid; - gname; - uname; - linkpath; - dev; - ino; - nlink; - path; - size; - mode; - global; - constructor(obj, global2 = false) { - this.atime = obj.atime; - this.charset = obj.charset; - this.comment = obj.comment; - this.ctime = obj.ctime; - this.dev = obj.dev; - this.gid = obj.gid; - this.global = global2; - this.gname = obj.gname; - this.ino = obj.ino; - this.linkpath = obj.linkpath; - this.mtime = obj.mtime; - this.nlink = obj.nlink; - this.path = obj.path; - this.size = obj.size; - this.uid = obj.uid; - this.uname = obj.uname; - } - encode() { - const body = this.encodeBody(); - if (body === "") { - return Buffer.allocUnsafe(0); - } - const bodyLen = Buffer.byteLength(body); - const bufLen = 512 * Math.ceil(1 + bodyLen / 512); - const buf = Buffer.allocUnsafe(bufLen); - for (let i = 0; i < 512; i++) { - buf[i] = 0; - } - new Header({ - // XXX split the path - // then the path should be PaxHeader + basename, but less than 99, - // prepend with the dirname - /* c8 ignore start */ - path: ("PaxHeader/" + (0, import_node_path2.basename)(this.path ?? "")).slice(0, 99), - /* c8 ignore stop */ - mode: this.mode || 420, - uid: this.uid, - gid: this.gid, - size: bodyLen, - 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(buf); - buf.write(body, 512, bodyLen, "utf8"); - for (let i = bodyLen + 512; i < buf.length; i++) { - buf[i] = 0; - } - return buf; - } - 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(field) { - if (this[field] === void 0) { - return ""; - } - const r = this[field]; - const v = r instanceof Date ? r.getTime() / 1e3 : r; - const s = " " + (field === "dev" || field === "ino" || field === "nlink" ? "SCHILY." : "") + field + "=" + v + "\n"; - const byteLen = Buffer.byteLength(s); - let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; - if (byteLen + digits >= Math.pow(10, digits)) { - digits += 1; - } - const len = digits + byteLen; - return len + s; - } - static parse(str, ex, g = false) { - return new _Pax(merge(parseKV(str), ex), g); - } - }; - merge = (a, b) => b ? Object.assign({}, b, a) : a; - parseKV = (str) => str.replace(/\n$/, "").split("\n").reduce(parseKVLine, /* @__PURE__ */ Object.create(null)); - parseKVLine = (set, line) => { - const n = parseInt(line, 10); - if (n !== Buffer.byteLength(line) + 1) { - return set; - } - line = line.slice((n + " ").length); - const kv = line.split("="); - const r = kv.shift(); - if (!r) { - return set; - } - const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, "$1"); - const v = kv.join("="); - set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? new Date(Number(v) * 1e3) : /^[0-9]+$/.test(v) ? +v : v; - return set; - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-windows-path.js -var platform, normalizeWindowsPath; -var init_normalize_windows_path = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-windows-path.js"() { - platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - normalizeWindowsPath = platform !== "win32" ? (p) => p : (p) => p && p.replace(/\\/g, "/"); - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/read-entry.js -var ReadEntry; -var init_read_entry = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/read-entry.js"() { - init_esm(); - init_normalize_windows_path(); - ReadEntry = class extends Minipass { - extended; - globalExtended; - header; - startBlockSize; - blockRemain; - remain; - type; - meta = false; - ignore = false; - path; - mode; - uid; - gid; - uname; - gname; - size = 0; - mtime; - atime; - ctime; - linkpath; - dev; - ino; - nlink; - invalid = false; - absolute; - unsupported = false; - constructor(header, ex, gex) { - super({}); - this.pause(); - this.extended = ex; - this.globalExtended = gex; - this.header = header; - this.remain = header.size ?? 0; - this.startBlockSize = 512 * Math.ceil(this.remain / 512); - this.blockRemain = this.startBlockSize; - this.type = header.type; - switch (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 = true; - break; - // NOTE: gnutar and bsdtar treat unrecognized types as 'File' - // it may be worth doing the same, but with a warning. - default: - this.ignore = true; - } - if (!header.path) { - throw new Error("no path provided for tar.ReadEntry"); - } - this.path = normalizeWindowsPath(header.path); - this.mode = header.mode; - if (this.mode) { - this.mode = this.mode & 4095; - } - this.uid = header.uid; - this.gid = header.gid; - this.uname = header.uname; - this.gname = header.gname; - this.size = this.remain; - this.mtime = header.mtime; - this.atime = header.atime; - this.ctime = header.ctime; - this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : void 0; - this.uname = header.uname; - this.gname = header.gname; - if (ex) { - this.#slurp(ex); - } - if (gex) { - this.#slurp(gex, true); - } - } - write(data) { - const writeLen = data.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); - } - const r = this.remain; - const br = this.blockRemain; - this.remain = Math.max(0, r - writeLen); - this.blockRemain = Math.max(0, br - writeLen); - if (this.ignore) { - return true; - } - if (r >= writeLen) { - return super.write(data); - } - return super.write(data.subarray(0, r)); - } - #slurp(ex, gex = false) { - if (ex.path) - ex.path = normalizeWindowsPath(ex.path); - if (ex.linkpath) - ex.linkpath = normalizeWindowsPath(ex.linkpath); - Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { - return !(v === null || v === void 0 || k === "path" && gex); - }))); - } - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/warn-method.js -var warnMethod; -var init_warn_method = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/warn-method.js"() { - warnMethod = (self2, code2, message, data = {}) => { - if (self2.file) { - data.file = self2.file; - } - if (self2.cwd) { - data.cwd = self2.cwd; - } - data.code = message instanceof Error && message.code || code2; - data.tarCode = code2; - if (!self2.strict && data.recoverable !== false) { - if (message instanceof Error) { - data = Object.assign(message, data); - message = message.message; - } - self2.emit("warn", code2, message, data); - } else if (message instanceof Error) { - self2.emit("error", Object.assign(message, data)); - } else { - self2.emit("error", Object.assign(new Error(`${code2}: ${message}`), data)); - } - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/parse.js -var import_events3, maxMetaEntrySize, gzipHeader, STATE, WRITEENTRY, READENTRY, NEXTENTRY, PROCESSENTRY, EX, GEX, META, EMITMETA, BUFFER2, QUEUE, ENDED, EMITTEDEND, EMIT, UNZIP, CONSUMECHUNK, CONSUMECHUNKSUB, CONSUMEBODY, CONSUMEMETA, CONSUMEHEADER, CONSUMING, BUFFERCONCAT, MAYBEEND, WRITING, ABORTED2, DONE, SAW_VALID_ENTRY, SAW_NULL_BLOCK, SAW_EOF, CLOSESTREAM, noop, Parser; -var init_parse = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/parse.js"() { - import_events3 = require("events"); - init_esm3(); - init_esm4(); +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/parse.js +var import_events3, maxMetaEntrySize, gzipHeader, zstdHeader, ZIP_HEADER_LEN, STATE, WRITEENTRY, READENTRY, NEXTENTRY, PROCESSENTRY, EX, GEX, META, EMITMETA, BUFFER2, QUEUE, ENDED, EMITTEDEND, EMIT, UNZIP, CONSUMECHUNK, CONSUMECHUNKSUB, CONSUMEBODY, CONSUMEMETA, CONSUMEHEADER, CONSUMING, BUFFERCONCAT, MAYBEEND, WRITING, ABORTED2, DONE, SAW_VALID_ENTRY, SAW_NULL_BLOCK, SAW_EOF, CLOSESTREAM, noop2, Parser; +var init_parse = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/parse.js"() { + import_events3 = require("events"); + init_esm3(); init_header(); init_pax(); init_read_entry(); init_warn_method(); maxMetaEntrySize = 1024 * 1024; gzipHeader = Buffer.from([31, 139]); + zstdHeader = Buffer.from([40, 181, 47, 253]); + ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length); STATE = Symbol("state"); WRITEENTRY = Symbol("writeEntry"); READENTRY = Symbol("readEntry"); @@ -15087,16 +14980,17 @@ var init_parse = __esm({ SAW_NULL_BLOCK = Symbol("sawNullBlock"); SAW_EOF = Symbol("sawEOF"); CLOSESTREAM = Symbol("closeStream"); - noop = () => true; + noop2 = () => true; Parser = class extends import_events3.EventEmitter { file; strict; maxMetaEntrySize; filter; brotli; + zstd; writable = true; readable = false; - [QUEUE] = new Yallist(); + [QUEUE] = []; [BUFFER2]; [READENTRY]; [WRITEENTRY]; @@ -15132,9 +15026,11 @@ var init_parse = __esm({ } this.strict = !!opt.strict; this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; - this.filter = typeof opt.filter === "function" ? opt.filter : noop; + this.filter = typeof opt.filter === "function" ? opt.filter : noop2; const isTBR = opt.file && (opt.file.endsWith(".tar.br") || opt.file.endsWith(".tbr")); - this.brotli = !opt.gzip && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; + this.brotli = !(opt.gzip || opt.zstd) && opt.brotli !== void 0 ? opt.brotli : isTBR ? void 0 : false; + const isTZST = opt.file && (opt.file.endsWith(".tar.zst") || opt.file.endsWith(".tzst")); + this.zstd = !(opt.gzip || opt.brotli) && opt.zstd !== void 0 ? opt.zstd : isTZST ? true : void 0; this.on("end", () => this[CLOSESTREAM]()); if (typeof opt.onwarn === "function") { this.on("warn", opt.onwarn); @@ -15355,7 +15251,7 @@ var init_parse = __esm({ chunk = Buffer.concat([this[BUFFER2], chunk]); this[BUFFER2] = void 0; } - if (chunk.length < gzipHeader.length) { + if (chunk.length < ZIP_HEADER_LEN) { this[BUFFER2] = chunk; cb?.(); return true; @@ -15365,8 +15261,18 @@ var init_parse = __esm({ this[UNZIP] = false; } } - const maybeBrotli = this.brotli === void 0; - if (this[UNZIP] === false && maybeBrotli) { + let isZstd = false; + if (this[UNZIP] === false && this.zstd !== false) { + isZstd = true; + for (let i = 0; i < zstdHeader.length; i++) { + if (chunk[i] !== zstdHeader[i]) { + isZstd = false; + break; + } + } + } + const maybeBrotli = this.brotli === void 0 && !isZstd; + if (this[UNZIP] === false && maybeBrotli) { if (chunk.length < 512) { if (this[ENDED]) { this.brotli = true; @@ -15384,10 +15290,10 @@ var init_parse = __esm({ } } } - if (this[UNZIP] === void 0 || this[UNZIP] === false && this.brotli) { + if (this[UNZIP] === void 0 || this[UNZIP] === false && (this.brotli || isZstd)) { const ended = this[ENDED]; this[ENDED] = false; - this[UNZIP] = this[UNZIP] === void 0 ? new Unzip({}) : new BrotliDecompress({}); + this[UNZIP] = this[UNZIP] === void 0 ? new Unzip({}) : isZstd ? new ZstdDecompress({}) : new BrotliDecompress({}); this[UNZIP].on("data", (chunk2) => this[CONSUMECHUNK](chunk2)); this[UNZIP].on("error", (er) => this.abort(er)); this[UNZIP].on("end", () => { @@ -15516,7 +15422,7 @@ var init_parse = __esm({ this[UNZIP].end(); } else { this[ENDED] = true; - if (this.brotli === void 0) + if (this.brotli === void 0 || this.zstd === void 0) chunk = chunk || Buffer.alloc(0); if (chunk) this.write(chunk); @@ -15529,10 +15435,10 @@ var init_parse = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js var stripTrailingSlashes; var init_strip_trailing_slashes = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/strip-trailing-slashes.js"() { stripTrailingSlashes = (str) => { let i = str.length - 1; let slashesStart = -1; @@ -15545,7 +15451,7 @@ var init_strip_trailing_slashes = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/list.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/list.js var list_exports = {}; __export(list_exports, { filesFilter: () => filesFilter, @@ -15553,7 +15459,7 @@ __export(list_exports, { }); var import_node_fs, import_path2, onReadEntryFunction, filesFilter, listFileSync, listFile, list; var init_list = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/list.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/list.js"() { init_esm2(); import_node_fs = __toESM(require("node:fs"), 1); import_path2 = require("path"); @@ -15593,16 +15499,20 @@ var init_list = __esm({ const file = opt.file; let fd; try { - const stat2 = import_node_fs.default.statSync(file); + fd = import_node_fs.default.openSync(file, "r"); + const stat = import_node_fs.default.fstatSync(fd); const readSize = opt.maxReadSize || 16 * 1024 * 1024; - if (stat2.size < readSize) { - p.end(import_node_fs.default.readFileSync(file)); + if (stat.size < readSize) { + const buf = Buffer.allocUnsafe(stat.size); + const read = import_node_fs.default.readSync(fd, buf, 0, stat.size, 0); + p.end(read === buf.byteLength ? buf : buf.subarray(0, read)); } else { let pos2 = 0; const buf = Buffer.allocUnsafe(readSize); - fd = import_node_fs.default.openSync(file, "r"); - while (pos2 < stat2.size) { + while (pos2 < stat.size) { const bytesRead = import_node_fs.default.readSync(fd, buf, 0, readSize, pos2); + if (bytesRead === 0) + break; pos2 += bytesRead; p.write(buf.subarray(0, bytesRead)); } @@ -15618,22 +15528,22 @@ var init_list = __esm({ } }; listFile = (opt, _files) => { - const parse5 = new Parser(opt); + const parse4 = new Parser(opt); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const file = opt.file; - const p = new Promise((resolve2, reject) => { - parse5.on("error", reject); - parse5.on("end", resolve2); - import_node_fs.default.stat(file, (er, stat2) => { + const p = new Promise((resolve, reject) => { + parse4.on("error", reject); + parse4.on("end", resolve); + import_node_fs.default.stat(file, (er, stat) => { if (er) { reject(er); } else { const stream = new ReadStream(file, { readSize, - size: stat2.size + size: stat.size }); stream.on("error", reject); - stream.pipe(parse5); + stream.pipe(parse4); } }); }); @@ -15648,10 +15558,10 @@ var init_list = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/get-write-flag.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/get-write-flag.js var import_fs3, platform2, isWindows, O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP, fMapEnabled, fMapLimit, fMapFlag, getWriteFlag; var init_get_write_flag = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/get-write-flag.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/get-write-flag.js"() { import_fs3 = __toESM(require("fs"), 1); platform2 = process.env.__FAKE_PLATFORM__ || process.platform; isWindows = platform2 === "win32"; @@ -15666,7 +15576,7 @@ var init_get_write_flag = __esm({ // .yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js var import_node_fs2, import_node_path3, lchownSync, chown, chownrKid, chownr, chownrKidSync, chownrSync; -var init_esm5 = __esm({ +var init_esm4 = __esm({ ".yarn/cache/chownr-npm-3.0.0-5275e85d25-43925b8770.zip/node_modules/chownr/dist/esm/index.js"() { import_node_fs2 = __toESM(require("node:fs"), 1); import_node_path3 = __toESM(require("node:path"), 1); @@ -15747,277 +15657,10 @@ var init_esm5 = __esm({ } }); -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/opts-arg.js -var import_fs4, optsArg; -var init_opts_arg = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/opts-arg.js"() { - import_fs4 = require("fs"); - optsArg = (opts) => { - if (!opts) { - opts = { mode: 511 }; - } else if (typeof opts === "object") { - opts = { mode: 511, ...opts }; - } else if (typeof opts === "number") { - opts = { mode: opts }; - } else if (typeof opts === "string") { - opts = { mode: parseInt(opts, 8) }; - } else { - throw new TypeError("invalid options argument"); - } - const resolved = opts; - const optsFs = opts.fs || {}; - opts.mkdir = opts.mkdir || optsFs.mkdir || import_fs4.mkdir; - opts.mkdirAsync = opts.mkdirAsync ? opts.mkdirAsync : async (path16, options) => { - return new Promise((res, rej) => resolved.mkdir(path16, options, (er, made) => er ? rej(er) : res(made))); - }; - opts.stat = opts.stat || optsFs.stat || import_fs4.stat; - opts.statAsync = opts.statAsync ? opts.statAsync : async (path16) => new Promise((res, rej) => resolved.stat(path16, (err, stats) => err ? rej(err) : res(stats))); - opts.statSync = opts.statSync || optsFs.statSync || import_fs4.statSync; - opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || import_fs4.mkdirSync; - return resolved; - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-manual.js -var import_path3, mkdirpManualSync, mkdirpManual; -var init_mkdirp_manual = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-manual.js"() { - import_path3 = require("path"); - init_opts_arg(); - mkdirpManualSync = (path16, options, made) => { - const parent = (0, import_path3.dirname)(path16); - const opts = { ...optsArg(options), recursive: false }; - if (parent === path16) { - try { - return opts.mkdirSync(path16, opts); - } catch (er) { - const fer = er; - if (fer && fer.code !== "EISDIR") { - throw er; - } - return; - } - } - try { - opts.mkdirSync(path16, opts); - return made || path16; - } catch (er) { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManualSync(path16, opts, mkdirpManualSync(parent, opts, made)); - } - if (fer && fer.code !== "EEXIST" && fer && fer.code !== "EROFS") { - throw er; - } - try { - if (!opts.statSync(path16).isDirectory()) - throw er; - } catch (_) { - throw er; - } - } - }; - mkdirpManual = Object.assign(async (path16, options, made) => { - const opts = optsArg(options); - opts.recursive = false; - const parent = (0, import_path3.dirname)(path16); - if (parent === path16) { - return opts.mkdirAsync(path16, opts).catch((er) => { - const fer = er; - if (fer && fer.code !== "EISDIR") { - throw er; - } - }); - } - return opts.mkdirAsync(path16, opts).then(() => made || path16, async (er) => { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManual(parent, opts).then((made2) => mkdirpManual(path16, opts, made2)); - } - if (fer && fer.code !== "EEXIST" && fer.code !== "EROFS") { - throw er; - } - return opts.statAsync(path16).then((st) => { - if (st.isDirectory()) { - return made; - } else { - throw er; - } - }, () => { - throw er; - }); - }); - }, { sync: mkdirpManualSync }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/find-made.js -var import_path4, findMade, findMadeSync; -var init_find_made = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/find-made.js"() { - import_path4 = require("path"); - findMade = async (opts, parent, path16) => { - if (path16 === parent) { - return; - } - return opts.statAsync(parent).then( - (st) => st.isDirectory() ? path16 : void 0, - // will fail later - // will fail later - (er) => { - const fer = er; - return fer && fer.code === "ENOENT" ? findMade(opts, (0, import_path4.dirname)(parent), parent) : void 0; - } - ); - }; - findMadeSync = (opts, parent, path16) => { - if (path16 === parent) { - return void 0; - } - try { - return opts.statSync(parent).isDirectory() ? path16 : void 0; - } catch (er) { - const fer = er; - return fer && fer.code === "ENOENT" ? findMadeSync(opts, (0, import_path4.dirname)(parent), parent) : void 0; - } - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-native.js -var import_path5, mkdirpNativeSync, mkdirpNative; -var init_mkdirp_native = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/mkdirp-native.js"() { - import_path5 = require("path"); - init_find_made(); - init_mkdirp_manual(); - init_opts_arg(); - mkdirpNativeSync = (path16, options) => { - const opts = optsArg(options); - opts.recursive = true; - const parent = (0, import_path5.dirname)(path16); - if (parent === path16) { - return opts.mkdirSync(path16, opts); - } - const made = findMadeSync(opts, path16); - try { - opts.mkdirSync(path16, opts); - return made; - } catch (er) { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManualSync(path16, opts); - } else { - throw er; - } - } - }; - mkdirpNative = Object.assign(async (path16, options) => { - const opts = { ...optsArg(options), recursive: true }; - const parent = (0, import_path5.dirname)(path16); - if (parent === path16) { - return await opts.mkdirAsync(path16, opts); - } - return findMade(opts, path16).then((made) => opts.mkdirAsync(path16, opts).then((m) => made || m).catch((er) => { - const fer = er; - if (fer && fer.code === "ENOENT") { - return mkdirpManual(path16, opts); - } else { - throw er; - } - })); - }, { sync: mkdirpNativeSync }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/path-arg.js -var import_path6, platform3, pathArg; -var init_path_arg = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/path-arg.js"() { - import_path6 = require("path"); - platform3 = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; - pathArg = (path16) => { - if (/\0/.test(path16)) { - throw Object.assign(new TypeError("path must be a string without null bytes"), { - path: path16, - code: "ERR_INVALID_ARG_VALUE" - }); - } - path16 = (0, import_path6.resolve)(path16); - if (platform3 === "win32") { - const badWinChars = /[*|"<>?:]/; - const { root } = (0, import_path6.parse)(path16); - if (badWinChars.test(path16.substring(root.length))) { - throw Object.assign(new Error("Illegal characters in path."), { - path: path16, - code: "EINVAL" - }); - } - } - return path16; - }; - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/use-native.js -var import_fs5, version2, versArr, hasNative, useNativeSync, useNative; -var init_use_native = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/use-native.js"() { - import_fs5 = require("fs"); - init_opts_arg(); - version2 = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; - versArr = version2.replace(/^v/, "").split("."); - hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12; - useNativeSync = !hasNative ? () => false : (opts) => optsArg(opts).mkdirSync === import_fs5.mkdirSync; - useNative = Object.assign(!hasNative ? () => false : (opts) => optsArg(opts).mkdir === import_fs5.mkdir, { - sync: useNativeSync - }); - } -}); - -// .yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/index.js -var mkdirpSync, mkdirp; -var init_mjs = __esm({ - ".yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-9f2b975e92.zip/node_modules/mkdirp/dist/mjs/index.js"() { - init_mkdirp_manual(); - init_mkdirp_native(); - init_opts_arg(); - init_path_arg(); - init_use_native(); - init_mkdirp_manual(); - init_mkdirp_native(); - init_use_native(); - mkdirpSync = (path16, opts) => { - path16 = pathArg(path16); - const resolved = optsArg(opts); - return useNativeSync(resolved) ? mkdirpNativeSync(path16, resolved) : mkdirpManualSync(path16, resolved); - }; - mkdirp = Object.assign(async (path16, opts) => { - path16 = pathArg(path16); - const resolved = optsArg(opts); - return useNative(resolved) ? mkdirpNative(path16, resolved) : mkdirpManual(path16, resolved); - }, { - mkdirpSync, - mkdirpNative, - mkdirpNativeSync, - mkdirpManual, - mkdirpManualSync, - sync: mkdirpSync, - native: mkdirpNative, - nativeSync: mkdirpNativeSync, - manual: mkdirpManual, - manualSync: mkdirpManualSync, - useNative, - useNativeSync - }); - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/cwd-error.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/cwd-error.js var CwdError; var init_cwd_error = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/cwd-error.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/cwd-error.js"() { CwdError = class extends Error { path; code; @@ -16034,10 +15677,10 @@ var init_cwd_error = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/symlink-error.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/symlink-error.js var SymlinkError; var init_symlink_error = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/symlink-error.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/symlink-error.js"() { SymlinkError = class extends Error { path; symlink; @@ -16055,28 +15698,26 @@ var init_symlink_error = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mkdir.js -var import_fs6, import_node_path4, cGet, cSet, checkCwd, mkdir3, mkdir_, onmkdir, checkCwdSync, mkdirSync4; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/mkdir.js +var import_node_fs3, import_promises, import_node_path4, checkCwd, mkdir, mkdir_, onmkdir, checkCwdSync, mkdirSync2; var init_mkdir = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mkdir.js"() { - init_esm5(); - import_fs6 = __toESM(require("fs"), 1); - init_mjs(); + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/mkdir.js"() { + init_esm4(); + import_node_fs3 = __toESM(require("node:fs"), 1); + import_promises = __toESM(require("node:fs/promises"), 1); import_node_path4 = __toESM(require("node:path"), 1); init_cwd_error(); init_normalize_windows_path(); init_symlink_error(); - cGet = (cache, key) => cache.get(normalizeWindowsPath(key)); - cSet = (cache, key, val) => cache.set(normalizeWindowsPath(key), val); checkCwd = (dir, cb) => { - import_fs6.default.stat(dir, (er, st) => { + import_node_fs3.default.stat(dir, (er, st) => { if (er || !st.isDirectory()) { er = new CwdError(dir, er?.code || "ENOTDIR"); } cb(er); }); }; - mkdir3 = (dir, opt, cb) => { + mkdir = (dir, opt, cb) => { dir = normalizeWindowsPath(dir); const umask = opt.umask ?? 18; const mode = opt.mode | 448; @@ -16086,30 +15727,25 @@ var init_mkdir = __esm({ const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); const preserve = opt.preserve; const unlink = opt.unlink; - const cache = opt.cache; const cwd = normalizeWindowsPath(opt.cwd); const done = (er, created) => { if (er) { cb(er); } else { - cSet(cache, dir, true); if (created && doChown) { chownr(created, uid, gid, (er2) => done(er2)); } else if (needChmod) { - import_fs6.default.chmod(dir, mode, cb); + import_node_fs3.default.chmod(dir, mode, cb); } else { cb(); } } }; - if (cache && cGet(cache, dir) === true) { - return done(); - } if (dir === cwd) { return checkCwd(dir, done); } if (preserve) { - return mkdirp(dir, { mode }).then( + return import_promises.default.mkdir(dir, { mode, recursive: true }).then( (made) => done(null, made ?? void 0), // oh, ts done @@ -16117,33 +15753,30 @@ var init_mkdir = __esm({ } const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); const parts = sub.split("/"); - mkdir_(cwd, parts, mode, cache, unlink, cwd, void 0, done); + mkdir_(cwd, parts, mode, unlink, cwd, void 0, done); }; - mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + mkdir_ = (base, parts, mode, unlink, cwd, created, cb) => { if (!parts.length) { return cb(null, created); } const p = parts.shift(); const part = normalizeWindowsPath(import_node_path4.default.resolve(base + "/" + p)); - if (cGet(cache, part)) { - return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); - } - import_fs6.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); }; - onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { + onmkdir = (part, parts, mode, unlink, cwd, created, cb) => (er) => { if (er) { - import_fs6.default.lstat(part, (statEr, st) => { + import_node_fs3.default.lstat(part, (statEr, st) => { if (statEr) { statEr.path = statEr.path && normalizeWindowsPath(statEr.path); cb(statEr); } else if (st.isDirectory()) { - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + mkdir_(part, parts, mode, unlink, cwd, created, cb); } else if (unlink) { - import_fs6.default.unlink(part, (er2) => { + import_node_fs3.default.unlink(part, (er2) => { if (er2) { return cb(er2); } - import_fs6.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + import_node_fs3.default.mkdir(part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb)); }); } else if (st.isSymbolicLink()) { return cb(new SymlinkError(part, part + "/" + parts.join("/"))); @@ -16153,14 +15786,14 @@ var init_mkdir = __esm({ }); } else { created = created || part; - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + mkdir_(part, parts, mode, unlink, cwd, created, cb); } }; checkCwdSync = (dir) => { let ok = false; let code2 = void 0; try { - ok = import_fs6.default.statSync(dir).isDirectory(); + ok = import_node_fs3.default.statSync(dir).isDirectory(); } catch (er) { code2 = er?.code; } finally { @@ -16169,7 +15802,7 @@ var init_mkdir = __esm({ } } }; - mkdirSync4 = (dir, opt) => { + mkdirSync2 = (dir, opt) => { dir = normalizeWindowsPath(dir); const umask = opt.umask ?? 18; const mode = opt.mode | 448; @@ -16179,49 +15812,38 @@ var init_mkdir = __esm({ const doChown = typeof uid === "number" && typeof gid === "number" && (uid !== opt.processUid || gid !== opt.processGid); const preserve = opt.preserve; const unlink = opt.unlink; - const cache = opt.cache; const cwd = normalizeWindowsPath(opt.cwd); const done = (created2) => { - cSet(cache, dir, true); if (created2 && doChown) { chownrSync(created2, uid, gid); } if (needChmod) { - import_fs6.default.chmodSync(dir, mode); + import_node_fs3.default.chmodSync(dir, mode); } }; - if (cache && cGet(cache, dir) === true) { - return done(); - } if (dir === cwd) { checkCwdSync(cwd); return done(); } if (preserve) { - return done(mkdirpSync(dir, mode) ?? void 0); + return done(import_node_fs3.default.mkdirSync(dir, { mode, recursive: true }) ?? void 0); } const sub = normalizeWindowsPath(import_node_path4.default.relative(cwd, dir)); const parts = sub.split("/"); let created = void 0; for (let p = parts.shift(), part = cwd; p && (part += "/" + p); p = parts.shift()) { part = normalizeWindowsPath(import_node_path4.default.resolve(part)); - if (cGet(cache, part)) { - continue; - } try { - import_fs6.default.mkdirSync(part, mode); + import_node_fs3.default.mkdirSync(part, mode); created = created || part; - cSet(cache, part, true); } catch (er) { - const st = import_fs6.default.lstatSync(part); + const st = import_node_fs3.default.lstatSync(part); if (st.isDirectory()) { - cSet(cache, part, true); continue; } else if (unlink) { - import_fs6.default.unlinkSync(part); - import_fs6.default.mkdirSync(part, mode); + import_node_fs3.default.unlinkSync(part); + import_node_fs3.default.mkdirSync(part, mode); created = created || part; - cSet(cache, part, true); continue; } else if (st.isSymbolicLink()) { return new SymlinkError(part, part + "/" + parts.join("/")); @@ -16233,45 +15855,30 @@ var init_mkdir = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-unicode.js -var normalizeCache, hasOwnProperty, normalizeUnicode; -var init_normalize_unicode = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/normalize-unicode.js"() { - normalizeCache = /* @__PURE__ */ Object.create(null); - ({ hasOwnProperty } = Object.prototype); - normalizeUnicode = (s) => { - if (!hasOwnProperty.call(normalizeCache, s)) { - normalizeCache[s] = s.normalize("NFD"); - } - return normalizeCache[s]; - }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-absolute-path.js -var import_node_path5, isAbsolute, parse4, stripAbsolutePath; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/strip-absolute-path.js +var import_node_path5, isAbsolute, parse3, stripAbsolutePath; var init_strip_absolute_path = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/strip-absolute-path.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/strip-absolute-path.js"() { import_node_path5 = require("node:path"); - ({ isAbsolute, parse: parse4 } = import_node_path5.win32); + ({ isAbsolute, parse: parse3 } = import_node_path5.win32); stripAbsolutePath = (path16) => { let r = ""; - let parsed = parse4(path16); + let parsed = parse3(path16); while (isAbsolute(path16) || parsed.root) { const root = path16.charAt(0) === "/" && path16.slice(0, 4) !== "//?/" ? "/" : parsed.root; path16 = path16.slice(root.length); r += root; - parsed = parse4(path16); + parsed = parse3(path16); } return [r, path16]; }; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/winchars.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/winchars.js var raw, win, toWin, toRaw, encode2, decode; var init_winchars = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/winchars.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/winchars.js"() { raw = ["|", "<", ">", "?", ":"]; win = raw.map((char) => String.fromCharCode(61440 + char.charCodeAt(0))); toWin = new Map(raw.map((char, i) => [char, win[i]])); @@ -16281,15 +15888,44 @@ var init_winchars = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/path-reservations.js -var import_node_path6, platform4, isWindows2, getDirs, PathReservations; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/normalize-unicode.js +var normalizeCache, MAX, cache, normalizeUnicode; +var init_normalize_unicode = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/normalize-unicode.js"() { + normalizeCache = /* @__PURE__ */ Object.create(null); + MAX = 1e4; + cache = /* @__PURE__ */ new Set(); + normalizeUnicode = (s) => { + if (!cache.has(s)) { + normalizeCache[s] = s.normalize("NFD"); + } else { + cache.delete(s); + } + cache.add(s); + const ret = normalizeCache[s]; + let i = cache.size - MAX; + if (i > MAX / 10) { + for (const s2 of cache) { + cache.delete(s2); + delete normalizeCache[s2]; + if (--i <= 0) + break; + } + } + return ret; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/path-reservations.js +var import_node_path6, platform3, isWindows2, getDirs, PathReservations; var init_path_reservations = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/path-reservations.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/path-reservations.js"() { import_node_path6 = require("node:path"); init_normalize_unicode(); init_strip_trailing_slashes(); - platform4 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - isWindows2 = platform4 === "win32"; + platform3 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows2 = platform3 === "win32"; getDirs = (path16) => { const dirs = path16.split("/").slice(0, -1).reduce((set, path17) => { const s = set[set.length - 1]; @@ -16421,28 +16057,25 @@ var init_path_reservations = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/unpack.js -var import_node_assert, import_node_crypto, import_node_fs3, import_node_path7, ONENTRY, CHECKFS, CHECKFS2, PRUNECACHE, ISREUSABLE, MAKEFS, FILE, DIRECTORY, LINK, SYMLINK, HARDLINK, UNSUPPORTED, CHECKPATH, MKDIR, ONERROR, PENDING, PEND, UNPEND, ENDED2, MAYBECLOSE, SKIP, DOCHOWN, UID, GID, CHECKED_CWD, platform5, isWindows3, DEFAULT_MAX_DEPTH, unlinkFile, unlinkFileSync, uint32, cacheKeyNormalize, pruneCache, dropCache, Unpack, callSync, UnpackSync; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/unpack.js +var import_node_assert, import_node_crypto, import_node_fs4, import_node_path7, ONENTRY, CHECKFS, CHECKFS2, ISREUSABLE, MAKEFS, FILE, DIRECTORY, LINK, SYMLINK, HARDLINK, UNSUPPORTED, CHECKPATH, MKDIR, ONERROR, PENDING, PEND, UNPEND, ENDED2, MAYBECLOSE, SKIP, DOCHOWN, UID, GID, CHECKED_CWD, platform4, isWindows3, DEFAULT_MAX_DEPTH, unlinkFile, unlinkFileSync, uint32, Unpack, callSync, UnpackSync; var init_unpack = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/unpack.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/unpack.js"() { init_esm2(); import_node_assert = __toESM(require("node:assert"), 1); import_node_crypto = require("node:crypto"); - import_node_fs3 = __toESM(require("node:fs"), 1); + import_node_fs4 = __toESM(require("node:fs"), 1); import_node_path7 = __toESM(require("node:path"), 1); init_get_write_flag(); init_mkdir(); - init_normalize_unicode(); init_normalize_windows_path(); init_parse(); init_strip_absolute_path(); - init_strip_trailing_slashes(); init_winchars(); init_path_reservations(); ONENTRY = Symbol("onEntry"); CHECKFS = Symbol("checkFs"); CHECKFS2 = Symbol("checkFs2"); - PRUNECACHE = Symbol("pruneCache"); ISREUSABLE = Symbol("isReusable"); MAKEFS = Symbol("makeFs"); FILE = Symbol("file"); @@ -16464,45 +16097,30 @@ var init_unpack = __esm({ UID = Symbol("uid"); GID = Symbol("gid"); CHECKED_CWD = Symbol("checkedCwd"); - platform5 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; - isWindows3 = platform5 === "win32"; + platform4 = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; + isWindows3 = platform4 === "win32"; DEFAULT_MAX_DEPTH = 1024; unlinkFile = (path16, cb) => { if (!isWindows3) { - return import_node_fs3.default.unlink(path16, cb); + return import_node_fs4.default.unlink(path16, cb); } const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); - import_node_fs3.default.rename(path16, name2, (er) => { + import_node_fs4.default.rename(path16, name2, (er) => { if (er) { return cb(er); } - import_node_fs3.default.unlink(name2, cb); + import_node_fs4.default.unlink(name2, cb); }); }; unlinkFileSync = (path16) => { if (!isWindows3) { - return import_node_fs3.default.unlinkSync(path16); + return import_node_fs4.default.unlinkSync(path16); } const name2 = path16 + ".DELETE." + (0, import_node_crypto.randomBytes)(16).toString("hex"); - import_node_fs3.default.renameSync(path16, name2); - import_node_fs3.default.unlinkSync(name2); + import_node_fs4.default.renameSync(path16, name2); + import_node_fs4.default.unlinkSync(name2); }; uint32 = (a, b, c) => a !== void 0 && a === a >>> 0 ? a : b !== void 0 && b === b >>> 0 ? b : c; - cacheKeyNormalize = (path16) => stripTrailingSlashes(normalizeWindowsPath(normalizeUnicode(path16))).toLowerCase(); - pruneCache = (cache, abs) => { - abs = cacheKeyNormalize(abs); - for (const path16 of cache.keys()) { - const pnorm = cacheKeyNormalize(path16); - if (pnorm === abs || pnorm.indexOf(abs + "/") === 0) { - cache.delete(path16); - } - } - }; - dropCache = (cache) => { - for (const key of cache.keys()) { - cache.delete(key); - } - }; Unpack = class extends Parser { [ENDED2] = false; [CHECKED_CWD] = false; @@ -16511,7 +16129,6 @@ var init_unpack = __esm({ transform; writable = true; readable = false; - dirCache; uid; gid; setOwner; @@ -16540,7 +16157,6 @@ var init_unpack = __esm({ }; super(opt); this.transform = opt.transform; - this.dirCache = opt.dirCache || /* @__PURE__ */ new Map(); this.chmod = !!opt.chmod; if (typeof opt.uid === "number" || typeof opt.gid === "number") { if (typeof opt.uid !== "number" || typeof opt.gid !== "number") { @@ -16701,7 +16317,7 @@ var init_unpack = __esm({ } } [MKDIR](dir, mode, cb) { - mkdir3(normalizeWindowsPath(dir), { + mkdir(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, @@ -16709,7 +16325,6 @@ var init_unpack = __esm({ umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, - cache: this.dirCache, cwd: this.cwd, mode }, cb); @@ -16733,7 +16348,7 @@ var init_unpack = __esm({ }); stream.on("error", (er) => { if (stream.fd) { - import_node_fs3.default.close(stream.fd, () => { + import_node_fs4.default.close(stream.fd, () => { }); } stream.write = () => true; @@ -16744,7 +16359,7 @@ var init_unpack = __esm({ const done = (er) => { if (er) { if (stream.fd) { - import_node_fs3.default.close(stream.fd, () => { + import_node_fs4.default.close(stream.fd, () => { }); } this[ONERROR](er, entry); @@ -16753,7 +16368,7 @@ var init_unpack = __esm({ } if (--actions === 0) { if (stream.fd !== void 0) { - import_node_fs3.default.close(stream.fd, (er2) => { + import_node_fs4.default.close(stream.fd, (er2) => { if (er2) { this[ONERROR](er2, entry); } else { @@ -16771,14 +16386,14 @@ var init_unpack = __esm({ actions++; const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; - import_node_fs3.default.futimes(fd, atime, mtime, (er) => er ? import_node_fs3.default.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); + import_node_fs4.default.futimes(fd, atime, mtime, (er) => er ? import_node_fs4.default.utimes(abs, atime, mtime, (er2) => done(er2 && er)) : done()); } if (typeof fd === "number" && this[DOCHOWN](entry)) { actions++; const uid = this[UID](entry); const gid = this[GID](entry); if (typeof uid === "number" && typeof gid === "number") { - import_node_fs3.default.fchown(fd, uid, gid, (er) => er ? import_node_fs3.default.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); + import_node_fs4.default.fchown(fd, uid, gid, (er) => er ? import_node_fs4.default.chown(abs, uid, gid, (er2) => done(er2 && er)) : done()); } } done(); @@ -16811,11 +16426,11 @@ var init_unpack = __esm({ }; if (entry.mtime && !this.noMtime) { actions++; - import_node_fs3.default.utimes(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); + import_node_fs4.default.utimes(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime, done); } if (this[DOCHOWN](entry)) { actions++; - import_node_fs3.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); + import_node_fs4.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); } done(); }); @@ -16858,17 +16473,8 @@ var init_unpack = __esm({ } this.reservations.reserve(paths, (done) => this[CHECKFS2](entry, done)); } - [PRUNECACHE](entry) { - if (entry.type === "SymbolicLink") { - dropCache(this.dirCache); - } else if (entry.type !== "Directory") { - pruneCache(this.dirCache, String(entry.absolute)); - } - } [CHECKFS2](entry, fullyDone) { - this[PRUNECACHE](entry); const done = (er) => { - this[PRUNECACHE](entry); fullyDone(er); }; const checkCwd2 = () => { @@ -16899,7 +16505,7 @@ var init_unpack = __esm({ afterMakeParent(); }; const afterMakeParent = () => { - import_node_fs3.default.lstat(String(entry.absolute), (lstatEr, st) => { + import_node_fs4.default.lstat(String(entry.absolute), (lstatEr, st) => { if (st && (this.keep || /* c8 ignore next */ this.newer && st.mtime > (entry.mtime ?? st.mtime))) { this[SKIP](entry); @@ -16916,10 +16522,10 @@ var init_unpack = __esm({ if (!needChmod) { return afterChmod(); } - return import_node_fs3.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + return import_node_fs4.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); } if (entry.absolute !== this.cwd) { - return import_node_fs3.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + return import_node_fs4.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); } } if (entry.absolute === this.cwd) { @@ -16955,7 +16561,7 @@ var init_unpack = __esm({ } } [LINK](entry, linkpath, link, done) { - import_node_fs3.default[link](linkpath, String(entry.absolute), (er) => { + import_node_fs4.default[link](linkpath, String(entry.absolute), (er) => { if (er) { this[ONERROR](er, entry); } else { @@ -16980,7 +16586,6 @@ var init_unpack = __esm({ }); } [CHECKFS](entry) { - this[PRUNECACHE](entry); if (!this[CHECKED_CWD]) { const er2 = this[MKDIR](this.cwd, this.dmode); if (er2) { @@ -16997,7 +16602,7 @@ var init_unpack = __esm({ } } } - const [lstatEr, st] = callSync(() => import_node_fs3.default.lstatSync(String(entry.absolute))); + const [lstatEr, st] = callSync(() => import_node_fs4.default.lstatSync(String(entry.absolute))); if (st && (this.keep || /* c8 ignore next */ this.newer && st.mtime > (entry.mtime ?? st.mtime))) { return this[SKIP](entry); @@ -17009,11 +16614,11 @@ var init_unpack = __esm({ if (entry.type === "Directory") { const needChmod = this.chmod && entry.mode && (st.mode & 4095) !== entry.mode; const [er3] = needChmod ? callSync(() => { - import_node_fs3.default.chmodSync(String(entry.absolute), Number(entry.mode)); + import_node_fs4.default.chmodSync(String(entry.absolute), Number(entry.mode)); }) : []; return this[MAKEFS](er3, entry); } - const [er2] = callSync(() => import_node_fs3.default.rmdirSync(String(entry.absolute))); + const [er2] = callSync(() => import_node_fs4.default.rmdirSync(String(entry.absolute))); this[MAKEFS](er2, entry); } const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(String(entry.absolute))); @@ -17024,7 +16629,7 @@ var init_unpack = __esm({ const oner = (er) => { let closeError; try { - import_node_fs3.default.closeSync(fd); + import_node_fs4.default.closeSync(fd); } catch (e) { closeError = e; } @@ -17035,7 +16640,7 @@ var init_unpack = __esm({ }; let fd; try { - fd = import_node_fs3.default.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); + fd = import_node_fs4.default.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); } catch (er) { return oner(er); } @@ -17046,7 +16651,7 @@ var init_unpack = __esm({ } tx.on("data", (chunk) => { try { - import_node_fs3.default.writeSync(fd, chunk, 0, chunk.length); + import_node_fs4.default.writeSync(fd, chunk, 0, chunk.length); } catch (er) { oner(er); } @@ -17057,10 +16662,10 @@ var init_unpack = __esm({ const atime = entry.atime || /* @__PURE__ */ new Date(); const mtime = entry.mtime; try { - import_node_fs3.default.futimesSync(fd, atime, mtime); + import_node_fs4.default.futimesSync(fd, atime, mtime); } catch (futimeser) { try { - import_node_fs3.default.utimesSync(String(entry.absolute), atime, mtime); + import_node_fs4.default.utimesSync(String(entry.absolute), atime, mtime); } catch (utimeser) { er = futimeser; } @@ -17070,10 +16675,10 @@ var init_unpack = __esm({ const uid = this[UID](entry); const gid = this[GID](entry); try { - import_node_fs3.default.fchownSync(fd, Number(uid), Number(gid)); + import_node_fs4.default.fchownSync(fd, Number(uid), Number(gid)); } catch (fchowner) { try { - import_node_fs3.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); + import_node_fs4.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); } catch (chowner) { er = er || fchowner; } @@ -17092,13 +16697,13 @@ var init_unpack = __esm({ } if (entry.mtime && !this.noMtime) { try { - import_node_fs3.default.utimesSync(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime); + import_node_fs4.default.utimesSync(String(entry.absolute), entry.atime || /* @__PURE__ */ new Date(), entry.mtime); } catch (er2) { } } if (this[DOCHOWN](entry)) { try { - import_node_fs3.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + import_node_fs4.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); } catch (er2) { } } @@ -17107,7 +16712,7 @@ var init_unpack = __esm({ } [MKDIR](dir, mode) { try { - return mkdirSync4(normalizeWindowsPath(dir), { + return mkdirSync2(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, @@ -17115,7 +16720,6 @@ var init_unpack = __esm({ umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, - cache: this.dirCache, cwd: this.cwd, mode }); @@ -17126,7 +16730,7 @@ var init_unpack = __esm({ [LINK](entry, linkpath, link, done) { const ls = `${link}Sync`; try { - import_node_fs3.default[ls](linkpath, String(entry.absolute)); + import_node_fs4.default[ls](linkpath, String(entry.absolute)); done(); entry.resume(); } catch (er) { @@ -17137,27 +16741,27 @@ var init_unpack = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/extract.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/extract.js var extract_exports = {}; __export(extract_exports, { extract: () => extract }); -var import_node_fs4, extractFileSync, extractFile, extract; +var import_node_fs5, extractFileSync, extractFile, extract; var init_extract = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/extract.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/extract.js"() { init_esm2(); - import_node_fs4 = __toESM(require("node:fs"), 1); + import_node_fs5 = __toESM(require("node:fs"), 1); init_list(); init_make_command(); init_unpack(); extractFileSync = (opt) => { const u = new UnpackSync(opt); const file = opt.file; - const stat2 = import_node_fs4.default.statSync(file); + const stat = import_node_fs5.default.statSync(file); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const stream = new ReadStreamSync(file, { readSize, - size: stat2.size + size: stat.size }); stream.pipe(u); }; @@ -17165,16 +16769,16 @@ var init_extract = __esm({ const u = new Unpack(opt); const readSize = opt.maxReadSize || 16 * 1024 * 1024; const file = opt.file; - const p = new Promise((resolve2, reject) => { + const p = new Promise((resolve, reject) => { u.on("error", reject); - u.on("close", resolve2); - import_node_fs4.default.stat(file, (er, stat2) => { + u.on("close", resolve); + import_node_fs5.default.stat(file, (er, stat) => { if (er) { reject(er); } else { const stream = new ReadStream(file, { readSize, - size: stat2.size + size: stat.size }); stream.on("error", reject); stream.pipe(u); @@ -17200,7 +16804,7 @@ var require_v8_compile_cache = __commonJS({ var path16 = require("path"); var vm = require("vm"); var os3 = require("os"); - var hasOwnProperty2 = Object.prototype.hasOwnProperty; + var hasOwnProperty = Object.prototype.hasOwnProperty; var FileSystemBlobStore = class { constructor(directory, prefix) { const name2 = prefix ? slashEscape(prefix + ".") : ""; @@ -17211,19 +16815,19 @@ var require_v8_compile_cache = __commonJS({ this._load(); } has(key, invalidationKey) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { return this._invalidationKeys[key] === invalidationKey; - } else if (hasOwnProperty2.call(this._storedMap, key)) { + } else if (hasOwnProperty.call(this._storedMap, key)) { return this._storedMap[key][0] === invalidationKey; } return false; } get(key, invalidationKey) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { if (this._invalidationKeys[key] === invalidationKey) { return this._memoryBlobs[key]; } - } else if (hasOwnProperty2.call(this._storedMap, key)) { + } else if (hasOwnProperty.call(this._storedMap, key)) { const mapping = this._storedMap[key]; if (mapping[0] === invalidationKey) { return this._storedBlob.slice(mapping[1], mapping[2]); @@ -17236,15 +16840,15 @@ var require_v8_compile_cache = __commonJS({ this._dirty = true; } delete(key) { - if (hasOwnProperty2.call(this._memoryBlobs, key)) { + if (hasOwnProperty.call(this._memoryBlobs, key)) { this._dirty = true; delete this._memoryBlobs[key]; } - if (hasOwnProperty2.call(this._invalidationKeys, key)) { + if (hasOwnProperty.call(this._invalidationKeys, key)) { this._dirty = true; delete this._invalidationKeys[key]; } - if (hasOwnProperty2.call(this._storedMap, key)) { + if (hasOwnProperty.call(this._storedMap, key)) { this._dirty = true; delete this._storedMap[key]; } @@ -17257,7 +16861,7 @@ var require_v8_compile_cache = __commonJS({ const blobToStore = Buffer.concat(dump[0]); const mapToStore = JSON.stringify(dump[1]); try { - mkdirpSync2(this._directory); + mkdirpSync(this._directory); fs17.writeFileSync(this._lockFilename, "LOCK", { flag: "wx" }); } catch (error) { return false; @@ -17297,7 +16901,7 @@ var require_v8_compile_cache = __commonJS({ push2(key, invalidationKey, buffer); } for (const key of Object.keys(this._storedMap)) { - if (hasOwnProperty2.call(newMap, key)) continue; + if (hasOwnProperty.call(newMap, key)) continue; const mapping = this._storedMap[key]; const buffer = this._storedBlob.slice(mapping[1], mapping[2]); push2(key, mapping[0], buffer); @@ -17322,21 +16926,21 @@ var require_v8_compile_cache = __commonJS({ function require2(id) { return mod.require(id); } - function resolve2(request, options) { + function resolve(request, options) { return Module2._resolveFilename(request, mod, false, options); } - require2.resolve = resolve2; + require2.resolve = resolve; if (hasRequireResolvePaths) { - resolve2.paths = function paths(request) { + resolve.paths = function paths(request) { return Module2._resolveLookupPaths(request, mod, true); }; } require2.main = process.mainModule; require2.extensions = Module2._extensions; require2.cache = Module2._cache; - const dirname5 = path16.dirname(filename); + const dirname2 = path16.dirname(filename); const compiledWrapper = self2._moduleCompile(filename, content); - const args = [mod.exports, require2, mod, filename, dirname5, process, global, Buffer]; + const args = [mod.exports, require2, mod, filename, dirname2, process, global, Buffer]; return compiledWrapper.apply(mod.exports, args); }; } @@ -17387,7 +16991,7 @@ var require_v8_compile_cache = __commonJS({ return compiledWrapper; } }; - function mkdirpSync2(p_) { + function mkdirpSync(p_) { _mkdirpSync(path16.resolve(p_), 511); } function _mkdirpSync(p, mode) { @@ -17399,8 +17003,8 @@ var require_v8_compile_cache = __commonJS({ _mkdirpSync(p); } else { try { - const stat2 = fs17.statSync(p); - if (!stat2.isDirectory()) { + const stat = fs17.statSync(p); + if (!stat.isDirectory()) { throw err0; } } catch (err1) { @@ -17429,10 +17033,10 @@ var require_v8_compile_cache = __commonJS({ if (v8_compile_cache_cache_dir) { return v8_compile_cache_cache_dir; } - const dirname5 = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; + const dirname2 = typeof process.getuid === "function" ? "v8-compile-cache-" + process.getuid() : "v8-compile-cache"; const arch = process.arch; - const version3 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; - const cacheDir = path16.join(os3.tmpdir(), dirname5, arch, version3); + const version2 = typeof process.versions.v8 === "string" ? process.versions.v8 : typeof process.versions.chakracore === "string" ? "chakracore-" + process.versions.chakracore : "node-" + process.version; + const cacheDir = path16.join(os3.tmpdir(), dirname2, arch, version2); return cacheDir; } function getMainName() { @@ -17456,7 +17060,7 @@ var require_v8_compile_cache = __commonJS({ module2.exports.__TEST__ = { FileSystemBlobStore, NativeCompileCache, - mkdirpSync: mkdirpSync2, + mkdirpSync, slashEscape, supportsCachedData, getCacheDir, @@ -17465,17 +17069,18 @@ var require_v8_compile_cache = __commonJS({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/satisfies.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js var require_satisfies = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/satisfies.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/satisfies.js"(exports2, module2) { + "use strict"; var Range3 = require_range(); - var satisfies = (version3, range, options) => { + var satisfies = (version2, range, options) => { try { range = new Range3(range, options); } catch (er) { return false; } - return range.test(version3); + return range.test(version2); }; module2.exports = satisfies; } @@ -17513,8 +17118,8 @@ var require_posix = __commonJS({ } }; exports2.sync = sync; - var checkStat = (stat2, options) => stat2.isFile() && checkMode(stat2, options); - var checkMode = (stat2, options) => { + var checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); + var checkMode = (stat, options) => { const myUid = options.uid ?? process.getuid?.(); const myGroups = options.groups ?? process.getgroups?.() ?? []; const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; @@ -17522,9 +17127,9 @@ var require_posix = __commonJS({ throw new Error("cannot get uid or gid"); } const groups = /* @__PURE__ */ new Set([myGid, ...myGroups]); - const mod = stat2.mode; - const uid = stat2.uid; - const gid = stat2.gid; + const mod = stat.mode; + const uid = stat.uid; + const gid = stat.gid; const u = parseInt("100", 8); const g = parseInt("010", 8); const o = parseInt("001", 8); @@ -17581,7 +17186,7 @@ var require_win32 = __commonJS({ } return false; }; - var checkStat = (stat2, path16, options) => stat2.isFile() && checkPathExt(path16, options); + var checkStat = (stat, path16, options) => stat.isFile() && checkPathExt(path16, options); } }); @@ -17597,22 +17202,22 @@ var require_options = __commonJS({ var require_cjs = __commonJS({ ".yarn/cache/isexe-npm-3.1.1-9c0061eead-9ec2576540.zip/node_modules/isexe/dist/cjs/index.js"(exports2) { "use strict"; - var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) { if (k2 === void 0) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { + var desc2 = Object.getOwnPropertyDescriptor(m, k); + if (!desc2 || ("get" in desc2 ? !m.__esModule : desc2.writable || desc2.configurable)) { + desc2 = { enumerable: true, get: function() { return m[k]; } }; } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { + Object.defineProperty(o, k2, desc2); + }) : (function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; - }); - var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + })); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { + }) : function(o, v) { o["default"] = v; }); var __importStar = exports2 && exports2.__importStar || function(mod) { @@ -17634,8 +17239,8 @@ var require_cjs = __commonJS({ var win322 = __importStar(require_win32()); exports2.win32 = win322; __exportStar(require_options(), exports2); - var platform6 = process.env._ISEXE_TEST_PLATFORM_ || process.platform; - var impl = platform6 === "win32" ? win322 : posix; + var platform5 = process.env._ISEXE_TEST_PLATFORM_ || process.platform; + var impl = platform5 === "win32" ? win322 : posix; exports2.isexe = impl.isexe; exports2.sync = impl.sync; } @@ -17774,7 +17379,7 @@ var require_polyfills = __commonJS({ var constants2 = require("constants"); var origCwd = process.cwd; var cwd = null; - var platform6 = process.env.GRACEFUL_FS_PLATFORM || process.platform; + var platform5 = process.env.GRACEFUL_FS_PLATFORM || process.platform; process.cwd = function() { if (!cwd) cwd = origCwd.call(process); @@ -17833,8 +17438,8 @@ var require_polyfills = __commonJS({ fs17.lchownSync = function() { }; } - if (platform6 === "win32") { - fs17.rename = typeof fs17.rename !== "function" ? fs17.rename : function(fs$rename) { + if (platform5 === "win32") { + fs17.rename = typeof fs17.rename !== "function" ? fs17.rename : (function(fs$rename) { function rename(from, to, cb) { var start = Date.now(); var backoff = 0; @@ -17857,9 +17462,9 @@ var require_polyfills = __commonJS({ } if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename); return rename; - }(fs17.rename); + })(fs17.rename); } - fs17.read = typeof fs17.read !== "function" ? fs17.read : function(fs$read) { + fs17.read = typeof fs17.read !== "function" ? fs17.read : (function(fs$read) { function read(fd, buffer, offset, length, position, callback_) { var callback; if (callback_ && typeof callback_ === "function") { @@ -17876,8 +17481,8 @@ var require_polyfills = __commonJS({ } if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read); return read; - }(fs17.read); - fs17.readSync = typeof fs17.readSync !== "function" ? fs17.readSync : /* @__PURE__ */ function(fs$readSync) { + })(fs17.read); + fs17.readSync = typeof fs17.readSync !== "function" ? fs17.readSync : /* @__PURE__ */ (function(fs$readSync) { return function(fd, buffer, offset, length, position) { var eagCounter = 0; while (true) { @@ -17892,7 +17497,7 @@ var require_polyfills = __commonJS({ } } }; - }(fs17.readSync); + })(fs17.readSync); function patchLchmod(fs18) { fs18.lchmod = function(path16, mode, callback) { fs18.open( @@ -18192,7 +17797,7 @@ var require_graceful_fs = __commonJS({ gracefulQueue = "___graceful-fs.queue"; previousSymbol = "___graceful-fs.previous"; } - function noop2() { + function noop3() { } function publishQueue(context, queue2) { Object.defineProperty(context, gracefulQueue, { @@ -18201,7 +17806,7 @@ var require_graceful_fs = __commonJS({ } }); } - var debug2 = noop2; + var debug2 = noop3; if (util.debuglog) debug2 = util.debuglog("gfs4"); else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) @@ -18213,7 +17818,7 @@ var require_graceful_fs = __commonJS({ if (!fs17[gracefulQueue]) { queue = global[gracefulQueue] || []; publishQueue(fs17, queue); - fs17.close = function(fs$close) { + fs17.close = (function(fs$close) { function close(fd, cb) { return fs$close.call(fs17, fd, function(err) { if (!err) { @@ -18227,8 +17832,8 @@ var require_graceful_fs = __commonJS({ value: fs$close }); return close; - }(fs17.close); - fs17.closeSync = function(fs$closeSync) { + })(fs17.close); + fs17.closeSync = (function(fs$closeSync) { function closeSync(fd) { fs$closeSync.apply(fs17, arguments); resetQueue(); @@ -18237,7 +17842,7 @@ var require_graceful_fs = __commonJS({ value: fs$closeSync }); return closeSync; - }(fs17.closeSync); + })(fs17.closeSync); if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { process.on("exit", function() { debug2(fs17[gracefulQueue]); @@ -18574,8 +18179,8 @@ var require_cmd_shim = __commonJS({ const opts_ = { ...DEFAULT_OPTIONS, ...opts }; const fs17 = opts_.fs; opts_.fs_ = { - chmod: fs17.chmod ? (0, util_1.promisify)(fs17.chmod) : async () => { - }, + chmod: fs17.chmod ? (0, util_1.promisify)(fs17.chmod) : (async () => { + }), mkdir: (0, util_1.promisify)(fs17.mkdir), readFile: (0, util_1.promisify)(fs17.readFile), stat: (0, util_1.promisify)(fs17.stat), @@ -18889,638 +18494,1012 @@ ${nodePath ? "$env:NODE_PATH=$env_node_path\n" : ""}${prependPath ? "$env:PATH=$ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mode-fix.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/mode-fix.js var modeFix; var init_mode_fix = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/mode-fix.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/mode-fix.js"() { modeFix = (mode, isDir, portable) => { mode &= 4095; if (portable) { mode = (mode | 384) & ~18; } - if (isDir) { - if (mode & 256) { - mode |= 64; + if (isDir) { + if (mode & 256) { + mode |= 64; + } + if (mode & 32) { + mode |= 8; + } + if (mode & 4) { + mode |= 1; + } + } + return mode; + }; + } +}); + +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/write-entry.js +var import_fs11, import_path9, prefixPath, maxReadSize, PROCESS, FILE2, DIRECTORY2, SYMLINK2, HARDLINK2, HEADER, READ2, LSTAT, ONLSTAT, ONREAD, ONREADLINK, OPENFILE, ONOPENFILE, CLOSE, MODE, AWAITDRAIN, ONDRAIN, PREFIX, WriteEntry, WriteEntrySync, WriteEntryTar, getType; +var init_write_entry = __esm({ + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/write-entry.js"() { + import_fs11 = __toESM(require("fs"), 1); + init_esm(); + import_path9 = __toESM(require("path"), 1); + init_header(); + init_mode_fix(); + init_normalize_windows_path(); + init_options(); + init_pax(); + init_strip_absolute_path(); + init_strip_trailing_slashes(); + init_warn_method(); + init_winchars(); + prefixPath = (path16, prefix) => { + if (!prefix) { + return normalizeWindowsPath(path16); + } + path16 = normalizeWindowsPath(path16).replace(/^\.(\/|$)/, ""); + return stripTrailingSlashes(prefix) + "/" + path16; + }; + maxReadSize = 16 * 1024 * 1024; + PROCESS = Symbol("process"); + FILE2 = Symbol("file"); + DIRECTORY2 = Symbol("directory"); + SYMLINK2 = Symbol("symlink"); + HARDLINK2 = Symbol("hardlink"); + HEADER = Symbol("header"); + READ2 = Symbol("read"); + LSTAT = Symbol("lstat"); + ONLSTAT = Symbol("onlstat"); + ONREAD = Symbol("onread"); + ONREADLINK = Symbol("onreadlink"); + OPENFILE = Symbol("openfile"); + ONOPENFILE = Symbol("onopenfile"); + CLOSE = Symbol("close"); + MODE = Symbol("mode"); + AWAITDRAIN = Symbol("awaitDrain"); + ONDRAIN = Symbol("ondrain"); + PREFIX = Symbol("prefix"); + WriteEntry = class extends Minipass { + path; + portable; + myuid = process.getuid && process.getuid() || 0; + // until node has builtin pwnam functions, this'll have to do + 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; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.path = normalizeWindowsPath(p); + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); + this.statCache = opt.statCache || /* @__PURE__ */ new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : void 0; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; + } + } + this.win32 = !!opt.win32 || process.platform === "win32"; + if (this.win32) { + this.path = decode(this.path.replace(/\\/g, "/")); + p = p.replace(/\\/g, "/"); + } + this.absolute = normalizeWindowsPath(opt.absolute || import_path9.default.resolve(this.cwd, p)); + if (this.path === "") { + this.path = "./"; + } + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } else { + this[LSTAT](); + } + } + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); + } + emit(ev, ...data) { + if (ev === "error") { + this.#hadError = true; + } + return super.emit(ev, ...data); + } + [LSTAT]() { + import_fs11.default.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit("error", er); + } + this[ONLSTAT](stat); + }); + } + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; + } + this.type = getType(stat); + this.emit("stat", stat); + this[PROCESS](); + } + [PROCESS]() { + switch (this.type) { + case "File": + return this[FILE2](); + case "Directory": + return this[DIRECTORY2](); + case "SymbolicLink": + return this[SYMLINK2](); + // unsupported types are ignored. + default: + return this.end(); + } + } + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); + } + [PREFIX](path16) { + return prefixPath(path16, this.prefix); + } + [HEADER]() { + if (!this.stat) { + throw new Error("cannot write header before stat"); + } + if (this.type === "Directory" && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](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, + /* c8 ignore next */ + 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 + }); + if (this.header.encode() && !this.noPax) { + super.write(new 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[PREFIX](this.path), + linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](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()); + } + const block = this.header?.block; + if (!block) { + throw new Error("failed to encode header"); + } + super.write(block); + } + [DIRECTORY2]() { + if (!this.stat) { + throw new Error("cannot create directory entry without stat"); + } + if (this.path.slice(-1) !== "/") { + this.path += "/"; + } + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [SYMLINK2]() { + import_fs11.default.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit("error", er); + } + this[ONREADLINK](linkpath); + }); + } + [ONREADLINK](linkpath) { + this.linkpath = normalizeWindowsPath(linkpath); + this[HEADER](); + this.end(); + } + [HARDLINK2](linkpath) { + if (!this.stat) { + throw new Error("cannot create link entry without stat"); + } + this.type = "Link"; + this.linkpath = normalizeWindowsPath(import_path9.default.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [FILE2]() { + if (!this.stat) { + throw new Error("cannot create file entry without stat"); + } + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK2](linkpath); + } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); + } + [OPENFILE]() { + import_fs11.default.open(this.absolute, "r", (er, fd) => { + if (er) { + return this.emit("error", er); + } + this[ONOPENFILE](fd); + }); + } + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); + } + if (!this.stat) { + throw new Error("should stat before calling onopenfile"); + } + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ2](); + } + [READ2]() { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("cannot read file without first opening"); + } + import_fs11.default.read(fd, buf, offset, length, pos2, (er, bytesRead) => { + if (er) { + return this[CLOSE](() => this.emit("error", er)); + } + this[ONREAD](bytesRead); + }); + } + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.close(this.fd, cb); + } + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error("encountered unexpected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error("did not encounter expected EOF"), { + path: this.absolute, + syscall: "read", + code: "EOF" + }); + return this[CLOSE](() => this.emit("error", er)); + } + if (!this.buf) { + throw new Error("should have created buffer prior to reading"); + } + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; + } + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } else { + this[ONDRAIN](); + } + } + [AWAITDRAIN](cb) { + this.once("drain", cb); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + } + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error("writing more data than expected"), { + path: this.absolute + }); + return this.emit("error", er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); + } + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); } - if (mode & 32) { - mode |= 8; + if (!this.buf) { + throw new Error("buffer lost somehow in ONDRAIN"); } - if (mode & 4) { - mode |= 1; + if (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[READ2](); } - return mode; }; - } -}); - -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/write-entry.js -var import_fs14, import_path13, prefixPath, maxReadSize, PROCESS, FILE2, DIRECTORY2, SYMLINK2, HARDLINK2, HEADER, READ2, LSTAT, ONLSTAT, ONREAD, ONREADLINK, OPENFILE, ONOPENFILE, CLOSE, MODE, AWAITDRAIN, ONDRAIN, PREFIX, WriteEntry, WriteEntrySync, WriteEntryTar, getType; -var init_write_entry = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/write-entry.js"() { - import_fs14 = __toESM(require("fs"), 1); - init_esm(); - import_path13 = __toESM(require("path"), 1); - init_header(); - init_mode_fix(); - init_normalize_windows_path(); - init_options(); - init_pax(); - init_strip_absolute_path(); - init_strip_trailing_slashes(); - init_warn_method(); - init_winchars(); - prefixPath = (path16, prefix) => { - if (!prefix) { - return normalizeWindowsPath(path16); + WriteEntrySync = class extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](import_fs11.default.lstatSync(this.absolute)); + } + [SYMLINK2]() { + this[ONREADLINK](import_fs11.default.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](import_fs11.default.openSync(this.absolute, "r")); + } + [READ2]() { + let threw = true; + try { + const { fd, buf, offset, length, pos: pos2 } = this; + if (fd === void 0 || buf === void 0) { + throw new Error("fd and buf must be set in READ method"); + } + const bytesRead = import_fs11.default.readSync(fd, buf, offset, length, pos2); + this[ONREAD](bytesRead); + threw = false; + } finally { + if (threw) { + try { + this[CLOSE](() => { + }); + } catch (er) { + } + } + } + } + [AWAITDRAIN](cb) { + cb(); + } + /* c8 ignore start */ + [CLOSE](cb = () => { + }) { + if (this.fd !== void 0) + import_fs11.default.closeSync(this.fd); + cb(); } - path16 = normalizeWindowsPath(path16).replace(/^\.(\/|$)/, ""); - return stripTrailingSlashes(prefix) + "/" + path16; }; - maxReadSize = 16 * 1024 * 1024; - PROCESS = Symbol("process"); - FILE2 = Symbol("file"); - DIRECTORY2 = Symbol("directory"); - SYMLINK2 = Symbol("symlink"); - HARDLINK2 = Symbol("hardlink"); - HEADER = Symbol("header"); - READ2 = Symbol("read"); - LSTAT = Symbol("lstat"); - ONLSTAT = Symbol("onlstat"); - ONREAD = Symbol("onread"); - ONREADLINK = Symbol("onreadlink"); - OPENFILE = Symbol("openfile"); - ONOPENFILE = Symbol("onopenfile"); - CLOSE = Symbol("close"); - MODE = Symbol("mode"); - AWAITDRAIN = Symbol("awaitDrain"); - ONDRAIN = Symbol("ondrain"); - PREFIX = Symbol("prefix"); - WriteEntry = class extends Minipass { - path; - portable; - myuid = process.getuid && process.getuid() || 0; - // until node has builtin pwnam functions, this'll have to do - myuser = process.env.USER || ""; - maxReadSize; - linkCache; - statCache; - preservePaths; - cwd; - strict; - mtime; - noPax; - noMtime; - prefix; - fd; + WriteEntryTar = class extends Minipass { blockLen = 0; blockRemain = 0; - buf; + buf = 0; pos = 0; remain = 0; length = 0; - offset = 0; - win32; - absolute; - header; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; linkpath; - stat; + size; onWriteEntry; - #hadError = false; - constructor(p, opt_ = {}) { + warn(code2, message, data = {}) { + return warnMethod(this, code2, message, data); + } + constructor(readEntry, opt_ = {}) { const opt = dealias(opt_); super(); - this.path = normalizeWindowsPath(p); - this.portable = !!opt.portable; - this.maxReadSize = opt.maxReadSize || maxReadSize; - this.linkCache = opt.linkCache || /* @__PURE__ */ new Map(); - this.statCache = opt.statCache || /* @__PURE__ */ new Map(); this.preservePaths = !!opt.preservePaths; - this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.portable = !!opt.portable; this.strict = !!opt.strict; this.noPax = !!opt.noPax; this.noMtime = !!opt.noMtime; - this.mtime = opt.mtime; - this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : void 0; this.onWriteEntry = opt.onWriteEntry; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); - } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root && typeof stripped === "string") { - this.path = stripped; - pathWarn = root; - } - } - this.win32 = !!opt.win32 || process.platform === "win32"; - if (this.win32) { - this.path = decode(this.path.replace(/\\/g, "/")); - p = p.replace(/\\/g, "/"); - } - this.absolute = normalizeWindowsPath(opt.absolute || import_path13.default.resolve(this.cwd, p)); - if (this.path === "") { - this.path = "./"; - } - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); - } - const cs = this.statCache.get(this.absolute); - if (cs) { - this[ONLSTAT](cs); - } else { - this[LSTAT](); - } - } - warn(code2, message, data = {}) { - return warnMethod(this, code2, message, data); - } - emit(ev, ...data) { - if (ev === "error") { - this.#hadError = true; - } - return super.emit(ev, ...data); - } - [LSTAT]() { - import_fs14.default.lstat(this.absolute, (er, stat2) => { - if (er) { - return this.emit("error", er); - } - this[ONLSTAT](stat2); - }); - } - [ONLSTAT](stat2) { - this.statCache.set(this.absolute, stat2); - this.stat = stat2; - if (!stat2.isFile()) { - stat2.size = 0; + this.readEntry = readEntry; + const { type } = readEntry; + if (type === "Unsupported") { + throw new Error("writing entry that should be ignored"); } - this.type = getType(stat2); - this.emit("stat", stat2); - this[PROCESS](); - } - [PROCESS]() { - switch (this.type) { - case "File": - return this[FILE2](); - case "Directory": - return this[DIRECTORY2](); - case "SymbolicLink": - return this[SYMLINK2](); - // unsupported types are ignored. - default: - return this.end(); + this.type = type; + if (this.type === "Directory" && this.portable) { + this.noMtime = true; } - } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); - } - [PREFIX](path16) { - return prefixPath(path16, this.prefix); - } - [HEADER]() { - if (!this.stat) { - throw new Error("cannot write header before stat"); + this.prefix = opt.prefix; + this.path = normalizeWindowsPath(readEntry.path); + this.mode = readEntry.mode !== void 0 ? this[MODE](readEntry.mode) : void 0; + this.uid = this.portable ? void 0 : readEntry.uid; + this.gid = this.portable ? void 0 : readEntry.gid; + this.uname = this.portable ? void 0 : readEntry.uname; + this.gname = this.portable ? void 0 : readEntry.gname; + this.size = readEntry.size; + this.mtime = this.noMtime ? void 0 : opt.mtime || readEntry.mtime; + this.atime = this.portable ? void 0 : readEntry.atime; + this.ctime = this.portable ? void 0 : readEntry.ctime; + this.linkpath = readEntry.linkpath !== void 0 ? normalizeWindowsPath(readEntry.linkpath) : void 0; + if (typeof opt.onwarn === "function") { + this.on("warn", opt.onwarn); } - if (this.type === "Directory" && this.portable) { - this.noMtime = true; + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === "string") { + this.path = stripped; + pathWarn = root; + } } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; this.onWriteEntry?.(this); this.header = new Header({ path: this[PREFIX](this.path), - // only apply the prefix to hard links. linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type - mode: this[MODE](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, - /* c8 ignore next */ - 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 + 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 }); + if (pathWarn) { + this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path + }); + } if (this.header.encode() && !this.noPax) { super.write(new 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, + 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[PREFIX](this.path), linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](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 + 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()); } - const block = this.header?.block; - if (!block) { + const b = this.header?.block; + if (!b) throw new Error("failed to encode header"); + super.write(b); + readEntry.pipe(this); + } + [PREFIX](path16) { + return prefixPath(path16, this.prefix); + } + [MODE](mode) { + return modeFix(mode, this.type === "Directory", this.portable); + } + write(chunk, encoding, cb) { + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; } - super.write(block); + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + } + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error("writing more to entry than is appropriate"); + } + this.blockRemain -= writeLen; + return super.write(chunk, cb); } - [DIRECTORY2]() { - if (!this.stat) { - throw new Error("cannot create directory entry without stat"); + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); } - if (this.path.slice(-1) !== "/") { - this.path += "/"; + if (typeof chunk === "function") { + cb = chunk; + encoding = void 0; + chunk = void 0; } - this.stat.size = 0; - this[HEADER](); - this.end(); + if (typeof encoding === "function") { + cb = encoding; + encoding = void 0; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding ?? "utf8"); + } + if (cb) + this.once("finish", cb); + chunk ? super.end(chunk, cb) : super.end(cb); + return this; } - [SYMLINK2]() { - import_fs14.default.readlink(this.absolute, (er, linkpath) => { - if (er) { - return this.emit("error", er); - } - this[ONREADLINK](linkpath); - }); + }; + getType = (stat) => stat.isFile() ? "File" : stat.isDirectory() ? "Directory" : stat.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; + } +}); + +// .yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js +function insertAfter(self2, node, value) { + const prev = node; + const next = node ? node.next : self2.head; + const inserted = new Node(value, prev, next, self2); + if (inserted.next === void 0) { + self2.tail = inserted; + } + if (inserted.prev === void 0) { + self2.head = inserted; + } + self2.length++; + return inserted; +} +function push(self2, item) { + self2.tail = new Node(item, self2.tail, void 0, self2); + if (!self2.head) { + self2.head = self2.tail; + } + self2.length++; +} +function unshift(self2, item) { + self2.head = new Node(item, void 0, self2.head, self2); + if (!self2.tail) { + self2.tail = self2.head; + } + self2.length++; +} +var Yallist, Node; +var init_esm5 = __esm({ + ".yarn/cache/yallist-npm-5.0.0-8732dd9f1c-a499c81ce6.zip/node_modules/yallist/dist/esm/index.js"() { + Yallist = class _Yallist { + tail; + head; + length = 0; + static create(list2 = []) { + return new _Yallist(list2); } - [ONREADLINK](linkpath) { - this.linkpath = normalizeWindowsPath(linkpath); - this[HEADER](); - this.end(); + constructor(list2 = []) { + for (const item of list2) { + this.push(item); + } } - [HARDLINK2](linkpath) { - if (!this.stat) { - throw new Error("cannot create link entry without stat"); + *[Symbol.iterator]() { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value; } - this.type = "Link"; - this.linkpath = normalizeWindowsPath(import_path13.default.relative(this.cwd, linkpath)); - this.stat.size = 0; - this[HEADER](); - this.end(); } - [FILE2]() { - if (!this.stat) { - throw new Error("cannot create file entry without stat"); + removeNode(node) { + if (node.list !== this) { + throw new Error("removing node which does not belong to this list"); } - if (this.stat.nlink > 1) { - const linkKey = `${this.stat.dev}:${this.stat.ino}`; - const linkpath = this.linkCache.get(linkKey); - if (linkpath?.indexOf(this.cwd) === 0) { - return this[HARDLINK2](linkpath); - } - this.linkCache.set(linkKey, this.absolute); + const next = node.next; + const prev = node.prev; + if (next) { + next.prev = prev; } - this[HEADER](); - if (this.stat.size === 0) { - return this.end(); + if (prev) { + prev.next = next; } - this[OPENFILE](); - } - [OPENFILE]() { - import_fs14.default.open(this.absolute, "r", (er, fd) => { - if (er) { - return this.emit("error", er); - } - this[ONOPENFILE](fd); - }); - } - [ONOPENFILE](fd) { - this.fd = fd; - if (this.#hadError) { - return this[CLOSE](); + if (node === this.head) { + this.head = next; } - if (!this.stat) { - throw new Error("should stat before calling onopenfile"); + if (node === this.tail) { + this.tail = prev; } - this.blockLen = 512 * Math.ceil(this.stat.size / 512); - this.blockRemain = this.blockLen; - const bufLen = Math.min(this.blockLen, this.maxReadSize); - this.buf = Buffer.allocUnsafe(bufLen); - this.offset = 0; - this.pos = 0; - this.remain = this.stat.size; - this.length = this.buf.length; - this[READ2](); + this.length--; + node.next = void 0; + node.prev = void 0; + node.list = void 0; + return next; } - [READ2]() { - const { fd, buf, offset, length, pos: pos2 } = this; - if (fd === void 0 || buf === void 0) { - throw new Error("cannot read file without first opening"); + unshiftNode(node) { + if (node === this.head) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const head = this.head; + node.list = this; + node.next = head; + if (head) { + head.prev = node; + } + this.head = node; + if (!this.tail) { + this.tail = node; } - import_fs14.default.read(fd, buf, offset, length, pos2, (er, bytesRead) => { - if (er) { - return this[CLOSE](() => this.emit("error", er)); - } - this[ONREAD](bytesRead); - }); - } - /* c8 ignore start */ - [CLOSE](cb = () => { - }) { - if (this.fd !== void 0) - import_fs14.default.close(this.fd, cb); + this.length++; } - [ONREAD](bytesRead) { - if (bytesRead <= 0 && this.remain > 0) { - const er = Object.assign(new Error("encountered unexpected EOF"), { - path: this.absolute, - syscall: "read", - code: "EOF" - }); - return this[CLOSE](() => this.emit("error", er)); - } - if (bytesRead > this.remain) { - const er = Object.assign(new Error("did not encounter expected EOF"), { - path: this.absolute, - syscall: "read", - code: "EOF" - }); - return this[CLOSE](() => this.emit("error", er)); + pushNode(node) { + if (node === this.tail) { + return; } - if (!this.buf) { - throw new Error("should have created buffer prior to reading"); + if (node.list) { + node.list.removeNode(node); } - if (bytesRead === this.remain) { - for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { - this.buf[i + this.offset] = 0; - bytesRead++; - this.remain++; - } + const tail = this.tail; + node.list = this; + node.prev = tail; + if (tail) { + tail.next = node; } - const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); - const flushed = this.write(chunk); - if (!flushed) { - this[AWAITDRAIN](() => this[ONDRAIN]()); - } else { - this[ONDRAIN](); + this.tail = node; + if (!this.head) { + this.head = node; } + this.length++; } - [AWAITDRAIN](cb) { - this.once("drain", cb); + push(...args) { + for (let i = 0, l = args.length; i < l; i++) { + push(this, args[i]); + } + return this.length; } - write(chunk, encoding, cb) { - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + unshift(...args) { + for (var i = 0, l = args.length; i < l; i++) { + unshift(this, args[i]); } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + return this.length; + } + pop() { + if (!this.tail) { + return void 0; } - if (this.blockRemain < chunk.length) { - const er = Object.assign(new Error("writing more data than expected"), { - path: this.absolute - }); - return this.emit("error", er); + const res = this.tail.value; + const t = this.tail; + this.tail = this.tail.prev; + if (this.tail) { + this.tail.next = void 0; + } else { + this.head = void 0; } - this.remain -= chunk.length; - this.blockRemain -= chunk.length; - this.pos += chunk.length; - this.offset += chunk.length; - return super.write(chunk, null, cb); + t.list = void 0; + this.length--; + return res; } - [ONDRAIN]() { - if (!this.remain) { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); - } - return this[CLOSE]((er) => er ? this.emit("error", er) : this.end()); - } - if (!this.buf) { - throw new Error("buffer lost somehow in ONDRAIN"); + shift() { + if (!this.head) { + return void 0; } - if (this.offset >= this.length) { - this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); - this.offset = 0; + const res = this.head.value; + const h = this.head; + this.head = this.head.next; + if (this.head) { + this.head.prev = void 0; + } else { + this.tail = void 0; } - this.length = this.buf.length - this.offset; - this[READ2](); - } - }; - WriteEntrySync = class extends WriteEntry { - sync = true; - [LSTAT]() { - this[ONLSTAT](import_fs14.default.lstatSync(this.absolute)); - } - [SYMLINK2]() { - this[ONREADLINK](import_fs14.default.readlinkSync(this.absolute)); + h.list = void 0; + this.length--; + return res; } - [OPENFILE]() { - this[ONOPENFILE](import_fs14.default.openSync(this.absolute, "r")); + forEach(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.head, i = 0; !!walker; i++) { + fn2.call(thisp, walker.value, i, this); + walker = walker.next; + } } - [READ2]() { - let threw = true; - try { - const { fd, buf, offset, length, pos: pos2 } = this; - if (fd === void 0 || buf === void 0) { - throw new Error("fd and buf must be set in READ method"); - } - const bytesRead = import_fs14.default.readSync(fd, buf, offset, length, pos2); - this[ONREAD](bytesRead); - threw = false; - } finally { - if (threw) { - try { - this[CLOSE](() => { - }); - } catch (er) { - } - } + forEachReverse(fn2, thisp) { + thisp = thisp || this; + for (let walker = this.tail, i = this.length - 1; !!walker; i--) { + fn2.call(thisp, walker.value, i, this); + walker = walker.prev; } } - [AWAITDRAIN](cb) { - cb(); + get(n) { + let i = 0; + let walker = this.head; + for (; !!walker && i < n; i++) { + walker = walker.next; + } + if (i === n && !!walker) { + return walker.value; + } } - /* c8 ignore start */ - [CLOSE](cb = () => { - }) { - if (this.fd !== void 0) - import_fs14.default.closeSync(this.fd); - cb(); + getReverse(n) { + let i = 0; + let walker = this.tail; + for (; !!walker && i < n; i++) { + walker = walker.prev; + } + if (i === n && !!walker) { + return walker.value; + } } - }; - WriteEntryTar = class extends 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(code2, message, data = {}) { - return warnMethod(this, code2, message, data); + map(fn2, thisp) { + thisp = thisp || this; + const res = new _Yallist(); + for (let walker = this.head; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.next; + } + return res; } - constructor(readEntry, opt_ = {}) { - const opt = dealias(opt_); - super(); - this.preservePaths = !!opt.preservePaths; - this.portable = !!opt.portable; - this.strict = !!opt.strict; - this.noPax = !!opt.noPax; - this.noMtime = !!opt.noMtime; - this.onWriteEntry = opt.onWriteEntry; - this.readEntry = readEntry; - const { type } = readEntry; - if (type === "Unsupported") { - throw new Error("writing entry that should be ignored"); + mapReverse(fn2, thisp) { + thisp = thisp || this; + var res = new _Yallist(); + for (let walker = this.tail; !!walker; ) { + res.push(fn2.call(thisp, walker.value, this)); + walker = walker.prev; } - this.type = type; - if (this.type === "Directory" && this.portable) { - this.noMtime = true; + return res; + } + reduce(fn2, initial) { + let acc; + let walker = this.head; + if (arguments.length > 1) { + acc = initial; + } else if (this.head) { + walker = this.head.next; + acc = this.head.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); } - this.prefix = opt.prefix; - this.path = normalizeWindowsPath(readEntry.path); - this.mode = readEntry.mode !== void 0 ? this[MODE](readEntry.mode) : void 0; - this.uid = this.portable ? void 0 : readEntry.uid; - this.gid = this.portable ? void 0 : readEntry.gid; - this.uname = this.portable ? void 0 : readEntry.uname; - this.gname = this.portable ? void 0 : readEntry.gname; - this.size = readEntry.size; - this.mtime = this.noMtime ? void 0 : opt.mtime || readEntry.mtime; - this.atime = this.portable ? void 0 : readEntry.atime; - this.ctime = this.portable ? void 0 : readEntry.ctime; - this.linkpath = readEntry.linkpath !== void 0 ? normalizeWindowsPath(readEntry.linkpath) : void 0; - if (typeof opt.onwarn === "function") { - this.on("warn", opt.onwarn); + for (var i = 0; !!walker; i++) { + acc = fn2(acc, walker.value, i); + walker = walker.next; } - let pathWarn = false; - if (!this.preservePaths) { - const [root, stripped] = stripAbsolutePath(this.path); - if (root && typeof stripped === "string") { - this.path = stripped; - pathWarn = root; - } + return acc; + } + reduceReverse(fn2, initial) { + let acc; + let walker = this.tail; + if (arguments.length > 1) { + acc = initial; + } else if (this.tail) { + walker = this.tail.prev; + acc = this.tail.value; + } else { + throw new TypeError("Reduce of empty list with no initial value"); } - this.remain = readEntry.size; - this.blockRemain = readEntry.startBlockSize; - this.onWriteEntry?.(this); - this.header = new Header({ - path: this[PREFIX](this.path), - linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](this.linkpath) : this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - 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 - }); - if (pathWarn) { - this.warn("TAR_ENTRY_INFO", `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path - }); + for (let i = this.length - 1; !!walker; i--) { + acc = fn2(acc, walker.value, i); + walker = walker.prev; } - if (this.header.encode() && !this.noPax) { - super.write(new 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[PREFIX](this.path), - linkpath: this.type === "Link" && this.linkpath !== void 0 ? this[PREFIX](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()); + return acc; + } + toArray() { + const arr = new Array(this.length); + for (let i = 0, walker = this.head; !!walker; i++) { + arr[i] = walker.value; + walker = walker.next; } - const b = this.header?.block; - if (!b) - throw new Error("failed to encode header"); - super.write(b); - readEntry.pipe(this); + return arr; } - [PREFIX](path16) { - return prefixPath(path16, this.prefix); + toArrayReverse() { + const arr = new Array(this.length); + for (let i = 0, walker = this.tail; !!walker; i++) { + arr[i] = walker.value; + walker = walker.prev; + } + return arr; } - [MODE](mode) { - return modeFix(mode, this.type === "Directory", this.portable); + slice(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let walker = this.head; + let i = 0; + for (i = 0; !!walker && i < from; i++) { + walker = walker.next; + } + for (; !!walker && i < to; i++, walker = walker.next) { + ret.push(walker.value); + } + return ret; } - write(chunk, encoding, cb) { - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + sliceReverse(from = 0, to = this.length) { + if (to < 0) { + to += this.length; } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, typeof encoding === "string" ? encoding : "utf8"); + if (from < 0) { + from += this.length; } - const writeLen = chunk.length; - if (writeLen > this.blockRemain) { - throw new Error("writing more to entry than is appropriate"); + const ret = new _Yallist(); + if (to < from || to < 0) { + return ret; } - this.blockRemain -= writeLen; - return super.write(chunk, cb); + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let i = this.length; + let walker = this.tail; + for (; !!walker && i > to; i--) { + walker = walker.prev; + } + for (; !!walker && i > from; i--, walker = walker.prev) { + ret.push(walker.value); + } + return ret; } - end(chunk, encoding, cb) { - if (this.blockRemain) { - super.write(Buffer.alloc(this.blockRemain)); + splice(start, deleteCount = 0, ...nodes) { + if (start > this.length) { + start = this.length - 1; } - if (typeof chunk === "function") { - cb = chunk; - encoding = void 0; - chunk = void 0; + if (start < 0) { + start = this.length + start; } - if (typeof encoding === "function") { - cb = encoding; - encoding = void 0; + let walker = this.head; + for (let i = 0; !!walker && i < start; i++) { + walker = walker.next; } - if (typeof chunk === "string") { - chunk = Buffer.from(chunk, encoding ?? "utf8"); + const ret = []; + for (let i = 0; !!walker && i < deleteCount; i++) { + ret.push(walker.value); + walker = this.removeNode(walker); } - if (cb) - this.once("finish", cb); - chunk ? super.end(chunk, cb) : super.end(cb); + if (!walker) { + walker = this.tail; + } else if (walker !== this.tail) { + walker = walker.prev; + } + for (const v of nodes) { + walker = insertAfter(this, walker, v); + } + return ret; + } + reverse() { + const head = this.head; + const tail = this.tail; + for (let walker = head; !!walker; walker = walker.prev) { + const p = walker.prev; + walker.prev = walker.next; + walker.next = p; + } + this.head = tail; + this.tail = head; return this; } }; - getType = (stat2) => stat2.isFile() ? "File" : stat2.isDirectory() ? "Directory" : stat2.isSymbolicLink() ? "SymbolicLink" : "Unsupported"; + Node = class { + list; + next; + prev; + value; + constructor(value, prev, next, list2) { + this.list = list2; + this.value = value; + if (prev) { + prev.next = this; + this.prev = prev; + } else { + this.prev = void 0; + } + if (next) { + next.prev = this; + this.next = next; + } else { + this.next = void 0; + } + } + }; } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pack.js -var import_fs15, import_path14, PackJob, EOF2, ONSTAT, ENDED3, QUEUE2, CURRENT, PROCESS2, PROCESSING, PROCESSJOB, JOBS, JOBDONE, ADDFSENTRY, ADDTARENTRY, STAT, READDIR, ONREADDIR, PIPE, ENTRY, ENTRYOPT, WRITEENTRYCLASS, WRITE, ONDRAIN2, Pack, PackSync; +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/pack.js +var import_fs12, import_path10, PackJob, EOF2, ONSTAT, ENDED3, QUEUE2, CURRENT, PROCESS2, PROCESSING, PROCESSJOB, JOBS, JOBDONE, ADDFSENTRY, ADDTARENTRY, STAT, READDIR, ONREADDIR, PIPE, ENTRY, ENTRYOPT, WRITEENTRYCLASS, WRITE, ONDRAIN2, Pack, PackSync; var init_pack = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/pack.js"() { - import_fs15 = __toESM(require("fs"), 1); + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/pack.js"() { + import_fs12 = __toESM(require("fs"), 1); init_write_entry(); init_esm(); init_esm3(); - init_esm4(); + init_esm5(); init_read_entry(); init_warn_method(); - import_path14 = __toESM(require("path"), 1); + import_path10 = __toESM(require("path"), 1); init_normalize_windows_path(); PackJob = class { path; @@ -19579,6 +19558,14 @@ var init_pack = __esm({ jobs; [WRITEENTRYCLASS]; onWriteEntry; + // Note: we actually DO need a linked list here, because we + // shift() to update the head of the list where we start, but still + // while that happens, need to know what the next item in the queue + // will be. Since we do multiple jobs in parallel, it's not as simple + // as just an Array.shift(), since that would lose the information about + // the next job in the list. We could add a .next field on the PackJob + // class, but then we'd have to be tracking the tail of the queue the + // whole time, and Yallist just does that for us anyway. [QUEUE2]; [JOBS] = 0; [PROCESSING] = false; @@ -19602,9 +19589,9 @@ var init_pack = __esm({ this.on("warn", opt.onwarn); } this.portable = !!opt.portable; - if (opt.gzip || opt.brotli) { - if (opt.gzip && opt.brotli) { - throw new TypeError("gzip and brotli are mutually exclusive"); + if (opt.gzip || opt.brotli || opt.zstd) { + if ((opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) > 1) { + throw new TypeError("gzip, brotli, zstd are mutually exclusive"); } if (opt.gzip) { if (typeof opt.gzip !== "object") { @@ -19621,6 +19608,12 @@ var init_pack = __esm({ } this.zip = new BrotliCompress(opt.brotli); } + if (opt.zstd) { + if (typeof opt.zstd !== "object") { + opt.zstd = {}; + } + this.zip = new ZstdCompress(opt.zstd); + } if (!this.zip) throw new Error("impossible"); const zip = this.zip; @@ -19680,7 +19673,7 @@ var init_pack = __esm({ return this.flowing; } [ADDTARENTRY](p) { - const absolute = normalizeWindowsPath(import_path14.default.resolve(this.cwd, p.path)); + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p.path)); if (!this.filter(p.path, p)) { p.resume(); } else { @@ -19693,28 +19686,28 @@ var init_pack = __esm({ this[PROCESS2](); } [ADDFSENTRY](p) { - const absolute = normalizeWindowsPath(import_path14.default.resolve(this.cwd, p)); + const absolute = normalizeWindowsPath(import_path10.default.resolve(this.cwd, p)); this[QUEUE2].push(new PackJob(p, absolute)); this[PROCESS2](); } [STAT](job) { job.pending = true; this[JOBS] += 1; - const stat2 = this.follow ? "stat" : "lstat"; - import_fs15.default[stat2](job.absolute, (er, stat3) => { + const stat = this.follow ? "stat" : "lstat"; + import_fs12.default[stat](job.absolute, (er, stat2) => { job.pending = false; this[JOBS] -= 1; if (er) { this.emit("error", er); } else { - this[ONSTAT](job, stat3); + this[ONSTAT](job, stat2); } }); } - [ONSTAT](job, stat2) { - this.statCache.set(job.absolute, stat2); - job.stat = stat2; - if (!this.filter(job.path, stat2)) { + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + if (!this.filter(job.path, stat)) { job.ignore = true; } this[PROCESS2](); @@ -19722,7 +19715,7 @@ var init_pack = __esm({ [READDIR](job) { job.pending = true; this[JOBS] += 1; - import_fs15.default.readdir(job.absolute, (er, entries) => { + import_fs12.default.readdir(job.absolute, (er, entries) => { job.pending = false; this[JOBS] -= 1; if (er) { @@ -19893,11 +19886,11 @@ var init_pack = __esm({ resume() { } [STAT](job) { - const stat2 = this.follow ? "statSync" : "lstatSync"; - this[ONSTAT](job, import_fs15.default[stat2](job.absolute)); + const stat = this.follow ? "statSync" : "lstatSync"; + this[ONSTAT](job, import_fs12.default[stat](job.absolute)); } [READDIR](job) { - this[ONREADDIR](job, import_fs15.default.readdirSync(job.absolute)); + this[ONREADDIR](job, import_fs12.default.readdirSync(job.absolute)); } // gotta get it all in this tick [PIPE](job) { @@ -19926,14 +19919,14 @@ var init_pack = __esm({ } }); -// .yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/create.js +// .yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/create.js var create_exports = {}; __export(create_exports, { create: () => create }); var import_node_path8, createFileSync, createFile, addFilesSync, addFilesAsync, createSync, createAsync, create; var init_create = __esm({ - ".yarn/cache/tar-npm-7.4.3-1dbbd1ffc3-d4679609bb.zip/node_modules/tar/dist/esm/create.js"() { + ".yarn/cache/tar-npm-7.5.2-6d8cfb7a13-a7d8b80113.zip/node_modules/tar/dist/esm/create.js"() { init_esm2(); import_node_path8 = __toESM(require("node:path"), 1); init_list(); @@ -20011,9 +20004,10 @@ var init_create = __esm({ } }); -// .yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/major.js +// .yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js var require_major = __commonJS({ - ".yarn/cache/semver-npm-7.7.1-4572475307-fd603a6fb9.zip/node_modules/semver/functions/major.js"(exports2, module2) { + ".yarn/cache/semver-npm-7.7.3-9cf7b3b46c-4afe5c9865.zip/node_modules/semver/functions/major.js"(exports2, module2) { + "use strict"; var SemVer3 = require_semver(); var major = (a, loose) => new SemVer3(a, loose).major; module2.exports = major; @@ -21683,11 +21677,11 @@ function String2(descriptor, ...args) { } // package.json -var version = "0.34.0"; +var version = "0.34.2"; // sources/Engine.ts -var import_fs9 = __toESM(require("fs")); -var import_path9 = __toESM(require("path")); +var import_fs6 = __toESM(require("fs")); +var import_path5 = __toESM(require("path")); var import_process3 = __toESM(require("process")); var import_rcompare = __toESM(require_rcompare()); var import_valid3 = __toESM(require_valid()); @@ -21697,7 +21691,7 @@ var import_valid4 = __toESM(require_valid2()); var config_default = { definitions: { npm: { - default: "11.4.2+sha1.6f1519a03f7e04023a957a22b812832d0c4a4b33", + default: "11.6.2+sha1.2af8ff1f23b279df1e5289db7c70cfedd0fe18c5", fetchLatestFrom: { type: "npm", package: "npm" @@ -21734,7 +21728,7 @@ var config_default = { } }, pnpm: { - default: "10.13.1+sha1.aa8c167c4509c97519542ef77a09e4b8ab59fb6a", + default: "10.20.0+sha1.a9bfe8cf88011d4758e1acbeb0da8883ecbd52ce", fetchLatestFrom: { type: "npm", package: "pnpm" @@ -21798,7 +21792,7 @@ var config_default = { package: "yarn" }, transparent: { - default: "4.9.2+sha224.b8e0b161ae590950fbda696e6f3ca071362768e5280c5fbfdadf064b", + default: "4.10.3+sha224.6020b3cdcdfbd7dbc24b7a7b75d58a249ce36068a8bf97d39aa8cc6d", commands: [ [ "yarn", @@ -21881,14 +21875,14 @@ var config_default = { // sources/corepackUtils.ts var import_crypto2 = require("crypto"); var import_events4 = require("events"); -var import_fs7 = __toESM(require("fs")); +var import_fs4 = __toESM(require("fs")); var import_module = __toESM(require("module")); -var import_path7 = __toESM(require("path")); +var import_path3 = __toESM(require("path")); var import_range = __toESM(require_range()); var import_semver = __toESM(require_semver()); var import_lt = __toESM(require_lt()); var import_parse3 = __toESM(require_parse()); -var import_promises = require("timers/promises"); +var import_promises2 = require("timers/promises"); // sources/debugUtils.ts var import_debug = __toESM(require_src()); @@ -21945,7 +21939,7 @@ var DEFAULT_HEADERS = { [`Accept`]: `application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8` }; var DEFAULT_NPM_REGISTRY_URL = `https://registry.npmjs.org`; -async function fetchAsJson2(packageName, version3) { +async function fetchAsJson2(packageName, version2) { const npmRegistryUrl = process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL; if (process.env.COREPACK_ENABLE_NETWORK === `0`) throw new UsageError(`Network access disabled by the environment; can't reach npm repository ${npmRegistryUrl}`); @@ -21956,9 +21950,9 @@ async function fetchAsJson2(packageName, version3) { const encodedCreds = Buffer.from(`${process.env.COREPACK_NPM_USERNAME}:${process.env.COREPACK_NPM_PASSWORD}`, `utf8`).toString(`base64`); headers.authorization = `Basic ${encodedCreds}`; } - return fetchAsJson(`${npmRegistryUrl}/${packageName}${version3 ? `/${version3}` : ``}`, { headers }); + return fetchAsJson(`${npmRegistryUrl}/${packageName}${version2 ? `/${version2}` : ``}`, { headers }); } -function verifySignature({ signatures, integrity, packageName, version: version3 }) { +function verifySignature({ signatures, integrity, packageName, version: version2 }) { if (!Array.isArray(signatures) || !signatures.length) throw new Error(`No compatible signature found in package metadata`); const { npm: trustedKeys } = process.env.COREPACK_INTEGRITY_KEYS ? JSON.parse(process.env.COREPACK_INTEGRITY_KEYS) : config_default.keys; let signature; @@ -21972,7 +21966,7 @@ function verifySignature({ signatures, integrity, packageName, version: version3 } if (signature?.sig == null) throw new UsageError(`The package was not signed by any trusted keys: ${JSON.stringify({ signatures, trustedKeys }, void 0, 2)}`); const verifier = (0, import_crypto.createVerify)(`SHA256`); - verifier.end(`${packageName}@${version3}:${integrity}`); + verifier.end(`${packageName}@${version2}:${integrity}`); const valid = verifier.verify( `-----BEGIN PUBLIC KEY----- ${key} @@ -21986,12 +21980,12 @@ ${key} } async function fetchLatestStableVersion(packageName) { const metadata = await fetchAsJson2(packageName, `latest`); - const { version: version3, dist: { integrity, signatures, shasum } } = metadata; + const { version: version2, dist: { integrity, signatures, shasum } } = metadata; if (!shouldSkipIntegrityCheck()) { try { verifySignature({ packageName, - version: version3, + version: version2, integrity, signatures }); @@ -21999,7 +21993,7 @@ async function fetchLatestStableVersion(packageName) { throw new Error(`Corepack cannot download the latest stable version of ${packageName}; you can disable signature verification by setting COREPACK_INTEGRITY_CHECK to 0 in your env, or instruct Corepack to use the latest stable release known by this version of Corepack by setting COREPACK_USE_LATEST to 0`, { cause }); } } - return `${version3}+${integrity ? `sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}` : `sha1.${shasum}`}`; + return `${version2}+${integrity ? `sha512.${Buffer.from(integrity.slice(7), `base64`).toString(`hex`)}` : `sha1.${shasum}`}`; } async function fetchAvailableTags(packageName) { const metadata = await fetchAsJson2(packageName); @@ -22009,11 +22003,11 @@ async function fetchAvailableVersions(packageName) { const metadata = await fetchAsJson2(packageName); return Object.keys(metadata.versions); } -async function fetchTarballURLAndSignature(packageName, version3) { - const versionMetadata = await fetchAsJson2(packageName, version3); +async function fetchTarballURLAndSignature(packageName, version2) { + const versionMetadata = await fetchAsJson2(packageName, version2); const { tarball, signatures, integrity } = versionMetadata.dist; if (tarball === void 0 || !tarball.startsWith(`http`)) - throw new Error(`${packageName}@${version3} does not have a valid tarball.`); + throw new Error(`${packageName}@${version2} does not have a valid tarball.`); return { tarball, signatures, integrity }; } @@ -22034,7 +22028,8 @@ async function fetch(input, init) { }; input.username = input.password = ``; } - if (input.origin === (process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL) && process.env.COREPACK_NPM_TOKEN) { + const registry = process.env.COREPACK_NPM_TOKEN && new URL(process.env.COREPACK_NPM_REGISTRY || DEFAULT_NPM_REGISTRY_URL); + if (registry && input.origin === registry.origin) { headers = { ...headers, authorization: `Bearer ${process.env.COREPACK_NPM_TOKEN}` @@ -22156,10 +22151,10 @@ async function fetchAvailableVersions2(spec) { } } async function findInstalledVersion(installTarget, descriptor) { - const installFolder = import_path7.default.join(installTarget, descriptor.name); + const installFolder = import_path3.default.join(installTarget, descriptor.name); let cacheDirectory; try { - cacheDirectory = await import_fs7.default.promises.opendir(installFolder); + cacheDirectory = await import_fs4.default.promises.opendir(installFolder); } catch (error) { if (error.code === `ENOENT`) { return null; @@ -22207,7 +22202,7 @@ async function download(installTarget, url, algo, binPath = null) { log(`Downloading to ${tmpFolder}`); const stream = await fetchUrlStream(url); const parsedUrl = new URL(url); - const ext = import_path7.default.posix.extname(parsedUrl.pathname); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); let outputFile = null; let sendTo; if (ext === `.tgz`) { @@ -22221,15 +22216,15 @@ async function download(installTarget, url, algo, binPath = null) { } : void 0 }); } else if (ext === `.js`) { - outputFile = import_path7.default.join(tmpFolder, import_path7.default.posix.basename(parsedUrl.pathname)); - sendTo = import_fs7.default.createWriteStream(outputFile); + outputFile = import_path3.default.join(tmpFolder, import_path3.default.posix.basename(parsedUrl.pathname)); + sendTo = import_fs4.default.createWriteStream(outputFile); } stream.pipe(sendTo); let hash = !binPath ? stream.pipe((0, import_crypto2.createHash)(algo)) : null; await (0, import_events4.once)(sendTo, `finish`); if (binPath) { - const downloadedBin = import_path7.default.join(tmpFolder, binPath); - outputFile = import_path7.default.join(tmpFolder, import_path7.default.basename(downloadedBin)); + const downloadedBin = import_path3.default.join(tmpFolder, binPath); + outputFile = import_path3.default.join(tmpFolder, import_path3.default.basename(downloadedBin)); try { await renameSafe(downloadedBin, outputFile); } catch (err) { @@ -22237,7 +22232,7 @@ async function download(installTarget, url, algo, binPath = null) { throw new Error(`Cannot locate '${binPath}' in downloaded tarball`, { cause: err }); throw err; } - const fileStream = import_fs7.default.createReadStream(outputFile); + const fileStream = import_fs4.default.createReadStream(outputFile); hash = fileStream.pipe((0, import_crypto2.createHash)(algo)); await (0, import_events4.once)(fileStream, `close`); } @@ -22250,11 +22245,11 @@ async function download(installTarget, url, algo, binPath = null) { async function installVersion(installTarget, locator, { spec }) { const locatorIsASupportedPackageManager = isSupportedPackageManagerLocator(locator); const locatorReference = locatorIsASupportedPackageManager ? (0, import_parse3.default)(locator.reference) : parseURLReference(locator); - const { version: version3, build } = locatorReference; - const installFolder = import_path7.default.join(installTarget, locator.name, version3); + const { version: version2, build } = locatorReference; + const installFolder = import_path3.default.join(installTarget, locator.name, version2); try { - const corepackFile = import_path7.default.join(installFolder, `.corepack`); - const corepackContent = await import_fs7.default.promises.readFile(corepackFile, `utf8`); + const corepackFile = import_path3.default.join(installFolder, `.corepack`); + const corepackContent = await import_fs4.default.promises.readFile(corepackFile, `utf8`); const corepackData = JSON.parse(corepackContent); log(`Reusing ${locator.name}@${locator.reference} found in ${installFolder}`); return { @@ -22272,11 +22267,11 @@ async function installVersion(installTarget, locator, { spec }) { let integrity; let binPath = null; if (locatorIsASupportedPackageManager) { - url = spec.url.replace(`{}`, version3); + url = spec.url.replace(`{}`, version2); if (process.env.COREPACK_NPM_REGISTRY) { const registry = getRegistryFromPackageManagerSpec(spec); if (registry.type === `npm`) { - ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version3)); + ({ tarball: url, signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); if (registry.bin) { binPath = registry.bin; } @@ -22287,7 +22282,7 @@ async function installVersion(installTarget, locator, { spec }) { ); } } else { - url = decodeURIComponent(version3); + url = decodeURIComponent(version2); if (process.env.COREPACK_NPM_REGISTRY && url.startsWith(DEFAULT_NPM_REGISTRY_URL)) { url = url.replace( DEFAULT_NPM_REGISTRY_URL, @@ -22295,7 +22290,7 @@ async function installVersion(installTarget, locator, { spec }) { ); } } - log(`Installing ${locator.name}@${version3} from ${url}`); + log(`Installing ${locator.name}@${version2} from ${url}`); const algo = build[0] ?? `sha512`; const { tmpFolder, outputFile, hash: actualHash } = await download(installTarget, url, algo, binPath); let bin; @@ -22310,7 +22305,7 @@ async function installVersion(installTarget, locator, { spec }) { if (locatorIsASupportedPackageManager && isValidBinSpec(spec.bin)) { bin = spec.bin; } else { - const { name: packageName, bin: packageBin } = require(import_path7.default.join(tmpFolder, `package.json`)); + const { name: packageName, bin: packageBin } = require(import_path3.default.join(tmpFolder, `package.json`)); if (typeof packageBin === `string`) { bin = { [packageName]: packageBin }; } else if (isValidBinSpec(packageBin)) { @@ -22324,27 +22319,27 @@ async function installVersion(installTarget, locator, { spec }) { const registry = getRegistryFromPackageManagerSpec(spec); if (registry.type === `npm` && !registry.bin && !shouldSkipIntegrityCheck()) { if (signatures == null || integrity == null) - ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version3)); - verifySignature({ signatures, integrity, packageName: registry.package, version: version3 }); + ({ signatures, integrity } = await fetchTarballURLAndSignature(registry.package, version2)); + verifySignature({ signatures, integrity, packageName: registry.package, version: version2 }); build[1] = Buffer.from(integrity.slice(`sha512-`.length), `base64`).toString(`hex`); } } if (build[1] && actualHash !== build[1]) throw new Error(`Mismatch hashes. Expected ${build[1]}, got ${actualHash}`); const serializedHash = `${algo}.${actualHash}`; - await import_fs7.default.promises.writeFile(import_path7.default.join(tmpFolder, `.corepack`), JSON.stringify({ + await import_fs4.default.promises.writeFile(import_path3.default.join(tmpFolder, `.corepack`), JSON.stringify({ locator, bin, hash: serializedHash })); - await import_fs7.default.promises.mkdir(import_path7.default.dirname(installFolder), { recursive: true }); + await import_fs4.default.promises.mkdir(import_path3.default.dirname(installFolder), { recursive: true }); try { await renameSafe(tmpFolder, installFolder); } catch (err) { if (err.code === `ENOTEMPTY` || // On Windows the error code is EPERM so we check if it is a directory - err.code === `EPERM` && (await import_fs7.default.promises.stat(installFolder)).isDirectory()) { + err.code === `EPERM` && (await import_fs4.default.promises.stat(installFolder)).isDirectory()) { log(`Another instance of corepack installed ${locator.name}@${locator.reference}`); - await import_fs7.default.promises.rm(tmpFolder, { recursive: true, force: true }); + await import_fs4.default.promises.rm(tmpFolder, { recursive: true, force: true }); } else { throw err; } @@ -22371,18 +22366,18 @@ async function renameSafe(oldPath, newPath) { if (process.platform === `win32`) { await renameUnderWindows(oldPath, newPath); } else { - await import_fs7.default.promises.rename(oldPath, newPath); + await import_fs4.default.promises.rename(oldPath, newPath); } } async function renameUnderWindows(oldPath, newPath) { const retries = 5; for (let i = 0; i < retries; i++) { try { - await import_fs7.default.promises.rename(oldPath, newPath); + await import_fs4.default.promises.rename(oldPath, newPath); break; } catch (err) { if ((err.code === `ENOENT` || err.code === `EPERM`) && i < retries - 1) { - await (0, import_promises.setTimeout)(100 * 2 ** i); + await (0, import_promises2.setTimeout)(100 * 2 ** i); continue; } else { throw err; @@ -22396,15 +22391,15 @@ async function runVersion(locator, installSpec, binName, args) { if (Array.isArray(bin)) { if (bin.some((name2) => name2 === binName)) { const parsedUrl = new URL(installSpec.spec.url); - const ext = import_path7.default.posix.extname(parsedUrl.pathname); + const ext = import_path3.default.posix.extname(parsedUrl.pathname); if (ext === `.js`) { - binPath = import_path7.default.join(installSpec.location, import_path7.default.posix.basename(parsedUrl.pathname)); + binPath = import_path3.default.join(installSpec.location, import_path3.default.posix.basename(parsedUrl.pathname)); } } } else { for (const [name2, dest] of Object.entries(bin)) { if (name2 === binName) { - binPath = import_path7.default.join(installSpec.location, dest); + binPath = import_path3.default.join(installSpec.location, dest); break; } } @@ -22416,7 +22411,7 @@ async function runVersion(locator, installSpec, binName, args) { await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); } } - process.env.COREPACK_ROOT = import_path7.default.dirname(require.resolve("corepack/package.json")); + process.env.COREPACK_ROOT = import_path3.default.dirname(require.resolve("corepack/package.json")); process.argv = [ process.execPath, binPath, @@ -22436,18 +22431,18 @@ function shouldSkipIntegrityCheck() { // sources/semverUtils.ts var import_range2 = __toESM(require_range()); var import_semver2 = __toESM(require_semver()); -function satisfiesWithPrereleases(version3, range, loose = false) { +function satisfiesWithPrereleases(version2, range, loose = false) { let semverRange; try { semverRange = new import_range2.default(range, loose); } catch (err) { return false; } - if (!version3) + if (!version2) return false; let semverVersion; try { - semverVersion = new import_semver2.default(version3, semverRange.loose); + semverVersion = new import_semver2.default(version2, semverRange.loose); if (semverVersion.prerelease) { semverVersion.prerelease = []; } @@ -22465,8 +22460,8 @@ function satisfiesWithPrereleases(version3, range, loose = false) { } // sources/specUtils.ts -var import_fs8 = __toESM(require("fs")); -var import_path8 = __toESM(require("path")); +var import_fs5 = __toESM(require("fs")); +var import_path4 = __toESM(require("path")); var import_satisfies = __toESM(require_satisfies()); var import_valid = __toESM(require_valid()); var import_valid2 = __toESM(require_valid2()); @@ -22585,24 +22580,24 @@ function parsePackageJSON(packageJSONContent) { console.warn(`! Corepack does not currently support array values for devEngines.packageManager`); return pm; } - const { name: name2, version: version3, onFail } = packageManager; + const { name: name2, version: version2, onFail } = packageManager; if (typeof name2 !== `string` || name2.includes(`@`)) { warnOrThrow(`The value of devEngines.packageManager.name ${JSON.stringify(name2)} is not a supported string value`, onFail); return pm; } - if (version3 != null && (typeof version3 !== `string` || !(0, import_valid2.default)(version3))) { - warnOrThrow(`The value of devEngines.packageManager.version ${JSON.stringify(version3)} is not a valid semver range`, onFail); + if (version2 != null && (typeof version2 !== `string` || !(0, import_valid2.default)(version2))) { + warnOrThrow(`The value of devEngines.packageManager.version ${JSON.stringify(version2)} is not a valid semver range`, onFail); return pm; } - log(`devEngines.packageManager defines that ${name2}@${version3} is the local package manager`); + log(`devEngines.packageManager defines that ${name2}@${version2} is the local package manager`); if (pm) { if (!pm.startsWith?.(`${name2}@`)) warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the "devEngines.packageManager" field set to ${JSON.stringify(name2)}`, onFail); - else if (version3 != null && !(0, import_satisfies.default)(pm.slice(packageManager.name.length + 1), version3)) - warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the value defined in "devEngines.packageManager" for ${JSON.stringify(name2)} of ${JSON.stringify(version3)}`, onFail); + else if (version2 != null && !(0, import_satisfies.default)(pm.slice(packageManager.name.length + 1), version2)) + warnOrThrow(`"packageManager" field is set to ${JSON.stringify(pm)} which does not match the value defined in "devEngines.packageManager" for ${JSON.stringify(name2)} of ${JSON.stringify(version2)}`, onFail); return pm; } - return `${name2}@${version3 ?? `*`}`; + return `${name2}@${version2 ?? `*`}`; } return pm; } @@ -22614,13 +22609,13 @@ async function setLocalPackageManager(cwd, info) { warnOrThrow(`The requested version of ${info.locator.name}@${info.locator.reference} does not match the devEngines specification (${range.name}@${range.range})`, range.onFail); } } - const content = lookup.type !== `NoProject` ? await import_fs8.default.promises.readFile(lookup.target, `utf8`) : ``; + const content = lookup.type !== `NoProject` ? await import_fs5.default.promises.readFile(lookup.target, `utf8`) : ``; const { data, indent } = readPackageJson(content); const previousPackageManager = data.packageManager ?? (range ? `${range.name}@${range.range}` : `unknown`); data.packageManager = `${info.locator.name}@${info.locator.reference}`; const newContent = normalizeLineEndings(content, `${JSON.stringify(data, null, indent)} `); - await import_fs8.default.promises.writeFile(lookup.target, newContent, `utf8`); + await import_fs5.default.promises.writeFile(lookup.target, newContent, `utf8`); return { previousPackageManager }; @@ -22631,14 +22626,14 @@ async function loadSpec(initialCwd) { let selection = null; while (nextCwd !== currCwd && (!selection || !selection.data.packageManager)) { currCwd = nextCwd; - nextCwd = import_path8.default.dirname(currCwd); + nextCwd = import_path4.default.dirname(currCwd); if (nodeModulesRegExp.test(currCwd)) continue; - const manifestPath = import_path8.default.join(currCwd, `package.json`); + const manifestPath = import_path4.default.join(currCwd, `package.json`); log(`Checking ${manifestPath}`); let content; try { - content = await import_fs8.default.promises.readFile(manifestPath, `utf8`); + content = await import_fs5.default.promises.readFile(manifestPath, `utf8`); } catch (err) { if (err?.code === `ENOENT`) continue; throw err; @@ -22649,9 +22644,9 @@ async function loadSpec(initialCwd) { } catch { } if (typeof data !== `object` || data === null) - throw new UsageError(`Invalid package.json in ${import_path8.default.relative(initialCwd, manifestPath)}`); + throw new UsageError(`Invalid package.json in ${import_path4.default.relative(initialCwd, manifestPath)}`); let localEnv; - const envFilePath2 = import_path8.default.resolve(currCwd, process.env.COREPACK_ENV_FILE ?? `.corepack.env`); + const envFilePath2 = import_path4.default.resolve(currCwd, process.env.COREPACK_ENV_FILE ?? `.corepack.env`); if (process.env.COREPACK_ENV_FILE == `0`) { log(`Skipping env file as configured with COREPACK_ENV_FILE`); localEnv = process.env; @@ -22662,7 +22657,7 @@ async function loadSpec(initialCwd) { log(`Checking ${envFilePath2}`); try { localEnv = { - ...Object.fromEntries(Object.entries((0, import_util.parseEnv)(await import_fs8.default.promises.readFile(envFilePath2, `utf8`))).filter((e) => e[0].startsWith(`COREPACK_`))), + ...Object.fromEntries(Object.entries((0, import_util.parseEnv)(await import_fs5.default.promises.readFile(envFilePath2, `utf8`))).filter((e) => e[0].startsWith(`COREPACK_`))), ...process.env }; log(`Successfully loaded env file found at ${envFilePath2}`); @@ -22676,7 +22671,7 @@ async function loadSpec(initialCwd) { selection = { data, manifestPath, localEnv, envFilePath: envFilePath2 }; } if (selection === null) - return { type: `NoProject`, target: import_path8.default.join(initialCwd, `package.json`) }; + return { type: `NoProject`, target: import_path4.default.join(initialCwd, `package.json`) }; let envFilePath; if (selection.localEnv !== process.env) { envFilePath = selection.envFilePath; @@ -22696,20 +22691,20 @@ async function loadSpec(initialCwd) { onFail: selection.data.devEngines.packageManager.onFail }, // Lazy-loading it so we do not throw errors on commands that do not need valid spec. - getSpec: () => parseSpec(rawPmSpec, import_path8.default.relative(initialCwd, selection.manifestPath)) + getSpec: () => parseSpec(rawPmSpec, import_path4.default.relative(initialCwd, selection.manifestPath)) }; } // sources/Engine.ts function getLastKnownGoodFilePath() { - const lkg = import_path9.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); + const lkg = import_path5.default.join(getCorepackHomeFolder(), `lastKnownGood.json`); log(`LastKnownGood file would be located at ${lkg}`); return lkg; } async function getLastKnownGood() { let raw2; try { - raw2 = await import_fs9.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); + raw2 = await import_fs6.default.promises.readFile(getLastKnownGoodFilePath(), `utf8`); } catch (err) { if (err?.code === `ENOENT`) { log(`No LastKnownGood version found in Corepack home.`); @@ -22742,8 +22737,8 @@ async function getLastKnownGood() { async function createLastKnownGoodFile(lastKnownGood) { const content = `${JSON.stringify(lastKnownGood, null, 2)} `; - await import_fs9.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); - await import_fs9.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); + await import_fs6.default.promises.mkdir(getCorepackHomeFolder(), { recursive: true }); + await import_fs6.default.promises.writeFile(getLastKnownGoodFilePath(), content, `utf8`); } function getLastKnownGoodFromFileContent(lastKnownGood, packageManager) { if (Object.hasOwn(lastKnownGood, packageManager)) @@ -22908,7 +22903,7 @@ var Engine = class { console.error(`! The local project doesn't define a 'packageManager' field. Corepack will now add one referencing ${installSpec.locator.name}@${installSpec.locator.reference}.`); console.error(`! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager`); console.error(); - await setLocalPackageManager(import_path9.default.dirname(result.target), installSpec); + await setLocalPackageManager(import_path5.default.dirname(result.target), installSpec); } log(`Falling back to ${fallbackDescriptor.name}@${fallbackDescriptor.range} in the absence of "packageManager" field in ${result.target}`); return fallbackDescriptor; @@ -22999,7 +22994,7 @@ var Engine = class { const packageManagerSpec = definition.ranges[range]; const registry = getRegistryFromPackageManagerSpec(packageManagerSpec); const versions2 = await fetchAvailableVersions2(registry); - return versions2.filter((version3) => satisfiesWithPrereleases(version3, finalDescriptor.range)); + return versions2.filter((version2) => satisfiesWithPrereleases(version2, finalDescriptor.range)); })); const highestVersion = [...new Set(versions.flat())].sort(import_rcompare.default); if (highestVersion.length === 0) @@ -23009,7 +23004,7 @@ var Engine = class { }; // sources/commands/Cache.ts -var import_fs10 = __toESM(require("fs")); +var import_fs7 = __toESM(require("fs")); var CacheCommand = class extends Command { static paths = [ [`cache`, `clean`], @@ -23022,13 +23017,13 @@ var CacheCommand = class extends Command { ` }); async execute() { - await import_fs10.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); + await import_fs7.default.promises.rm(getInstallFolder(), { recursive: true, force: true }); } }; // sources/commands/Disable.ts -var import_fs11 = __toESM(require("fs")); -var import_path10 = __toESM(require("path")); +var import_fs8 = __toESM(require("fs")); +var import_path6 = __toESM(require("path")); var import_which = __toESM(require_lib()); var DisableCommand = class extends Command { static paths = [ @@ -23059,7 +23054,7 @@ var DisableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path10.default.dirname(await (0, import_which.default)(`corepack`)); + installDirectory = import_path6.default.dirname(await (0, import_which.default)(`corepack`)); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; const allBinNames = []; for (const name2 of new Set(names)) { @@ -23072,13 +23067,13 @@ var DisableCommand = class extends Command { await Promise.all(allBinNames.map(removeLink)); } async removePosixLink(installDirectory, binName) { - const file = import_path10.default.join(installDirectory, binName); + const file = import_path6.default.join(installDirectory, binName); try { - if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs11.default.promises.realpath(file))) { + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs8.default.promises.realpath(file))) { console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); return; } - await import_fs11.default.promises.unlink(file); + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23087,9 +23082,9 @@ var DisableCommand = class extends Command { } async removeWin32Link(installDirectory, binName) { for (const ext of [``, `.ps1`, `.cmd`]) { - const file = import_path10.default.join(installDirectory, `${binName}${ext}`); + const file = import_path6.default.join(installDirectory, `${binName}${ext}`); try { - await import_fs11.default.promises.unlink(file); + await import_fs8.default.promises.unlink(file); } catch (err) { if (err.code !== `ENOENT`) { throw err; @@ -23101,8 +23096,8 @@ var DisableCommand = class extends Command { // sources/commands/Enable.ts var import_cmd_shim = __toESM(require_cmd_shim()); -var import_fs12 = __toESM(require("fs")); -var import_path11 = __toESM(require("path")); +var import_fs9 = __toESM(require("fs")); +var import_path7 = __toESM(require("path")); var import_which2 = __toESM(require_lib()); var EnableCommand = class extends Command { static paths = [ @@ -23133,11 +23128,11 @@ var EnableCommand = class extends Command { async execute() { let installDirectory = this.installDirectory; if (typeof installDirectory === `undefined`) - installDirectory = import_path11.default.dirname(await (0, import_which2.default)(`corepack`)); - installDirectory = import_fs12.default.realpathSync(installDirectory); + installDirectory = import_path7.default.dirname(await (0, import_which2.default)(`corepack`)); + installDirectory = import_fs9.default.realpathSync(installDirectory); const manifestPath = require.resolve("corepack/package.json"); - const distFolder = import_path11.default.join(import_path11.default.dirname(manifestPath), `dist`); - if (!import_fs12.default.existsSync(distFolder)) + const distFolder = import_path7.default.join(import_path7.default.dirname(manifestPath), `dist`); + if (!import_fs9.default.existsSync(distFolder)) throw new Error(`Assertion failed: The stub folder doesn't exist`); const names = this.names.length === 0 ? SupportedPackageManagerSetWithoutNpm : this.names; const allBinNames = []; @@ -23151,33 +23146,33 @@ var EnableCommand = class extends Command { await Promise.all(allBinNames.map(generateLink)); } async generatePosixLink(installDirectory, distFolder, binName) { - const file = import_path11.default.join(installDirectory, binName); - const symlink = import_path11.default.relative(installDirectory, import_path11.default.join(distFolder, `${binName}.js`)); - if (import_fs12.default.existsSync(file)) { - const currentSymlink = await import_fs12.default.promises.readlink(file); - if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs12.default.promises.realpath(file))) { + const file = import_path7.default.join(installDirectory, binName); + const symlink = import_path7.default.relative(installDirectory, import_path7.default.join(distFolder, `${binName}.js`)); + if (import_fs9.default.existsSync(file)) { + const currentSymlink = await import_fs9.default.promises.readlink(file); + if (binName.includes(`yarn`) && isYarnSwitchPath(await import_fs9.default.promises.realpath(file))) { console.warn(`${binName} is already installed in ${file} and points to a Yarn Switch install - skipping`); return; } if (currentSymlink !== symlink) { - await import_fs12.default.promises.unlink(file); + await import_fs9.default.promises.unlink(file); } else { return; } } - await import_fs12.default.promises.symlink(symlink, file); + await import_fs9.default.promises.symlink(symlink, file); } async generateWin32Link(installDirectory, distFolder, binName) { - const file = import_path11.default.join(installDirectory, binName); - await (0, import_cmd_shim.default)(import_path11.default.join(distFolder, `${binName}.js`), file, { + const file = import_path7.default.join(installDirectory, binName); + await (0, import_cmd_shim.default)(import_path7.default.join(distFolder, `${binName}.js`), file, { createCmdFile: true }); } }; // sources/commands/InstallGlobal.ts -var import_fs13 = __toESM(require("fs")); -var import_path12 = __toESM(require("path")); +var import_fs10 = __toESM(require("fs")); +var import_path8 = __toESM(require("path")); // sources/commands/Base.ts var BaseCommand = class extends Command { @@ -23244,7 +23239,7 @@ var InstallGlobalCommand = class extends BaseCommand { throw new UsageError(`No package managers specified`); await Promise.all(this.args.map((arg) => { if (arg.endsWith(`.tgz`)) { - return this.installFromTarball(import_path12.default.resolve(this.context.cwd, arg)); + return this.installFromTarball(import_path8.default.resolve(this.context.cwd, arg)); } else { return this.installFromDescriptor(parseSpec(arg, `CLI arguments`, { enforceExactVersion: false })); } @@ -23295,7 +23290,7 @@ var InstallGlobalCommand = class extends BaseCommand { if (!isSupportedPackageManager(name2)) throw new UsageError(`Unsupported package manager '${name2}'`); this.log({ name: name2, reference }); - await import_fs13.default.promises.mkdir(installFolder, { recursive: true }); + await import_fs10.default.promises.mkdir(installFolder, { recursive: true }); await tarX({ file: p, cwd: installFolder }, [`${name2}/${reference}`]); if (!this.cacheOnly) { await this.context.engine.activatePackageManager({ name: name2, reference }); @@ -23334,8 +23329,8 @@ var InstallLocalCommand = class extends BaseCommand { }; // sources/commands/Pack.ts -var import_promises2 = require("fs/promises"); -var import_path15 = __toESM(require("path")); +var import_promises3 = require("fs/promises"); +var import_path11 = __toESM(require("path")); var PackCommand = class extends BaseCommand { static paths = [ [`pack`] @@ -23376,17 +23371,17 @@ var PackCommand = class extends BaseCommand { installLocations.push(packageManagerInfo.location); } const baseInstallFolder = getInstallFolder(); - const outputPath = import_path15.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); + const outputPath = import_path11.default.resolve(this.context.cwd, this.output ?? `corepack.tgz`); if (!this.json) { this.context.stdout.write(` `); - this.context.stdout.write(`Packing the selected tools in ${import_path15.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path11.default.basename(outputPath)}... `); } const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); - await (0, import_promises2.mkdir)(baseInstallFolder, { recursive: true }); - await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path15.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path15.default.relative(baseInstallFolder, location); + await (0, import_promises3.mkdir)(baseInstallFolder, { recursive: true }); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path11.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path11.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} @@ -23477,8 +23472,8 @@ var UseCommand = class extends BaseCommand { }; // sources/commands/deprecated/Hydrate.ts -var import_promises3 = require("fs/promises"); -var import_path16 = __toESM(require("path")); +var import_promises4 = require("fs/promises"); +var import_path12 = __toESM(require("path")); var HydrateCommand = class extends Command { static paths = [ [`hydrate`] @@ -23489,7 +23484,7 @@ var HydrateCommand = class extends Command { fileName = options_exports.String(); async execute() { const installFolder = getInstallFolder(); - const fileName = import_path16.default.resolve(this.context.cwd, this.fileName); + const fileName = import_path12.default.resolve(this.context.cwd, this.fileName); const archiveEntries = /* @__PURE__ */ new Map(); let hasShortEntries = false; const { list: tarT } = await Promise.resolve().then(() => (init_list(), list_exports)); @@ -23517,7 +23512,7 @@ var HydrateCommand = class extends Command { else this.context.stdout.write(`Hydrating ${name2}@${reference}... `); - await (0, import_promises3.mkdir)(installFolder, { recursive: true }); + await (0, import_promises4.mkdir)(installFolder, { recursive: true }); await tarX({ file: fileName, cwd: installFolder }, [`${name2}/${reference}`]); if (this.activate) { await this.context.engine.activatePackageManager({ name: name2, reference }); @@ -23530,8 +23525,8 @@ var HydrateCommand = class extends Command { }; // sources/commands/deprecated/Prepare.ts -var import_promises4 = require("fs/promises"); -var import_path17 = __toESM(require("path")); +var import_promises5 = require("fs/promises"); +var import_path13 = __toESM(require("path")); var PrepareCommand = class extends Command { static paths = [ [`prepare`] @@ -23585,14 +23580,14 @@ var PrepareCommand = class extends Command { if (this.output) { const outputName = typeof this.output === `string` ? this.output : `corepack.tgz`; const baseInstallFolder = getInstallFolder(); - const outputPath = import_path17.default.resolve(this.context.cwd, outputName); + const outputPath = import_path13.default.resolve(this.context.cwd, outputName); if (!this.json) - this.context.stdout.write(`Packing the selected tools in ${import_path17.default.basename(outputPath)}... + this.context.stdout.write(`Packing the selected tools in ${import_path13.default.basename(outputPath)}... `); const { create: tarC } = await Promise.resolve().then(() => (init_create(), create_exports)); - await (0, import_promises4.mkdir)(baseInstallFolder, { recursive: true }); - await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path17.default.resolve(outputPath) }, installLocations.map((location) => { - return import_path17.default.relative(baseInstallFolder, location); + await (0, import_promises5.mkdir)(baseInstallFolder, { recursive: true }); + await tarC({ gzip: true, cwd: baseInstallFolder, file: import_path13.default.resolve(outputPath) }, installLocations.map((location) => { + return import_path13.default.relative(baseInstallFolder, location); })); if (this.json) { this.context.stdout.write(`${JSON.stringify(outputPath)} diff --git a/deps/corepack/package.json b/deps/corepack/package.json index baa2a678c8b092..647dd5659ce8f5 100644 --- a/deps/corepack/package.json +++ b/deps/corepack/package.json @@ -1,6 +1,6 @@ { "name": "corepack", - "version": "0.34.0", + "version": "0.34.2", "homepage": "https://github.com/nodejs/corepack#readme", "bugs": { "url": "https://github.com/nodejs/corepack/issues" @@ -16,7 +16,7 @@ "./package.json": "./package.json" }, "license": "MIT", - "packageManager": "yarn@4.9.0+sha224.dce6c5df199861784bd9b0eecb2a228df97e3f18a02b1bb75ff98383", + "packageManager": "yarn@4.10.3+sha224.6020b3cdcdfbd7dbc24b7a7b75d58a249ce36068a8bf97d39aa8cc6d", "devDependencies": { "@types/debug": "^4.1.5", "@types/node": "^20.4.6", @@ -37,7 +37,7 @@ "tar": "^7.4.0", "tsx": "^4.16.2", "typescript": "^5.7.3", - "undici": "^6.19.2", + "undici": "^6.21.2", "v8-compile-cache": "^2.3.0", "vitest": "^3.0.5", "which": "^5.0.0" diff --git a/deps/googletest/include/gtest/gtest-matchers.h b/deps/googletest/include/gtest/gtest-matchers.h index 93643dba1d3a07..bd8dfe999d3681 100644 --- a/deps/googletest/include/gtest/gtest-matchers.h +++ b/deps/googletest/include/gtest/gtest-matchers.h @@ -296,12 +296,12 @@ class MatcherBase : private MatcherDescriberInterface { return *this; } - MatcherBase(MatcherBase&& other) + MatcherBase(MatcherBase&& other) noexcept : vtable_(other.vtable_), buffer_(other.buffer_) { other.vtable_ = nullptr; } - MatcherBase& operator=(MatcherBase&& other) { + MatcherBase& operator=(MatcherBase&& other) noexcept { if (this == &other) return *this; Destroy(); vtable_ = other.vtable_; diff --git a/deps/inspector_protocol/README.node b/deps/inspector_protocol/README.node index af4618cd6160e5..f37ddb9e9280b6 100644 --- a/deps/inspector_protocol/README.node +++ b/deps/inspector_protocol/README.node @@ -2,7 +2,7 @@ Name: inspector protocol Short Name: inspector_protocol URL: https://chromium.googlesource.com/deps/inspector_protocol/ Version: 0 -Revision: 69d69ddf3aa698b171886551a4a672c5af1ad902 +Revision: af7f5a8173fdbc29f0835ec94395932e328b2ea2 License: BSD License File: LICENSE Security Critical: no diff --git a/deps/inspector_protocol/crdtp/cbor.cc b/deps/inspector_protocol/crdtp/cbor.cc index 801c1708022763..dc52549c55a6fe 100644 --- a/deps/inspector_protocol/crdtp/cbor.cc +++ b/deps/inspector_protocol/crdtp/cbor.cc @@ -833,7 +833,7 @@ void ParseUTF16String(CBORTokenizer* tokenizer, ParserHandler* out) { span rep = tokenizer->GetString16WireRep(); for (size_t ii = 0; ii < rep.size(); ii += 2) value.push_back((rep[ii + 1] << 8) | rep[ii]); - out->HandleString16(span(value.data(), value.size())); + out->HandleString16(value); tokenizer->Next(); } @@ -1037,7 +1037,7 @@ void ParseCBOR(span bytes, ParserHandler* out) { Status AppendString8EntryToCBORMap(span string8_key, span string8_value, std::vector* cbor) { - span bytes(cbor->data(), cbor->size()); + span bytes(*cbor); CBORTokenizer tokenizer(bytes); if (tokenizer.TokenTag() == CBORTokenTag::ERROR_VALUE) return tokenizer.Status(); diff --git a/deps/inspector_protocol/crdtp/cbor_test.cc b/deps/inspector_protocol/crdtp/cbor_test.cc index 058cd787d6416b..2d3689e730047c 100644 --- a/deps/inspector_protocol/crdtp/cbor_test.cc +++ b/deps/inspector_protocol/crdtp/cbor_test.cc @@ -349,7 +349,7 @@ TEST(EncodeDecodeString16Test, RoundtripsHelloWorld) { std::array msg{ {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}}; std::vector encoded; - EncodeString16(span(msg.data(), msg.size()), &encoded); + EncodeString16(msg, &encoded); // This will be encoded as BYTE_STRING of length 20, so the 20 is encoded in // the additional info part of the initial byte. Payload is two bytes for each // UTF16 character. @@ -384,7 +384,7 @@ TEST(EncodeDecodeString16Test, Roundtrips500) { for (uint16_t ii = 0; ii < 250; ++ii) two_fifty.push_back(ii); std::vector encoded; - EncodeString16(span(two_fifty.data(), two_fifty.size()), &encoded); + EncodeString16(two_fifty, &encoded); EXPECT_EQ(3u + 250u * 2, encoded.size()); // Now check the first three bytes: // Major type: 2 (BYTE_STRING) @@ -501,7 +501,7 @@ TEST(EncodeFromLatin1Test, ConvertsToUTF8IfNeeded) { TEST(EncodeFromUTF16Test, ConvertsToUTF8IfEasy) { std::vector ascii = {'e', 'a', 's', 'y'}; std::vector encoded; - EncodeFromUTF16(span(ascii.data(), ascii.size()), &encoded); + EncodeFromUTF16(ascii, &encoded); CBORTokenizer tokenizer(SpanFrom(encoded)); EXPECT_EQ(CBORTokenTag::STRING8, tokenizer.TokenTag()); @@ -518,7 +518,7 @@ TEST(EncodeFromUTF16Test, EncodesAsString16IfNeeded) { std::vector msg = {'H', 'e', 'l', 'l', 'o', ',', ' ', 0xd83c, 0xdf0e, '.'}; std::vector encoded; - EncodeFromUTF16(span(msg.data(), msg.size()), &encoded); + EncodeFromUTF16(msg, &encoded); CBORTokenizer tokenizer(SpanFrom(encoded)); EXPECT_EQ(CBORTokenTag::STRING16, tokenizer.TokenTag()); @@ -535,7 +535,7 @@ TEST(EncodeDecodeBinaryTest, RoundtripsHelloWorld) { std::vector binary = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '.'}; std::vector encoded; - EncodeBinary(span(binary.data(), binary.size()), &encoded); + EncodeBinary(binary, &encoded); // So, on the wire we see that the binary blob travels unmodified. EXPECT_THAT( encoded, @@ -699,7 +699,7 @@ TEST(JSONToCBOREncoderTest, SevenBitStrings) { Status status; std::unique_ptr encoder = NewCBOREncoder(&encoded, &status); std::vector utf16 = {'f', 'o', 'o'}; - encoder->HandleString16(span(utf16.data(), utf16.size())); + encoder->HandleString16(utf16); EXPECT_THAT(status, StatusIsOk()); // Here we assert that indeed, seven bit strings are represented as // bytes on the wire, "foo" is just "foo". @@ -771,7 +771,7 @@ TEST(JsonCborRoundtrip, EncodingDecoding) { std::string decoded; std::unique_ptr json_encoder = json::NewJSONEncoder(&decoded, &status); - ParseCBOR(span(encoded.data(), encoded.size()), json_encoder.get()); + ParseCBOR(encoded, json_encoder.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(json, decoded); } @@ -791,7 +791,7 @@ TEST(JsonCborRoundtrip, MoreRoundtripExamples) { std::string decoded; std::unique_ptr json_writer = json::NewJSONEncoder(&decoded, &status); - ParseCBOR(span(encoded.data(), encoded.size()), json_writer.get()); + ParseCBOR(encoded, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(json, decoded); } @@ -842,7 +842,7 @@ TEST(ParseCBORTest, ParseEmptyCBORMessage) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(in.data(), in.size()), json_writer.get()); + ParseCBOR(in, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{}", out); } @@ -866,7 +866,7 @@ TEST(ParseCBORTest, ParseCBORHelloWorld) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"msg\":\"Hello, \\ud83c\\udf0e.\"}", out); } @@ -887,7 +887,7 @@ TEST(ParseCBORTest, UTF8IsSupportedInKeys) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"\\ud83c\\udf0e\":\"\\u263e\"}", out); } @@ -898,7 +898,7 @@ TEST(ParseCBORTest, NoInputError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(in.data(), in.size()), json_writer.get()); + ParseCBOR(in, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ENVELOPE, 0u)); EXPECT_EQ("", out); } @@ -914,7 +914,7 @@ TEST(ParseCBORTest, UnexpectedEofExpectedValueError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE, bytes.size())); EXPECT_EQ("", out); @@ -932,7 +932,7 @@ TEST(ParseCBORTest, UnexpectedEofInArrayError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_ARRAY, bytes.size())); EXPECT_EQ("", out); @@ -947,7 +947,7 @@ TEST(ParseCBORTest, UnexpectedEofInMapError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNEXPECTED_EOF_IN_MAP, 7u)); EXPECT_EQ("", out); } @@ -963,7 +963,7 @@ TEST(ParseCBORTest, EnvelopeEncodingLegacy) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(out, "{\"foo\":42}"); } @@ -980,7 +980,7 @@ TEST(ParseCBORTest, EnvelopeEncodingBySpec) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ(out, "{\"foo\":42}"); } @@ -991,7 +991,7 @@ TEST(ParseCBORTest, NoEmptyEnvelopesAllowed) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, bytes.size())); EXPECT_EQ("", out); @@ -1021,7 +1021,7 @@ TEST(ParseCBORTest, OnlyMapsAndArraysSupportedInsideEnvelopes) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE, error_pos)); EXPECT_EQ("", out); @@ -1038,7 +1038,7 @@ TEST(ParseCBORTest, InvalidMapKeyError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_MAP_KEY, 7u)); EXPECT_EQ("", out); } @@ -1068,7 +1068,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); EXPECT_EQ("{\"key\":{\"key\":{\"key\":\"innermost_value\"}}}", out); } @@ -1078,7 +1078,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIsOk()); } @@ -1097,7 +1097,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, opening_segment_size * 301)); } @@ -1107,7 +1107,7 @@ TEST(ParseCBORTest, StackLimitExceededError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_STACK_LIMIT_EXCEEDED, opening_segment_size * 301)); } @@ -1126,7 +1126,7 @@ TEST(ParseCBORTest, UnsupportedValueError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_UNSUPPORTED_VALUE, error_pos)); EXPECT_EQ("", out); } @@ -1148,7 +1148,7 @@ TEST(ParseCBORTest, InvalidString16Error) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING16, error_pos)); EXPECT_EQ("", out); } @@ -1167,7 +1167,7 @@ TEST(ParseCBORTest, InvalidString8Error) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_STRING8, error_pos)); EXPECT_EQ("", out); } @@ -1188,7 +1188,7 @@ TEST(ParseCBORTest, InvalidBinaryError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_BINARY, error_pos)); EXPECT_EQ("", out); } @@ -1208,7 +1208,7 @@ TEST(ParseCBORTest, InvalidDoubleError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_DOUBLE, error_pos)); EXPECT_EQ("", out); } @@ -1228,7 +1228,7 @@ TEST(ParseCBORTest, InvalidSignedError) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_INVALID_INT32, error_pos)); EXPECT_EQ("", out); } @@ -1250,7 +1250,7 @@ TEST(ParseCBORTest, TrailingJunk) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_TRAILING_JUNK, error_pos)); EXPECT_EQ("", out); } @@ -1272,7 +1272,7 @@ TEST(ParseCBORTest, EnvelopeContentsLengthMismatch) { Status status; std::unique_ptr json_writer = json::NewJSONEncoder(&out, &status); - ParseCBOR(span(bytes.data(), bytes.size()), json_writer.get()); + ParseCBOR(bytes, json_writer.get()); EXPECT_THAT(status, StatusIs(Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH, bytes.size())); EXPECT_EQ("", out); diff --git a/deps/inspector_protocol/crdtp/json.cc b/deps/inspector_protocol/crdtp/json.cc index 479f9ba51875ab..bc3b8a6d9093c7 100644 --- a/deps/inspector_protocol/crdtp/json.cc +++ b/deps/inspector_protocol/crdtp/json.cc @@ -149,23 +149,31 @@ class JSONEncoder : public ParserHandler { Emit('"'); for (const uint16_t ch : chars) { if (ch == '"') { - Emit('\\'); Emit('"'); + Emit('\\'); + Emit('"'); } else if (ch == '\\') { - Emit('\\'); Emit('\\'); + Emit('\\'); + Emit('\\'); } else if (ch >= 32 && ch <= 127) { Emit(ch); } else if (ch == '\n') { - Emit('\\'); Emit('n'); + Emit('\\'); + Emit('n'); } else if (ch == '\r') { - Emit('\\'); Emit('r'); + Emit('\\'); + Emit('r'); } else if (ch == '\t') { - Emit('\\'); Emit('t'); + Emit('\\'); + Emit('t'); } else if (ch == '\b') { - Emit('\\'); Emit('b'); + Emit('\\'); + Emit('b'); } else if (ch == '\f') { - Emit('\\'); Emit('f'); + Emit('\\'); + Emit('f'); } else { - Emit('\\'); Emit('u'); + Emit('\\'); + Emit('u'); PrintHex(ch, out_); } } @@ -177,26 +185,42 @@ class JSONEncoder : public ParserHandler { return; state_.top().StartElement(out_); Emit('"'); + // Fast path for input strings that can be emitted as-is. + if (std::all_of(chars.begin(), chars.end(), [](uint8_t c) { + return c != '"' && c != '\\' && c >= 32 && c <= 127; + })) { + Emit(chars); + Emit('"'); + return; + } for (size_t ii = 0; ii < chars.size(); ++ii) { uint8_t c = chars[ii]; if (c == '"') { - Emit('\\'); Emit('"'); + Emit('\\'); + Emit('"'); } else if (c == '\\') { - Emit('\\'); Emit('\\'); + Emit('\\'); + Emit('\\'); } else if (c >= 32 && c <= 127) { Emit(c); } else if (c == '\n') { - Emit('\\'); Emit('n'); + Emit('\\'); + Emit('n'); } else if (c == '\r') { - Emit('\\'); Emit('r'); + Emit('\\'); + Emit('r'); } else if (c == '\t') { - Emit('\\'); Emit('t'); + Emit('\\'); + Emit('t'); } else if (c == '\b') { - Emit('\\'); Emit('b'); + Emit('\\'); + Emit('b'); } else if (c == '\f') { - Emit('\\'); Emit('f'); + Emit('\\'); + Emit('f'); } else if (c < 32) { - Emit('\\'); Emit('u'); + Emit('\\'); + Emit('u'); PrintHex(static_cast(c), out_); } else { // Inspect the leading byte to figure out how long the utf8 @@ -330,10 +354,11 @@ class JSONEncoder : public ParserHandler { if (!status_->ok()) return; state_.top().StartElement(out_); - if (value) + if (value) { Emit("true"); - else + } else { Emit("false"); + } } void HandleNull() override { @@ -351,13 +376,16 @@ class JSONEncoder : public ParserHandler { private: inline void Emit(char c) { out_->push_back(c); } - template + template inline void Emit(const char (&str)[N]) { out_->insert(out_->end(), str, str + N - 1); } inline void Emit(const std::string& str) { out_->insert(out_->end(), str.begin(), str.end()); } + inline void Emit(const span& bytes) { + out_->insert(out_->end(), bytes.begin(), bytes.end()); + } C* out_; Status* status_; @@ -882,7 +910,7 @@ class JsonParser { HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); return; } - handler_->HandleString16(span(value.data(), value.size())); + handler_->HandleString16(value); break; } case ArrayBegin: { @@ -929,7 +957,7 @@ class JsonParser { HandleError(Error::JSON_PARSER_INVALID_STRING, token_start); return; } - handler_->HandleString16(span(key.data(), key.size())); + handler_->HandleString16(key); start = token_end; token = ParseToken(start, end, &token_start, &token_end); diff --git a/deps/inspector_protocol/crdtp/json_test.cc b/deps/inspector_protocol/crdtp/json_test.cc index 08f65e48a20147..13566ac8b92f61 100644 --- a/deps/inspector_protocol/crdtp/json_test.cc +++ b/deps/inspector_protocol/crdtp/json_test.cc @@ -90,7 +90,7 @@ TEST(JsonEncoder, EscapesLoneHighSurrogates) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"a\\ud800b\\udadac\\udbffd\"", out); } @@ -103,7 +103,7 @@ TEST(JsonEncoder, EscapesLoneLowSurrogates) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"a\\udc00b\\udedec\\udfffd\"", out); } @@ -114,7 +114,7 @@ TEST(JsonEncoder, EscapesFFFF) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars.data(), chars.size())); + writer->HandleString16(chars); EXPECT_EQ("\"abc\\uffffd\"", out); } @@ -123,7 +123,7 @@ TEST(JsonEncoder, Passes0x7FString8) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString8(span(chars.data(), chars.size())); + writer->HandleString8(chars); EXPECT_EQ( "\"a\x7f" "b\"", @@ -135,7 +135,7 @@ TEST(JsonEncoder, Passes0x7FString16) { std::string out; Status status; std::unique_ptr writer = NewJSONEncoder(&out, &status); - writer->HandleString16(span(chars16.data(), chars16.size())); + writer->HandleString16(chars16); EXPECT_EQ( "\"a\x7f" "b\"", @@ -737,8 +737,7 @@ TYPED_TEST(ConvertJSONToCBORTest, RoundTripValidJson16) { '"', ':', '[', '1', ',', '2', ',', '3', ']', '}'}; std::vector cbor; { - Status status = - ConvertJSONToCBOR(span(json16.data(), json16.size()), &cbor); + Status status = ConvertJSONToCBOR(json16, &cbor); EXPECT_THAT(status, StatusIsOk()); } TypeParam roundtrip_json; diff --git a/deps/inspector_protocol/crdtp/protocol_core.cc b/deps/inspector_protocol/crdtp/protocol_core.cc index 69773593ded162..dc483ac5ad0896 100644 --- a/deps/inspector_protocol/crdtp/protocol_core.cc +++ b/deps/inspector_protocol/crdtp/protocol_core.cc @@ -12,7 +12,7 @@ namespace crdtp { DeserializerState::DeserializerState(std::vector bytes) : storage_(new std::vector(std::move(bytes))), - tokenizer_(span(storage_->data(), storage_->size())) {} + tokenizer_(*storage_) {} DeserializerState::DeserializerState(Storage storage, span span) : storage_(std::move(storage)), tokenizer_(span) {} diff --git a/deps/inspector_protocol/crdtp/protocol_core.h b/deps/inspector_protocol/crdtp/protocol_core.h index f8283367773a42..b111746253aaf3 100644 --- a/deps/inspector_protocol/crdtp/protocol_core.h +++ b/deps/inspector_protocol/crdtp/protocol_core.h @@ -219,8 +219,7 @@ struct CRDTP_EXPORT ProtocolTypeTraits { template struct ProtocolTypeTraits> { - static bool Deserialize(DeserializerState* state, - std::optional* value) { + static bool Deserialize(DeserializerState* state, std::optional* value) { T res; if (!ProtocolTypeTraits::Deserialize(state, &res)) return false; @@ -341,9 +340,7 @@ template bool ConvertProtocolValue(const F& from, T* to) { std::vector bytes; ProtocolTypeTraits::Serialize(from, &bytes); - auto deserializer = - DeferredMessage::FromSpan(span(bytes.data(), bytes.size())) - ->MakeDeserializer(); + auto deserializer = DeferredMessage::FromSpan(bytes)->MakeDeserializer(); return ProtocolTypeTraits::Deserialize(&deserializer, to); } diff --git a/deps/inspector_protocol/crdtp/span.h b/deps/inspector_protocol/crdtp/span.h index c2b5b02d9a1832..40471f20aa88a2 100644 --- a/deps/inspector_protocol/crdtp/span.h +++ b/deps/inspector_protocol/crdtp/span.h @@ -7,49 +7,17 @@ #include #include -#include +#include #include +#include #include "export.h" namespace crdtp { -// ============================================================================= -// span - sequence of bytes -// ============================================================================= -// This template is similar to std::span, which will be included in C++20. +// crdtp::span is a std::span which always holds const elements. template -class span { - public: - using index_type = size_t; - - constexpr span() : data_(nullptr), size_(0) {} - constexpr span(const T* data, index_type size) : data_(data), size_(size) {} - - constexpr const T* data() const { return data_; } - - constexpr const T* begin() const { return data_; } - constexpr const T* end() const { return data_ + size_; } - - constexpr const T& operator[](index_type idx) const { return data_[idx]; } - - constexpr span subspan(index_type offset, index_type count) const { - return span(data_ + offset, count); - } - - constexpr span subspan(index_type offset) const { - return span(data_ + offset, size_ - offset); - } - - constexpr bool empty() const { return size_ == 0; } - - constexpr index_type size() const { return size_; } - constexpr index_type size_bytes() const { return size_ * sizeof(T); } - - private: - const T* data_; - index_type size_; -}; +using span = std::span; template constexpr span MakeSpan(const char (&str)[N]) { diff --git a/deps/inspector_protocol/crdtp/span_test.cc b/deps/inspector_protocol/crdtp/span_test.cc index e562f4ea6feed9..2845a3b889fcc3 100644 --- a/deps/inspector_protocol/crdtp/span_test.cc +++ b/deps/inspector_protocol/crdtp/span_test.cc @@ -85,6 +85,12 @@ TEST(SpanFromTest, FromVectorUint8AndUint16) { EXPECT_EQ(bar.size(), bar_span.size()); } +TEST(SpanFromTest, FromVectorImplicit) { + std::vector foo = {'f', 'o', 'o'}; + span foo_span(foo); + EXPECT_EQ(foo.size(), foo_span.size()); +} + TEST(SpanComparisons, ByteWiseLexicographicalOrder) { // Compare the empty span. EXPECT_FALSE(SpanLessThan(span(), span())); diff --git a/deps/inspector_protocol/lib/Values_cpp.template b/deps/inspector_protocol/lib/Values_cpp.template index 0c409295d52ae3..abeee79e5c3a05 100644 --- a/deps/inspector_protocol/lib/Values_cpp.template +++ b/deps/inspector_protocol/lib/Values_cpp.template @@ -300,7 +300,7 @@ namespace { // transcodes to UTF8 if needed. void EncodeString(const String& s, std::vector* out) { if (StringUtil::CharacterCount(s) == 0) { - cbor::EncodeString8(span(nullptr, 0), out); // Empty string. + cbor::EncodeString8(span(), out); // Empty string. } else if (StringUtil::CharactersLatin1(s)) { cbor::EncodeFromLatin1(span(StringUtil::CharactersLatin1(s), StringUtil::CharacterCount(s)), diff --git a/deps/inspector_protocol/pdl.py b/deps/inspector_protocol/pdl.py index 6b448c07443c7e..20f505ea81e34e 100644 --- a/deps/inspector_protocol/pdl.py +++ b/deps/inspector_protocol/pdl.py @@ -86,6 +86,18 @@ def parse(data, file_name, map_binary_to_string=False): protocol['domains'].append(domain) continue + match = re.compile( + r'^include (.*)').match(line) + if match: + included_filename = match.group(1) + if path.isabs(included_filename): + raise Exception("Only relative paths are supported in include's") + resolved_path = path.normpath(path.join(path.dirname(file_name), included_filename)) + with open(resolved_path, 'r') as file: + included_data = parse(file.read(), resolved_path, map_binary_to_string) + protocol['domains'].extend(included_data['domains']) + continue + match = re.compile(r'^ depends on ([^\s]+)').match(line) if match: if 'dependencies' not in domain: diff --git a/deps/ncrypto/ncrypto.cc b/deps/ncrypto/ncrypto.cc index e1c2da6969a1ce..461819ce0fa732 100644 --- a/deps/ncrypto/ncrypto.cc +++ b/deps/ncrypto/ncrypto.cc @@ -4666,9 +4666,10 @@ std::pair X509Name::Iterator::operator*() const { unsigned char* value_str; int value_str_size = ASN1_STRING_to_UTF8(&value_str, value); - return { - std::move(name_str), - std::string(reinterpret_cast(value_str), value_str_size)}; + std::string out(reinterpret_cast(value_str), value_str_size); + OPENSSL_free(value_str); // free after copy + + return {std::move(name_str), std::move(out)}; } // ============================================================================ diff --git a/deps/nghttp2/lib/CMakeLists.txt b/deps/nghttp2/lib/CMakeLists.txt index fda8dcb7fc7f2a..98e3dbe7682fb0 100644 --- a/deps/nghttp2/lib/CMakeLists.txt +++ b/deps/nghttp2/lib/CMakeLists.txt @@ -47,7 +47,29 @@ if(WIN32) set(NGHTTP2_RES ${CMAKE_CURRENT_BINARY_DIR}/version.rc) endif() -set(EXPORT_SET "${PROJECT_NAME}-targets") +set(NGHTTP2_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") +set(NGHTTP2_VERSION_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake") +set(NGHTTP2_PROJECT_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}Config.cmake") +set(NGHTTP2_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") +set(NGHTTP2_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") +set(NGHTTP2_NAMESPACE "${PROJECT_NAME}::") +set(NGHTTP2_VERSION ${PROJECT_VERSION}) + +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${NGHTTP2_VERSION_CONFIG}" VERSION ${NGHTTP2_VERSION} COMPATIBILITY SameMajorVersion +) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.in" "${NGHTTP2_PROJECT_CONFIG}" @ONLY) + +# Install cmake config files +install( + FILES "${NGHTTP2_PROJECT_CONFIG}" "${NGHTTP2_VERSION_CONFIG}" + DESTINATION "${NGHTTP2_CONFIG_INSTALL_DIR}") + +install( + EXPORT "${NGHTTP2_TARGETS_EXPORT_NAME}" + NAMESPACE "${NGHTTP2_NAMESPACE}" + DESTINATION "${NGHTTP2_CONFIG_INSTALL_DIR}") # Public shared library if(BUILD_SHARED_LIBS) @@ -65,7 +87,11 @@ if(BUILD_SHARED_LIBS) $ ) - install(TARGETS ${SHARED_LIB} EXPORT ${EXPORT_SET}) + install(TARGETS ${SHARED_LIB} + EXPORT ${NGHTTP2_TARGETS_EXPORT_NAME} + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") list(APPEND nghttp2_exports ${SHARED_LIB}) endif() @@ -87,7 +113,9 @@ if(BUILD_STATIC_LIBS) target_compile_definitions(${STATIC_LIB} PUBLIC "-DNGHTTP2_STATICLIB") - install(TARGETS ${STATIC_LIB} EXPORT ${EXPORT_SET}) + install(TARGETS ${STATIC_LIB} + EXPORT ${NGHTTP2_TARGETS_EXPORT_NAME} + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") list(APPEND nghttp2_exports ${STATIC_LIB}) endif() @@ -97,11 +125,7 @@ else() set(LIB_SELECTED ${STATIC_LIB}) endif() -add_library(${PROJECT_NAME}::nghttp2 ALIAS ${LIB_SELECTED}) +add_library(nghttp2 ALIAS ${LIB_SELECTED}) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libnghttp2.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") - -install(EXPORT ${EXPORT_SET} - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} - NAMESPACE ${PROJECT_NAME}::) diff --git a/deps/nghttp2/lib/Makefile.am b/deps/nghttp2/lib/Makefile.am index 1168c1e6135661..3a743df6ae72e5 100644 --- a/deps/nghttp2/lib/Makefile.am +++ b/deps/nghttp2/lib/Makefile.am @@ -22,7 +22,7 @@ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SUBDIRS = includes -EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in +EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in config.cmake.in AM_CFLAGS = $(WARNCFLAGS) $(EXTRACFLAG) AM_CPPFLAGS = -I$(srcdir)/includes -I$(builddir)/includes -DBUILDING_NGHTTP2 \ diff --git a/deps/nghttp2/lib/Makefile.in b/deps/nghttp2/lib/Makefile.in index 7a4cb5e97404b6..bb458a182c9f6d 100644 --- a/deps/nghttp2/lib/Makefile.in +++ b/deps/nghttp2/lib/Makefile.in @@ -360,6 +360,8 @@ LIBNGHTTP3_LIBS = @LIBNGHTTP3_LIBS@ LIBNGTCP2_CFLAGS = @LIBNGTCP2_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS = @LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_LIBS = @LIBNGTCP2_CRYPTO_BORINGSSL_LIBS@ +LIBNGTCP2_CRYPTO_LIBRESSL_CFLAGS = @LIBNGTCP2_CRYPTO_LIBRESSL_CFLAGS@ +LIBNGTCP2_CRYPTO_LIBRESSL_LIBS = @LIBNGTCP2_CRYPTO_LIBRESSL_LIBS@ LIBNGTCP2_CRYPTO_OSSL_CFLAGS = @LIBNGTCP2_CRYPTO_OSSL_CFLAGS@ LIBNGTCP2_CRYPTO_OSSL_LIBS = @LIBNGTCP2_CRYPTO_OSSL_LIBS@ LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS = @LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS@ @@ -494,7 +496,7 @@ top_srcdir = @top_srcdir@ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SUBDIRS = includes -EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in +EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in config.cmake.in AM_CFLAGS = $(WARNCFLAGS) $(EXTRACFLAG) AM_CPPFLAGS = -I$(srcdir)/includes -I$(builddir)/includes -DBUILDING_NGHTTP2 \ @DEFS@ diff --git a/deps/nghttp2/lib/config.cmake.in b/deps/nghttp2/lib/config.cmake.in new file mode 100644 index 00000000000000..0b677718f462d6 --- /dev/null +++ b/deps/nghttp2/lib/config.cmake.in @@ -0,0 +1,3 @@ +include(CMakeFindDependencyMacro) + +include("${CMAKE_CURRENT_LIST_DIR}/@NGHTTP2_TARGETS_EXPORT_NAME@.cmake") diff --git a/deps/nghttp2/lib/includes/Makefile.in b/deps/nghttp2/lib/includes/Makefile.in index 7504f8e7c75b52..a4687390385ce6 100644 --- a/deps/nghttp2/lib/includes/Makefile.in +++ b/deps/nghttp2/lib/includes/Makefile.in @@ -265,6 +265,8 @@ LIBNGHTTP3_LIBS = @LIBNGHTTP3_LIBS@ LIBNGTCP2_CFLAGS = @LIBNGTCP2_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS = @LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS@ LIBNGTCP2_CRYPTO_BORINGSSL_LIBS = @LIBNGTCP2_CRYPTO_BORINGSSL_LIBS@ +LIBNGTCP2_CRYPTO_LIBRESSL_CFLAGS = @LIBNGTCP2_CRYPTO_LIBRESSL_CFLAGS@ +LIBNGTCP2_CRYPTO_LIBRESSL_LIBS = @LIBNGTCP2_CRYPTO_LIBRESSL_LIBS@ LIBNGTCP2_CRYPTO_OSSL_CFLAGS = @LIBNGTCP2_CRYPTO_OSSL_CFLAGS@ LIBNGTCP2_CRYPTO_OSSL_LIBS = @LIBNGTCP2_CRYPTO_OSSL_LIBS@ LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS = @LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS@ diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h index 3d91af55109cc8..19c1874f23a3ca 100644 --- a/deps/nghttp2/lib/includes/nghttp2/nghttp2.h +++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2.h @@ -2039,18 +2039,19 @@ typedef int (*nghttp2_on_header_callback2)(nghttp2_session *session, /** * @functypedef * - * Callback function invoked when a invalid header name/value pair is + * Callback function invoked when an invalid header name/value pair is * received for the |frame|. * * The parameter and behaviour are similar to * :type:`nghttp2_on_header_callback`. The difference is that this - * callback is only invoked when a invalid header name/value pair is - * received which is treated as stream error if this callback is not - * set. Only invalid regular header field are passed to this - * callback. In other words, invalid pseudo header field is not - * passed to this callback. Also header fields which includes upper - * cased latter are also treated as error without passing them to this - * callback. + * callback is only invoked when an invalid header name/value pair is + * received which is treated as stream error if this callback returns + * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` and + * :type:`nghttp2_on_invalid_header_callback2` is not set. Only + * invalid regular header field are passed to this callback. In other + * words, invalid pseudo header field is not passed to this callback. + * Also header fields which includes upper cased latter are also + * treated as error without passing them to this callback. * * This callback is only considered if HTTP messaging validation is * turned on (which is on by default, see @@ -2076,17 +2077,18 @@ typedef int (*nghttp2_on_invalid_header_callback)( /** * @functypedef * - * Callback function invoked when a invalid header name/value pair is + * Callback function invoked when an invalid header name/value pair is * received for the |frame|. * * The parameter and behaviour are similar to * :type:`nghttp2_on_header_callback2`. The difference is that this - * callback is only invoked when a invalid header name/value pair is - * received which is silently ignored if this callback is not set. - * Only invalid regular header field are passed to this callback. In - * other words, invalid pseudo header field is not passed to this - * callback. Also header fields which includes upper cased latter are - * also treated as error without passing them to this callback. + * callback is only invoked when an invalid header name/value pair is + * received which is silently ignored if neither this callback nor + * :type:`nghttp2_on_invalid_header_callback` is set. Only invalid + * regular header field are passed to this callback. In other words, + * invalid pseudo header field is not passed to this callback. Also + * header fields which includes upper cased latter are also treated as + * error without passing them to this callback. * * This callback is only considered if HTTP messaging validation is * turned on (which is on by default, see @@ -2445,6 +2447,15 @@ typedef int (*nghttp2_error_callback2)(nghttp2_session *session, int lib_error_code, const char *msg, size_t len, void *user_data); +/** + * @functypedef + * + * Callback function invoked when unpredictable data of |destlen| + * bytes are needed. The implementation must write unpredictable data + * of |destlen| bytes into the buffer pointed by |dest|. + */ +typedef void (*nghttp2_rand_callback)(uint8_t *dest, size_t destlen); + struct nghttp2_session_callbacks; /** @@ -2649,7 +2660,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback2( /** * @function * - * Sets callback function invoked when a invalid header name/value + * Sets callback function invoked when an invalid header name/value * pair is received. If both * `nghttp2_session_callbacks_set_on_invalid_header_callback()` and * `nghttp2_session_callbacks_set_on_invalid_header_callback2()` are @@ -2662,7 +2673,7 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback( /** * @function * - * Sets callback function invoked when a invalid header name/value + * Sets callback function invoked when an invalid header name/value * pair is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback2( @@ -2833,6 +2844,18 @@ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback( NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback2( nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2); +/** + * @function + * + * Sets callback function invoked when unpredictable data is needed. + * Although this callback is optional due to the backward + * compatibility, it is recommended to specify it to harden the + * runtime behavior against suspicious activities of a remote + * endpoint. + */ +NGHTTP2_EXTERN void nghttp2_session_callbacks_set_rand_callback( + nghttp2_session_callbacks *cbs, nghttp2_rand_callback rand_callback); + /** * @functypedef * @@ -3218,6 +3241,23 @@ nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option, NGHTTP2_EXTERN void nghttp2_option_set_max_continuations(nghttp2_option *option, size_t val); +/** + * @function + * + * This function sets the rate limit for the "glitches", the + * suspicious activities from a remote endpoint. It is a token-bucket + * based rate limiter. |burst| specifies the number of tokens that is + * initially available. The maximum number of tokens is capped to + * this value. |rate| specifies the number of tokens that are + * regenerated per second. When a suspicious activity is detected, + * some amount of tokens are consumed. If there is no token + * available, GOAWAY is sent to tear down the connection. |burst| and + * |rate| default to 1000 and 33 respectively. + */ +NGHTTP2_EXTERN void nghttp2_option_set_glitch_rate_limit(nghttp2_option *option, + uint64_t burst, + uint64_t rate); + /** * @function * diff --git a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h index 776c4924276b85..bd5e6c28723232 100644 --- a/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h +++ b/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h @@ -29,7 +29,7 @@ * @macro * Version number of the nghttp2 library release */ -#define NGHTTP2_VERSION "1.66.0" +#define NGHTTP2_VERSION "1.67.1" /** * @macro @@ -37,6 +37,6 @@ * release. This is a 24 bit number with 8 bits for major number, 8 bits * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203. */ -#define NGHTTP2_VERSION_NUM 0x014200 +#define NGHTTP2_VERSION_NUM 0x014301 #endif /* NGHTTP2VER_H */ diff --git a/deps/nghttp2/lib/nghttp2_callbacks.c b/deps/nghttp2/lib/nghttp2_callbacks.c index 32fedd52d85a3f..162ca6bd4b5332 100644 --- a/deps/nghttp2/lib/nghttp2_callbacks.c +++ b/deps/nghttp2/lib/nghttp2_callbacks.c @@ -201,3 +201,8 @@ void nghttp2_session_callbacks_set_error_callback2( nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) { cbs->error_callback2 = error_callback2; } + +void nghttp2_session_callbacks_set_rand_callback( + nghttp2_session_callbacks *cbs, nghttp2_rand_callback rand_callback) { + cbs->rand_callback = rand_callback; +} diff --git a/deps/nghttp2/lib/nghttp2_callbacks.h b/deps/nghttp2/lib/nghttp2_callbacks.h index a611f485481e7c..ad515970c48a36 100644 --- a/deps/nghttp2/lib/nghttp2_callbacks.h +++ b/deps/nghttp2/lib/nghttp2_callbacks.h @@ -151,6 +151,7 @@ struct nghttp2_session_callbacks { nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback; nghttp2_error_callback error_callback; nghttp2_error_callback2 error_callback2; + nghttp2_rand_callback rand_callback; }; #endif /* NGHTTP2_CALLBACKS_H */ diff --git a/deps/nghttp2/lib/nghttp2_map.c b/deps/nghttp2/lib/nghttp2_map.c index ee6bb1967ec6da..f89f310319a1a3 100644 --- a/deps/nghttp2/lib/nghttp2_map.c +++ b/deps/nghttp2/lib/nghttp2_map.c @@ -31,12 +31,13 @@ #include "nghttp2_helper.h" -#define NGHTTP2_INITIAL_TABLE_LENBITS 4 +#define NGHTTP2_INITIAL_HASHBITS 4 -void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem) { +void nghttp2_map_init(nghttp2_map *map, uint32_t seed, nghttp2_mem *mem) { map->mem = mem; map->hashbits = 0; map->table = NULL; + map->seed = seed; map->size = 0; } @@ -77,8 +78,13 @@ int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr), return 0; } -static size_t hash(nghttp2_map_key_type key, size_t bits) { - return (size_t)(((uint32_t)key * 2654435769u) >> (32 - bits)); +static size_t map_hash(const nghttp2_map *map, nghttp2_map_key_type key) { + /* hasher from + https://github.com/rust-lang/rustc-hash/blob/dc5c33f1283de2da64d8d7a06401d91aded03ad4/src/lib.rs + We do not perform finalization here because we use top bits + anyway. */ + uint32_t h = ((uint32_t)key + map->seed) * 0x93d765dd; + return (size_t)((h * 2654435769u) >> (32 - map->hashbits)); } static void map_bucket_swap(nghttp2_map_bucket *a, nghttp2_map_bucket *b) { @@ -109,24 +115,28 @@ void nghttp2_map_print_distance(const nghttp2_map *map) { continue; } - idx = hash(bkt->key, map->hashbits); + idx = map_hash(map, bkt->key); fprintf(stderr, "@%zu hash=%zu key=%d base=%zu distance=%u\n", i, - hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); + map_hash(map, bkt->key), bkt->key, idx, bkt->psl); } } -#endif /* !WIN32 */ - -static int insert(nghttp2_map_bucket *table, size_t hashbits, - nghttp2_map_key_type key, void *data) { - size_t idx = hash(key, hashbits); - nghttp2_map_bucket b = {0, key, data}, *bkt; - size_t mask = (1u << hashbits) - 1; +#endif /* !defined(WIN32) */ + +static int map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data) { + size_t idx = map_hash(map, key); + nghttp2_map_bucket b = { + .key = key, + .data = data, + }; + nghttp2_map_bucket *bkt; + size_t mask = (1u << map->hashbits) - 1; for (;;) { - bkt = &table[idx]; + bkt = &map->table[idx]; if (bkt->data == NULL) { *bkt = b; + ++map->size; return 0; } @@ -147,15 +157,19 @@ static int insert(nghttp2_map_bucket *table, size_t hashbits, static int map_resize(nghttp2_map *map, size_t new_hashbits) { size_t i; - nghttp2_map_bucket *new_table; nghttp2_map_bucket *bkt; size_t tablelen; int rv; + nghttp2_map new_map = { + .table = nghttp2_mem_calloc(map->mem, 1u << new_hashbits, + sizeof(nghttp2_map_bucket)), + .mem = map->mem, + .seed = map->seed, + .hashbits = new_hashbits, + }; (void)rv; - new_table = nghttp2_mem_calloc(map->mem, 1u << new_hashbits, - sizeof(nghttp2_map_bucket)); - if (new_table == NULL) { + if (new_map.table == NULL) { return NGHTTP2_ERR_NOMEM; } @@ -168,15 +182,15 @@ static int map_resize(nghttp2_map *map, size_t new_hashbits) { continue; } - rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + rv = map_insert(&new_map, bkt->key, bkt->data); assert(0 == rv); } } nghttp2_mem_free(map->mem, map->table); + map->table = new_map.table; map->hashbits = new_hashbits; - map->table = new_table; return 0; } @@ -186,30 +200,28 @@ int nghttp2_map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data) { assert(data); - /* Load factor is 0.75 */ + /* Load factor is 7/8 */ /* Under the very initial condition, that is map->size == 0 and - map->hashbits == 0, 4 > 3 still holds nicely. */ - if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + map->hashbits == 0, 8 > 7 still holds nicely. */ + if ((map->size + 1) * 8 > (1u << map->hashbits) * 7) { if (map->hashbits) { rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, NGHTTP2_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGHTTP2_INITIAL_HASHBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->hashbits, key, data); + rv = map_insert(map, key, data); if (rv != 0) { return rv; } - ++map->size; - return 0; } @@ -223,7 +235,7 @@ void *nghttp2_map_find(const nghttp2_map *map, nghttp2_map_key_type key) { return NULL; } - idx = hash(key, map->hashbits); + idx = map_hash(map, key); mask = (1u << map->hashbits) - 1; for (;;) { @@ -252,7 +264,7 @@ int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key) { return NGHTTP2_ERR_INVALID_ARGUMENT; } - idx = hash(key, map->hashbits); + idx = map_hash(map, key); mask = (1u << map->hashbits) - 1; for (;;) { diff --git a/deps/nghttp2/lib/nghttp2_map.h b/deps/nghttp2/lib/nghttp2_map.h index 5adfb78d027679..e45685bce71768 100644 --- a/deps/nghttp2/lib/nghttp2_map.h +++ b/deps/nghttp2/lib/nghttp2_map.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -47,6 +47,7 @@ typedef struct nghttp2_map_bucket { typedef struct nghttp2_map { nghttp2_map_bucket *table; nghttp2_mem *mem; + uint32_t seed; size_t size; size_t hashbits; } nghttp2_map; @@ -54,7 +55,7 @@ typedef struct nghttp2_map { /* * nghttp2_map_init initializes the map |map|. */ -void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem); +void nghttp2_map_init(nghttp2_map *map, uint32_t seed, nghttp2_mem *mem); /* * nghttp2_map_free deallocates any resources allocated for |map|. @@ -123,6 +124,6 @@ int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr), #ifndef WIN32 void nghttp2_map_print_distance(const nghttp2_map *map); -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -#endif /* NGHTTP2_MAP_H */ +#endif /* !defined(NGHTTP2_MAP_H) */ diff --git a/deps/nghttp2/lib/nghttp2_option.c b/deps/nghttp2/lib/nghttp2_option.c index 02a24eee6b2605..7e44a241ba1eec 100644 --- a/deps/nghttp2/lib/nghttp2_option.c +++ b/deps/nghttp2/lib/nghttp2_option.c @@ -155,3 +155,10 @@ void nghttp2_option_set_max_continuations(nghttp2_option *option, size_t val) { option->opt_set_mask |= NGHTTP2_OPT_MAX_CONTINUATIONS; option->max_continuations = val; } + +void nghttp2_option_set_glitch_rate_limit(nghttp2_option *option, + uint64_t burst, uint64_t rate) { + option->opt_set_mask |= NGHTTP2_OPT_GLITCH_RATE_LIMIT; + option->glitch_burst = burst; + option->glitch_rate = rate; +} diff --git a/deps/nghttp2/lib/nghttp2_option.h b/deps/nghttp2/lib/nghttp2_option.h index c89cb97f8bb685..78fa21e4a77ac8 100644 --- a/deps/nghttp2/lib/nghttp2_option.h +++ b/deps/nghttp2/lib/nghttp2_option.h @@ -72,6 +72,7 @@ typedef enum { NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 14, NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT = 1 << 15, NGHTTP2_OPT_MAX_CONTINUATIONS = 1 << 16, + NGHTTP2_OPT_GLITCH_RATE_LIMIT = 1 << 17, } nghttp2_option_flag; /** @@ -83,6 +84,11 @@ struct nghttp2_option { */ uint64_t stream_reset_burst; uint64_t stream_reset_rate; + /** + * NGHTTP2_OPT_GLITCH_RATE_LIMIT + */ + uint64_t glitch_burst; + uint64_t glitch_rate; /** * NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH */ diff --git a/deps/nghttp2/lib/nghttp2_session.c b/deps/nghttp2/lib/nghttp2_session.c index dc1a00cf576917..a53c7420b36952 100644 --- a/deps/nghttp2/lib/nghttp2_session.c +++ b/deps/nghttp2/lib/nghttp2_session.c @@ -438,6 +438,7 @@ static int session_new(nghttp2_session **session_ptr, size_t max_deflate_dynamic_table_size = NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE; size_t i; + uint32_t map_seed; if (mem == NULL) { mem = nghttp2_mem_default(); @@ -474,6 +475,10 @@ static int session_new(nghttp2_session **session_ptr, NGHTTP2_DEFAULT_STREAM_RESET_BURST, NGHTTP2_DEFAULT_STREAM_RESET_RATE); + nghttp2_ratelim_init(&(*session_ptr)->glitch_ratelim, + NGHTTP2_DEFAULT_GLITCH_BURST, + NGHTTP2_DEFAULT_GLITCH_RATE); + if (server) { (*session_ptr)->server = 1; } @@ -566,6 +571,11 @@ static int session_new(nghttp2_session **session_ptr, if (option->opt_set_mask & NGHTTP2_OPT_MAX_CONTINUATIONS) { (*session_ptr)->max_continuations = option->max_continuations; } + + if (option->opt_set_mask & NGHTTP2_OPT_GLITCH_RATE_LIMIT) { + nghttp2_ratelim_init(&(*session_ptr)->glitch_ratelim, + option->glitch_burst, option->glitch_rate); + } } rv = nghttp2_hd_deflate_init2(&(*session_ptr)->hd_deflater, @@ -594,7 +604,13 @@ static int session_new(nghttp2_session **session_ptr, goto fail_aob_framebuf; } - nghttp2_map_init(&(*session_ptr)->streams, mem); + if (callbacks->rand_callback) { + callbacks->rand_callback((uint8_t *)&map_seed, sizeof(map_seed)); + } else { + map_seed = 0; + } + + nghttp2_map_init(&(*session_ptr)->streams, map_seed, mem); active_outbound_item_reset(&(*session_ptr)->aob, mem); @@ -3367,11 +3383,26 @@ static int session_call_on_invalid_frame_recv_callback(nghttp2_session *session, return 0; } +static int session_update_glitch_ratelim(nghttp2_session *session) { + if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) { + return 0; + } + + nghttp2_ratelim_update(&session->glitch_ratelim, nghttp2_time_now_sec()); + + if (nghttp2_ratelim_drain(&session->glitch_ratelim, 1) == 0) { + return 0; + } + + return nghttp2_session_terminate_session(session, NGHTTP2_ENHANCE_YOUR_CALM); +} + static int session_handle_invalid_stream2(nghttp2_session *session, int32_t stream_id, nghttp2_frame *frame, int lib_error_code) { int rv; + rv = nghttp2_session_add_rst_stream( session, stream_id, get_error_code_from_lib_error_code(lib_error_code)); if (rv != 0) { @@ -5444,6 +5475,16 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (rv == NGHTTP2_ERR_IGN_PAYLOAD) { DEBUGF("recv: DATA not allowed stream_id=%d\n", iframe->frame.hd.stream_id); + + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + iframe->state = NGHTTP2_IB_IGN_DATA; break; } @@ -5469,6 +5510,20 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, break; } + /* Empty DATA frame without END_STREAM flag set is + suspicious. */ + if (iframe->payloadleft == 0 && + (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0) { + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + } + iframe->state = NGHTTP2_IB_READ_DATA; break; } @@ -5545,6 +5600,15 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } if (rv == NGHTTP2_ERR_IGN_HEADER_BLOCK) { + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + iframe->state = NGHTTP2_IB_IGN_HEADER_BLOCK; break; } @@ -5565,6 +5629,18 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, break; } + /* This is deprecated RFC 7540 priorities mechanism which is + very unpopular. We do not expect it is received so + frequently. */ + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + iframe->state = NGHTTP2_IB_READ_NBYTE; inbound_frame_set_mark(iframe, NGHTTP2_PRIORITY_SPECLEN); @@ -5737,8 +5813,17 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, if (check_ext_type_set(session->user_recv_ext_types, iframe->frame.hd.type)) { if (!session->callbacks.unpack_extension_callback) { - /* Silently ignore unknown frame type. */ + /* Receiving too frequent unknown frames is suspicious. */ + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + /* Silently ignore unknown frame type. */ busy = 1; iframe->state = NGHTTP2_IB_IGN_PAYLOAD; @@ -5850,6 +5935,17 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, break; } + /* Receiving too frequent PRIORITY_UPDATE is + suspicious. */ + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + if (iframe->payloadleft > sizeof(iframe->raw_sbuf)) { busy = 1; iframe->state = NGHTTP2_IB_IGN_PAYLOAD; @@ -5863,6 +5959,16 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, break; default: + /* Receiving too frequent unknown frames is suspicious. */ + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + busy = 1; iframe->state = NGHTTP2_IB_IGN_PAYLOAD; @@ -5959,6 +6065,15 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, } if (rv == NGHTTP2_ERR_IGN_HEADER_BLOCK) { + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + iframe->state = NGHTTP2_IB_IGN_HEADER_BLOCK; break; } @@ -6497,6 +6612,20 @@ nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, iframe->frame.data.padlen = (size_t)padlen; + /* Empty DATA frame without END_STREAM flag set is + suspicious. */ + if (iframe->payloadleft == 0 && + (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0) { + rv = session_update_glitch_ratelim(session); + if (rv != 0) { + return rv; + } + + if (iframe->state == NGHTTP2_IB_IGN_ALL) { + return (nghttp2_ssize)inlen; + } + } + iframe->state = NGHTTP2_IB_READ_DATA; break; diff --git a/deps/nghttp2/lib/nghttp2_session.h b/deps/nghttp2/lib/nghttp2_session.h index 419d23b5a9617e..25f300d23f131c 100644 --- a/deps/nghttp2/lib/nghttp2_session.h +++ b/deps/nghttp2/lib/nghttp2_session.h @@ -106,6 +106,10 @@ typedef struct { #define NGHTTP2_DEFAULT_STREAM_RESET_BURST 1000 #define NGHTTP2_DEFAULT_STREAM_RESET_RATE 33 +/* The default values for glitch rate limiter. */ +#define NGHTTP2_DEFAULT_GLITCH_BURST 1000 +#define NGHTTP2_DEFAULT_GLITCH_RATE 33 + /* The default max number of CONTINUATION frames following an incoming HEADER frame. */ #define NGHTTP2_DEFAULT_MAX_CONTINUATIONS 8 @@ -229,6 +233,8 @@ struct nghttp2_session { /* Stream reset rate limiter. If receiving excessive amount of stream resets, GOAWAY will be sent. */ nghttp2_ratelim stream_reset_ratelim; + /* Rate limiter for all kinds of glitches. */ + nghttp2_ratelim glitch_ratelim; /* Sequential number across all streams to process streams in FIFO. */ uint64_t stream_seq; diff --git a/deps/nghttp2/lib/nghttp2_submit.c b/deps/nghttp2/lib/nghttp2_submit.c index 5c6390fa759fd8..8a90f714e4a4b5 100644 --- a/deps/nghttp2/lib/nghttp2_submit.c +++ b/deps/nghttp2/lib/nghttp2_submit.c @@ -487,7 +487,7 @@ int nghttp2_submit_altsvc(nghttp2_session *session, uint8_t flags, return 0; fail_item_malloc: - free(buf); + nghttp2_mem_free(mem, buf); return rv; } @@ -570,7 +570,7 @@ int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags, return 0; fail_item_malloc: - free(ov_copy); + nghttp2_mem_free(mem, ov_copy); return rv; } @@ -642,7 +642,7 @@ int nghttp2_submit_priority_update(nghttp2_session *session, uint8_t flags, return 0; fail_item_malloc: - free(buf); + nghttp2_mem_free(mem, buf); return rv; } diff --git a/deps/simdjson/simdjson.cpp b/deps/simdjson/simdjson.cpp index 819942e8289b69..7ac177b062b36c 100644 --- a/deps/simdjson/simdjson.cpp +++ b/deps/simdjson/simdjson.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-06-04 00:22:10 -0400. Do not edit! */ +/* auto-generated on 2025-10-27 16:52:41 -0400. version 4.1.0 Do not edit! */ /* including simdjson.cpp: */ /* begin file simdjson.cpp */ #define SIMDJSON_SRC_SIMDJSON_CPP @@ -77,30 +77,71 @@ #endif #endif +#ifndef SIMDJSON_CONSTEXPR_LAMBDA +#if SIMDJSON_CPLUSPLUS17 +#define SIMDJSON_CONSTEXPR_LAMBDA constexpr +#else +#define SIMDJSON_CONSTEXPR_LAMBDA +#endif +#endif + + + #ifdef __has_include #if __has_include() #include #endif #endif +// The current specification is unclear on how we detect +// static reflection, both __cpp_lib_reflection and +// __cpp_impl_reflection are proposed in the draft specification. +// For now, we disable static reflect by default. It must be +// specified at compiler time. +#ifndef SIMDJSON_STATIC_REFLECTION +#define SIMDJSON_STATIC_REFLECTION 0 // disabled by default. +#endif + #if defined(__apple_build_version__) #if __apple_build_version__ < 14000000 #define SIMDJSON_CONCEPT_DISABLED 1 // apple-clang/13 doesn't support std::convertible_to #endif #endif +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L +#include +#define SIMDJSON_SUPPORTS_RANGES 1 +#else +#define SIMDJSON_SUPPORTS_RANGES 0 +#endif #if defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) #if __cpp_concepts >= 201907L #include -#define SIMDJSON_SUPPORTS_DESERIALIZATION 1 +#define SIMDJSON_SUPPORTS_CONCEPTS 1 #else -#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#define SIMDJSON_SUPPORTS_CONCEPTS 0 #endif #else // defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) -#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#define SIMDJSON_SUPPORTS_CONCEPTS 0 #endif // defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) +// copy SIMDJSON_SUPPORTS_CONCEPTS to SIMDJSON_SUPPORTS_DESERIALIZATION. +#if SIMDJSON_SUPPORTS_CONCEPTS +#define SIMDJSON_SUPPORTS_DESERIALIZATION 1 +#else +#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#endif + + +#if !defined(SIMDJSON_CONSTEVAL) +#if defined(__cpp_consteval) && __cpp_consteval >= 201811L && defined(__cpp_lib_constexpr_string) && __cpp_lib_constexpr_string >= 201907L +#define SIMDJSON_CONSTEVAL 1 +#else +#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" */ @@ -152,6 +193,22 @@ 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 + // 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 + #endif #elif defined(__loongarch_lp64) #define SIMDJSON_IS_LOONGARCH64 1 #elif defined(__PPC64__) || defined(_M_PPC64) @@ -298,6 +355,7 @@ using std::size_t; #if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) // 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. #if SIMDJSON_VISUAL_STUDIO #define SIMDJSON_UNREACHABLE() __assume(0) #define SIMDJSON_ASSUME(COND) __assume(COND) @@ -549,17 +607,6 @@ double from_chars(const char *first, const char* end) noexcept; // We assume by default static linkage #define SIMDJSON_DLLIMPORTEXPORT #endif - -/** - * Workaround for the vcpkg package manager. Only vcpkg should - * ever touch the next line. The SIMDJSON_USING_LIBRARY macro is otherwise unused. - */ -#if SIMDJSON_USING_LIBRARY -#define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport) -#endif -/** - * End of workaround for the vcpkg package manager. - */ #else #define SIMDJSON_DLLIMPORTEXPORT #endif @@ -1022,9 +1069,9 @@ using std::operator<<; #endif #if nssv_HAVE_NODISCARD -# define nssv_nodiscard [[nodiscard]] +# define nssv_nodiscard simdjson_warn_unused #else -# define nssv_nodiscard /*[[nodiscard]]*/ +# define nssv_nodiscard /*simdjson_warn_unused*/ #endif // Additional includes: @@ -2342,16 +2389,25 @@ namespace std { // It could also wrongly set SIMDJSON_DEVELOPMENT_CHECKS (e.g., if the programmer // sets _DEBUG in a release build under Visual Studio, or if some compiler fails to // set the __OPTIMIZE__ macro). +// We make it so that if NDEBUG is defined, then SIMDJSON_DEVELOPMENT_CHECKS +// is not defined, irrespective of the compiler. +// We recommend that users set NDEBUG in release builds, so that +// SIMDJSON_DEVELOPMENT_CHECKS is not defined in release builds by default, +// irrespective of the compiler. #ifndef SIMDJSON_DEVELOPMENT_CHECKS #ifdef _MSC_VER // Visual Studio seems to set _DEBUG for debug builds. -#ifdef _DEBUG +// We set SIMDJSON_DEVELOPMENT_CHECKS to 1 if _DEBUG is defined +// and NDEBUG is not defined. +#if defined(_DEBUG) && !defined(NDEBUG) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // _DEBUG #else // _MSC_VER // All other compilers appear to set __OPTIMIZE__ to a positive integer // when the compiler is optimizing. -#ifndef __OPTIMIZE__ +// We only set SIMDJSON_DEVELOPMENT_CHECKS if both __OPTIMIZE__ +// and NDEBUG are not defined. +#if !defined(__OPTIMIZE__) && !defined(NDEBUG) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // __OPTIMIZE__ #endif // _MSC_VER @@ -2407,6 +2463,18 @@ namespace std { #define SIMDJSON_AVX512_ALLOWED 1 #endif + +#ifndef __has_cpp_attribute +#define simdjson_lifetime_bound +#elif __has_cpp_attribute(msvc::lifetimebound) +#define simdjson_lifetime_bound [[msvc::lifetimebound]] +#elif __has_cpp_attribute(clang::lifetimebound) +#define simdjson_lifetime_bound [[clang::lifetimebound]] +#elif __has_cpp_attribute(lifetimebound) +#define simdjson_lifetime_bound [[lifetimebound]] +#else +#define simdjson_lifetime_bound +#endif #endif // SIMDJSON_COMMON_DEFS_H /* end file simdjson/common_defs.h */ /* skipped duplicate #include "simdjson/compiler_check.h" */ @@ -2463,7 +2531,8 @@ enum error_code { SCALAR_DOCUMENT_AS_VALUE, ///< A scalar document is treated as a value. OUT_OF_BOUNDS, ///< Attempted to access location outside of document. TRAILING_CONTENT, ///< Unexpected trailing content in the JSON input - NUM_ERROR_CODES + OUT_OF_CAPACITY, ///< The capacity was exceeded, we cannot allocate enough memory. + NUM_ERROR_CODES ///< Placeholder for end of error code list. }; /** @@ -2521,6 +2590,10 @@ namespace internal { /** * The result of a simdjson operation that could fail. * + * IMPORTANT: For the ondemand API, we use implementation_simdjson_result_base as a base class + * to avoid some compilation issue. Thus, if you modify this class, please ensure that the ondemand + * implementation_simdjson_result_base is also modified. + * * 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 @@ -2581,8 +2654,27 @@ struct simdjson_result_base : protected std::pair { */ simdjson_inline error_code error() const noexcept; + /** + * Whether there is a value. + */ + simdjson_inline bool has_value() const noexcept; #if SIMDJSON_EXCEPTIONS + /** + * Dereference operator to access the contained 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); + /** * Get the result value. * @@ -2616,12 +2708,42 @@ struct simdjson_result_base : protected std::pair { /** * Get the result value. This function is safe if and only * the error() method returns a value that evaluates to false. + * We discourage the use of value_unsafe(). + * + * The recommended pattern is: + * + * T value; // where T is the type + * auto error = result.get(value); + * if (error) { + * // handle error + * } + * + * Or you may call 'value()' which will raise an exception + * in case of error: + * + * T value = result.value(); */ simdjson_inline const T& value_unsafe() const& noexcept; /** * Take the result value (move it). This function is safe if and only * the error() method returns a value that evaluates to false. + * We discourage the use of value_unsafe(). + * + * The recommended pattern is: + * + * T value; // where T is the type + * auto error = result.get(value); + * if (error) { + * // handle error, return, exit, abort + * } else { + * // use value here. + * } + * + * Or you may call 'value()' which will raise an exception + * in case of error: + * + * T value = result.value(); */ simdjson_inline T&& value_unsafe() && noexcept; @@ -2636,6 +2758,7 @@ struct simdjson_result_base : protected std::pair { */ template struct simdjson_result : public internal::simdjson_result_base { + /** * @private Create a new empty result with error = UNINITIALIZED. */ @@ -2667,24 +2790,33 @@ struct simdjson_result : public internal::simdjson_result_base { * @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; -// + /** * Copy the value to a provided std::string, only enabled for std::string_view. * * @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(std::string &value) && noexcept -#if SIMDJSON_SUPPORTS_DESERIALIZATION - requires (!std::is_same_v) -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION - ; + template + simdjson_warn_unused simdjson_inline error_code get(std::string &value) && noexcept { + static_assert(std::is_same::value, "SFINAE"); + std::string_view v; + error_code error = std::forward>(*this).get(v); + if (!error) { + value.assign(v.data(), v.size()); + } + return error; + } + /** * The error. */ simdjson_inline error_code error() const noexcept; -#if SIMDJSON_EXCEPTIONS + +#if SIMDJSON_EXCEPTIONS + using internal::simdjson_result_base::operator*; + using internal::simdjson_result_base::operator->; /** * Get the result value. * @@ -2755,7 +2887,7 @@ inline const std::string error_message(int error) noexcept; /* begin file simdjson/concepts.h */ #ifndef SIMDJSON_CONCEPTS_H #define SIMDJSON_CONCEPTS_H -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #include #include @@ -2787,7 +2919,9 @@ SIMDJSON_IMPL_CONCEPT(op_append, operator+=) #undef SIMDJSON_IMPL_CONCEPT } // namespace details - +template +concept is_pair = requires { typename T::first_type; typename T::second_type; } && + std::same_as>; template concept string_view_like = std::is_convertible_v && !std::is_convertible_v; @@ -2870,21 +3004,152 @@ concept optional_type = requires(std::remove_cvref_t obj) { { obj.value() } -> std::same_as::value_type&>; requires requires(typename std::remove_cvref_t::value_type &&val) { obj.emplace(std::move(val)); - obj = std::move(val); { obj.value_or(val) } -> std::convertible_to::value_type>; }; { static_cast(obj) } -> std::same_as; // convertible to bool + { obj.reset() } noexcept -> std::same_as; +}; + + + +// Types we serialize as JSON strings (not as containers) +template +concept string_like = + std::is_same_v, std::string> || + std::is_same_v, std::string_view> || + std::is_same_v, const char*> || + std::is_same_v, char*>; + +// Concept that checks if a type is a container but not a string (because +// strings handling must be handled differently) +// Now uses iterator-based approach for broader container support +template +concept container_but_not_string = + std::ranges::input_range && !string_like && !concepts::string_view_keyed_map; + + + +// Concept: Indexable container that is not a string or associative container +// Accepts: std::vector, std::array, std::deque (have operator[], value_type, not string_like) +// Rejects: std::string (string_like), std::list (no operator[]), std::map (has key_type) +template +concept indexable_container = requires { + typename Container::value_type; + requires !concepts::string_like; + requires !requires { typename Container::key_type; }; // Reject maps/sets + requires requires(Container& c, std::size_t i) { + { c[i] } -> std::convertible_to; + }; }; +// Variable template to use with std::meta::substitute +template +constexpr bool indexable_container_v = indexable_container; } // namespace concepts + + +/** + * We use tag_invoke as our customization point mechanism. + */ +template +concept tag_invocable = requires(Tag tag, Args... args) { + tag_invoke(std::forward(tag), std::forward(args)...); +}; + +template +concept nothrow_tag_invocable = + tag_invocable && requires(Tag tag, Args... args) { + { + tag_invoke(std::forward(tag), std::forward(args)...) + } noexcept; + }; + } // namespace simdjson -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS #endif // SIMDJSON_CONCEPTS_H /* end file simdjson/concepts.h */ +/* including simdjson/constevalutil.h: #include "simdjson/constevalutil.h" */ +/* begin file simdjson/constevalutil.h */ +#ifndef SIMDJSON_CONSTEVALUTIL_H +#define SIMDJSON_CONSTEVALUTIL_H + +#include +#include +#include + +namespace simdjson { +namespace constevalutil { +#if SIMDJSON_CONSTEVAL + +constexpr static std::array 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}; +constexpr static std::array 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"}; +// unoptimized, meant for compile-time execution +consteval std::string consteval_to_quoted_escaped(std::string_view input) { + std::string out = "\""; + for (char c : input) { + if (json_quotable_character[uint8_t(c)]) { + if (c == '"') { + out.append("\\\""); + } else if (c == '\\') { + out.append("\\\\"); + } else { + std::string_view v = control_chars[uint8_t(c)]; + out.append(v); + } + } else { + out.push_back(c); + } + } + out.push_back('"'); + return out; +} +#endif // SIMDJSON_CONSTEVAL + + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +struct fixed_string { + constexpr fixed_string(const char (&str)[N]) { + for (std::size_t i = 0; i < N; ++i) { + data[i] = str[i]; + } + } + char data[N]; + constexpr std::string_view view() const { return {data, N - 1}; } +}; +template +fixed_string(const char (&)[N]) -> fixed_string; + +template +struct string_constant { + static constexpr std::string_view value = str.view(); +}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace constevalutil +} // namespace simdjson +#endif // SIMDJSON_CONSTEVALUTIL_H +/* end file simdjson/constevalutil.h */ /** * @brief The top level simdjson namespace, containing everything the library provides. @@ -4612,8 +4877,38 @@ simdjson_inline error_code simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_inline bool simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS + +template +simdjson_inline T& simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -4638,6 +4933,7 @@ simdjson_inline simdjson_result_base::operator T&&() && noexcept(false) { #endif // SIMDJSON_EXCEPTIONS + template simdjson_inline const T& simdjson_result_base::value_unsafe() const& noexcept { return this->first; @@ -4672,26 +4968,10 @@ simdjson_inline void simdjson_result::tie(T &value, error_code &error) && noe std::forward>(*this).tie(value, error); } -template -simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &value) && noexcept { - return std::forward>(*this).get(value); -} - template simdjson_warn_unused simdjson_inline error_code -simdjson_result::get(std::string &value) && noexcept -#if SIMDJSON_SUPPORTS_DESERIALIZATION -requires (!std::is_same_v) -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION -{ - // SFINAE : n'active que pour T = std::string_view - static_assert(std::is_same::value, "simdjson_result::get(std::string&) n'est disponible que pour T = std::string_view"); - std::string_view v; - error_code error = std::forward>(*this).get(v); - if (!error) { - value.assign(v.data(), v.size()); - } - return error; +simdjson_result::get(T &value) && noexcept { + return std::forward>(*this).get(value); } template @@ -4786,7 +5066,8 @@ namespace internal { { INCOMPLETE_ARRAY_OR_OBJECT, "INCOMPLETE_ARRAY_OR_OBJECT: JSON document ended early in the middle of an object or array. This is a fatal and unrecoverable error." }, { SCALAR_DOCUMENT_AS_VALUE, "SCALAR_DOCUMENT_AS_VALUE: A JSON document made of a scalar (number, Boolean, null or string) is treated as a value. Use get_bool(), get_double(), etc. on the document instead. "}, { OUT_OF_BOUNDS, "OUT_OF_BOUNDS: Attempt to access location outside of document."}, - { TRAILING_CONTENT, "TRAILING_CONTENT: Unexpected trailing content in the JSON input."} + { TRAILING_CONTENT, "TRAILING_CONTENT: Unexpected trailing content in the JSON input."}, + { OUT_OF_CAPACITY, "OUT_OF_CAPACITY: The capacity was exceeded, we cannot allocate enough memory."} }; // error_messages[] } // namespace internal @@ -8209,6 +8490,12 @@ namespace { 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; } }; @@ -8285,7 +8572,7 @@ namespace { // Bit-specific operations simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); } - simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); } template simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); } @@ -8298,7 +8585,12 @@ namespace { 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 @@ -8592,7 +8884,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -8621,6 +8913,32 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + } // unnamed namespace } // namespace arm64 } // namespace simdjson @@ -9040,12 +9358,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -9054,6 +9377,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -9095,6 +9428,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -9471,7 +9805,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -9499,7 +9833,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -9588,7 +9922,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -9651,13 +9985,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -9683,7 +10017,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -10467,12 +10801,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -10991,6 +11354,12 @@ namespace { 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; } }; @@ -11067,7 +11436,7 @@ namespace { // Bit-specific operations simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); } - simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); } template simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); } @@ -11080,7 +11449,12 @@ namespace { 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 @@ -11374,7 +11748,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -11403,6 +11777,32 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + } // unnamed namespace } // namespace arm64 } // namespace simdjson @@ -12110,7 +12510,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -12235,7 +12635,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -12283,7 +12683,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -12437,7 +12837,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -12447,7 +12847,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -12656,7 +13056,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -13508,6 +13908,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for arm64 */ /* including generic/stage2/stringparsing.h for arm64: #include */ /* begin file generic/stage2/stringparsing.h for arm64 */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -13660,7 +14061,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -13705,7 +14107,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -13747,6 +14150,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace arm64 } // namespace simdjson @@ -14974,7 +15378,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -14998,6 +15402,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace haswell } // namespace simdjson @@ -15415,12 +15844,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -15429,6 +15863,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -15470,6 +15914,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -15846,7 +16291,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -15874,7 +16319,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -15963,7 +16408,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -16026,13 +16471,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -16058,7 +16503,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -16842,12 +17287,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -17627,7 +18101,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -17651,6 +18125,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace haswell } // namespace simdjson @@ -18356,7 +18855,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -18481,7 +18980,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -18529,7 +19028,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -18683,7 +19182,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -18693,7 +19192,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -18902,7 +19401,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -19754,6 +20253,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for haswell */ /* including generic/stage2/stringparsing.h for haswell: #include */ /* begin file generic/stage2/stringparsing.h for haswell */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -19906,7 +20406,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -19951,7 +20452,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -19993,6 +20495,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace haswell } // namespace simdjson @@ -20834,7 +21337,6 @@ namespace simd { friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) { return _mm512_cmpeq_epi8_mask(lhs, rhs); } - static const int SIZE = sizeof(base::value); template @@ -21153,7 +21655,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -21177,6 +21679,35 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + + +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 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 @@ -21654,12 +22185,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -21668,6 +22204,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -21709,6 +22255,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -22085,7 +22632,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -22113,7 +22660,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -22202,7 +22749,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -22265,13 +22812,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -22297,7 +22844,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -23081,12 +23628,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -23483,7 +24059,6 @@ namespace simd { friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) { return _mm512_cmpeq_epi8_mask(lhs, rhs); } - static const int SIZE = sizeof(base::value); template @@ -23802,7 +24377,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -23826,6 +24401,35 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + + +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 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 @@ -24591,7 +25195,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -24716,7 +25320,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -24764,7 +25368,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -24918,7 +25522,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -24928,7 +25532,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -25137,7 +25741,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -25989,6 +26593,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for icelake */ /* including generic/stage2/stringparsing.h for icelake: #include */ /* begin file generic/stage2/stringparsing.h for icelake */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -26141,7 +26746,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -26186,7 +26792,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -26228,6 +26835,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace icelake } // namespace simdjson @@ -27589,7 +28197,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static backslash_and_quote + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { @@ -27630,6 +28238,32 @@ backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 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 @@ -28049,12 +28683,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -28063,6 +28702,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -28104,6 +28753,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -28480,7 +29130,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -28508,7 +29158,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -28597,7 +29247,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -28660,13 +29310,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -28692,7 +29342,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -29476,12 +30126,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -30353,7 +31032,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static backslash_and_quote + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { @@ -30394,6 +31073,32 @@ backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 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 @@ -31101,7 +31806,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -31226,7 +31931,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -31274,7 +31979,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -31428,7 +32133,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -31438,7 +32143,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -31647,7 +32352,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -32499,6 +33204,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for ppc64 */ /* including generic/stage2/stringparsing.h for ppc64: #include */ /* begin file generic/stage2/stringparsing.h for ppc64 */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -32651,7 +33357,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -32696,7 +33403,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -32738,6 +33446,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace ppc64 } // namespace simdjson @@ -34363,7 +35072,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -34389,6 +35098,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace westmere } // namespace simdjson @@ -34806,12 +35540,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -34820,6 +35559,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -34861,6 +35610,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -35237,7 +35987,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -35265,7 +36015,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -35354,7 +36104,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -35417,13 +36167,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -35449,7 +36199,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -36233,12 +36983,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -37442,7 +38221,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -37468,6 +38247,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace westmere } // namespace simdjson @@ -38173,7 +38977,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -38298,7 +39102,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -38346,7 +39150,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -38500,7 +39304,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -38510,7 +39314,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -38719,7 +39523,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -39571,6 +40375,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for westmere */ /* including generic/stage2/stringparsing.h for westmere: #include */ /* begin file generic/stage2/stringparsing.h for westmere */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -39723,7 +40528,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -39768,7 +40574,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -39810,6 +40617,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace westmere } // namespace simdjson @@ -40338,7 +41146,6 @@ simdjson_warn_unused error_code dom_parser_implementation::parse(const uint8_t * if (error) { return error; } return stage2(_doc); } - } // namespace westmere } // namespace simdjson @@ -40939,7 +41746,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -40968,6 +41775,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + static_cast((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace lsx } // namespace simdjson @@ -41387,12 +42219,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -41401,6 +42238,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -41442,6 +42289,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -41818,7 +42666,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -41846,7 +42694,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -41935,7 +42783,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -41998,13 +42846,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -42030,7 +42878,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -42814,12 +43662,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -43488,7 +44365,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -43517,6 +44394,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + static_cast((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace lsx } // namespace simdjson @@ -44224,7 +45126,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -44349,7 +45251,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -44397,7 +45299,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -44551,7 +45453,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -44561,7 +45463,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -44770,7 +45672,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -45622,6 +46524,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for lsx */ /* including generic/stage2/stringparsing.h for lsx: #include */ /* begin file generic/stage2/stringparsing.h for lsx */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -45774,7 +46677,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -45819,7 +46723,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -45861,6 +46766,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace lsx } // namespace simdjson @@ -46971,7 +47877,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -46994,6 +47900,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask() + }; +} + } // unnamed namespace } // namespace lasx } // namespace simdjson @@ -47413,12 +48344,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -47427,6 +48363,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -47468,6 +48414,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -47844,7 +48791,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -47872,7 +48819,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -47961,7 +48908,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -48024,13 +48971,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -48056,7 +49003,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -48840,12 +49787,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -49536,7 +50512,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -49559,6 +50535,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask() + }; +} + } // unnamed namespace } // namespace lasx } // namespace simdjson @@ -50266,7 +51267,7 @@ using namespace simd; } } // do not forget to call check_eof! - simdjson_inline error_code errors() { + simdjson_warn_unused simdjson_inline error_code errors() { return this->error.any_bits_set_anywhere() ? error_code::UTF8_ERROR : error_code::SUCCESS; } @@ -50391,7 +51392,7 @@ class json_scanner { json_scanner() = default; simdjson_inline json_block next(const simd::simd8x64& in); // Returns either UNCLOSED_STRING or SUCCESS - simdjson_inline error_code finish(); + simdjson_warn_unused simdjson_inline error_code finish(); private: // Whether the last character of the previous iteration is part of a scalar token @@ -50439,7 +51440,7 @@ simdjson_inline json_block json_scanner::next(const simd::simd8x64& in) ); } -simdjson_inline error_code json_scanner::finish() { +simdjson_warn_unused simdjson_inline error_code json_scanner::finish() { return string_scanner.finish(); } @@ -50593,7 +51594,7 @@ class json_minifier { template simdjson_inline void step(const uint8_t *block_buf, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block); - simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); + simdjson_warn_unused simdjson_inline error_code finish(uint8_t *dst_start, size_t &dst_len); json_scanner scanner{}; uint8_t *dst; }; @@ -50603,7 +51604,7 @@ simdjson_inline void json_minifier::next(const simd::simd8x64& in, cons dst += in.compress(mask, dst); } -simdjson_inline error_code json_minifier::finish(uint8_t *dst_start, size_t &dst_len) { +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; @@ -50812,7 +51813,7 @@ class json_structural_indexer { template simdjson_inline void step(const uint8_t *block, buf_block_reader &reader) noexcept; simdjson_inline void next(const simd::simd8x64& in, const json_block& block, size_t idx); - simdjson_inline error_code finish(dom_parser_implementation &parser, size_t idx, size_t len, stage1_mode partial); + 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{}; @@ -51664,6 +52665,7 @@ simdjson_warn_unused simdjson_inline error_code json_iterator::visit_primitive(V /* end file generic/stage2/json_iterator.h for lasx */ /* including generic/stage2/stringparsing.h for lasx: #include */ /* begin file generic/stage2/stringparsing.h for lasx */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -51816,7 +52818,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -51861,7 +52864,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -51903,6 +52907,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace lasx } // namespace simdjson @@ -52516,7 +53521,7 @@ namespace { struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline static 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 c == '"'; } simdjson_inline bool has_backslash() { return c == '\\'; } @@ -52532,6 +53537,24 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin 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 @@ -53038,12 +54061,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -53052,6 +54080,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -53093,6 +54131,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -53469,7 +54508,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -53497,7 +54536,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -53586,7 +54625,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -53649,13 +54688,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -53681,7 +54720,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -54465,12 +55504,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -54670,7 +55738,7 @@ namespace { struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline static 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 c == '"'; } simdjson_inline bool has_backslash() { return c == '\\'; } @@ -54686,6 +55754,24 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin 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 @@ -54892,6 +55978,7 @@ simdjson_inline uint32_t find_next_document_index(dom_parser_implementation &par /* end file generic/stage1/find_next_document_index.h for fallback */ /* including generic/stage2/stringparsing.h for fallback: #include */ /* begin file generic/stage2/stringparsing.h for fallback */ +#include #ifndef SIMDJSON_SRC_GENERIC_STAGE2_STRINGPARSING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -55044,7 +56131,8 @@ simdjson_inline bool handle_unicode_codepoint_wobbly(const uint8_t **src_ptr, 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -55089,7 +56177,8 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t // 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 bs_quote = backslash_and_quote::copy_and_find(src, dst); + 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 @@ -55131,6 +56220,7 @@ simdjson_warn_unused simdjson_inline uint8_t *parse_wobbly_string(const uint8_t } } // namespace stringparsing + } // unnamed namespace } // namespace fallback } // namespace simdjson @@ -56097,10 +57187,78 @@ simdjson_inline void validate_utf8_character() { idx += 4; } +static const uint8_t CHAR_TYPE_SPACE = 1 << 0; +static const uint8_t CHAR_TYPE_OPERATOR = 1 << 1; +static const uint8_t CHAR_TYPE_ESC_ASCII = 1 << 2; +static const uint8_t CHAR_TYPE_NON_ASCII = 1 << 3; + +const uint8_t char_table[256] = { + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x04, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 +}; + +simdjson_inline bool char_is_type(uint8_t c, uint8_t type) { + return (char_table[c] & type); +} + +simdjson_inline bool char_is_space(uint8_t c) { + return char_is_type(c, CHAR_TYPE_SPACE); +} + +simdjson_inline bool char_is_operator(uint8_t c) { + return char_is_type(c, CHAR_TYPE_OPERATOR); +} + +simdjson_inline bool char_is_space_or_operator(uint8_t c) { + return char_is_type(c, CHAR_TYPE_SPACE | CHAR_TYPE_OPERATOR); +} + +simdjson_inline bool char_is_ascii_stop(uint8_t c) { + return char_is_type(c, CHAR_TYPE_ESC_ASCII | CHAR_TYPE_NON_ASCII); +} + // Returns true if the string is unclosed. simdjson_inline bool validate_string() { idx++; // skip first quote - while (idx < len && buf[idx] != '"') { + while (idx < len) { + do { + if (char_is_ascii_stop(buf[idx])) { break; } + idx++; + } while (idx < len); + if (idx >= len) { return true; } + if (buf[idx] == '"') { + return false; + } if (buf[idx] == '\\') { idx += 2; } else if (simdjson_unlikely(buf[idx] & 0x80)) { @@ -56114,43 +57272,31 @@ simdjson_inline bool validate_string() { return false; } -simdjson_inline bool is_whitespace_or_operator(uint8_t c) { - switch (c) { - case '{': case '}': case '[': case ']': case ',': case ':': - case ' ': case '\r': case '\n': case '\t': - return true; - default: - return false; - } -} - // // Parse the entire input in STEP_SIZE-byte chunks. // -simdjson_inline error_code scan() { +simdjson_warn_unused simdjson_inline error_code scan() { bool unclosed_string = false; for (;idx= len) { break; } + // String + if (buf[idx] == '"') { + add_structural(); + unclosed_string |= validate_string(); + // Operator + } else if (char_is_operator(buf[idx])) { + add_structural(); + // Primitive or invalid character (invalid characters will be checked in stage 2) + } else { + // Anything else, add the structural and go until we find the next one + add_structural(); + while (idx+1) #include #endif #endif +// The current specification is unclear on how we detect +// static reflection, both __cpp_lib_reflection and +// __cpp_impl_reflection are proposed in the draft specification. +// For now, we disable static reflect by default. It must be +// specified at compiler time. +#ifndef SIMDJSON_STATIC_REFLECTION +#define SIMDJSON_STATIC_REFLECTION 0 // disabled by default. +#endif + #if defined(__apple_build_version__) #if __apple_build_version__ < 14000000 #define SIMDJSON_CONCEPT_DISABLED 1 // apple-clang/13 doesn't support std::convertible_to #endif #endif +#if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L +#include +#define SIMDJSON_SUPPORTS_RANGES 1 +#else +#define SIMDJSON_SUPPORTS_RANGES 0 +#endif #if defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) #if __cpp_concepts >= 201907L #include -#define SIMDJSON_SUPPORTS_DESERIALIZATION 1 +#define SIMDJSON_SUPPORTS_CONCEPTS 1 #else -#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#define SIMDJSON_SUPPORTS_CONCEPTS 0 #endif #else // defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) -#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#define SIMDJSON_SUPPORTS_CONCEPTS 0 #endif // defined(__cpp_concepts) && !defined(SIMDJSON_CONCEPT_DISABLED) +// copy SIMDJSON_SUPPORTS_CONCEPTS to SIMDJSON_SUPPORTS_DESERIALIZATION. +#if SIMDJSON_SUPPORTS_CONCEPTS +#define SIMDJSON_SUPPORTS_DESERIALIZATION 1 +#else +#define SIMDJSON_SUPPORTS_DESERIALIZATION 0 +#endif + + +#if !defined(SIMDJSON_CONSTEVAL) +#if defined(__cpp_consteval) && __cpp_consteval >= 201811L && defined(__cpp_lib_constexpr_string) && __cpp_lib_constexpr_string >= 201907L +#define SIMDJSON_CONSTEVAL 1 +#else +#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" */ @@ -172,6 +213,22 @@ 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 + // 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 + #endif #elif defined(__loongarch_lp64) #define SIMDJSON_IS_LOONGARCH64 1 #elif defined(__PPC64__) || defined(_M_PPC64) @@ -318,6 +375,7 @@ using std::size_t; #if defined(NDEBUG) || defined(__OPTIMIZE__) || (defined(_MSC_VER) && !defined(_DEBUG)) // 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. #if SIMDJSON_VISUAL_STUDIO #define SIMDJSON_UNREACHABLE() __assume(0) #define SIMDJSON_ASSUME(COND) __assume(COND) @@ -569,17 +627,6 @@ double from_chars(const char *first, const char* end) noexcept; // We assume by default static linkage #define SIMDJSON_DLLIMPORTEXPORT #endif - -/** - * Workaround for the vcpkg package manager. Only vcpkg should - * ever touch the next line. The SIMDJSON_USING_LIBRARY macro is otherwise unused. - */ -#if SIMDJSON_USING_LIBRARY -#define SIMDJSON_DLLIMPORTEXPORT __declspec(dllimport) -#endif -/** - * End of workaround for the vcpkg package manager. - */ #else #define SIMDJSON_DLLIMPORTEXPORT #endif @@ -1042,9 +1089,9 @@ using std::operator<<; #endif #if nssv_HAVE_NODISCARD -# define nssv_nodiscard [[nodiscard]] +# define nssv_nodiscard simdjson_warn_unused #else -# define nssv_nodiscard /*[[nodiscard]]*/ +# define nssv_nodiscard /*simdjson_warn_unused*/ #endif // Additional includes: @@ -2362,16 +2409,25 @@ namespace std { // It could also wrongly set SIMDJSON_DEVELOPMENT_CHECKS (e.g., if the programmer // sets _DEBUG in a release build under Visual Studio, or if some compiler fails to // set the __OPTIMIZE__ macro). +// We make it so that if NDEBUG is defined, then SIMDJSON_DEVELOPMENT_CHECKS +// is not defined, irrespective of the compiler. +// We recommend that users set NDEBUG in release builds, so that +// SIMDJSON_DEVELOPMENT_CHECKS is not defined in release builds by default, +// irrespective of the compiler. #ifndef SIMDJSON_DEVELOPMENT_CHECKS #ifdef _MSC_VER // Visual Studio seems to set _DEBUG for debug builds. -#ifdef _DEBUG +// We set SIMDJSON_DEVELOPMENT_CHECKS to 1 if _DEBUG is defined +// and NDEBUG is not defined. +#if defined(_DEBUG) && !defined(NDEBUG) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // _DEBUG #else // _MSC_VER // All other compilers appear to set __OPTIMIZE__ to a positive integer // when the compiler is optimizing. -#ifndef __OPTIMIZE__ +// We only set SIMDJSON_DEVELOPMENT_CHECKS if both __OPTIMIZE__ +// and NDEBUG are not defined. +#if !defined(__OPTIMIZE__) && !defined(NDEBUG) #define SIMDJSON_DEVELOPMENT_CHECKS 1 #endif // __OPTIMIZE__ #endif // _MSC_VER @@ -2427,6 +2483,18 @@ namespace std { #define SIMDJSON_AVX512_ALLOWED 1 #endif + +#ifndef __has_cpp_attribute +#define simdjson_lifetime_bound +#elif __has_cpp_attribute(msvc::lifetimebound) +#define simdjson_lifetime_bound [[msvc::lifetimebound]] +#elif __has_cpp_attribute(clang::lifetimebound) +#define simdjson_lifetime_bound [[clang::lifetimebound]] +#elif __has_cpp_attribute(lifetimebound) +#define simdjson_lifetime_bound [[lifetimebound]] +#else +#define simdjson_lifetime_bound +#endif #endif // SIMDJSON_COMMON_DEFS_H /* end file simdjson/common_defs.h */ @@ -2440,18 +2508,18 @@ namespace std { #define SIMDJSON_SIMDJSON_VERSION_H /** The version of simdjson being used (major.minor.revision) */ -#define SIMDJSON_VERSION "3.13.0" +#define SIMDJSON_VERSION "4.1.0" namespace simdjson { enum { /** * The major version (MAJOR.minor.revision) of simdjson being used. */ - SIMDJSON_VERSION_MAJOR = 3, + SIMDJSON_VERSION_MAJOR = 4, /** * The minor version (major.MINOR.revision) of simdjson being used. */ - SIMDJSON_VERSION_MINOR = 13, + SIMDJSON_VERSION_MINOR = 1, /** * The revision (major.minor.REVISION) of simdjson being used. */ @@ -2526,7 +2594,8 @@ enum error_code { SCALAR_DOCUMENT_AS_VALUE, ///< A scalar document is treated as a value. OUT_OF_BOUNDS, ///< Attempted to access location outside of document. TRAILING_CONTENT, ///< Unexpected trailing content in the JSON input - NUM_ERROR_CODES + OUT_OF_CAPACITY, ///< The capacity was exceeded, we cannot allocate enough memory. + NUM_ERROR_CODES ///< Placeholder for end of error code list. }; /** @@ -2584,6 +2653,10 @@ namespace internal { /** * The result of a simdjson operation that could fail. * + * IMPORTANT: For the ondemand API, we use implementation_simdjson_result_base as a base class + * to avoid some compilation issue. Thus, if you modify this class, please ensure that the ondemand + * implementation_simdjson_result_base is also modified. + * * 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 @@ -2644,8 +2717,27 @@ struct simdjson_result_base : protected std::pair { */ simdjson_inline error_code error() const noexcept; + /** + * Whether there is a value. + */ + simdjson_inline bool has_value() const noexcept; #if SIMDJSON_EXCEPTIONS + /** + * Dereference operator to access the contained 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); + /** * Get the result value. * @@ -2679,12 +2771,42 @@ struct simdjson_result_base : protected std::pair { /** * Get the result value. This function is safe if and only * the error() method returns a value that evaluates to false. + * We discourage the use of value_unsafe(). + * + * The recommended pattern is: + * + * T value; // where T is the type + * auto error = result.get(value); + * if (error) { + * // handle error + * } + * + * Or you may call 'value()' which will raise an exception + * in case of error: + * + * T value = result.value(); */ simdjson_inline const T& value_unsafe() const& noexcept; /** * Take the result value (move it). This function is safe if and only * the error() method returns a value that evaluates to false. + * We discourage the use of value_unsafe(). + * + * The recommended pattern is: + * + * T value; // where T is the type + * auto error = result.get(value); + * if (error) { + * // handle error, return, exit, abort + * } else { + * // use value here. + * } + * + * Or you may call 'value()' which will raise an exception + * in case of error: + * + * T value = result.value(); */ simdjson_inline T&& value_unsafe() && noexcept; @@ -2699,6 +2821,7 @@ struct simdjson_result_base : protected std::pair { */ template struct simdjson_result : public internal::simdjson_result_base { + /** * @private Create a new empty result with error = UNINITIALIZED. */ @@ -2730,24 +2853,33 @@ struct simdjson_result : public internal::simdjson_result_base { * @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; -// + /** * Copy the value to a provided std::string, only enabled for std::string_view. * * @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(std::string &value) && noexcept -#if SIMDJSON_SUPPORTS_DESERIALIZATION - requires (!std::is_same_v) -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION - ; + template + simdjson_warn_unused simdjson_inline error_code get(std::string &value) && noexcept { + static_assert(std::is_same::value, "SFINAE"); + std::string_view v; + error_code error = std::forward>(*this).get(v); + if (!error) { + value.assign(v.data(), v.size()); + } + return error; + } + /** * The error. */ simdjson_inline error_code error() const noexcept; -#if SIMDJSON_EXCEPTIONS + +#if SIMDJSON_EXCEPTIONS + using internal::simdjson_result_base::operator*; + using internal::simdjson_result_base::operator->; /** * Get the result value. * @@ -2818,7 +2950,7 @@ inline const std::string error_message(int error) noexcept; /* begin file simdjson/concepts.h */ #ifndef SIMDJSON_CONCEPTS_H #define SIMDJSON_CONCEPTS_H -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #include #include @@ -2850,7 +2982,9 @@ SIMDJSON_IMPL_CONCEPT(op_append, operator+=) #undef SIMDJSON_IMPL_CONCEPT } // namespace details - +template +concept is_pair = requires { typename T::first_type; typename T::second_type; } && + std::same_as>; template concept string_view_like = std::is_convertible_v && !std::is_convertible_v; @@ -2933,21 +3067,152 @@ concept optional_type = requires(std::remove_cvref_t obj) { { obj.value() } -> std::same_as::value_type&>; requires requires(typename std::remove_cvref_t::value_type &&val) { obj.emplace(std::move(val)); - obj = std::move(val); { obj.value_or(val) } -> std::convertible_to::value_type>; }; { static_cast(obj) } -> std::same_as; // convertible to bool + { obj.reset() } noexcept -> std::same_as; }; +// Types we serialize as JSON strings (not as containers) +template +concept string_like = + std::is_same_v, std::string> || + std::is_same_v, std::string_view> || + std::is_same_v, const char*> || + std::is_same_v, char*>; + +// Concept that checks if a type is a container but not a string (because +// strings handling must be handled differently) +// Now uses iterator-based approach for broader container support +template +concept container_but_not_string = + std::ranges::input_range && !string_like && !concepts::string_view_keyed_map; + + + +// Concept: Indexable container that is not a string or associative container +// Accepts: std::vector, std::array, std::deque (have operator[], value_type, not string_like) +// Rejects: std::string (string_like), std::list (no operator[]), std::map (has key_type) +template +concept indexable_container = requires { + typename Container::value_type; + requires !concepts::string_like; + requires !requires { typename Container::key_type; }; // Reject maps/sets + requires requires(Container& c, std::size_t i) { + { c[i] } -> std::convertible_to; + }; +}; + + +// Variable template to use with std::meta::substitute +template +constexpr bool indexable_container_v = indexable_container; + } // namespace concepts + + +/** + * We use tag_invoke as our customization point mechanism. + */ +template +concept tag_invocable = requires(Tag tag, Args... args) { + tag_invoke(std::forward(tag), std::forward(args)...); +}; + +template +concept nothrow_tag_invocable = + tag_invocable && requires(Tag tag, Args... args) { + { + tag_invoke(std::forward(tag), std::forward(args)...) + } noexcept; + }; + } // namespace simdjson -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS #endif // SIMDJSON_CONCEPTS_H /* end file simdjson/concepts.h */ +/* including simdjson/constevalutil.h: #include "simdjson/constevalutil.h" */ +/* begin file simdjson/constevalutil.h */ +#ifndef SIMDJSON_CONSTEVALUTIL_H +#define SIMDJSON_CONSTEVALUTIL_H + +#include +#include +#include + +namespace simdjson { +namespace constevalutil { +#if SIMDJSON_CONSTEVAL + +constexpr static std::array 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}; +constexpr static std::array 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"}; +// unoptimized, meant for compile-time execution +consteval std::string consteval_to_quoted_escaped(std::string_view input) { + std::string out = "\""; + for (char c : input) { + if (json_quotable_character[uint8_t(c)]) { + if (c == '"') { + out.append("\\\""); + } else if (c == '\\') { + out.append("\\\\"); + } else { + std::string_view v = control_chars[uint8_t(c)]; + out.append(v); + } + } else { + out.push_back(c); + } + } + out.push_back('"'); + return out; +} +#endif // SIMDJSON_CONSTEVAL + + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +struct fixed_string { + constexpr fixed_string(const char (&str)[N]) { + for (std::size_t i = 0; i < N; ++i) { + data[i] = str[i]; + } + } + char data[N]; + constexpr std::string_view view() const { return {data, N - 1}; } +}; +template +fixed_string(const char (&)[N]) -> fixed_string; + +template +struct string_constant { + static constexpr std::string_view value = str.view(); +}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + +} // namespace constevalutil +} // namespace simdjson +#endif // SIMDJSON_CONSTEVALUTIL_H +/* end file simdjson/constevalutil.h */ /** * @brief The top level simdjson namespace, containing everything the library provides. @@ -3071,8 +3336,38 @@ simdjson_inline error_code simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_inline bool simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS + +template +simdjson_inline T& simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -3097,6 +3392,7 @@ simdjson_inline simdjson_result_base::operator T&&() && noexcept(false) { #endif // SIMDJSON_EXCEPTIONS + template simdjson_inline const T& simdjson_result_base::value_unsafe() const& noexcept { return this->first; @@ -3131,26 +3427,10 @@ simdjson_inline void simdjson_result::tie(T &value, error_code &error) && noe std::forward>(*this).tie(value, error); } -template -simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &value) && noexcept { - return std::forward>(*this).get(value); -} - template simdjson_warn_unused simdjson_inline error_code -simdjson_result::get(std::string &value) && noexcept -#if SIMDJSON_SUPPORTS_DESERIALIZATION -requires (!std::is_same_v) -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION -{ - // SFINAE : n'active que pour T = std::string_view - static_assert(std::is_same::value, "simdjson_result::get(std::string&) n'est disponible que pour T = std::string_view"); - std::string_view v; - error_code error = std::forward>(*this).get(v); - if (!error) { - value.assign(v.data(), v.size()); - } - return error; +simdjson_result::get(T &value) && noexcept { + return std::forward>(*this).get(value); } template @@ -4016,6 +4296,9 @@ class padded_string_view : public std::string_view { /** The number of allocated bytes. */ inline size_t capacity() const noexcept; + /** check that the view has sufficient padding */ + inline bool has_sufficient_padding() const noexcept; + /** * Remove the UTF-8 Byte Order Mark (BOM) if it exists. * @@ -4042,14 +4325,24 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result= SIMDJSON_PADDING) { + return true; + } + size_t missing_padding = SIMDJSON_PADDING - padding(); + if(length() < missing_padding) { return false; } + + for (size_t i = length() - missing_padding; i < length(); i++) { + char c = data()[i]; + if (c != ' ' && c != '\t' && c != '\n' && c != '\r') { + return false; + } + } + return true; +} + inline size_t padded_string_view::capacity() const noexcept { return _capacity; } inline size_t padded_string_view::padding() const noexcept { return capacity() - length(); } @@ -4114,10 +4423,33 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result 0; i--) { + char c = s[i - 1]; + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + existing_padding++; + } else { + break; + } + } + size_t needed_padding = 0; + if (existing_padding < SIMDJSON_PADDING) { + needed_padding = SIMDJSON_PADDING - existing_padding; + s.append(needed_padding, ' '); + } + + return padded_string_view(s.data(), s.size() - needed_padding, s.size()); } + +inline padded_string_view pad_with_reserve(std::string& s) noexcept { + if (s.capacity() - s.size() < SIMDJSON_PADDING) { + s.reserve(s.size() + SIMDJSON_PADDING ); + } + return padded_string_view(s.data(), s.size(), s.capacity()); +} + + + } // namespace simdjson @@ -4242,9 +4574,9 @@ inline const char *padded_string::data() const noexcept { return data_ptr; } inline char *padded_string::data() noexcept { return data_ptr; } -inline padded_string::operator std::string_view() const { return std::string_view(data(), length()); } +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 { +inline padded_string::operator padded_string_view() const noexcept simdjson_lifetime_bound { return padded_string_view(data(), length(), length() + SIMDJSON_PADDING); } @@ -4384,6 +4716,8 @@ class tape_ref; #ifndef SIMDJSON_DOM_ARRAY_H #define SIMDJSON_DOM_ARRAY_H +#include + /* skipped duplicate #include "simdjson/dom/base.h" */ /* including simdjson/internal/tape_ref.h: #include "simdjson/internal/tape_ref.h" */ /* begin file simdjson/internal/tape_ref.h */ @@ -4491,7 +4825,7 @@ class array { iterator& operator=(const iterator&) noexcept = default; private: simdjson_inline iterator(const internal::tape_ref &tape) noexcept; - internal::tape_ref tape; + internal::tape_ref tape{}; friend class array; }; @@ -4542,12 +4876,23 @@ class array { */ inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept; + /** + * Recursive function which processes the JSON path of each child element + */ + inline void process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept; + + + /** + * Adds support for JSONPath expression with wildcards '*' + */ + inline simdjson_result> at_path_with_wildcard(std::string_view json_path) const 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -4575,6 +4920,15 @@ class array { */ inline simdjson_result at(size_t index) const noexcept; + /** + * Gets the values of items in an array element + * This function has linear-time complexity: the values are checked one by one. + * + * @return The child elements of an array + */ + + inline std::vector& get_values(std::vector& out) const noexcept; + /** * Implicitly convert object to element */ @@ -4582,7 +4936,7 @@ class array { private: simdjson_inline array(const internal::tape_ref &tape) noexcept; - internal::tape_ref tape; + internal::tape_ref tape{}; friend class element; friend struct simdjson_result; template @@ -4601,8 +4955,11 @@ struct simdjson_result : public internal::simdjson_result_base at_pointer(std::string_view json_pointer) const noexcept; + inline void process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept; + inline simdjson_result> at_path_with_wildcard(std::string_view json_path) const noexcept; inline simdjson_result at_path(std::string_view json_path) const noexcept; inline simdjson_result at(size_t index) const noexcept; + inline std::vector& get_values(std::vector& out) const noexcept; #if SIMDJSON_EXCEPTIONS inline dom::array::iterator begin() const noexcept(false); @@ -4615,9 +4972,7 @@ struct simdjson_result : public internal::simdjson_result_base - +#if SIMDJSON_SUPPORTS_RANGES namespace std { namespace ranges { template<> @@ -4628,7 +4983,7 @@ inline constexpr bool enable_view load(const std::string &path) & noexcept; - inline simdjson_result load(const std::string &path) && = delete ; + inline simdjson_result load(std::string_view path) & noexcept; + inline simdjson_result load(std::string_view path) && = delete ; /** * Load a JSON document from a file into a provide document instance and return a temporary reference to it. @@ -4883,8 +5238,8 @@ class parser { * - 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 load_into_document(document& doc, const std::string &path) & noexcept; - inline simdjson_result load_into_document(document& doc, const std::string &path) && =delete; + inline simdjson_result load_into_document(document& doc, std::string_view path) & noexcept; + inline simdjson_result load_into_document(document& doc, std::string_view path) && =delete; /** * Parse a JSON document and return a temporary reference to it. @@ -5121,7 +5476,7 @@ class parser { * - 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 load_many(const std::string &path, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept; + inline simdjson_result load_many(std::string_view path, size_t batch_size = dom::DEFAULT_BATCH_SIZE) noexcept; /** * Parse a buffer containing many JSON documents. @@ -5392,7 +5747,7 @@ class parser { inline error_code ensure_capacity(document& doc, size_t desired_capacity) noexcept; /** Read the file into loaded_bytes */ - inline simdjson_result read_file(const std::string &path) noexcept; + inline simdjson_result read_file(std::string_view path) noexcept; friend class parser::Iterator; friend class document_stream; @@ -5476,7 +5831,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * error = parser.parse_many(json).get(docs); * ``` @@ -5729,6 +6084,8 @@ struct simdjson_result : public internal::simdjson_result_ #ifndef SIMDJSON_DOM_ELEMENT_H #define SIMDJSON_DOM_ELEMENT_H +#include + /* skipped duplicate #include "simdjson/dom/base.h" */ /* skipped duplicate #include "simdjson/dom/array.h" */ @@ -6127,12 +6484,14 @@ class element { */ inline simdjson_result at_pointer(const std::string_view json_pointer) const noexcept; + inline simdjson_result> at_path_with_wildcard(const std::string_view json_path) const 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -6220,7 +6579,7 @@ class element { private: simdjson_inline element(const internal::tape_ref &tape) noexcept; - internal::tape_ref tape; + internal::tape_ref tape{}; friend class document; friend class object; friend class array; @@ -6272,6 +6631,7 @@ struct simdjson_result : public internal::simdjson_result_base operator[](const char *key) const noexcept; simdjson_result operator[](int) const noexcept = delete; simdjson_inline simdjson_result at_pointer(const std::string_view json_pointer) const noexcept; + simdjson_inline simdjson_result> at_path_with_wildcard(const std::string_view json_path) const noexcept; simdjson_inline simdjson_result at_path(const std::string_view json_path) const noexcept; [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]] simdjson_inline simdjson_result at(const std::string_view json_pointer) const noexcept; @@ -6303,6 +6663,8 @@ struct simdjson_result : public internal::simdjson_result_base + /* skipped duplicate #include "simdjson/dom/base.h" */ /* skipped duplicate #include "simdjson/dom/element.h" */ /* skipped duplicate #include "simdjson/internal/tape_ref.h" */ @@ -6391,7 +6753,7 @@ class object { private: simdjson_inline iterator(const internal::tape_ref &tape) noexcept; - internal::tape_ref tape; + internal::tape_ref tape{}; friend class object; }; @@ -6474,12 +6836,22 @@ class object { */ inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept; + /** + * Recursive function which processes the JSON path of each child element + */ + inline void process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept; + + /** + * Adds support for JSONPath expression with wildcards '*' + */ + inline simdjson_result> at_path_with_wildcard(std::string_view json_path) const 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -6505,6 +6877,14 @@ class object { */ inline simdjson_result at_key(std::string_view key) const noexcept; + /** + * Gets the values associated with keys of an object + * This function has linear-time complexity: the keys are checked one by one. + * + * @return the values associated with each key of an object + */ + inline std::vector& get_values(std::vector& out) const noexcept; + /** * Get the value associated with the given key in a case-insensitive manner. * It is only guaranteed to work over ASCII inputs. @@ -6526,7 +6906,7 @@ class object { private: simdjson_inline object(const internal::tape_ref &tape) noexcept; - internal::tape_ref tape; + internal::tape_ref tape{}; friend class element; friend struct simdjson_result; @@ -6563,8 +6943,11 @@ struct simdjson_result : public internal::simdjson_result_base operator[](const char *key) const noexcept; simdjson_result operator[](int) const noexcept = delete; inline simdjson_result at_pointer(std::string_view json_pointer) const noexcept; + inline void process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept; + inline simdjson_result> at_path_with_wildcard(std::string_view json_path_new) const noexcept; inline simdjson_result at_path(std::string_view json_path) const noexcept; inline simdjson_result at_key(std::string_view key) const noexcept; + inline std::vector& get_values(std::vector& out) const noexcept; inline simdjson_result at_key_case_insensitive(std::string_view key) const noexcept; #if SIMDJSON_EXCEPTIONS @@ -6576,9 +6959,7 @@ struct simdjson_result : public internal::simdjson_result_base - +#if SIMDJSON_SUPPORTS_RANGES namespace std { namespace ranges { template<> @@ -6589,7 +6970,7 @@ inline constexpr bool enable_view - namespace simdjson { /** @@ -6614,8 +6993,7 @@ namespace simdjson { */ namespace internal { -template -class base_formatter { +template class base_formatter { public: /** Add a comma **/ simdjson_inline void comma(); @@ -6654,24 +7032,76 @@ class base_formatter { /** Prints one character **/ simdjson_inline void one_char(char c); + /** Prints characters in [begin, end) verbatim. **/ + simdjson_inline void chars(const char *begin, const char *end); + simdjson_inline void call_print_newline() { - static_cast(this)->print_newline(); + static_cast(this)->print_newline(); } simdjson_inline void call_print_indents(size_t depth) { - static_cast(this)->print_indents(depth); + static_cast(this)->print_indents(depth); } simdjson_inline void call_print_space() { - static_cast(this)->print_space(); + static_cast(this)->print_space(); } protected: // implementation details (subject to change) /** Backing buffer **/ - std::vector buffer{}; // not ideal! -}; + struct vector_with_small_buffer { + vector_with_small_buffer() = default; + ~vector_with_small_buffer() { free_buffer(); } + + vector_with_small_buffer(const vector_with_small_buffer &) = delete; + vector_with_small_buffer & + operator=(const vector_with_small_buffer &) = delete; + + void clear() { + size = 0; + capacity = StaticCapacity; + free_buffer(); + buffer = array; + } + + simdjson_inline void push_back(char c) { + if (capacity < size + 1) + grow(capacity * 2); + buffer[size++] = c; + } + + simdjson_inline void append(const char *begin, const char *end) { + const size_t new_size = size + (end - begin); + if (capacity < new_size) + // std::max(new_size, capacity * 2); is broken in tests on Windows + grow(new_size < capacity * 2 ? capacity * 2 : new_size); + std::copy(begin, end, buffer + size); + size = new_size; + } + std::string_view str() const { return std::string_view(buffer, size); } + + private: + void free_buffer() { + if (buffer != array) + delete[] buffer; + } + void grow(size_t new_capacity) { + auto new_buffer = new char[new_capacity]; + std::copy(buffer, buffer + size, new_buffer); + free_buffer(); + buffer = new_buffer; + capacity = new_capacity; + } + + static const size_t StaticCapacity = 64; + char array[StaticCapacity]; + char *buffer = array; + size_t size = 0; + size_t capacity = StaticCapacity; + } buffer{}; +}; /** * @private This is the class that we expect to use with the string_builder @@ -6705,9 +7135,11 @@ class pretty_formatter : public base_formatter { * by a "formatter" which handles the details. Thus * the string_builder template could support both minification * and prettification, and various other tradeoffs. + * + * This is not to be confused with the simdjson::builder::string_builder + * which is a different class. */ -template -class string_builder { +template class string_builder { public: /** Construct an initially empty builder, would print the empty string **/ string_builder() = default; @@ -6729,11 +7161,12 @@ class string_builder { simdjson_inline std::string_view str() const; /** Append a key_value_pair to the builder (to be printed) **/ simdjson_inline void append(simdjson::dom::key_value_pair value); + private: formatter format{}; }; -} // internal +} // namespace internal namespace dom { @@ -6742,33 +7175,43 @@ namespace dom { * * @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. + * @throw if there is an error with the underlying output stream. simdjson + * itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::element value); +inline std::ostream &operator<<(std::ostream &out, + simdjson::dom::element value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x); #endif /** * Print JSON to an output stream. * * @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. + * @throw if there is an error with the underlying output stream. simdjson + * itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::array value); +inline std::ostream &operator<<(std::ostream &out, simdjson::dom::array value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x); #endif /** * Print JSON to an output stream. * * @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. + * @throw if there is an error with the underlying output stream. simdjson + * itself will not throw. */ -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::object value); +inline std::ostream &operator<<(std::ostream &out, simdjson::dom::object value); #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x); #endif } // namespace dom @@ -6780,47 +7223,47 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result -std::string to_string(T x) { - // in C++, to_string is standard: http://www.cplusplus.com/reference/string/to_string/ - // Currently minify and to_string are identical but in the future, they may - // differ. - simdjson::internal::string_builder<> sb; - sb.append(x); - std::string_view answer = sb.str(); - return std::string(answer.data(), answer.size()); +template std::string to_string(T x) { + // in C++, to_string is standard: + // http://www.cplusplus.com/reference/string/to_string/ Currently minify and + // to_string are identical but in the future, they may differ. + simdjson::internal::string_builder<> sb; + sb.append(x); + std::string_view answer = sb.str(); + return std::string(answer.data(), answer.size()); } #if SIMDJSON_EXCEPTIONS -template -std::string to_string(simdjson_result x) { - if (x.error()) { throw simdjson_error(x.error()); } - return to_string(x.value()); +template std::string to_string(simdjson_result x) { + if (x.error()) { + throw simdjson_error(x.error()); + } + return to_string(x.value()); } #endif /** - * Minifies a JSON element or document, printing the smallest possible valid JSON. + * Minifies a JSON element or document, printing the smallest possible valid + * JSON. * * dom::parser parser; * element doc = parser.parse(" [ 1 , 2 , 3 ] "_padded); * cout << minify(doc) << endl; // prints [1,2,3] * */ -template -std::string minify(T x) { - return to_string(x); -} +template std::string minify(T x) { return to_string(x); } #if SIMDJSON_EXCEPTIONS -template -std::string minify(simdjson_result x) { - if (x.error()) { throw simdjson_error(x.error()); } - return to_string(x.value()); +template std::string minify(simdjson_result x) { + if (x.error()) { + throw simdjson_error(x.error()); + } + return to_string(x.value()); } #endif /** - * Prettifies a JSON element or document, printing the valid JSON with indentation. + * Prettifies a JSON element or document, printing the valid JSON with + * indentation. * * dom::parser parser; * element doc = parser.parse(" [ 1 , 2 , 3 ] "_padded); @@ -6836,25 +7279,24 @@ std::string minify(simdjson_result x) { * cout << prettify(doc) << endl; * */ -template -std::string prettify(T x) { - simdjson::internal::string_builder sb; - sb.append(x); - std::string_view answer = sb.str(); - return std::string(answer.data(), answer.size()); +template std::string prettify(T x) { + simdjson::internal::string_builder sb; + sb.append(x); + std::string_view answer = sb.str(); + return std::string(answer.data(), answer.size()); } #if SIMDJSON_EXCEPTIONS -template -std::string prettify(simdjson_result x) { - if (x.error()) { throw simdjson_error(x.error()); } - return to_string(x.value()); +template std::string prettify(simdjson_result x) { + if (x.error()) { + throw simdjson_error(x.error()); + } + return to_string(x.value()); } #endif } // namespace simdjson - #endif /* end file simdjson/dom/serialization.h */ @@ -6878,6 +7320,8 @@ std::string prettify(simdjson_result x) { #include /* skipped duplicate #include "simdjson/common_defs.h" */ +#include + namespace simdjson { /** * Converts JSONPath to JSON Pointer. @@ -6886,12 +7330,12 @@ namespace simdjson { */ inline std::string json_path_to_pointer_conversion(std::string_view json_path) { size_t i = 0; - // if JSONPath starts with $, skip it + // json_path.starts_with('$') requires C++20. if (!json_path.empty() && json_path.front() == '$') { i = 1; } - if (json_path.empty() || (json_path[i] != '.' && + if (i >= json_path.size() || (json_path[i] != '.' && json_path[i] != '[')) { return "-1"; // This is just a sentinel value, the caller should check for this and return an error. } @@ -6934,6 +7378,49 @@ inline std::string json_path_to_pointer_conversion(std::string_view json_path) { return result; } + +inline std::pair get_next_key_and_json_path(std::string_view& json_path) { + std::string_view key; + + if (json_path.empty()) { + return {key, json_path}; + } + size_t i = 0; + + // if JSONPath starts with $, skip it + if (json_path.front() == '$') { + i = 1; + } + + + if (i < json_path.length() && json_path[i] == '.') { + i += 1; + size_t key_start = i; + + while (i < json_path.length() && json_path[i] != '[' && json_path[i] != '.') { + ++i; + } + + key = json_path.substr(key_start, i - key_start); + } else if ((i+1 < json_path.size()) && json_path[i] == '[' && (json_path[i+1] == '\'' || json_path[i+1] == '"')) { + i += 2; + size_t key_start = i; + while (i < json_path.length() && json_path[i] != '\'' && json_path[i] != '"') { + ++i; + } + + key = json_path.substr(key_start, i - key_start); + + i += 2; + } else if ((i+2 < json_path.size()) && json_path[i] == '[' && json_path[i+1] == '*' && json_path[i+2] == ']') { // i.e [*].additional_keys or [*]["additional_keys"] + key = "*"; + i += 3; + } + + + return std::make_pair(key, json_path.substr(i)); +} + } // namespace simdjson #endif // SIMDJSON_JSONPATHUTIL_H /* end file simdjson/jsonpathutil.h */ @@ -7131,11 +7618,22 @@ inline simdjson_result simdjson_result::at_pointer(std return at_pointer(json_pointer); } +inline simdjson_result> simdjson_result::at_path_with_wildcard(std::string_view json_path) const noexcept { + if (error()) { + return error(); + } + return first.at_path_with_wildcard(json_path); +} + inline simdjson_result simdjson_result::at(size_t index) const noexcept { if (error()) { return error(); } return first.at(index); } +inline std::vector& simdjson_result::get_values(std::vector& out) const noexcept { + return first.get_values(out); +} + namespace dom { // @@ -7206,6 +7704,93 @@ inline simdjson_result array::at_path(std::string_view json_path) const return at_pointer(json_pointer); } +inline void array::process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept { + if (current == end) { + return; + } + + simdjson_result> result; + + + for (auto it = current; it != end; ++it) { + std::vector child_result; + auto error = it->at_path_with_wildcard(path_suffix).get(child_result); + if(error) { + continue; + } + accumulator.reserve(accumulator.size() + child_result.size()); + accumulator.insert(accumulator.end(), + std::make_move_iterator(child_result.begin()), + std::make_move_iterator(child_result.end())); + } +} + +inline simdjson_result> array::at_path_with_wildcard(std::string_view json_path) const noexcept { + SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914 + + size_t i = 0; + // json_path.starts_with('$') requires C++20. + if (!json_path.empty() && json_path.front() == '$') { + i = 1; + } + + if (i >= json_path.size() || (json_path[i] != '.' && json_path[i] != '[')) { + return INVALID_JSON_POINTER; + } + + if (json_path.find("*") != std::string::npos) { + std::vector child_values; + + if ( + (json_path.compare(i, 3, "[*]") == 0 && json_path.size() == i + 3) || + (json_path.compare(i, 2,".*") == 0 && json_path.size() == i + 2) + ) { + get_values(child_values); + return child_values; + } + + std::pair key_and_json_path = get_next_key_and_json_path(json_path); + + std::string_view key = key_and_json_path.first; + json_path = key_and_json_path.second; + + if (key.size() > 0) { + if (key == "*") { + get_values(child_values); + } else { + element pointer_result; + std::string json_pointer = std::string("/") + std::string(key); + auto error = at_pointer(json_pointer).get(pointer_result); + + if (!error) { + child_values.emplace_back(pointer_result); + } + } + + std::vector result = {}; + + if (child_values.size() > 0) { + std::vector::iterator child_values_begin = child_values.begin(); + std::vector::iterator child_values_end = child_values.end(); + + process_json_path_of_child_elements(child_values_begin, child_values_end, json_path, result); + } + + return result; + } else { + return INVALID_JSON_POINTER; + } + } else { + element result; + auto error = at_path(json_path).get(result); + if (error) { + return error; + } + + return std::vector{std::move(result)}; + } +} + inline simdjson_result array::at(size_t index) const noexcept { SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914 size_t i=0; @@ -7216,6 +7801,15 @@ inline simdjson_result array::at(size_t index) const noexcept { return INDEX_OUT_OF_BOUNDS; } +inline std::vector& array::get_values(std::vector& out) const noexcept { + out.reserve(this->size()); + for (auto element : *this) { + out.emplace_back(element); + } + + return out; +} + inline array::operator element() const noexcept { return element(tape); } @@ -7315,10 +7909,19 @@ inline simdjson_result simdjson_result::at_path(std:: if (json_pointer == "-1") { return INVALID_JSON_POINTER; } return at_pointer(json_pointer); } +inline simdjson_result> simdjson_result::at_path_with_wildcard(std::string_view json_path) const noexcept { + if (error()) { + return error(); + } + return first.at_path_with_wildcard(json_path); +} inline simdjson_result simdjson_result::at_key(std::string_view key) const noexcept { if (error()) { return error(); } return first.at_key(key); } +inline std::vector& simdjson_result::get_values(std::vector& out) const noexcept { + return first.get_values(out); +} inline simdjson_result simdjson_result::at_key_case_insensitive(std::string_view key) const noexcept { if (error()) { return error(); } return first.at_key_case_insensitive(key); @@ -7418,6 +8021,97 @@ inline simdjson_result object::at_path(std::string_view json_path) cons return at_pointer(json_pointer); } +inline void object::process_json_path_of_child_elements(std::vector::iterator& current, std::vector::iterator& end, const std::string_view& path_suffix, std::vector& accumulator) const noexcept { + if (current == end) { + return; + } + + simdjson_result> result; + + for (auto it = current; it != end; ++it) { + std::vector child_result; + auto error = it->at_path_with_wildcard(path_suffix).get(child_result); + if(error) { + continue; + } + accumulator.reserve(accumulator.size() + child_result.size()); + accumulator.insert(accumulator.end(), + std::make_move_iterator(child_result.begin()), + std::make_move_iterator(child_result.end())); + } +} + +inline simdjson_result> object::at_path_with_wildcard(std::string_view json_path) const noexcept { + SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914 + + size_t i = 0; + if (json_path.empty()) { + return INVALID_JSON_POINTER; + } + // if JSONPath starts with $, skip it + // json_path.starts_with('$') requires C++20. + if (json_path.front() == '$') { + i = 1; + } + + if (i >= json_path.size() || (json_path[i] != '.' && json_path[i] != '[')) { + // expect JSONPath expressions to always start with $ but this isn't currently + // expected in jsonpathutil.h. + return INVALID_JSON_POINTER; + } + + if (json_path.find("*") != std::string::npos) { + + std::vector child_values; + + if ( + (json_path.compare(i, 3, "[*]") == 0 && json_path.size() == i + 3) || + (json_path.compare(i, 2,".*") == 0 && json_path.size() == i + 2) + ) { + get_values(child_values); + return child_values; + } + + std::pair key_and_json_path = get_next_key_and_json_path(json_path); + + std::string_view key = key_and_json_path.first; + json_path = key_and_json_path.second; + + if (key.size() > 0) { + if (key == "*") { + get_values(child_values); + } else { + element pointer_result; + auto error = at_pointer(std::string("/") + std::string(key)).get(pointer_result); + + if (!error) { + child_values.emplace_back(pointer_result); + } + } + + std::vector result = {}; + if (child_values.size() > 0) { + + std::vector::iterator child_values_begin = child_values.begin(); + std::vector::iterator child_values_end = child_values.end(); + + process_json_path_of_child_elements(child_values_begin, child_values_end, json_path, result); + } + + return result; + } else { + return INVALID_JSON_POINTER; + } + } else { + element result; + auto error = this->at_path(json_path).get(result); + if (error) { + return error; + } + return std::vector{std::move(result)}; + } +} + inline simdjson_result object::at_key(std::string_view key) const noexcept { iterator end_field = end(); for (iterator field = begin(); field != end_field; ++field) { @@ -7427,6 +8121,18 @@ inline simdjson_result object::at_key(std::string_view key) const noexc } return NO_SUCH_FIELD; } + +inline std::vector& object::get_values(std::vector& out) const noexcept { + iterator end_field = end(); + iterator begin_field = begin(); + + out.reserve(std::distance(begin_field, end_field)); + for (iterator field = begin_field; field != end_field; ++field) { + out.emplace_back(field.value()); + } + + return out; +} // In case you wonder why we need this, please see // https://github.com/simdjson/simdjson/issues/323 // People do seek keys in a case-insensitive manner. @@ -7538,14 +8244,14 @@ inline key_value_pair::key_value_pair(std::string_view _key, element _value) noe } // namespace simdjson -#if defined(__cpp_lib_ranges) +#if SIMDJSON_SUPPORTS_RANGES static_assert(std::ranges::view); static_assert(std::ranges::sized_range); #if SIMDJSON_EXCEPTIONS static_assert(std::ranges::view>); static_assert(std::ranges::sized_range>); #endif // SIMDJSON_EXCEPTIONS -#endif // defined(__cpp_lib_ranges) +#endif // SIMDJSON_SUPPORTS_RANGES #endif // SIMDJSON_OBJECT_INL_H /* end file simdjson/dom/object-inl.h */ @@ -7669,6 +8375,12 @@ simdjson_inline simdjson_result simdjson_result::at_ if (json_pointer == "-1") { return INVALID_JSON_POINTER; } return at_pointer(json_pointer); } + +simdjson_inline simdjson_result> simdjson_result::at_path_with_wildcard(const std::string_view json_path) const noexcept { + if (error()) { return error(); } + return first.at_path_with_wildcard(json_path); +} + #ifndef SIMDJSON_DISABLE_DEPRECATED_API [[deprecated("For standard compliance, use at_pointer instead, and prefix your pointers with a slash '/', see RFC6901 ")]] simdjson_inline simdjson_result simdjson_result::at(const std::string_view json_pointer) const noexcept { @@ -7959,6 +8671,20 @@ inline simdjson_result element::at_pointer(std::string_view json_pointe } } } + +inline simdjson_result> element::at_path_with_wildcard(std::string_view json_path) const noexcept { + SIMDJSON_DEVELOPMENT_ASSERT(tape.usable()); // https://github.com/simdjson/simdjson/issues/1914 + + switch (tape.tape_ref_type()) { + case internal::tape_type::START_OBJECT: + return object(tape).at_path_with_wildcard(json_path); + case internal::tape_type::START_ARRAY: + return array(tape).at_path_with_wildcard(json_path); + default: + return std::vector{}; + } +} + inline simdjson_result element::at_path(std::string_view json_path) const noexcept { auto json_pointer = json_path_to_pointer_conversion(json_path); if (json_pointer == "-1") { return INVALID_JSON_POINTER; } @@ -8025,14 +8751,14 @@ inline std::ostream& operator<<(std::ostream& out, element_type type) { #endif // SIMDJSON_ELEMENT_INL_H /* end file simdjson/dom/element-inl.h */ -#if defined(__cpp_lib_ranges) +#if SIMDJSON_SUPPORTS_RANGES static_assert(std::ranges::view); static_assert(std::ranges::sized_range); #if SIMDJSON_EXCEPTIONS static_assert(std::ranges::view>); static_assert(std::ranges::sized_range>); #endif // SIMDJSON_EXCEPTIONS -#endif // defined(__cpp_lib_ranges) +#endif // SIMDJSON_SUPPORTS_RANGES #endif // SIMDJSON_ARRAY_INL_H /* end file simdjson/dom/array-inl.h */ @@ -8083,11 +8809,11 @@ inline bool parser::dump_raw_tape(std::ostream &os) const noexcept { return valid ? doc.dump_raw_tape(os) : false; } -inline simdjson_result parser::read_file(const std::string &path) noexcept { +inline simdjson_result parser::read_file(std::string_view path) noexcept { // Open the file SIMDJSON_PUSH_DISABLE_WARNINGS SIMDJSON_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: manually verified this is safe - std::FILE *fp = std::fopen(path.c_str(), "rb"); + std::FILE *fp = std::fopen(path.data(), "rb"); SIMDJSON_POP_DISABLE_WARNINGS if (fp == nullptr) { @@ -8139,18 +8865,18 @@ inline simdjson_result parser::read_file(const std::string &path) noexce return bytes_read; } -inline simdjson_result parser::load(const std::string &path) & noexcept { +inline simdjson_result parser::load(std::string_view path) & noexcept { return load_into_document(doc, path); } -inline simdjson_result parser::load_into_document(document& provided_doc, const std::string &path) & noexcept { +inline simdjson_result parser::load_into_document(document& provided_doc, std::string_view path) & noexcept { size_t len; auto _error = read_file(path).get(len); if (_error) { return _error; } return parse_into_document(provided_doc, loaded_bytes.get(), len, false); } -inline simdjson_result parser::load_many(const std::string &path, size_t batch_size) noexcept { +inline simdjson_result parser::load_many(std::string_view path, size_t batch_size) noexcept { size_t len; auto _error = read_file(path).get(len); if (_error) { return _error; } @@ -8886,8 +9612,8 @@ inline bool document::dump_raw_tape(std::ostream &os) const noexcept { #define SIMDJSON_SERIALIZATION_INL_H /* skipped duplicate #include "simdjson/dom/base.h" */ -/* skipped duplicate #include "simdjson/dom/serialization.h" */ /* skipped duplicate #include "simdjson/dom/parser.h" */ +/* skipped duplicate #include "simdjson/dom/serialization.h" */ /* skipped duplicate #include "simdjson/internal/tape_type.h" */ /* skipped duplicate #include "simdjson/dom/array-inl.h" */ @@ -8899,7 +9625,9 @@ inline bool document::dump_raw_tape(std::ostream &os) const noexcept { namespace simdjson { namespace dom { inline bool parser::print_json(std::ostream &os) const noexcept { - if (!valid) { return false; } + if (!valid) { + return false; + } simdjson::internal::string_builder<> sb; sb.append(doc.root()); std::string_view answer = sb.str(); @@ -8907,37 +9635,51 @@ inline bool parser::print_json(std::ostream &os) const noexcept { return true; } -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::element value) { - simdjson::internal::string_builder<> sb; - sb.append(value); - return (out << sb.str()); +inline std::ostream &operator<<(std::ostream &out, + simdjson::dom::element value) { + simdjson::internal::string_builder<> sb; + sb.append(value); + return (out << sb.str()); } #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x) { + if (x.error()) { + throw simdjson::simdjson_error(x.error()); + } + return (out << x.value()); } #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::array value) { - simdjson::internal::string_builder<> sb; - sb.append(value); - return (out << sb.str()); +inline std::ostream &operator<<(std::ostream &out, simdjson::dom::array value) { + simdjson::internal::string_builder<> sb; + sb.append(value); + return (out << sb.str()); } #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x) { + if (x.error()) { + throw simdjson::simdjson_error(x.error()); + } + return (out << x.value()); } #endif -inline std::ostream& operator<<(std::ostream& out, simdjson::dom::object value) { - simdjson::internal::string_builder<> sb; - sb.append(value); - return (out << sb.str()); +inline std::ostream &operator<<(std::ostream &out, + simdjson::dom::object value) { + simdjson::internal::string_builder<> sb; + sb.append(value); + return (out << sb.str()); } #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +inline std::ostream & +operator<<(std::ostream &out, + simdjson::simdjson_result x) { + if (x.error()) { + throw simdjson::simdjson_error(x.error()); + } + return (out << x.value()); } #endif @@ -8952,8 +9694,9 @@ namespace { * We expect that most compilers will use 8 bytes for this data structure. **/ struct escape_sequence { - uint8_t length; - const char string[7]; // technically, we only ever need 6 characters, we pad to 8 + uint8_t length; + const char + string[7]; // technically, we only ever need 6 characters, we pad to 8 }; /**@private * This converts a signed integer into a character sequence. @@ -8969,7 +9712,7 @@ static char *fast_itoa(char *output, int64_t value) noexcept { char buffer[20]; uint64_t value_positive; // In general, negating a signed integer is unsafe. - if(value < 0) { + if (value < 0) { *output++ = '-'; // Doing value_positive = -value; while avoiding // undefined behavior warnings. @@ -8988,7 +9731,7 @@ static char *fast_itoa(char *output, int64_t value) noexcept { // A faster approach is possible if we expect large integers: // unroll the loop (work in 100s, 1000s) and use some kind of // memoization. - while(value_positive >= 10) { + while (value_positive >= 10) { *write_pointer-- = char('0' + (value_positive % 10)); value_positive /= 10; } @@ -9014,7 +9757,7 @@ static char *fast_itoa(char *output, uint64_t value) noexcept { // A faster approach is possible if we expect large integers: // unroll the loop (work in 100s, 1000s) and use some kind of // memoization. - while(value >= 10) { + while (value >= 10) { *write_pointer-- = char('0' + (value % 10)); value /= 10; }; @@ -9024,7 +9767,6 @@ static char *fast_itoa(char *output, uint64_t value) noexcept { return output + len; } - } // anonymous namespace namespace internal { @@ -9032,194 +9774,209 @@ namespace internal { * Minifier/formatter code. **/ -template +template simdjson_inline void base_formatter::number(uint64_t x) { char number_buffer[24]; char *newp = fast_itoa(number_buffer, x); - buffer.insert(buffer.end(), number_buffer, newp); + chars(number_buffer, newp); } -template +template simdjson_inline void base_formatter::number(int64_t x) { char number_buffer[24]; char *newp = fast_itoa(number_buffer, x); - buffer.insert(buffer.end(), number_buffer, newp); + chars(number_buffer, newp); } -template +template simdjson_inline void base_formatter::number(double x) { char number_buffer[24]; // Currently, passing the nullptr to the second argument is // safe because our implementation does not check the second // argument. char *newp = internal::to_chars(number_buffer, nullptr, x); - buffer.insert(buffer.end(), number_buffer, newp); + chars(number_buffer, newp); } -template -simdjson_inline void base_formatter::start_array() { one_char('['); } - +template +simdjson_inline void base_formatter::start_array() { + one_char('['); +} -template -simdjson_inline void base_formatter::end_array() { one_char(']'); } +template +simdjson_inline void base_formatter::end_array() { + one_char(']'); +} -template -simdjson_inline void base_formatter::start_object() { one_char('{'); } +template +simdjson_inline void base_formatter::start_object() { + one_char('{'); +} -template -simdjson_inline void base_formatter::end_object() { one_char('}'); } +template +simdjson_inline void base_formatter::end_object() { + one_char('}'); +} -template -simdjson_inline void base_formatter::comma() { one_char(','); } +template +simdjson_inline void base_formatter::comma() { + one_char(','); +} -template +template simdjson_inline void base_formatter::true_atom() { - const char * s = "true"; - buffer.insert(buffer.end(), s, s + 4); + const char *s = "true"; + chars(s, s + 4); } -template +template simdjson_inline void base_formatter::false_atom() { - const char * s = "false"; - buffer.insert(buffer.end(), s, s + 5); + const char *s = "false"; + chars(s, s + 5); } -template +template simdjson_inline void base_formatter::null_atom() { - const char * s = "null"; - buffer.insert(buffer.end(), s, s + 4); + const char *s = "null"; + chars(s, s + 4); +} + +template +simdjson_inline void base_formatter::one_char(char c) { + buffer.push_back(c); } -template -simdjson_inline void base_formatter::one_char(char c) { buffer.push_back(c); } +template +simdjson_inline void base_formatter::chars(const char *begin, + const char *end) { + buffer.append(begin, end); +} -template -simdjson_inline void base_formatter::key(std::string_view unescaped) { +template +simdjson_inline void +base_formatter::key(std::string_view unescaped) { string(unescaped); one_char(':'); } -template -simdjson_inline void base_formatter::string(std::string_view unescaped) { +template +simdjson_inline void +base_formatter::string(std::string_view unescaped) { one_char('\"'); size_t i = 0; - // Fast path for the case where we have no control character, no ", and no backslash. - // This should include most keys. - // - // We would like to use 'bool' but some compilers take offense to bitwise operation - // with bool types. - constexpr static char needs_escaping[] = {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}; - for(;i + 8 <= unescaped.length(); i += 8) { + // Fast path for the case where we have no control character, no ", and no + // backslash. This should include most keys. + // + // We would like to use 'bool' but some compilers take offense to bitwise + // operation with bool types. + constexpr static char needs_escaping[] = { + 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}; + for (; i + 8 <= unescaped.length(); i += 8) { // Poor's man vectorization. This could get much faster if we used SIMD. // - // It is not the case that replacing '|' with '||' would be neutral performance-wise. - if(needs_escaping[uint8_t(unescaped[i])] | needs_escaping[uint8_t(unescaped[i+1])] - | needs_escaping[uint8_t(unescaped[i+2])] | needs_escaping[uint8_t(unescaped[i+3])] - | needs_escaping[uint8_t(unescaped[i+4])] | needs_escaping[uint8_t(unescaped[i+5])] - | needs_escaping[uint8_t(unescaped[i+6])] | needs_escaping[uint8_t(unescaped[i+7])] - ) { break; } - } - for(;i < unescaped.length(); i++) { - if(needs_escaping[uint8_t(unescaped[i])]) { break; } - } - // The following is also possible and omits a 256-byte table, but it is slower: - // for (; (i < unescaped.length()) && (uint8_t(unescaped[i]) > 0x1F) + // It is not the case that replacing '|' with '||' would be neutral + // performance-wise. + if (needs_escaping[uint8_t(unescaped[i])] | + needs_escaping[uint8_t(unescaped[i + 1])] | + needs_escaping[uint8_t(unescaped[i + 2])] | + needs_escaping[uint8_t(unescaped[i + 3])] | + needs_escaping[uint8_t(unescaped[i + 4])] | + needs_escaping[uint8_t(unescaped[i + 5])] | + needs_escaping[uint8_t(unescaped[i + 6])] | + needs_escaping[uint8_t(unescaped[i + 7])]) { + break; + } + } + for (; i < unescaped.length(); i++) { + if (needs_escaping[uint8_t(unescaped[i])]) { + break; + } + } + // The following is also possible and omits a 256-byte table, but it is + // slower: for (; (i < unescaped.length()) && (uint8_t(unescaped[i]) > 0x1F) // && (unescaped[i] != '\"') && (unescaped[i] != '\\'); i++) {} // At least for long strings, the following should be fast. We could // do better by integrating the checks and the insertion. - buffer.insert(buffer.end(), unescaped.data(), unescaped.data() + i); + chars(unescaped.data(), unescaped.data() + i); // We caught a control character if we enter this loop (slow). // Note that we are do not restart from the beginning, but rather we continue // from the point where we encountered something that requires escaping. for (; i < unescaped.length(); i++) { switch (unescaped[i]) { - case '\"': - { - const char * s = "\\\""; - buffer.insert(buffer.end(), s, s + 2); - } - break; - case '\\': - { - const char * s = "\\\\"; - buffer.insert(buffer.end(), s, s + 2); - } - break; + case '\"': { + const char *s = "\\\""; + chars(s, s + 2); + } break; + case '\\': { + const char *s = "\\\\"; + chars(s, s + 2); + } break; default: if (uint8_t(unescaped[i]) <= 0x1F) { // If packed, this uses 8 * 32 bytes. // Note that we expect most compilers to embed this code in the data // section. constexpr static escape_sequence escaped[32] = { - {6, "\\u0000"}, {6, "\\u0001"}, {6, "\\u0002"}, {6, "\\u0003"}, - {6, "\\u0004"}, {6, "\\u0005"}, {6, "\\u0006"}, {6, "\\u0007"}, - {2, "\\b"}, {2, "\\t"}, {2, "\\n"}, {6, "\\u000b"}, - {2, "\\f"}, {2, "\\r"}, {6, "\\u000e"}, {6, "\\u000f"}, - {6, "\\u0010"}, {6, "\\u0011"}, {6, "\\u0012"}, {6, "\\u0013"}, - {6, "\\u0014"}, {6, "\\u0015"}, {6, "\\u0016"}, {6, "\\u0017"}, - {6, "\\u0018"}, {6, "\\u0019"}, {6, "\\u001a"}, {6, "\\u001b"}, - {6, "\\u001c"}, {6, "\\u001d"}, {6, "\\u001e"}, {6, "\\u001f"}}; + {6, "\\u0000"}, {6, "\\u0001"}, {6, "\\u0002"}, {6, "\\u0003"}, + {6, "\\u0004"}, {6, "\\u0005"}, {6, "\\u0006"}, {6, "\\u0007"}, + {2, "\\b"}, {2, "\\t"}, {2, "\\n"}, {6, "\\u000b"}, + {2, "\\f"}, {2, "\\r"}, {6, "\\u000e"}, {6, "\\u000f"}, + {6, "\\u0010"}, {6, "\\u0011"}, {6, "\\u0012"}, {6, "\\u0013"}, + {6, "\\u0014"}, {6, "\\u0015"}, {6, "\\u0016"}, {6, "\\u0017"}, + {6, "\\u0018"}, {6, "\\u0019"}, {6, "\\u001a"}, {6, "\\u001b"}, + {6, "\\u001c"}, {6, "\\u001d"}, {6, "\\u001e"}, {6, "\\u001f"}}; auto u = escaped[uint8_t(unescaped[i])]; - buffer.insert(buffer.end(), u.string, u.string + u.length); + chars(u.string, u.string + u.length); } else { one_char(unescaped[i]); } } // switch - } // for + } // for one_char('\"'); } - -template -inline void base_formatter::clear() { +template inline void base_formatter::clear() { buffer.clear(); } -template +template simdjson_inline std::string_view base_formatter::str() const { - return std::string_view(buffer.data(), buffer.size()); + return buffer.str(); } -simdjson_inline void mini_formatter::print_newline() { - return; -} +simdjson_inline void mini_formatter::print_newline() { return; } simdjson_inline void mini_formatter::print_indents(size_t depth) { - (void)depth; - return; + (void)depth; + return; } -simdjson_inline void mini_formatter::print_space() { - return; -} +simdjson_inline void mini_formatter::print_space() { return; } -simdjson_inline void pretty_formatter::print_newline() { - one_char('\n'); -} +simdjson_inline void pretty_formatter::print_newline() { one_char('\n'); } simdjson_inline void pretty_formatter::print_indents(size_t depth) { - if(this->indent_step <= 0) { - return; - } - for(size_t i = 0; i < this->indent_step * depth; i++) { - one_char(' '); - } -} - -simdjson_inline void pretty_formatter::print_space() { + if (this->indent_step <= 0) { + return; + } + for (size_t i = 0; i < this->indent_step * depth; i++) { one_char(' '); + } } +simdjson_inline void pretty_formatter::print_space() { one_char(' '); } + /*** * String building code. **/ @@ -9397,7 +10154,8 @@ inline void string_builder::append(simdjson::dom::array value) { } template -simdjson_inline void string_builder::append(simdjson::dom::key_value_pair kv) { +simdjson_inline void +string_builder::append(simdjson::dom::key_value_pair kv) { format.key(kv.key); append(kv.value); } @@ -9412,7 +10170,6 @@ simdjson_inline std::string_view string_builder::str() const { return format.str(); } - } // namespace internal } // namespace simdjson @@ -10623,6 +11380,12 @@ namespace { 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; } }; @@ -10699,7 +11462,7 @@ namespace { // Bit-specific operations simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); } - simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); } template simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); } @@ -10712,7 +11475,12 @@ namespace { 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 @@ -11006,7 +11774,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -11035,6 +11803,32 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + } // unnamed namespace } // namespace arm64 } // namespace simdjson @@ -11454,12 +12248,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -11468,6 +12267,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -11509,6 +12318,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -11885,7 +12695,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -11913,7 +12723,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -12002,7 +12812,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -12065,13 +12875,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -12097,7 +12907,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -12881,12 +13691,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -13055,7 +13894,7 @@ namespace { struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline static 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 c == '"'; } simdjson_inline bool has_backslash() { return c == '\\'; } @@ -13071,6 +13910,24 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin 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 @@ -13577,12 +14434,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -13591,6 +14453,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -13632,6 +14504,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -14008,7 +14881,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -14036,7 +14909,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -14125,7 +14998,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -14188,13 +15061,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -14220,7 +15093,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -15004,12 +15877,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -15751,7 +16653,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -15775,6 +16677,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace haswell } // namespace simdjson @@ -16192,12 +17119,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -16206,6 +17138,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -16247,6 +17189,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -16623,7 +17566,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -16651,7 +17594,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -16740,7 +17683,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -16803,13 +17746,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -16835,7 +17778,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -17619,12 +18562,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -17984,7 +18956,6 @@ namespace simd { friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) { return _mm512_cmpeq_epi8_mask(lhs, rhs); } - static const int SIZE = sizeof(base::value); template @@ -18303,7 +19274,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -18327,6 +19298,35 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + + +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 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 @@ -18804,12 +19804,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -18818,6 +19823,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -18859,6 +19874,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -19235,7 +20251,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -19263,7 +20279,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -19352,7 +20368,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -19415,13 +20431,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -19447,7 +20463,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -20231,12 +21247,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -21073,7 +22118,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static backslash_and_quote + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { @@ -21114,6 +22159,32 @@ backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 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 @@ -21533,12 +22604,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -21547,6 +22623,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -21588,6 +22674,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -21964,7 +23051,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -21992,7 +23079,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -22081,7 +23168,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -22144,13 +23231,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -22176,7 +23263,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -22960,12 +24047,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -24136,7 +25252,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -24162,6 +25278,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace westmere } // namespace simdjson @@ -24579,12 +25720,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -24593,6 +25739,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -24634,6 +25790,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -25010,7 +26167,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -25038,7 +26195,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -25127,7 +26284,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -25190,13 +26347,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -25222,7 +26379,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -26006,12 +27163,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -26654,7 +27840,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -26683,6 +27869,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + static_cast((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace lsx } // namespace simdjson @@ -27102,12 +28313,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -27116,6 +28332,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -27157,6 +28383,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -27533,7 +28760,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -27561,7 +28788,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -27650,7 +28877,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -27713,13 +28940,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -27745,7 +28972,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -28529,12 +29756,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -29196,7 +30452,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -29219,6 +30475,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask() + }; +} + } // unnamed namespace } // namespace lasx } // namespace simdjson @@ -29638,12 +30919,17 @@ struct implementation_simdjson_result_base { * * @param value The variable to assign the value to. May not be set if there is an error. */ - simdjson_inline error_code get(T &value) && noexcept; + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept; /** * The error. */ - simdjson_inline error_code error() const noexcept; + 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 @@ -29652,6 +30938,16 @@ struct implementation_simdjson_result_base { * * @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); /** @@ -29693,6 +30989,7 @@ struct implementation_simdjson_result_base { * the error() method returns a value that evaluates to false. */ simdjson_inline T&& value_unsafe() && noexcept; + protected: /** users should never directly access first and second. **/ T first{}; /** Users should never directly access 'first'. **/ @@ -30069,7 +31366,7 @@ simdjson_inline bool is_digit(const uint8_t c) { return static_cast(c - '0') <= 9; } -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) { +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 @@ -30097,7 +31394,7 @@ simdjson_inline error_code parse_decimal_after_separator(simdjson_unused const u return SUCCESS; } -simdjson_inline error_code parse_exponent(simdjson_unused const uint8_t *const src, const uint8_t *&p, int64_t &exponent) { +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 @@ -30186,7 +31483,7 @@ static error_code slow_float_parsing(simdjson_unused const uint8_t * src, double /** @private */ template -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) { +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. @@ -30249,13 +31546,13 @@ simdjson_inline error_code write_float(const uint8_t *const src, bool negative, // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer); +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 -simdjson_inline error_code parse_number(const uint8_t *const, W &writer) { +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 } @@ -30281,7 +31578,7 @@ simdjson_unused simdjson_inline simdjson_result get_number_type(con // // Our objective is accurate parsing (ULP of 0) at high speed. template -simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { +simdjson_warn_unused simdjson_inline error_code parse_number(const uint8_t *const src, W &writer) { // // Check for minus sign // @@ -31065,12 +32362,41 @@ simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_b } template -simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { +simdjson_warn_unused simdjson_inline error_code implementation_simdjson_result_base::error() const noexcept { return this->second; } + +template +simdjson_warn_unused simdjson_inline bool implementation_simdjson_result_base::has_value() const noexcept { + return this->error() == SUCCESS; +} + #if SIMDJSON_EXCEPTIONS +template +simdjson_inline T& implementation_simdjson_result_base::operator*() & noexcept(false) { + return this->value(); +} + +template +simdjson_inline T&& implementation_simdjson_result_base::operator*() && noexcept(false) { + return std::forward>(*this).value(); +} + +template +simdjson_inline T* implementation_simdjson_result_base::operator->() noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + + +template +simdjson_inline const T* implementation_simdjson_result_base::operator->() const noexcept(false) { + if (this->error()) { throw simdjson_error(this->error()); } + return &this->first; +} + template simdjson_inline T& implementation_simdjson_result_base::value() & noexcept(false) { if (error()) { throw simdjson_error(error()); } @@ -31162,6 +32488,7 @@ simdjson_inline implementation_simdjson_result_base::implementation_simdjson_ // 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" */ @@ -31596,6 +32923,12 @@ namespace { 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; } }; @@ -31672,7 +33005,7 @@ namespace { // Bit-specific operations simdjson_inline simd8 any_bits_set(simd8 bits) const { return vtstq_u8(*this, bits); } - simdjson_inline bool any_bits_set_anywhere() const { return this->max_val() != 0; } + simdjson_inline bool any_bits_set_anywhere() const { return vmaxvq_u32(vreinterpretq_u32_u8(*this)) != 0; } simdjson_inline bool any_bits_set_anywhere(simd8 bits) const { return (*this & bits).any_bits_set_anywhere(); } template simdjson_inline simd8 shr() const { return vshrq_n_u8(*this, N); } @@ -31685,7 +33018,12 @@ namespace { 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 @@ -31979,7 +33317,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -32008,6 +33346,32 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (is_backslash | is_quote | is_control).to_bitmask64() + }; +} + + + } // unnamed namespace } // namespace arm64 } // namespace simdjson @@ -32076,7 +33440,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -32085,55 +33449,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -32155,7 +33472,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -32166,28 +33483,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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 + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -32197,7 +33530,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -32539,7 +33872,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -32623,8 +33956,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -32634,8 +33967,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -32672,7 +34005,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -32737,13 +34070,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -32760,22 +34094,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -32785,7 +34135,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -32903,7 +34253,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -33085,7 +34435,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -33424,7 +34774,7 @@ struct simdjson_result : public arm64::implementation_si simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -33458,7 +34808,7 @@ struct simdjson_result : public arm64::implementation_si * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -33505,7 +34855,22 @@ struct simdjson_result : public arm64::implementation_si simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -33999,14 +35364,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -34026,7 +35391,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -34117,6 +35482,7 @@ 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, ... } ) @@ -34323,6 +35689,12 @@ class raw_json_string { */ 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, @@ -34462,10 +35834,10 @@ struct simdjson_result : public arm64::impleme simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(arm64::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -34481,6 +35853,7 @@ struct simdjson_result : public arm64::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace arm64 { @@ -34599,7 +35972,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -34687,6 +36062,11 @@ class parser { * 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 @@ -34694,10 +36074,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -34723,14 +36103,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -34832,13 +36214,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -34866,6 +36274,315 @@ struct simdjson_result : public arm64::implementation_s #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(arm64::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -34978,7 +36695,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -35002,11 +36719,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -35080,7 +36828,28 @@ struct simdjson_result : public arm64::implementation_si simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -35125,7 +36894,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -35149,6 +36919,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -35167,7 +36942,6 @@ namespace simdjson { template<> struct simdjson_result : public arm64::implementation_simdjson_result_base { -public: 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; @@ -35180,6 +36954,8 @@ struct simdjson_result : public arm64::implemen simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -35307,7 +37083,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -35373,7 +37149,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -35396,7 +37172,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -35414,18 +37190,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -35437,7 +37213,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -35447,7 +37223,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -35512,7 +37288,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -35521,7 +37297,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -35597,7 +37373,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -35671,11 +37447,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -35875,7 +37667,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -35899,11 +37691,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -35956,7 +37778,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -35965,7 +37787,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -35978,7 +37800,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -36000,14 +37822,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -36019,7 +37841,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -36029,12 +37851,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -36103,7 +37930,7 @@ struct simdjson_result : public arm64::implementation simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -36116,6 +37943,9 @@ struct simdjson_result : public arm64::implementation template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using arm64::implementation_simdjson_result_base::operator*; + using arm64::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator arm64::ondemand::array() & noexcept(false); @@ -36155,6 +37985,11 @@ struct simdjson_result : public arm64::implementation simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -36181,7 +38016,7 @@ struct simdjson_result : public arm64::impl simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -36232,6 +38067,11 @@ struct simdjson_result : public arm64::impl simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -36324,7 +38164,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -36374,6 +38214,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -36387,6 +38228,7 @@ class document_stream { * @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 * @@ -36430,6 +38272,11 @@ class document_stream { */ 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. */ @@ -36441,6 +38288,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -36704,6 +38552,9 @@ struct simdjson_result : public arm64::implementation_si /* 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): #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 { @@ -36730,7 +38581,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -36901,11 +38752,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -36944,12 +38855,42 @@ struct simdjson_result : public arm64::implementation_s simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -37078,6 +39019,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -37149,28 +39104,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -37184,7 +39141,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -37193,7 +39149,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -37206,8 +39161,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -37224,7 +39194,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -37233,9 +39202,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - arm64::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, arm64::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -37266,7 +39239,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -37292,7 +39264,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, arm64::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_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 +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 +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 +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); +} /** @@ -37310,7 +39320,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -37335,17 +39344,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -37354,10 +39363,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + arm64::ondemand::object obj; + if constexpr (std::is_same_v, 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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for arm64 */ // Inline definitions @@ -37450,7 +39778,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -37641,6 +39969,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace arm64 } // namespace simdjson @@ -37677,7 +40008,9 @@ simdjson_inline simdjson_result &simdjson_resul ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -37734,7 +40067,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -37776,15 +40109,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -38381,7 +40714,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -38407,15 +40740,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -38435,8 +40768,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -38485,7 +40818,7 @@ simdjson_inline simdjson_result document::operator[](const char *key) & n return start_or_resume_object()[key]; } -simdjson_inline error_code document::consume() noexcept { +simdjson_warn_unused simdjson_inline error_code document::consume() noexcept { bool scalar = false; auto error = is_scalar().get(scalar); if(error) { return error; } @@ -38587,6 +40920,54 @@ simdjson_inline simdjson_result document::at_path(std::string_view json_p } } + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 @@ -38694,7 +41075,7 @@ simdjson_inline simdjson_result simdjson_result -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } @@ -38730,12 +41111,12 @@ simdjson_deprecated simdjson_inline simdjson_result simdjson_result(first).get(); } template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } return std::forward(first).get(out); } @@ -38745,8 +41126,8 @@ template<> simdjson_deprecated simdjson_inline simdjson_result(first); } -template<> simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(arm64::ondemand::document &out) && noexcept { if (error()) { return error(); } out = std::forward(first); return SUCCESS; @@ -38864,6 +41245,15 @@ simdjson_inline simdjson_result simdjson_result + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION + } // namespace simdjson @@ -38898,7 +41288,7 @@ simdjson_inline simdjson_result document_reference::get_double() noexcep simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } template -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_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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } @@ -38951,7 +41341,13 @@ simdjson_inline simdjson_result document_reference::at_pointer(std::strin simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); +} +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace arm64 } // namespace simdjson @@ -39048,7 +41444,7 @@ simdjson_inline simdjson_result simdjson_result -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } @@ -39083,12 +41479,12 @@ simdjson_inline simdjson_result simdjson_result(first).get(); } template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } return std::forward(first).get(out); } @@ -39105,13 +41501,13 @@ simdjson_inline simdjson_result simdjson_result -simdjson_inline error_code simdjson_result::get(arm64::ondemand::document_reference &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(arm64::ondemand::document_reference &out) & noexcept { if (error()) { return error(); } out = first; return SUCCESS; } template <> -simdjson_inline error_code simdjson_result::get(arm64::ondemand::document_reference &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(arm64::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } out = first; return SUCCESS; @@ -39199,7 +41595,14 @@ simdjson_inline simdjson_result simdjson_result + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H @@ -39390,10 +41793,19 @@ simdjson_inline document_stream::iterator& document_stream::iterator::operator++ 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. @@ -39511,7 +41923,10 @@ inline void document_stream::next_document() noexcept { // Always set depth=1 at the start of document doc.iter._depth = 1; // consume comma if comma separated is allowed - if (allow_comma_separated) { doc.iter.consume_character(','); } + if (allow_comma_separated) { + error_code ignored = doc.iter.consume_character(','); + static_cast(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(); @@ -39757,7 +42172,7 @@ simdjson_inline simdjson_result simdjson_result -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.unescaped_key(receiver, allow_replacement); } @@ -39993,6 +42408,8 @@ simdjson_inline void json_iterator::assert_valid_position(token_position positio #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 } @@ -40117,7 +42534,7 @@ simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { return _string_buf_loc; } -simdjson_inline error_code json_iterator::report_error(error_code _error, const char *message) noexcept { +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; @@ -40161,7 +42578,7 @@ simdjson_inline void json_iterator::reenter_child(token_position position, depth _depth = child_depth; } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { +simdjson_warn_unused simdjson_inline error_code json_iterator::consume_character(char c) noexcept { if (*peek() == c) { return_current_and_advance(); return SUCCESS; @@ -40184,7 +42601,7 @@ simdjson_inline void json_iterator::set_start_position(depth_t depth, token_posi #endif -simdjson_inline error_code json_iterator::optional_error(error_code _error, const char *message) noexcept { +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; @@ -40579,6 +42996,10 @@ inline void log_line(const json_iterator &iter, token_position index, depth_t de /* 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): #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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { @@ -40636,7 +43057,7 @@ simdjson_inline simdjson_result object::start_root(value_iterator &iter) SIMDJSON_TRY( iter.start_root_object().error() ); return object(iter); } -simdjson_inline error_code object::consume() noexcept { +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 @@ -40765,6 +43186,52 @@ simdjson_inline simdjson_result object::reset() & noexcept { return iter.reset_object(); } +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 @@ -40841,6 +43308,7 @@ simdjson_inline simdjson_result simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } json.remove_utf8_bom(); @@ -41055,7 +43523,7 @@ simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(p #ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } json.remove_utf8_bom(); @@ -41087,10 +43555,7 @@ simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(s } simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); - } - return iterate(padded_string_view(json)); + return iterate(pad_with_reserve(json)); } simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { @@ -41112,7 +43577,7 @@ simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(c } simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } json.remove_utf8_bom(); @@ -41127,6 +43592,7 @@ simdjson_warn_unused simdjson_inline simdjson_result parser::iter } inline simdjson_result 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; @@ -41135,16 +43601,24 @@ inline simdjson_result parser::iterate_many(const uint8_t *buf, if(allow_comma_separated && batch_size < len) { batch_size = len; } return document_stream(*this, buf, len, batch_size, allow_comma_separated); } + inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { +inline simdjson_result 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 parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); + return iterate_many(padded_string_view(s), batch_size, allow_comma_separated); +} +inline simdjson_result 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 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; } @@ -41179,6 +43653,34 @@ simdjson_inline simdjson_warn_unused simdjson_result parser::u 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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; +} + + } // namespace ondemand } // namespace arm64 } // namespace simdjson @@ -41213,8 +43715,13 @@ 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(buf); } +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); +} +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; +} simdjson_inline bool raw_json_string::is_free_from_unescaped_quote(std::string_view target) noexcept { size_t pos{0}; @@ -41391,6 +43898,10 @@ simdjson_inline simdjson_result simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(arm64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { if (error()) { return error(); } return first.unescape(iter, allow_replacement); @@ -41416,6 +43927,9 @@ simdjson_inline simdjson_warn_unused simdjson_result simdjson_ /* 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 { @@ -41781,7 +44295,7 @@ simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start if (*_json_iter->peek() == '}') { logger::log_value(*_json_iter, "empty object"); _json_iter->return_current_and_advance(); - end_container(); + SIMDJSON_TRY(end_container()); return false; } return true; @@ -42635,7 +45149,7 @@ simdjson_inline void value_iterator::advance_scalar(const char *type) noexcept { _json_iter->ascend_to(depth()-1); } -simdjson_inline error_code value_iterator::start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept { +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; @@ -42797,7 +45311,7 @@ simdjson_inline simdjson_result value_iterator::type() const noexcept case '5': case '6': case '7': case '8': case '9': return json_type::number; default: - return TAPE_ERROR; + return json_type::unknown; } } @@ -42837,2483 +45351,2443 @@ simdjson_inline simdjson_result::simdjson_resul #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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H -/* 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): #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 */ -#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 +/* + * 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. + */ -/* 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 +#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 -/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #include "simdjson/base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif namespace simdjson { -/** - * Fallback implementation (runs on any machine). - */ -namespace fallback { +namespace arm64 { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -class implementation; +/** -} // namespace fallback -} // namespace simdjson +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). -#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 +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; +} -/* 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 { +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(c)]) { + return true; + } + } + return false; +} -#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; +#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(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(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; } -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; +#else +simdjson_inline bool fast_needs_escaping(std::string_view view) { + return simple_needs_escaping(view); } #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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -} // unnamed namespace -} // namespace fallback -} // namespace simdjson +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"}; -#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 +// 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; +} -/* 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 */ +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) {} -namespace simdjson { -namespace fallback { -namespace { +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; +} -// Holds backslashes and quotes locations. -struct backslash_and_quote { -public: - static constexpr uint32_t BYTES_PROCESSED = 1; - simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 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; } +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; + } +} - uint8_t c; -}; // struct backslash_and_quote +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} -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] }; +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } } -} // unnamed namespace -} // namespace fallback -} // namespace simdjson +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; + } +} -#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 +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; + } +} -/* 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 */ +namespace internal { -#include +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 -#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 +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -namespace simdjson { -namespace fallback { -namespace numberparsing { +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); + } +} -// 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); +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++] = '"'; + } } -/** @private */ -static simdjson_inline uint32_t parse_eight_digits_unrolled(const uint8_t *chars) { - return parse_eight_digits_unrolled(reinterpret_cast(chars)); +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++] = '"'; + } } -#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; +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); } -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; +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); } #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; +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); } -} // namespace numberparsing -} // namespace fallback -} // namespace simdjson +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(); + } +} -#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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} -#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) -#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} + +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} #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 +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + start_object(); -/* 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 */ + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; -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 { + // 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 + } -/** Represents the depth of a JSON value (number of nested arrays/objects). */ -using depth_t = int32_t; + // Append first item without leading comma + append(*it); + ++it; -/** @copydoc simdjson::fallback::number_type */ -using number_type = simdjson::fallback::number_type; + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } +} -/** @private Position in the JSON buffer indexes */ -using token_position = const uint32_t *; +#endif -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; +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); +} -} // namespace ondemand -} // namespace fallback -} // namespace simdjson +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif -#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_DESERIALIZATION +simdjson_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); +} -#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 */ +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; +} -#include -namespace simdjson { +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); +} -namespace tag_invoke_fn_ns { -void tag_invoke(); +simdjson_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } +} -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } -}; -} // namespace tag_invoke_fn_ns +} -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } +} -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } +} -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} -template -using tag_invoke_result = - std::invoke_result; +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } +} -template -using tag_invoke_result_t = - std::invoke_result_t; +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} -template using tag_t = std::decay_t; +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif +} // namespace builder +} // namespace arm64 +} // namespace simdjson -struct deserialize_tag; +#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 -/// These types are deserializable in a built-in way -template struct is_builtin_deserializable : std::false_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; +/* 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 -template -concept is_builtin_deserializable_v = is_builtin_deserializable::value; +#include +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet -template -concept custom_deserializable = tag_invocable; +namespace simdjson { +namespace arm64 { +namespace builder { -template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -concept nothrow_custom_deserializable = nothrow_tag_invocable; +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} -// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template -concept nothrow_deserializable = nothrow_custom_deserializable || is_builtin_deserializable_v; +template + requires(!require_custom_serialization) +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('}'); +} -/// Deserialize Tag -inline constexpr struct deserialize_tag { - using value_type = fallback::ondemand::value; - using document_type = fallback::ondemand::document; - using document_reference_type = fallback::ondemand::document_reference; - // Customization Point for value - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); +} + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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 + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); } +} - // Customization Point for document - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); } +} - // Customization Point for document reference - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif +} + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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 + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); +} -} deserialize{}; +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); +} -} // namespace simdjson +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} -#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} -/* 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 +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} -/* 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 */ +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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 { -namespace fallback { -namespace ondemand { +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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(']'); +} -/** - * 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{}; +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); +} -public: - simdjson_inline value_iterator() noexcept = default; - /** - * Denote that we're starting a document. - */ - simdjson_inline void start_document() noexcept; +template +simdjson_warn_unused simdjson_result 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); +} - /** - * 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; +template +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; +} - /** - * Tell whether the iterator is at the EOF mark - */ - simdjson_inline bool at_end() const noexcept; +template +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; +} - /** - * Tell whether the iterator is at the start of the value - */ - simdjson_inline bool at_start() const noexcept; +// extract_from: Serialize only specific fields from a struct to JSON +template + requires(std::is_class_v && (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) || ...); + }; - /** - * 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; + b.append('{'); + bool first = true; - /** - * Tell whether the value is at an object's first field (just after the {). - */ - simdjson_inline bool at_first_field() const noexcept; + // 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()))) { - /** - * Abandon all iteration. - */ - simdjson_inline void abandon() noexcept; + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); - /** - * Get the child value as a value_iterator. - */ - simdjson_inline value_iterator child_value() const noexcept; + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; - /** - * Get the depth of this value. - */ - simdjson_inline int32_t depth() const noexcept; + // 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(':'); - /** - * 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 type() const noexcept; + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; - /** - * @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. - * - * @{ - */ + b.append('}'); +} - /** - * 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 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 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 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 started_root_object() noexcept; +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} - /** - * 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 has_next_field() noexcept; +} // namespace builder +} // namespace arm64 +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; +} +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); +} - /** - * Get the current field's key. - */ - simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept; +} // namespace simdjson - /** - * Pass the : in the field and move to its value. - */ - simdjson_warn_unused simdjson_inline error_code field_value() noexcept; +#endif // SIMDJSON_STATIC_REFLECTION - /** - * 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; +#endif +/* end file simdjson/generic/ondemand/json_builder.h for arm64 */ - /** - * 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 find_field_raw(const std::string_view key) noexcept; +// 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 emails; }; + * + * std::string email; + * path_accessor::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 - /** - * 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 find_field_unordered_raw(const std::string_view key) noexcept; +/* 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 - /** - * @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. - * @{ - */ +#include +#include +#include - /** - * 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 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 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 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 started_root_array() noexcept; +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 { - /** - * 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 has_next_element() noexcept; +// 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 - /** - * Get a child value iterator. - */ - simdjson_warn_unused simdjson_inline value_iterator child() const noexcept; +using ::simdjson::arm64::ondemand::value; - /** @} */ +// Path step types +enum class step_type { + field, // .field_name or ["field_name"] + array_index // [index] +}; - /** - * @defgroup scalar Scalar values - * @addtogroup scalar - * @{ - */ +// Represents a single step in a JSON path +template +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) - simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept; - template - simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept; - simdjson_warn_unused simdjson_inline bool is_negative() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; + 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]; + } + } - simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept; - template - 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 get_root_wobbly_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; + constexpr std::string_view key_view() const { + return {key, N - 1}; + } +}; - 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; +// Helper to create field step +template +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); +} - simdjson_inline void assert_is_valid() const noexcept; - simdjson_inline bool is_valid() const noexcept; +// Helper to create array index step +consteval auto make_index_step(std::size_t idx) { + return path_step<1>(step_type::array_index, "", idx); +} - /** @} */ -protected: - /** - * Restarts an array iteration. - * @returns Whether the array has any elements (returns false for empty). - */ - simdjson_inline simdjson_result reset_array() noexcept; - /** - * Restarts an object iteration. - * @returns Whether the object has any fields (returns false for empty). - */ - simdjson_inline simdjson_result 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; +// Parse state for compile-time JSON path parsing +struct parse_result { + bool success; + std::size_t pos; + std::string_view error_msg; +}; - /** - * 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; +// Compile-time JSON path parser +// Supports subset: .field, ["field"], [index], nested combinations +template +struct json_path_parser { + static constexpr std::string_view path_str = Path.view(); - simdjson_inline simdjson_result parse_null(const uint8_t *json) const noexcept; - simdjson_inline simdjson_result 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; + // Skip leading $ if present + static consteval std::size_t skip_root() { + if (!path_str.empty() && path_str[0] == '$') { + return 1; + } + return 0; + } - /** - * 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. - */ + // 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(); - 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; + while (i < path_str.size()) { + if (path_str[i] == '.') { + // Field access: .field + ++i; + if (i >= path_str.size()) break; - 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; + // 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; + } - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() noexcept; + // 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; - /** - * 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 advance_to_value() noexcept; + 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; + } - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const noexcept; + // Parse an array index at compile time + static consteval std::pair parse_array_index(std::size_t start) { + std::size_t index = 0; + std::size_t i = start; - 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; + while (i < path_str.size() && path_str[i] >= '0' && path_str[i] <= '9') { + index = index * 10 + (path_str[i] - '0'); + ++i; + } - /** - * 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; + return {i, index}; + } +}; - 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; +// Compile-time path accessor generator +template +struct path_accessor { + using value = ::simdjson::arm64::ondemand::value; - /** Get the starting position of this value */ - simdjson_inline token_position start_position() const noexcept; + static constexpr auto parser = json_path_parser(); + static constexpr std::size_t num_steps = parser.count_steps(); + static constexpr std::string_view path_view = Path.view(); - /** @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_inline error_code report_error(error_code error, const char *message) noexcept; + // Compile-time accessor generation + // If T is a struct, validates the path at compile time + // If T is void, skips validation + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + constexpr bool path_valid = validate_path(); + static_assert(path_valid, "JSON path does not match struct definition"); + } - friend class document; - friend class object; - friend class array; - friend class value; - friend class field; -}; // value_iterator + // Parse the path at compile time to build access steps + return access_impl(doc_or_val.get_value()); + } -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -namespace simdjson { + // Validate path exists in struct definition + constexpr bool path_valid = validate_path(); + static_assert(path_valid, "JSON path does not match struct definition"); -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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; -}; + // Get the type at the end of the path + constexpr auto final_type = get_final_type(); -} // namespace simdjson + // Verify target type matches the field type + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the path"); -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H + // All validation done at compile time - just navigate and extract + auto json_value = access_impl(doc_or_val.get_value()); + if (json_value.error()) return json_value.error(); -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + return json_value.get(target); + } -#include +private: + // Get the final type by walking the path through the struct type + template + static consteval std::enable_if_t, 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; + } -namespace simdjson { + std::string_view field_name = path_view.substr(field_start, i - field_start); -namespace fallback { -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; + auto members = std::meta::nonstatic_data_members_of( + current_type, std::meta::access_context::unchecked() + ); - /** - * 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 - simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); - T out{}; - SIMDJSON_TRY(get(out)); - return out; + 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 + static inline error_code extract_with_reflection(simdjson_result current, TargetType& target_ref) noexcept { + if (current.error()) return current.error(); - /** - * Get this value as the given type. - * - * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool - * - * @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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - #if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { - return deserialize(*this, out); - } else { - static_assert(!sizeof(T), "The get 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 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(out); // to get rid of unused errors - return UNINITIALIZED; + // 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION - // 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(out); // to get rid of unused errors - return UNINITIALIZED; -#endif + + // 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; + } + } } - /** - * 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 get_array() noexcept; + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if (current.error()) return current; - /** - * 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 get_object() noexcept; + 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); - /** - * 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 get_uint64() noexcept; + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); - /** - * 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 get_uint64_in_string() noexcept; + auto obj = obj_result.value_unsafe(); + auto next_value = obj.find_field_unordered(field_name); - /** - * 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 get_int64() noexcept; + return access_impl(next_value); - /** - * 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 get_int64_in_string() noexcept; + } 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); - /** - * 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 get_double() noexcept; + if constexpr (is_field) { + constexpr std::string_view field_name = std::get<1>(bracket_info); - /** - * 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 get_double_in_string() noexcept; + auto obj_result = current.get_object(); + if (obj_result.error()) return obj_result.error(); - /** - * Cast this JSON value to a string. - * - * The string is guaranteed to be valid UTF-8. - * - * Equivalent to get(). - * - * 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 get_string(bool allow_replacement = false) noexcept; + auto obj = obj_result.value_unsafe(); + auto next_value = obj.find_field_unordered(field_name); - /** - * 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 - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + return access_impl(next_value); - /** - * 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 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 get_raw_json_string() noexcept; + } else { + constexpr std::size_t index = std::get<3>(bracket_info); - /** - * 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 get_bool() noexcept; + auto arr_result = current.get_array(); + if (arr_result.error()) return arr_result.error(); - /** - * 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 is_null() noexcept; + auto arr = arr_result.value_unsafe(); + auto next_value = arr.at(index); -#if SIMDJSON_EXCEPTIONS - /** - * Cast this JSON value to an instance of type T. The programmer is responsible for - * providing an implementation of get 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 - 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(). - * - * @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 + return access_impl(next_value); + } + } else { + return access_impl(current); + } + } - /** - * Begin array iteration. - * - * Part of the std::iterable interface. - * - * @returns INCORRECT_TYPE If the JSON value is not an array. - */ - simdjson_inline simdjson_result begin() & noexcept; - /** - * Sentinel representing the end of the array. - * - * Part of the std::iterable interface. - */ - simdjson_inline simdjson_result 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 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 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 at(size_t index) noexcept; - /** - * Look up a field by name on an object (order-sensitive). - * - * 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 }`: - * - * ```c++ - * 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. + // 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); + } - * **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 find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field(const char *key) noexcept; + // 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 '[' - /** - * 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. - * - * It is the default, however, 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 find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) noexcept; - simdjson_result operator[](int) noexcept = delete; + 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; - /** - * 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 type() noexcept; + 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; - /** - * 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 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 is_string() noexcept; + return std::make_tuple(false, std::string_view{}, i, index); + } + } - /** - * 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 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 get_number_type() noexcept; +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; + } - /** - * 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 get_number() noexcept; + if (std::meta::can_substitute(^^concepts::indexable_container_v, {type_reflection})) { + return std::meta::extract(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; + } - /** - * 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; + // 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); + } - /** - * 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 raw_json() noexcept; + 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; + } - /** - * Returns the current location in the document if in bounds. - */ - simdjson_inline simdjson_result current_location() noexcept; +private: + // Check if type has member with given name + template + 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; + } - /** - * 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 type of member by name + template + 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; + } - /** - * 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 at_pointer(std::string_view json_pointer) noexcept; + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; + } - /** - * 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 at_path(std::string_view at_path) noexcept; + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -protected: - /** - * Create a value. - */ - simdjson_inline value(const value_iterator &iter) noexcept; + 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; + } - /** - * Skip this value, allowing iteration to continue. - */ - simdjson_inline void skip() noexcept; + std::string_view field_name = path_view.substr(field_start, i - field_start); - /** - * 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; + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); - /** - * Resume a value. - */ - static simdjson_inline value resume(const value_iterator &iter) noexcept; + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } - /** - * Get the object, starting or resuming it as necessary - */ - simdjson_inline simdjson_result start_or_resume_object() noexcept; + if (!found) { + return false; + } - // simdjson_inline void log_value(const char *type) const noexcept; - // simdjson_inline void log_error(const char *message) const noexcept; + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; - value_iterator iter{}; + 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; + } - friend class document; - friend class array_iterator; - friend class field; - friend class object; - friend struct simdjson_result; - friend struct simdjson_result; - friend class field; -}; + 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; -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -namespace simdjson { + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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; + if (!found) { + return false; + } - simdjson_inline simdjson_result get_array() noexcept; - simdjson_inline simdjson_result get_object() noexcept; + } else { + while (i < path_view.size() && path_view[i] >= '0' && path_view[i] <= '9') { + ++i; + } - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result is_null() noexcept; + if (i < path_view.size() && path_view[i] == ']') ++i; - template simdjson_inline simdjson_result get() noexcept; + if (!is_array_like_reflected(current_type)) { + return false; + } - template simdjson_inline error_code get(T &out) noexcept; + auto new_type = get_element_type_reflected(current_type); -#if SIMDJSON_EXCEPTIONS - template - 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 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 bool() noexcept(false); -#endif - simdjson_inline simdjson_result count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; + if (new_type == ^^void) { + return false; + } - /** - * Look up a field by name on an object (order-sensitive). - * - * 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 }`: - * - * ```c++ - * 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 find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field(const char *key) noexcept; + current_type = new_type; + } + } else { + ++i; + } + } - /** - * 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. - * - * It is the default, however, 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 find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) noexcept; - simdjson_result operator[](int) noexcept = delete; + return true; + } +}; - /** - * Get the type of this JSON value. - * - * 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 type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; +// Compile-time path accessor with validation +template +inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); +} - /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ - simdjson_inline simdjson_result raw_json_token() noexcept; - simdjson_inline simdjson_result raw_json() noexcept; +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::arm64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); +} - /** @copydoc simdjson_inline simdjson_result current_location() noexcept */ - simdjson_inline simdjson_result current_location() noexcept; - /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ - simdjson_inline simdjson_result current_depth() const noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; -}; +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ -} // namespace simdjson +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H + // 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]; + } + } + } -/* 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 */ + // 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; + } -namespace simdjson { -namespace fallback { -namespace ondemand { + // 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; + } -// 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 { + // Count tokens in pointer + static consteval std::size_t count_tokens() { + if (pointer_str.empty() || pointer_str == "/") return 0; -enum class log_level : int32_t { - info = 0, - error = 1 -}; + std::size_t count = 0; + std::size_t pos = pointer_str[0] == '/' ? 1 : 0; -#if SIMDJSON_VERBOSE_LOGGING - static constexpr const bool LOG_ENABLED = true; -#else - static constexpr const bool LOG_ENABLED = false; -#endif + 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; + } -// 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 -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 -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; + return count; + } -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; + // 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; -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; + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -} // namespace logger -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H + return pointer_str.substr(pos, token_end - pos); + } +}; -/* 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 */ +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -namespace simdjson { -namespace fallback { -namespace ondemand { + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -/** - * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `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; + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; - /** - * 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 - 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 - 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 fallback -} // namespace simdjson + 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(); -namespace simdjson { + std::string_view token = pointer_view.substr(pos, token_end - pos); -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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 -}; + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -} // namespace simdjson + if (!found) return false; + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H + pos = token_end + 1; + } -/* 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 */ + return true; + } -namespace simdjson { -namespace fallback { -namespace ondemand { + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -/** - * 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}; + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -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; + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } - /** - * Tell whether the iterator is still at the start - */ - simdjson_inline bool at_root() const noexcept; + 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; + } + } - /** - * 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; + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } - /** - * 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; + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); - /** - * Tell whether the iterator is at the EOF mark - */ - simdjson_inline bool at_end() const noexcept; + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); - /** - * Tell whether the iterator is live (has not been moved). - */ - simdjson_inline bool is_alive() const noexcept; + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); - /** - * Abandon this iterator, setting depth to 0 (as if the document is finished). - */ - simdjson_inline void abandon() noexcept; + simdjson_result current_value = doc_or_val.get_value(); + auto json_value = access_impl<0>(current_value); + if (json_value.error()) return json_value.error(); - /** - * Advance the current token without modifying depth. - */ - simdjson_inline const uint8_t *return_current_and_advance() noexcept; + return json_value.get(target); + } - /** - * 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; +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; - /** - * 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; + 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(); - /** - * 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; + std::string_view token = pointer_view.substr(pos, token_end - pos); - /** - * 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; + if (parser::is_numeric(token)) { + current_type = path_accessor::get_element_type_reflected(current_type); + } else { + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); - /** - * Get current depth. - */ - simdjson_inline depth_t depth() const noexcept; + for (auto mem : members) { + if (std::meta::identifier_of(mem) == token) { + current_type = std::meta::type_of(mem); + break; + } + } + } - /** - * Get current (writeable) location in the string buffer. - */ - simdjson_inline uint8_t *&string_buf_loc() noexcept; + pos = token_end + 1; + } - /** - * 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_inline error_code report_error(error_code error, const char *message) noexcept; + return current_type; + } +}; - /** - * 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_inline error_code optional_error(error_code error, const char *message) noexcept; +// Compile-time JSON Pointer accessor with validation +template +inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); +} - /** - * 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; +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::arm64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); +} - 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 unescape(raw_json_string in, bool allow_replacement) noexcept; - simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept; +} // namespace json_path +} // namespace ondemand +} // namespace arm64 +} // namespace simdjson - simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_GENERIC_ONDEMAND_COMPILE_TIME_ACCESSORS_H - 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 +/* end file simdjson/generic/ondemand/compile_time_accessors.h for arm64 */ - /* Useful for debugging and logging purposes. */ - inline std::string to_string() const noexcept; +/* 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 */ - /** - * Returns the current location in the document if in bounds. - */ - inline simdjson_result current_location() const noexcept; +#undef SIMDJSON_SKIP_BACKSLASH_SHORT_CIRCUIT +/* undefining SIMDJSON_IMPLEMENTATION from "arm64" */ +#undef SIMDJSON_IMPLEMENTATION +/* end file simdjson/arm64/end.h */ - /** - * 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; +#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 - 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 - 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 - 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 +/* 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 -} // namespace ondemand -} // namespace fallback -} // namespace simdjson +/* 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 { -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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; -}; +class implementation; +} // namespace fallback } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H +#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): #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): #include "simdjson/fallback/base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace fallback { -namespace ondemand { +namespace { -/** - * The type of a JSON value. - */ -enum class json_type { - // 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) -}; +#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 -/** - * 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 { +/* 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 +} - /** - * 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; +} // unnamed namespace +} // namespace fallback +} // namespace simdjson - /** - * 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; +#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 */ - /** - * 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; +namespace simdjson { +namespace fallback { +namespace { - /** - * 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; +// 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; } -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 - 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 - 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. - */ + uint8_t c; +}; // struct backslash_and_quote - /** - * 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}; -}; +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] }; +} -/** - * 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 +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 + +#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(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_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 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 { /** - * Send JSON type to an output stream. + * A fast, simple, DOM-like interface that parses JSON as you use it. * - * @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). + * Designed for maximum speed and a lower memory profile. */ -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false); -#endif +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 { -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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 -}; +struct deserialize_tag; + +/// These types are deserializable in a built-in way +template struct is_builtin_deserializable : std::false_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; + +template +concept is_builtin_deserializable_v = is_builtin_deserializable::value; + +template +concept custom_deserializable = tag_invocable; + +template +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; + +template +concept nothrow_custom_deserializable = nothrow_tag_invocable; + +// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. +template +concept nothrow_deserializable = nothrow_custom_deserializable || is_builtin_deserializable_v; + +/// 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 + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for value + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document reference + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + +} deserialize{}; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H +#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_RAW_JSON_STRING_H */ +/* 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 */ @@ -45323,787 +47797,471 @@ namespace fallback { 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. + * Iterates through a single JSON value at a particular depth. * - * 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(). + * 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 raw_json_string { +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; + /** - * Create a new invalid raw_json_string. - * - * Exists so you can declare a variable and later assign to it before use. + * Denote that we're starting a document. */ - simdjson_inline raw_json_string() noexcept = default; + simdjson_inline void start_document() noexcept; /** - * 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. + * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object. * - * It *must* be terminated by a ", and be a valid JSON string. + * Optimized for scalars. */ - simdjson_inline raw_json_string(const uint8_t * _buf) noexcept; + simdjson_warn_unused simdjson_inline error_code skip_child() 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. + * Tell whether the iterator is at the EOF mark */ - simdjson_inline const char * raw() const noexcept; + simdjson_inline bool at_end() 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. + * Tell whether the iterator is at the start of the value */ - simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept; + simdjson_inline bool at_start() 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); + * Tell whether the value is open--if the value has not been used, or the array/object is still open. */ - simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept; + simdjson_inline bool is_open() 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); + * Tell whether the value is at an object's first field (just after the {). */ - simdjson_inline bool unsafe_is_equal(const char* target) const noexcept; + simdjson_inline bool at_first_field() 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). + * Abandon all iteration. */ - simdjson_inline bool is_equal(std::string_view target) const noexcept; + simdjson_inline void abandon() noexcept; /** - * This compares the current instance to the C string target: returns true if - * they are byte-by-byte equal (no escaping is done). + * Get the child value as a value_iterator. */ - simdjson_inline bool is_equal(const char* target) const noexcept; + simdjson_inline value_iterator child_value() 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!). + * Get the depth of this value. */ - 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: - + simdjson_inline int32_t depth() const noexcept; /** - * This will set the inner pointer to zero, effectively making - * this instance unusable. + * Get the JSON type of this value. + * + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". */ - simdjson_inline void consume() noexcept { buf = nullptr; } + simdjson_inline simdjson_result type() const noexcept; /** - * Checks whether the inner pointer is non-null and thus usable. + * @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. + * + * @{ */ - 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. + * Start an object iteration. * - * ## IMPORTANT: string_view lifetime + * @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 start_object() noexcept; + /** + * Start an object iteration from the root. * - * The string_view is only valid until the next parse() call on the parser. + * @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 start_root_object() noexcept; + /** + * Checks whether an object could be started from the root. May be called by start_root_object. * - * @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. + * @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_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept; - + simdjson_warn_unused simdjson_inline error_code check_root_object() 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/ + * Start an object iteration after the user has already checked and moved past the {. * - * ## IMPORTANT: string_view lifetime + * Does not move the iterator unless the object is empty ({}). * - * The string_view is only valid until the next parse() call on the parser. + * @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 started_object() noexcept; + /** + * Start an object iteration from the root, after the user has already checked and moved past the {. * - * @param iter A json_iterator, which contains a buffer where the string will be written. + * 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_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept; - const uint8_t * buf{}; - friend class object; - friend class field; - friend class parser; - friend struct simdjson_result; -}; - -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 fallback -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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 raw() const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result 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 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 */ -/* 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 - -namespace simdjson { -namespace fallback { -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; + simdjson_warn_unused simdjson_inline simdjson_result started_root_object() noexcept; -/** - * A JSON fragment iterator. - * - * This holds the actual iterator as well as the buffer for writing strings. - */ -class parser { -public: /** - * Create a JSON parser. + * Moves to the next field in an object. * - * The new parser will have zero capacity. + * 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. */ - inline explicit parser(size_t max_capacity = SIMDJSON_MAXSIZE_BYTES) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result has_next_field() 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; + /** + * Get the current field's key. + */ + simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept; - /** Deallocate the JSON parser. */ - inline ~parser() noexcept = default; + /** + * Pass the : in the field and move to its value. + */ + simdjson_warn_unused simdjson_inline error_code field_value() noexcept; /** - * 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. + * Find the next field with the given key. * - * 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: + * Assumes you have called next_field() or otherwise matched the previous value. * - * std::string json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"; - * document doc = parser.iterate(simdjson::pad(json)); + * This means the iterator must be sitting at the next key: * - * @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). + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` * - * @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. + * 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_result iterate(padded_string_view json) & noexcept; -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON - simdjson_warn_unused simdjson_result iterate_allow_incomplete_json(padded_string_view json) & noexcept; -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete; + simdjson_warn_unused simdjson_inline error_code find_field(const std::string_view key) noexcept; /** - * @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. + * 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. * - * ### REQUIRED: Buffer Padding + * Assumes you have called next_field() or otherwise matched the previous value. * - * 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 means the iterator must be sitting at the next key: * - * @param json The JSON to parse. + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` * - * @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. + * 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_result iterate_raw(padded_string_view json) & noexcept; - + simdjson_warn_unused simdjson_inline simdjson_result find_field_raw(const std::string_view key) 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. - * - * ### 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. + * Find the field with the given key without regard to order, and *without* unescaping. * - * ### Threads + * This is an unordered object lookup: if the field is not found initially, it will cycle around and scan from the beginning. * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * Assumes you have called next_field() or otherwise matched the previous value. * - * ### Parser Capacity + * This means the iterator must be sitting at the next key: * - * If the parser's current capacity is less than batch_size, it will allocate enough capacity - * to handle it (up to max_capacity). + * ``` + * { "a": 1, "b": 2 } + * ^ + * ``` * - * @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). + * 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.). */ - inline simdjson_result 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ - inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept; - /** @private We do not want to allow implicit conversion from C string to std::string. */ - simdjson_result 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. + * @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. + * @{ */ - 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. + * Check for an opening [ and start an array iteration. * - * @param capacity The new capacity. - * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH. - * @return The error, if there is one. + * @returns Whether the array had any elements (returns false for empty). + * @error INCORRECT_TYPE If there is no [. */ - simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept; - - #ifdef SIMDJSON_THREADS_ENABLED + simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept; /** - * 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. + * 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 */ - bool threaded{true}; - #else + simdjson_warn_unused simdjson_inline simdjson_result start_root_array() noexcept; /** - * When SIMDJSON_THREADS_ENABLED is not defined, the parser instance cannot use threads. + * 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 */ - bool threaded{false}; - #endif + simdjson_warn_unused simdjson_inline error_code check_root_array() noexcept; /** - * 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. + * Start an array iteration, after the user has already checked and moved past the [. * - * 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()). + * Does not move the iterator unless the array is empty ([]). * - * ## IMPORTANT: string_view lifetime + * @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 started_array() noexcept; + /** + * Start an array iteration from the root, after the user has already checked and moved past the [. * - * The string_view is only valid as long as the bytes in dst. + * Does not move the iterator unless the array is empty ([]). * - * @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. + * @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_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept; + simdjson_warn_unused simdjson_inline simdjson_result started_root_array() 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. + * Moves to the next element in an array. * - * 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. + * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it. + * Otherwise, it advances to the next value. * - * @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. + * @return Whether there is another element in the array. + * @error TAPE_ERROR If there is a comma missing between elements. */ - simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept; + simdjson_warn_unused simdjson_inline simdjson_result has_next_element() 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. + * Get a child value iterator. */ - bool string_buffer_overflow(const uint8_t *string_buf_loc) const noexcept; -#endif - -private: - /** @private [for benchmarking access] The implementation to use */ - std::unique_ptr implementation{}; - size_t _capacity{0}; - size_t _max_capacity; - size_t _max_depth{DEFAULT_MAX_DEPTH}; - std::unique_ptr string_buf{}; -#if SIMDJSON_DEVELOPMENT_CHECKS - std::unique_ptr start_positions{}; -#endif - - friend class json_iterator; - friend class document_stream; -}; - -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { + simdjson_warn_unused simdjson_inline value_iterator child() const noexcept; -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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; -}; + /** @} */ -} // namespace simdjson + /** + * @defgroup scalar Scalar values + * @addtogroup scalar + * @{ + */ -#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for fallback */ + simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept; + simdjson_warn_unused simdjson_inline bool is_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; -// 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H + simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept; + template + 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 get_root_wobbly_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + 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; -namespace simdjson { -namespace fallback { -namespace ondemand { + simdjson_inline void assert_is_valid() const noexcept; + simdjson_inline bool is_valid() const noexcept; -/** - * A forward-only JSON array. - */ -class array { -public: + /** @} */ +protected: /** - * Create a new invalid array. - * - * Exists so you can declare a variable and later assign to it before use. + * Restarts an array iteration. + * @returns Whether the array has any elements (returns false for empty). */ - simdjson_inline array() noexcept = default; - + simdjson_inline simdjson_result reset_array() noexcept; /** - * Begin array iteration. - * - * Part of the std::iterable interface. + * Restarts an object iteration. + * @returns Whether the object has any fields (returns false for empty). */ - simdjson_inline simdjson_result begin() noexcept; + simdjson_inline simdjson_result reset_object() noexcept; /** - * Sentinel representing the end of the array. + * 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. * - * Part of the std::iterable interface. - */ - simdjson_inline simdjson_result end() noexcept; + * Usage: used with value::count_elements(). + **/ + simdjson_inline void move_at_start() 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. + * move_at_container_start(): moves us so that we are pointing at the beginning of + * the container so that assert_at_container_start() passes. * - * To check that an array is empty, it is more performant to use - * the is_empty() method. - */ - simdjson_inline simdjson_result 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 is_empty() & noexcept; + * 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 parse_null(const uint8_t *json) const noexcept; + simdjson_inline simdjson_result 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; + /** - * 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. + * 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. * - * @returns true if the array contains some elements (not empty) - */ - inline simdjson_result 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. + * 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... * - * 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 + * ({"globals":{"a":{"shadowable":[}}}}) * - * 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. + * 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. * - * 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. + * 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. * - * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching. + * So the contract is: first call 'peek_...' and then call 'advance_...' only + * if you have determined that it is a type you can handle. * - * @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 + * Unfortunately, it makes the code more verbose, longer and maybe more error prone. */ - inline simdjson_result 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 - * - * @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 at_path(std::string_view json_path) noexcept; + 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; - /** - * 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 raw_json() 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; - /** - * 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 at(size_t index) noexcept; -protected: - /** - * Go to the end of the array, no matter where you are right now. - */ - simdjson_inline error_code consume() 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; /** - * 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 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 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. + * Advance to a place expecting a value (increasing depth). * - * @param iter The iterator. Must be after the initial [. Will be *moved* into the resulting array. + * @return The current token (the one left behind). + * @error TAPE_ERROR If the document ended early. */ - static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; + simdjson_inline simdjson_result 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; /** - * Create an array at the given Internal array creation. Call array::start() or array::started() instead of this. + * is_at_iterator_start() returns true on an array or object after it has just been + * created, whether the instance is empty or not. * - * @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. + * Usage: used by array::begin() in debug mode (SIMDJSON_DEVELOPMENT_CHECKS) */ - simdjson_inline array(const value_iterator &iter) noexcept; + simdjson_inline bool is_at_iterator_start() const noexcept; /** - * Iterator marking current position. + * Assuming that we are within an object, this returns true if we + * are pointing at a key. * - * iter.is_alive() == false indicates iteration is complete. + * Usage: the skip_child() method should never be used while we are pointing + * at a key inside an object. */ - value_iterator iter{}; + 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 value; friend class document; - friend struct simdjson_result; - friend struct simdjson_result; - friend class array_iterator; -}; + friend class object; + friend class array; + friend class value; + friend class field; +}; // value_iterator } // namespace ondemand } // namespace fallback @@ -46112,192 +48270,165 @@ class array { namespace simdjson { template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { +struct simdjson_result : public fallback::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(fallback::ondemand::array &&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; - - simdjson_inline simdjson_result begin() noexcept; - simdjson_inline simdjson_result end() noexcept; - inline simdjson_result count_elements() & noexcept; - inline simdjson_result is_empty() & noexcept; - inline simdjson_result reset() & noexcept; - simdjson_inline simdjson_result at(size_t index) noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - simdjson_inline simdjson_result raw_json() noexcept; - }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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 "simdjson/generic/implementation_simdjson_result_base.h" */ +/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#include namespace simdjson { + namespace fallback { namespace ondemand { - /** - * A forward-only JSON array. - * - * This is an input_iterator, meaning: - * - It is forward-only - * - * must be called exactly once per element. - * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) + * 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 array_iterator { +class value { public: - /** Create a new, invalid array iterator. */ - simdjson_inline array_iterator() noexcept = default; - - // - // Iterator interface - // - /** - * Get the current element. + * Create a new invalid value. * - * Part of the std::iterator interface. + * Exists so you can declare a variable and later assign to it before use. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline value() noexcept = default; + /** - * Check if we are at the end of the JSON. + * Get this value as the given type. * - * Part of the std::iterator interface. + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool * - * @return true if there are no more elements in the JSON array. + * 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. */ - simdjson_inline bool operator==(const array_iterator &) const noexcept; + template + simdjson_inline simdjson_result get() +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } + + /** - * Check if there are more elements in the JSON array. + * Get this value as the given type. * - * Part of the std::iterator interface. + * 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. * - * @return true if there are more elements in the JSON array. + * @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. */ - simdjson_inline bool operator!=(const array_iterator &) const noexcept; + template + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + #if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { + return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); + } else { + static_assert(!sizeof(T), "The get 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 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(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(out); // to get rid of unused errors + return UNINITIALIZED; +#endif + } + /** - * Move to the next element. + * Cast this JSON value to an array. * - * Part of the std::iterator interface. + * @returns An object that can be used to iterate the array. + * @returns INCORRECT_TYPE If the JSON value is not an array. */ - simdjson_inline array_iterator &operator++() noexcept; - -private: - value_iterator iter{}; + simdjson_inline simdjson_result get_array() noexcept; - simdjson_inline array_iterator(const value_iterator &iter) 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 get_object() noexcept; - friend class array; - friend class value; - friend struct simdjson_result; -}; + /** + * 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 get_uint64() noexcept; -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + /** + * 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 get_uint64_in_string() noexcept; -namespace simdjson { - -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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; - - // - // Iterator interface - // - - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result &) const noexcept; - simdjson_inline simdjson_result &operator++() noexcept; -}; - -} // 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 */ -#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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - - -namespace simdjson { -namespace fallback { -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 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 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 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 get_uint64_in_string() noexcept; /** * Cast this JSON value to a signed integer. * @@ -46305,6 +48436,7 @@ class document { * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. */ simdjson_inline simdjson_result get_int64() noexcept; + /** * Cast this JSON value (inside string) to a signed integer. * @@ -46312,6 +48444,7 @@ class document { * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. */ simdjson_inline simdjson_result get_int64_in_string() noexcept; + /** * Cast this JSON value to a double. * @@ -46321,25 +48454,40 @@ class document { simdjson_inline simdjson_result get_double() noexcept; /** - * Cast this JSON value (inside string) to a double. + * 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 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. + * Equivalent to get(). + * + * 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); * - * @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 get_string(bool allow_replacement = false) noexcept; + /** * Attempts to fill the provided std::string reference with the parsed value of the current string. * @@ -46354,13 +48502,16 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + /** - * Cast this JSON value to a string. + * Cast this JSON value to a "wobbly" string. * - * The string is not guaranteed to be valid UTF-8. See https://simonsapin.github.io/wtf-8/ + * The string is may not be a valid UTF-8 string. + * See https://simonsapin.github.io/wtf-8/ * - * Important: Calling get_wobbly_string() twice on the same document is an error. + * 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. @@ -46376,6 +48527,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. */ simdjson_inline simdjson_result get_raw_json_string() noexcept; + /** * Cast this JSON value to a bool. * @@ -46383,22 +48535,9 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not true or false. */ simdjson_inline simdjson_result 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 get_value() noexcept; /** - * Checks if this JSON value is null. If and only if the value is + * 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. * @@ -46407,128 +48546,32 @@ class document { */ simdjson_inline simdjson_result 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 - simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); - T out{}; - SIMDJSON_TRY(get(out)); - return out; - } - /** - * @overload template simdjson_result 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 - simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(!std::is_same::value && !std::is_same::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(*this).get(); - } - - /** - * 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { -#if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { - return deserialize(*this, out); - } else { - static_assert(!sizeof(T), "The get 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 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(out); // to get rid of unused errors - return UNINITIALIZED; - } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION - // 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(out); // to get rid of unused errors - return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION - } - - /** @overload template error_code get(T &out) & noexcept */ - template 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 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.) + * 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 - explicit simdjson_inline operator T() & noexcept(false); - template - explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); - + 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); + 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); + simdjson_inline operator object() noexcept(false); /** * Cast this JSON value to an unsigned integer. * @@ -46555,6 +48598,8 @@ class document { * * The string is guaranteed to be valid UTF-8. * + * Equivalent to get(). + * * @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. @@ -46576,19 +48621,22 @@ class document { * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false. */ simdjson_inline operator bool() noexcept(false); +#endif + /** - * Cast this JSON value to a value when the document is an object or an array. + * Begin array iteration. * - * 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. + * Part of the std::iterable interface. * - * @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). + * @returns INCORRECT_TYPE If the JSON value is not an array. */ - simdjson_inline operator value() noexcept(false); -#endif + simdjson_inline simdjson_result begin() & noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result 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 @@ -46598,11 +48646,13 @@ class document { * 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. + * 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 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 @@ -46614,7 +48664,10 @@ class document { * safe to continue. * * To check that an object is empty, it is more performant to use - * the is_empty() method. + * 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 count_fields() & noexcept; /** @@ -46624,55 +48677,32 @@ class document { * @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 at(size_t index) & noexcept; - /** - * Begin array iteration. - * - * Part of the std::iterable interface. - */ - simdjson_inline simdjson_result begin() & noexcept; - /** - * Sentinel representing the end of the array. - * - * Part of the std::iterable interface. - */ - simdjson_inline simdjson_result end() & noexcept; - + simdjson_inline simdjson_result at(size_t index) noexcept; /** * Look up a field by name on an object (order-sensitive). * * 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 }`: * - * ```c++ + * ```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. 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 find_field(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field(const char *key) noexcept; /** * Look up a field by name on an object, without regard to key order. @@ -46687,31 +48717,23 @@ class document { * 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. + * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful + * that only one field is returned. * - * 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. + * 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 find_field_unordered(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) noexcept; + simdjson_result operator[](int) noexcept = delete; /** * Get the type of this JSON value. It does not validate or consume the value. @@ -46722,21 +48744,22 @@ class document { * 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 type() noexcept; /** - * Checks whether the document is a scalar (string, number, null, Boolean). + * 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 is_scalar() noexcept; - /** - * Checks whether the document is a string. + * 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". @@ -46744,18 +48767,22 @@ class document { simdjson_inline simdjson_result is_string() noexcept; /** - * Checks whether the document is a negative number. + * Checks whether the value 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 + * 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 is_integer() noexcept; @@ -46770,12 +48797,12 @@ class document { * 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. + * 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 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 + * 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 @@ -46802,6 +48829,8 @@ class document { * 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 @@ -46810,6 +48839,10 @@ class document { * 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 get_number() noexcept; @@ -46823,8 +48856,9 @@ class document { * 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. + * 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: * - { @@ -46834,36 +48868,25 @@ class document { * - true * - false * - null + * + * See also value::raw_json(). */ - simdjson_inline simdjson_result raw_json_token() noexcept; + simdjson_inline 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. + * 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. */ - inline bool is_alive() noexcept; + simdjson_inline simdjson_result raw_json() noexcept; /** * Returns the current location in the document if in bounds. */ - inline simdjson_result 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; + simdjson_inline simdjson_result current_location() noexcept; /** * Returns the current depth in the document if in bounds. @@ -46892,19 +48915,23 @@ class document { * 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. + * 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. * - * 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) + * 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. * - * 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. + * 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 * @@ -46913,7 +48940,6 @@ class document { * - 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 at_pointer(std::string_view json_pointer) noexcept; @@ -46922,226 +48948,73 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 - * - * 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 at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result at_path(std::string_view at_path) noexcept; + +protected: /** - * 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. + * Create a value. */ - simdjson_inline simdjson_result raw_json() noexcept; -protected: + simdjson_inline value(const value_iterator &iter) noexcept; + /** - * Consumes the document. + * Skip this value, allowing iteration to continue. */ - simdjson_inline error_code consume() noexcept; + simdjson_inline void skip() noexcept; - simdjson_inline document(ondemand::json_iterator &&iter) noexcept; - simdjson_inline const uint8_t *text(uint32_t idx) const 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; - simdjson_inline value_iterator resume_value_iterator() noexcept; - simdjson_inline value_iterator get_root_value_iterator() 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 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 + // 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 value; - friend class ondemand::parser; + friend class field; friend class object; - friend class array; + friend struct simdjson_result; + friend struct simdjson_result; friend class field; - friend class token; - friend class document_stream; - friend class document_reference; }; +} // namespace ondemand +} // namespace fallback +} // namespace simdjson -/** - * 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 { +namespace simdjson { + +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { 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 get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; - - simdjson_inline simdjson_result is_null() noexcept; - template - simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); - T out{}; - SIMDJSON_TRY(get(out)); - return out; - } - template - simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(!std::is_same::value && !std::is_same::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(*this).get(); - } - - /** - * 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { -#if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { - return deserialize(*this, out); - } else { - static_assert(!sizeof(T), "The get 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 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(out); // to get rid of unused errors - return UNINITIALIZED; - } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION - // 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(out); // to get rid of unused errors - return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION - } - - /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; - simdjson_inline simdjson_result raw_json() noexcept; - simdjson_inline operator document&() const noexcept; -#if SIMDJSON_EXCEPTIONS - template - 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 count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - - simdjson_inline simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - - simdjson_inline simdjson_result current_location() noexcept; - simdjson_inline int32_t current_depth() const noexcept; - simdjson_inline bool is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; - simdjson_inline simdjson_result raw_json_token() noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - -private: - document *doc{nullptr}; -}; -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - simdjson_inline simdjson_result(fallback::ondemand::document &&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 error_code rewind() noexcept; - simdjson_inline simdjson_result get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_array() noexcept; + simdjson_inline simdjson_result get_object() noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; simdjson_inline simdjson_result get_uint64_in_string() noexcept; simdjson_inline simdjson_result get_int64() noexcept; @@ -47150,492 +49023,363 @@ struct simdjson_result : public fallback::implemen simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; simdjson_inline simdjson_result is_null() noexcept; - template simdjson_inline simdjson_result get() & noexcept; - template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; + template simdjson_inline simdjson_result get() noexcept; + + template simdjson_inline error_code get(T &out) noexcept; - template simdjson_inline error_code get(T &out) & noexcept; - template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS - template ::value == false>::type> + template 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 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 fallback::ondemand::raw_json_string() noexcept(false); simdjson_inline operator bool() noexcept(false); - simdjson_inline operator fallback::ondemand::value() noexcept(false); #endif simdjson_inline simdjson_result count_elements() & noexcept; simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result at(size_t index) noexcept; simdjson_inline simdjson_result begin() & noexcept; simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). + * + * 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 find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result 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. + * + * It is the default, however, 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 find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) noexcept; + simdjson_result 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 type() noexcept; simdjson_inline simdjson_result is_scalar() noexcept; simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result 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 is_negative() noexcept; simdjson_inline simdjson_result is_integer() noexcept; simdjson_inline simdjson_result get_number_type() noexcept; simdjson_inline simdjson_result get_number() noexcept; - /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ + + /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ simdjson_inline simdjson_result raw_json_token() noexcept; + simdjson_inline simdjson_result raw_json() noexcept; + /** @copydoc simdjson_inline simdjson_result current_location() noexcept */ + simdjson_inline simdjson_result current_location() noexcept; + /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ + simdjson_inline simdjson_result current_depth() const noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(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 */ +#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 fallback { +namespace ondemand { -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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 get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; - simdjson_inline simdjson_result is_null() noexcept; +// 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 { - template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; +enum class log_level : int32_t { + info = 0, + error = 1 +}; - template simdjson_inline error_code get(T &out) & noexcept; - template simdjson_inline error_code get(T &out) && noexcept; -#if SIMDJSON_EXCEPTIONS - template - 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 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 bool() noexcept(false); - simdjson_inline operator fallback::ondemand::value() noexcept(false); +#if SIMDJSON_VERBOSE_LOGGING + static constexpr const bool LOG_ENABLED = true; +#else + static constexpr const bool LOG_ENABLED = false; #endif - simdjson_inline simdjson_result count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result current_location() noexcept; - simdjson_inline simdjson_result current_depth() const noexcept; - simdjson_inline simdjson_result is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; - /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ - simdjson_inline simdjson_result raw_json_token() noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; -}; +// 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 +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 +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 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H */ +/* 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/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/logger.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#ifdef SIMDJSON_THREADS_ENABLED -#include -#include -#include -#endif - namespace simdjson { namespace fallback { 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(); +/** + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`) + * detected by stage 1. + * + * @private This is not intended for external use. + */ +class token_iterator { +public: /** - * Start a stage 1 job. You should first call 'run', then 'finish'. - * You must call start_thread once before. + * Create a new invalid token_iterator. + * + * Exists so you can declare a variable and later assign to it before use. */ - 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(); + 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; - 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. + * Advance to the next token (returning the current one). */ - bool has_work{false}; - bool can_work{true}; - + simdjson_inline const uint8_t *return_current_and_advance() noexcept; /** - * We lock using a mutex. + * Reports the current offset in bytes from the start of the underlying buffer. */ - 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: + simdjson_inline uint32_t current_offset() const noexcept; /** - * Construct an uninitialized document_stream. + * Get the JSON text for a given token (relative). * - * ```c++ - * document_stream docs; - * auto error = parser.iterate_many(json).get(docs); - * ``` + * 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 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; - + simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept; /** - * Returns the input size in bytes. + * 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. */ - inline size_t size_in_bytes() const noexcept; + simdjson_inline uint32_t peek_length(int32_t delta=0) 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()). + * Get the JSON text for a given token. * - * You should only call truncated_bytes() after streaming through all - * documents, like so: + * This is not null-terminated; it is a view into the JSON. * - * document_stream stream = parser.iterate_many(json,window); - * for(auto & doc : stream) { - * // do something with doc - * } - * size_t truncated = stream.truncated_bytes(); + * @param position The position of the token. * */ - inline size_t truncated_bytes() const noexcept; - - class iterator { - public: - using value_type = simdjson_result; - using reference = simdjson_result; - using pointer = void; - using difference_type = std::ptrdiff_t; - using iterator_category = std::input_iterator_tag; - - /** - * Default constructor. - */ - simdjson_inline iterator() noexcept; - /** - * 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; - /** - * @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; - - 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; - }; - - /** - * Start iterating the documents in the stream. - */ - simdjson_inline iterator begin() noexcept; + simdjson_inline const uint8_t *peek(token_position position) const noexcept; /** - * The end of the stream, for iterator comparison purposes. + * 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 iterator end() noexcept; - -private: - - document_stream &operator=(const document_stream &) = delete; // Disallow copying - document_stream(const document_stream &other) = delete; // Disallow copying - + simdjson_inline uint32_t peek_length(token_position position) const noexcept; /** - * Construct a document_stream. Does not allocate or parse anything until the iterator is - * used. + * Get the maximum length of the JSON text for a root token. * - * @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) + * 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 document_stream( - ondemand::parser &parser, - const uint8_t *buf, - size_t len, - size_t batch_size, - bool allow_comma_separated - ) noexcept; - + simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; /** - * Parse the first document in the buffer. Used by begin(), to handle allocation and - * initialization. + * Return the current index. */ - inline void start() noexcept; - + simdjson_inline token_position position() const 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. + * Reset to a previously saved index. */ - inline void next() noexcept; + simdjson_inline void set_position(token_position target_position) noexcept; - /** Move the json_iterator of the document to the location of the next document in the stream. */ - inline void next_document() 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. - /** Get the next document index. */ - inline size_t next_batch_start() 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; + simdjson_inline bool operator<=(const token_iterator &other) 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; +protected: + simdjson_inline token_iterator(const uint8_t *buf, token_position position) 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. + * 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. */ - 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 worker{new(std::nothrow) stage1_worker()}; + simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept; /** - * The parser used to run stage 1 in the background. Will be swapped - * with the regular parser when finished. + * 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. + * */ - ondemand::parser stage1_thread_parser{}; + simdjson_inline uint32_t peek_index(token_position position) const noexcept; - friend struct stage1_worker; - #endif // SIMDJSON_THREADS_ENABLED + const uint8_t *buf{}; + token_position _position{}; - friend class parser; - friend class document; friend class json_iterator; - friend struct simdjson_result; - friend struct simdjson::internal::simdjson_result_base; -}; // document_stream + friend class value_iterator; + friend class object; + template + 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 + 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 fallback } // namespace simdjson namespace simdjson { + template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { +struct simdjson_result : public fallback::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(fallback::ondemand::document_stream &&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 }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */ +/* 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/raw_json_string.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { @@ -47643,330 +49387,311 @@ namespace fallback { namespace ondemand { /** - * A JSON field (key/value pair) in an object. - * - * Returned from object iteration. + * Iterates through JSON tokens, keeping track of depth and string buffer. * - * Extends from std::pair so you can use C++ algorithms that rely on pairs. + * @private This is not intended for external use. */ -class field : public std::pair { -public: +class json_iterator { +protected: + token_iterator token{}; + ondemand::parser *parser{}; /** - * Create a new invalid field. + * Next free location in the string buffer. * - * Exists so you can declare a variable and later assign to it before use. + * Used by raw_json_string::unescape() to have a place to unescape strings to. */ - simdjson_inline field() noexcept; - + uint8_t *_string_buf_loc{}; /** - * 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. + * JSON error, if there is one. * - * This consumes the key: once you have called unescaped_key(), you cannot - * call it again nor can you call key(). + * 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. */ - simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement = false) noexcept; + error_code error{SUCCESS}; /** - * 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. + * Depth of the current token in the JSON. * - * This consumes the key: once you have called unescaped_key(), you cannot - * call it again nor can you call key(). + * - 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. */ - template - simdjson_inline simdjson_warn_unused error_code unescaped_key(string_type& receiver, bool allow_replacement = false) noexcept; + depth_t _depth{}; /** - * 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. + * 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); */ - simdjson_inline raw_json_string key() const noexcept; + token_position _root{}; /** - * 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(). + * 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. */ - simdjson_inline std::string_view key_raw_json_token() const noexcept; + 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; /** - * 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. + * Skips a JSON value, whether it is a scalar, array or object. */ - simdjson_inline std::string_view escaped_key() const noexcept; + simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept; + /** - * Get the field value. + * Tell whether the iterator is still at the start */ - simdjson_inline ondemand::value &value() & noexcept; + simdjson_inline bool at_root() const noexcept; + /** - * @overload ondemand::value &ondemand::value() & 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 ondemand::value value() && noexcept; - -protected: - simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept; - static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept; - static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept; - friend struct simdjson_result; - friend class object_iterator; -}; - -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { -public: - 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 bool streaming() const noexcept; - simdjson_inline simdjson_result unescaped_key(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result key() noexcept; - simdjson_inline simdjson_result key_raw_json_token() noexcept; - simdjson_inline simdjson_result escaped_key() noexcept; - simdjson_inline simdjson_result value() 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; -} // namespace simdjson + /** + * Tell whether the iterator is at the EOF mark + */ + simdjson_inline bool at_end() const noexcept; -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H + /** + * Tell whether the iterator is live (has not been moved). + */ + simdjson_inline bool is_alive() const noexcept; -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + /** + * Abandon this iterator, setting depth to 0 (as if the document is finished). + */ + simdjson_inline void abandon() noexcept; -namespace simdjson { -namespace fallback { -namespace ondemand { + /** + * Advance the current token without modifying depth. + */ + simdjson_inline const uint8_t *return_current_and_advance() noexcept; -/** - * A forward-only JSON object field iterator. - */ -class object { -public: /** - * Create a new invalid object. + * 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). * - * Exists so you can declare a variable and later assign to it before use. + * @return whether there is a single token */ - simdjson_inline object() noexcept = default; + simdjson_inline bool is_single_token() const noexcept; - simdjson_inline simdjson_result begin() noexcept; - simdjson_inline simdjson_result end() noexcept; /** - * Look up a field by name on an object (order-sensitive). + * Assert that there are at least the given number of tokens left. * - * 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 }`: + * 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). * - * ```c++ - * 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. + * 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). * - * **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 }`. + * This is not null-terminated; it is a view into the JSON. * - * 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. + * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token. * - * 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. + * 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). * - * If you expect to have keys with escape characters, please review our documentation. + * The length will include any whitespace at the end of the token. * - * @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. + * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token. */ - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; - + simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept; /** - * Look up a field by name on an object, without regard to key order. + * Get a pointer to the current location in the input buffer. * - * **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. + * This is not null-terminated; it is a view into the JSON. * - * It is the default, however, 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. + * 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. * - * 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). + * This is not null-terminated; it is a view into the JSON. * - * If you have multiple fields with a matching key ({"x": 1, "x": 1}) be mindful - * that only one field is returned. + * @param position The position of the token to retrieve. * - * 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. + * 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). * - * 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. + * The length will include any whitespace at the end of the token. * - * 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. + * @param position The position of the token to retrieve. */ - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; - + simdjson_inline uint32_t peek_length(token_position position) const 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 + * Get the maximum length of the JSON text for the current root token. * - * It is allowed for a key to be the empty string: + * The length will include any whitespace at the end of the token. * - * ondemand::parser parser; - * auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded; - * auto doc = parser.iterate(json); - * doc.at_pointer("//a/1") == 20 + * @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. * - * 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. + * This is not null-terminated; it is a view into the JSON. * - * 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. + * 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. * - * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching. + * Validates that the depth - 1 == parent_depth. * - * @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 + * @param parent_depth the expected parent depth. */ - inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline void ascend_to(depth_t parent_depth) 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. + * Descend one level. * - * @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 + * Validates that the new depth == child_depth. + * + * @param child_depth the expected child depth. */ - inline simdjson_result at_path(std::string_view json_path) noexcept; + simdjson_inline void descend_to(depth_t child_depth) noexcept; + simdjson_inline void descend_to(depth_t child_depth, int32_t delta) 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) + * Get current depth. */ - inline simdjson_result reset() & noexcept; + simdjson_inline depth_t depth() const 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. + * Get current (writeable) location in the string buffer. */ - inline simdjson_result is_empty() & noexcept; + simdjson_inline uint8_t *&string_buf_loc() 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. + * Report an unrecoverable error, preventing further iteration. * - * Performance hint: You should only call count_fields() as a last - * resort as it may require scanning the document twice or more. + * @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_inline simdjson_result count_fields() & noexcept; + simdjson_warn_unused simdjson_inline error_code report_error(error_code error, const char *message) 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. + * 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_inline simdjson_result raw_json() noexcept; + simdjson_warn_unused simdjson_inline error_code optional_error(error_code error, const char *message) noexcept; -protected: /** - * Go to the end of the object, no matter where you are right now. + * 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_inline error_code consume() noexcept; - static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; - static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; - static simdjson_inline simdjson_result 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 bool copy_to_buffer(const uint8_t *json, uint32_t max_len, uint8_t *tmpbuf, size_t N) noexcept; - simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) 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 unescape(raw_json_string in, bool allow_replacement) noexcept; + simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept; - value_iterator iter{}; + 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 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 value; friend class document; - friend struct simdjson_result; -}; + 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 + 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 + 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 fallback @@ -47975,86 +49700,163 @@ class object { namespace simdjson { template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { +struct simdjson_result : public fallback::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(fallback::ondemand::object &&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; - - simdjson_inline simdjson_result begin() noexcept; - simdjson_inline simdjson_result end() noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - - inline simdjson_result reset() noexcept; - inline simdjson_result is_empty() noexcept; - inline simdjson_result count_fields() & noexcept; - inline simdjson_result raw_json() noexcept; + simdjson_inline simdjson_result() noexcept = default; }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H */ +/* 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/ondemand/value_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/numberparsing.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace fallback { namespace ondemand { -class object_iterator { -public: +/** + * 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 { + /** - * Create a new invalid object_iterator. + * return the automatically determined type of + * the number: number_type::floating_point_number, + * number_type::signed_integer or number_type::unsigned_integer. * - * Exists so you can declare a variable and later assign to it before use. + * 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 object_iterator() noexcept = default; + 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; - // - // Iterator interface - // + /** + * 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; - // Reads key and value, yielding them to the user. - // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline simdjson_result 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 ',' - simdjson_inline object_iterator &operator++() noexcept; -private: /** - * 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. + * return true if the automatically determined type of + * the number is number_type::floating_point_number. */ - value_iterator iter{}; + 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; - simdjson_inline object_iterator(const value_iterator &iter) noexcept; - friend struct simdjson_result; - friend class object; + /** + * 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 + 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 + 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 &type) noexcept(false); +#endif + } // namespace ondemand } // namespace fallback } // namespace simdjson @@ -48062,534 +49864,645 @@ class object_iterator { namespace simdjson { template<> -struct simdjson_result : public fallback::implementation_simdjson_result_base { +struct simdjson_result : public fallback::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(fallback::ondemand::object_iterator &&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; - - // - // Iterator interface - // - - // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result 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 &) const noexcept; - // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result &) const noexcept; - // Checks for ']' and ',' - simdjson_inline simdjson_result &operator++() noexcept; + simdjson_inline ~simdjson_result() noexcept = default; ///< @private }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H */ +/* 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 { -/** - * 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 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 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 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 to_json_string(fallback::ondemand::array& x) noexcept; -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -} // 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 fallback { namespace ondemand { +namespace fallback { +namespace ondemand { /** - * Print JSON to an output stream. It does not - * validate the content. + * A string escaped per JSON rules, terminated with quote ("). They are used to represent + * unescaped keys inside JSON documents. * - * @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::fallback::ondemand::value x); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); -#endif -/** - * Print JSON to an output stream. It does not - * validate the content. + * (In other words, a pointer to the beginning of a string, just after the start quote, inside a + * JSON file.) * - * @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::fallback::ondemand::array value); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); -#endif -/** - * Print JSON to an output stream. It does not - * validate the content. + * 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. * - * @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::fallback::ondemand::document& value); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x); -#endif -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&& x); -#endif -/** - * Print JSON to an output stream. It does not - * validate the content. + * 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(). * - * @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::fallback::ondemand::object value); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); -#endif -}}} // namespace simdjson::fallback::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for fallback */ - -// 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 */ -#if SIMDJSON_SUPPORTS_DESERIALIZATION - -#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/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -#include -#include - -namespace simdjson { -template -constexpr bool require_custom_serialization = false; +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; -////////////////////////////// -// Number deserialization -////////////////////////////// + /** + * 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; -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - using limits = std::numeric_limits; + /** + * 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; - uint64_t x; - SIMDJSON_TRY(val.get_uint64().get(x)); - if (x > (limits::max)()) { - return NUMBER_OUT_OF_RANGE; - } - out = static_cast(x); - return SUCCESS; -} + /** + * 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; -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - double x; - SIMDJSON_TRY(val.get_double().get(x)); - out = static_cast(x); - return SUCCESS; -} + /** + * 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; -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - using limits = std::numeric_limits; + /** + * 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; - 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(x); - return SUCCESS; -} + /** + * 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; -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { - std::string_view str; - SIMDJSON_TRY(val.get_string().get(str)); - out = T{str}; - return SUCCESS; -} + /** + * 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; -/** - * 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>(). - */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { - using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the container must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the container must default constructible."); +private: - fallback::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); - for (auto v : arr) { - if constexpr (concepts::returns_reference) { - if (auto const err = v.get().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(out.pop_back()); - } - return err; - } - } else { - value_type temp; - if (auto const err = v.get().get(temp); err) { - return err; - } - concepts::emplace_one(out, std::move(temp)); - } - } - return SUCCESS; -} + /** + * This will set the inner pointer to zero, effectively making + * this instance unusable. + */ + simdjson_inline void consume() noexcept { buf = nullptr; } -/** - * We want to support std::map and std::unordered_map but only for - * string-keyed types. - */ - template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { - using value_type = typename std::remove_cvref_t::mapped_type; - static_assert( - deserializable, - "The specified value type inside the container must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified value type inside the container must default constructible."); - fallback::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().get(this_value)); - [[maybe_unused]] std::pair 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; -} + /** + * 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 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 unescape_wobbly(json_iterator &iter) const noexcept; + const uint8_t * buf{}; + friend class object; + friend class field; + friend class parser; + friend struct simdjson_result; +}; +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) noexcept; /** - * 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 + * 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. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { - using element_type = typename std::remove_cvref_t::element_type; - - // For better error messages, don't use these as constraints on - // the tag_invoke CPO. - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); +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; - auto ptr = new (std::nothrow) element_type(); - if (ptr == nullptr) { - return MEMALLOC; - } - SIMDJSON_TRY(val.template get(*ptr)); - out.reset(ptr); - return SUCCESS; -} -/** - * This CPO (Customization Point Object) will help deserialize into optional types. - */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { - using value_type = typename std::remove_cvref_t::value_type; +} // namespace ondemand +} // namespace fallback +} // namespace simdjson - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); +namespace simdjson { - if (!out) { - out.emplace(); - } - SIMDJSON_TRY(val.template get(out.value())); - return SUCCESS; -} +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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 raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept; +}; } // namespace simdjson -#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION -/* end file simdjson/generic/ondemand/std_deserialize.h for fallback */ - -// 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #define SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #include "simdjson/generic/implementation_simdjson_result_base.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#include +#include + namespace simdjson { namespace fallback { 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::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::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::started(value_iterator &iter) noexcept { - bool has_value; - SIMDJSON_TRY(iter.started_array().get(has_value)); - return array(iter); -} - -simdjson_inline simdjson_result 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::end() noexcept { - return array_iterator(iter); -} -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 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(starting_point), size_t(final_point - starting_point)); -} - -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline simdjson_result 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 +/** + * 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; -simdjson_inline simdjson_result 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; -} +/** + * 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 simdjson_result array::reset() & noexcept { - return iter.reset_array(); -} + 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; -inline simdjson_result 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; } + /** Deallocate the JSON parser. */ + inline ~parser() noexcept = default; - // 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; - } + /** + * 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 iterate(padded_string_view json) & noexcept; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + simdjson_warn_unused simdjson_result iterate_allow_incomplete_json(padded_string_view json) & noexcept; +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete; - // 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" + /** + * @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 iterate_raw(padded_string_view json) & noexcept; - // 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; -} + /** + * 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 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 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 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 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 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 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 iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; -inline simdjson_result 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); -} + /** 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; -simdjson_inline simdjson_result 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; -} + /** + * 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 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 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); + /** @private [for benchmarking access] The implementation to use */ + std::unique_ptr implementation{}; + size_t _capacity{0}; + size_t _max_capacity; + size_t _max_depth{DEFAULT_MAX_DEPTH}; + std::unique_ptr string_buf{}; + +#if SIMDJSON_DEVELOPMENT_CHECKS + std::unique_ptr start_positions{}; +#endif + + friend class json_iterator; + friend class document_stream; +}; } // namespace ondemand } // namespace fallback @@ -48597,1042 +50510,678 @@ simdjson_inline simdjson_result array::at(size_t index) noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::array &&value -) noexcept - : implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept - : implementation_simdjson_result_base(error) -{ -} +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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; +}; -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::is_empty() & noexcept { - if (error()) { return error(); } - return first.is_empty(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); -} -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); -} -simdjson_inline simdjson_result simdjson_result::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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H +#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_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): #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 { -namespace fallback { -namespace ondemand { - -simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} -simdjson_inline simdjson_result array_iterator::operator*() noexcept { - 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 { - 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; -} -} // namespace ondemand -} // namespace fallback -} // namespace simdjson +#if SIMDJSON_SUPPORTS_CONCEPTS -namespace simdjson { +namespace fallback { +namespace builder { + class string_builder; +}} -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::array_iterator &&value -) noexcept - : fallback::implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : fallback::implementation_simdjson_result_base({}, error) -{ -} +template +struct has_custom_serialization : std::false_type {}; -simdjson_inline simdjson_result simdjson_result::operator*() noexcept { - if (error()) { return error(); } - return *first; -} -simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return !error(); } - return first == other.first; -} -simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -simdjson_inline simdjson_result &simdjson_result::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; -} +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(fallback::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } -} // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; -/* 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 */ +template +constexpr bool require_custom_serialization = has_custom_serialization::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS -namespace simdjson { namespace fallback { -namespace ondemand { +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); -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; -} + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; -simdjson_inline simdjson_result value::get_array() noexcept { - return array::start(iter); -} -simdjson_inline simdjson_result value::get_object() noexcept { - return object::start(iter); -} -simdjson_inline simdjson_result value::start_or_resume_object() noexcept { - if (iter.at_start()) { - return get_object(); - } else { - return object::resume(iter); - } -} + /** + * 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::value>::type> + simdjson_inline void append(number_type v) noexcept; -simdjson_inline simdjson_result value::get_raw_json_string() noexcept { - return iter.get_raw_json_string(); -} -simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept { - return iter.get_string(allow_replacement); -} -template -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 value::get_wobbly_string() noexcept { - return iter.get_wobbly_string(); -} -simdjson_inline simdjson_result value::get_double() noexcept { - return iter.get_double(); -} -simdjson_inline simdjson_result value::get_double_in_string() noexcept { - return iter.get_double_in_string(); -} -simdjson_inline simdjson_result value::get_uint64() noexcept { - return iter.get_uint64(); -} -simdjson_inline simdjson_result value::get_uint64_in_string() noexcept { - return iter.get_uint64_in_string(); -} -simdjson_inline simdjson_result value::get_int64() noexcept { - return iter.get_int64(); -} -simdjson_inline simdjson_result value::get_int64_in_string() noexcept { - return iter.get_int64_in_string(); -} -simdjson_inline simdjson_result value::get_bool() noexcept { - return iter.get_bool(); -} -simdjson_inline simdjson_result value::is_null() noexcept { - return iter.is_null(); -} + /** + * Append character c. + */ + simdjson_inline void append(char c) noexcept; -template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } + /** + * Append the string 'null'. + */ + simdjson_inline void append_null() noexcept; + /** + * Clear the content. + */ + simdjson_inline void clear() noexcept; -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } + /** + * 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; -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline value::operator T() noexcept(false) { - return get(); -} -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(); -} + /** + * 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 + 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; -simdjson_inline simdjson_result value::begin() & noexcept { - return get_array().begin(); -} -simdjson_inline simdjson_result value::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result value::count_elements() & noexcept { - simdjson_result 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 value::count_fields() & noexcept { - simdjson_result answer; - auto a = get_object(); - answer = a.count_fields(); - iter.move_at_start(); - return answer; -} -simdjson_inline simdjson_result value::at(size_t index) noexcept { - auto a = get_array(); - return a.at(index); -} - -simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept { - return start_or_resume_object().find_field(key); -} -simdjson_inline simdjson_result value::find_field(const char *key) noexcept { - return start_or_resume_object().find_field(key); -} + /** + * 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; -simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept { - return start_or_resume_object().find_field_unordered(key); -} -simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept { - return start_or_resume_object().find_field_unordered(key); -} + /** + * Append the C string directly, without escaping. + * There is no UTF-8 validation. + */ + simdjson_inline void append_raw(const char *c) noexcept; -simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept { - return start_or_resume_object()[key]; -} -simdjson_inline simdjson_result value::operator[](const char *key) noexcept { - return start_or_resume_object()[key]; -} + /** + * Append "{" to the buffer. + */ + simdjson_inline void start_object() noexcept; -simdjson_inline simdjson_result value::type() noexcept { - return iter.type(); -} + /** + * Append "}" to the buffer. + */ + simdjson_inline void end_object() noexcept; -simdjson_inline simdjson_result 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)); -} + /** + * Append "[" to the buffer. + */ + simdjson_inline void start_array() noexcept; -simdjson_inline simdjson_result value::is_string() noexcept { - json_type this_type; - auto error = type().get(this_type); - if(error) { return error; } - return (this_type == json_type::string); -} + /** + * Append "]" to the buffer. + */ + simdjson_inline void end_array() noexcept; + /** + * Append "," to the buffer. + */ + simdjson_inline void append_comma() noexcept; -simdjson_inline bool value::is_negative() noexcept { - return iter.is_negative(); -} + /** + * Append ":" to the buffer. + */ + simdjson_inline void append_colon() noexcept; -simdjson_inline simdjson_result value::is_integer() noexcept { - return iter.is_integer(); -} -simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept { - return iter.get_number_type(); -} -simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept { - return iter.get_number(); -} + /** + * 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; -simdjson_inline std::string_view value::raw_json_token() noexcept { - return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length()); -} + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); -simdjson_inline simdjson_result 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(); - } -} + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); -simdjson_inline simdjson_result value::current_location() noexcept { - return iter.json_iter().current_location(); -} + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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; -simdjson_inline int32_t value::current_depth() const noexcept{ - return iter.json_iter().depth(); -} + /** + * 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); -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; -} + /** + * 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 -simdjson_inline simdjson_result 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; - } -} + /** + * 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 view() const noexcept; -simdjson_inline simdjson_result 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; - } -} + /** + * 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 c_str() noexcept; -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + /** + * Return true if the content is valid UTF-8. + */ + simdjson_inline bool validate_unicode() const noexcept; -namespace simdjson { + /** + * Returns the current size of the written JSON buffer. + * If an error occurred, returns 0. + */ + simdjson_inline size_t size() const noexcept; -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::value &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - if (error()) { return error(); } - return {}; -} +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); -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept { - if (error()) { return error(); } - return first.find_field(key); -} + /** + * 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); -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} + /** + * We use this helper function to make sure that is_valid is kept consistent. + */ + simdjson_inline void set_valid(bool valid) noexcept; -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept { - if (error()) { return error(); } - return first[key]; -} + std::unique_ptr buffer{}; + size_t position{0}; + size_t capacity{0}; + bool is_valid{true}; +}; -simdjson_inline simdjson_result simdjson_result::get_array() noexcept { - if (error()) { return error(); } - return first.get_array(); -} -simdjson_inline simdjson_result simdjson_result::get_object() noexcept { - if (error()) { return error(); } - return first.get_object(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); -} -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); -} -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); -} -template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); -} -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); -} -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); -} -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); -} -template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::value &out) noexcept { - if (error()) { return error(); } - out = first; - return SUCCESS; -} -template simdjson_inline simdjson_result simdjson_result::get() noexcept { - if (error()) { return error(); } - return first.get(); } -template simdjson_inline error_code simdjson_result::get(T &out) noexcept { - if (error()) { return error(); } - return first.get(out); } -template<> simdjson_inline simdjson_result simdjson_result::get() noexcept { - if (error()) { return error(); } - return std::move(first); -} -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); -} -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); -} -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); -} -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); -} -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); -} -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); -} -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first.get(); +#if !SIMDJSON_STATIC_REFLECTION +// fallback implementation until we have static reflection +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result::operator fallback::ondemand::array() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::object() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +template +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 -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); -} - -simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { - if (error()) { return error(); } - return first.raw_json(); -} - -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); -} - -simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); -} - -simdjson_inline simdjson_result simdjson_result::at_pointer( - std::string_view json_pointer) noexcept { - if (error()) { - return error(); - } - return first.at_pointer(json_pointer); -} - -simdjson_inline simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); -} +#if SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_SUPPORTS_CONCEPTS } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H +#endif // SIMDJSON_GENERIC_STRING_BUILDER_H +/* end file simdjson/generic/ondemand/json_string_builder.h for fallback */ + +// 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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ +/* 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/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): #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 fallback { namespace ondemand { -simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept - : iter{std::forward(_iter)} -{ - logger::log_start_value(iter, "document"); -} - -simdjson_inline document document::start(json_iterator &&iter) noexcept { - return document(std::forward(iter)); -} - -inline void document::rewind() noexcept { - iter.rewind(); -} - -inline std::string document::to_debug_string() noexcept { - return iter.to_string(); -} +/** + * 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; -inline simdjson_result document::current_location() const noexcept { - return iter.current_location(); -} + /** + * Begin array iteration. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result begin() noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result 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 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 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 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 at_pointer(std::string_view json_pointer) noexcept; -inline int32_t document::current_depth() const noexcept { - return iter.depth(); -} + /** + * 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 at_path(std::string_view json_path) noexcept; -inline bool document::at_end() const noexcept { - return iter.at_end(); -} + /** + * 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 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 at(size_t index) noexcept; -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 document::start_or_resume_object() noexcept { - if (iter.at_root()) { - return get_object(); - } else { - return object::resume(resume_value_iterator()); +#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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + return deserialize(*this, out); } -} -simdjson_inline simdjson_result document::get_value() noexcept { - // Make sure we start any arrays or objects before returning, so that start_root_() - // 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; + /** + * 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; } -} -simdjson_inline simdjson_result document::get_array() & noexcept { - auto value = get_root_value_iterator(); - return array::start_root(value); -} -simdjson_inline simdjson_result document::get_object() & noexcept { - auto value = get_root_value_iterator(); - return object::start_root(value); -} +#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; -/** - * 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. - */ + /** + * 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 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 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 started(value_iterator &iter) noexcept; -simdjson_inline simdjson_result document::get_uint64() noexcept { - return get_root_value_iterator().get_root_uint64(true); -} -simdjson_inline simdjson_result document::get_uint64_in_string() noexcept { - return get_root_value_iterator().get_root_uint64_in_string(true); -} -simdjson_inline simdjson_result document::get_int64() noexcept { - return get_root_value_iterator().get_root_int64(true); -} -simdjson_inline simdjson_result document::get_int64_in_string() noexcept { - return get_root_value_iterator().get_root_int64_in_string(true); -} -simdjson_inline simdjson_result document::get_double() noexcept { - return get_root_value_iterator().get_root_double(true); -} -simdjson_inline simdjson_result document::get_double_in_string() noexcept { - return get_root_value_iterator().get_root_double_in_string(true); -} -simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept { - return get_root_value_iterator().get_root_string(true, allow_replacement); -} -template -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 document::get_wobbly_string() noexcept { - return get_root_value_iterator().get_root_wobbly_string(true); -} -simdjson_inline simdjson_result document::get_raw_json_string() noexcept { - return get_root_value_iterator().get_root_raw_json_string(true); -} -simdjson_inline simdjson_result document::get_bool() noexcept { - return get_root_value_iterator().get_root_bool(true); -} -simdjson_inline simdjson_result document::is_null() noexcept { - return get_root_value_iterator().is_root_null(true); -} + /** + * 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; -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } + /** + * Iterator marking current position. + * + * iter.is_alive() == false indicates iteration is complete. + */ + value_iterator iter{}; -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } + friend class value; + friend class document; + friend struct simdjson_result; + friend struct simdjson_result; + friend class array_iterator; +}; -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +} // namespace ondemand +} // namespace fallback +} // namespace simdjson -#if SIMDJSON_EXCEPTIONS -template -simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } -template -simdjson_inline document::operator T() & noexcept(false) { return get(); } -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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { 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(); } +namespace simdjson { -#endif -simdjson_inline simdjson_result document::count_elements() & noexcept { - auto a = get_array(); - simdjson_result 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 document::count_fields() & noexcept { - auto a = get_object(); - simdjson_result 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 document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); -} -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); -} -simdjson_inline simdjson_result document::end() & noexcept { - return {}; -} +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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 document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); -} -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); -} -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); -} -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); -} -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; -} -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; -} + simdjson_inline simdjson_result begin() noexcept; + simdjson_inline simdjson_result end() noexcept; + inline simdjson_result count_elements() & noexcept; + inline simdjson_result is_empty() & noexcept; + inline simdjson_result reset() & noexcept; + simdjson_inline simdjson_result at(size_t index) noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h -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(); + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } return SUCCESS; } - error = iter.skip_child(0); - if(error) { iter.abandon(); } - return error; -} +#endif // SIMDJSON_SUPPORTS_CONCEPTS +}; -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); -} +} // namespace simdjson -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H -simdjson_inline simdjson_result 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)); -} +/* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ +/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_H */ +/* 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 */ -simdjson_inline simdjson_result 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(); -} +namespace simdjson { +namespace fallback { +namespace ondemand { -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); -} +/** + * A forward-only JSON array. + * + * This is an input_iterator, meaning: + * - It is forward-only + * - * must be called exactly once per element. + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) + */ +class array_iterator { +public: + /** Create a new, invalid array iterator. */ + simdjson_inline array_iterator() noexcept = default; -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); -} + // + // Iterator interface + // -simdjson_inline simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); -} + /** + * Get the current element. + * + * Part of the std::iterator interface. + */ + simdjson_inline simdjson_result + 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; -simdjson_inline simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); -} +private: + value_iterator iter{}; -simdjson_inline simdjson_result 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 array_iterator(const value_iterator &iter) noexcept; -simdjson_inline simdjson_result 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; - } -} + friend class array; + friend class value; + friend struct simdjson_result; +}; } // namespace ondemand } // namespace fallback @@ -49640,1026 +51189,5805 @@ simdjson_inline simdjson_result document::at_path(std::string_view json_p namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::document &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base( - error - ) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); -} -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); -} -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); -} -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); -} -template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); -} -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); -} -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); -} -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); -} -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); -} - -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); -} -template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); -} -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); -} -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { - if (error()) { return error(); } - return std::forward(first).get(out); -} - -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; -} - -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} - -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); -} - -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); -} - -simdjson_inline bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); -} - -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); -} - -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); -} - -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); -} - - -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator fallback::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -#endif - - -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); -} - -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { + 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; + // + // Iterator interface + // -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); -} + simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result &) const noexcept; + simdjson_inline simdjson_result &operator++() noexcept; -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); -} + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; +}; -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); -} +} // namespace simdjson -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_H -} // namespace simdjson +/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace fallback { 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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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. + * A JSON document. It holds a json_iterator instance. * - * 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. + * Used by tokens to get text, and string buffer location. * - * To achieve this result, we pass a 'false' to a get_root_value_iterator() method: - * this indicates that we allow trailing content. + * You must keep the document around during iteration. */ -simdjson_inline simdjson_result document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } - -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - - - -namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), error) {} - +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; -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + /** + * 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 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 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 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 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 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 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 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 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 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 + 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 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 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 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 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 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 + simdjson_inline simdjson_result get() & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } + /** + * @overload template simdjson_result 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 + simdjson_inline simdjson_result get() && +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(!std::is_same::value && !std::is_same::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(*this).get(); + } + + /** + * 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { + return deserialize(*this, out); + } else { + static_assert(!sizeof(T), "The get 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 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(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(out); // to get rid of unused errors + return UNINITIALIZED; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + } + + /** @overload template error_code get(T &out) & noexcept */ + template 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 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 + explicit simdjson_inline operator T() & noexcept(false); + template + 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 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 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 at(size_t index) & noexcept; + /** + * Begin array iteration. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result begin() & noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result end() & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). + * + * 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 find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result 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. + * + * It is the default, however, 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 find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result 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 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 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 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 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 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 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 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 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 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 at_path(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 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 + requires(std::is_class_v && (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 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 get_array() & noexcept; + simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result get_value() noexcept; + + simdjson_inline simdjson_result is_null() noexcept; + template + simdjson_inline simdjson_result get() & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } + template + simdjson_inline simdjson_result get() && +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(!std::is_same::value && !std::is_same::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(*this).get(); + } + + /** + * 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { + return deserialize(*this, out); + } else { + static_assert(!sizeof(T), "The get 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 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(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(out); // to get rid of unused errors + return UNINITIALIZED; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + } + + /** @overload template error_code get(T &out) & noexcept */ + template simdjson_inline error_code get(T &out) && noexcept; + simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 + 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 count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + + simdjson_inline simdjson_result current_location() noexcept; + simdjson_inline int32_t current_depth() const noexcept; + simdjson_inline bool is_negative() noexcept; + simdjson_inline simdjson_result is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + simdjson_inline simdjson_result raw_json_token() noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + +private: + document *doc{nullptr}; +}; +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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 get_array() & noexcept; + simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result get_value() noexcept; + simdjson_inline simdjson_result is_null() noexcept; + + template simdjson_inline simdjson_result get() & noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; + + template simdjson_inline error_code get(T &out) & noexcept; + template simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS + + using fallback::implementation_simdjson_result_base::operator*; + using fallback::implementation_simdjson_result_base::operator->; + template ::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 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 bool() noexcept(false); + simdjson_inline operator fallback::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + simdjson_inline simdjson_result 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 is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ + simdjson_inline simdjson_result raw_json_token() noexcept; + + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 : public fallback::implementation_simdjson_result_base { +public: + 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 get_array() & noexcept; + simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result get_value() noexcept; + simdjson_inline simdjson_result is_null() noexcept; + + template simdjson_inline simdjson_result get() & noexcept; + template simdjson_inline simdjson_result get() && noexcept; + + template simdjson_inline error_code get(T &out) & noexcept; + template simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS + template + 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 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 bool() noexcept(false); + simdjson_inline operator fallback::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + simdjson_inline simdjson_result current_location() noexcept; + simdjson_inline simdjson_result current_depth() const noexcept; + simdjson_inline simdjson_result is_negative() noexcept; + simdjson_inline simdjson_result is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ + simdjson_inline simdjson_result raw_json_token() noexcept; + + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 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 */ +/* 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 +#include +#include +#endif + +namespace simdjson { +namespace fallback { +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; + using reference = simdjson_result; + 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 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; + friend struct simdjson::internal::simdjson_result_base; +}; // document_stream + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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; +}; + +} // 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 */ +#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 fallback { +namespace ondemand { + +/** + * A JSON field (key/value pair) in an object. + * + * Returned from object iteration. + * + * Extends from std::pair so you can use C++ algorithms that rely on pairs. + */ +class field : public std::pair { +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 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 + 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 start(value_iterator &parent_iter) noexcept; + static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept; + friend struct simdjson_result; + friend class object_iterator; +}; + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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 unescaped_key(bool allow_replacement = false) noexcept; + template + simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result key() noexcept; + simdjson_inline simdjson_result key_raw_json_token() noexcept; + simdjson_inline simdjson_result escaped_key() noexcept; + simdjson_inline simdjson_result 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 */ +#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): #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 fallback { +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; + + simdjson_inline simdjson_result begin() noexcept; + simdjson_inline simdjson_result end() noexcept; + /** + * Look up a field by name on an object (order-sensitive). + * + * 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 find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result 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. + * + * It is the default, however, 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 find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result 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 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 at_path(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 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 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 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 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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 start(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result 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; +}; + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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 begin() noexcept; + simdjson_inline simdjson_result end() noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + inline simdjson_result reset() noexcept; + inline simdjson_result is_empty() noexcept; + inline simdjson_result count_fields() & noexcept; + inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(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 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 */ +/* 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 fallback { +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 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 ',' + simdjson_inline object_iterator &operator++() noexcept; + +private: + /** + * 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; + friend class object; +}; + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public fallback::implementation_simdjson_result_base { +public: + 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; + + // + // Iterator interface + // + + // Reads key and value, yielding them to the user. + simdjson_inline simdjson_result 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 &) const noexcept; + // Assumes it's being compared with the end. true if depth >= iter->depth. + simdjson_inline bool operator!=(const simdjson_result &) const noexcept; + // Checks for ']' and ',' + simdjson_inline simdjson_result &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 */ +#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 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 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 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 to_json_string(fallback::ondemand::array& x) noexcept; +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +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 fallback { 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::fallback::ondemand::value x); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::fallback::ondemand::array value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::fallback::ondemand::document& value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x); +#endif +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&& 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::fallback::ondemand::object value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); +#endif +}}} // namespace simdjson::fallback::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H +/* end file simdjson/generic/ondemand/serialization.h for fallback */ + +// 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 */ +#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 +#include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif + +namespace simdjson { + +////////////////////////////// +// Number deserialization +////////////////////////////// + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits; + + uint64_t x; + SIMDJSON_TRY(val.get_uint64().get(x)); + if (x > (limits::max)()) { + return NUMBER_OUT_OF_RANGE; + } + out = static_cast(x); + return SUCCESS; +} + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + double x; + SIMDJSON_TRY(val.get_double().get(x)); + out = static_cast(x); + return SUCCESS; +} + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits; + + 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(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 +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { + 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>(). + */ +template +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t::value_type; + static_assert( + deserializable, + "The specified type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "The specified type inside the container must default constructible."); + fallback::ondemand::array arr; + if constexpr (std::is_same_v, fallback::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + + for (auto v : arr) { + if constexpr (concepts::returns_reference) { + if (auto const err = v.get().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(out.pop_back()); + } + return err; + } + } else { + value_type temp; + if (auto const err = v.get().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 +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t::mapped_type; + static_assert( + deserializable, + "The specified value type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "The specified value type inside the container must default constructible."); + fallback::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().get(this_value)); + [[maybe_unused]] std::pair 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 +error_code tag_invoke(deserialize_tag, fallback::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + fallback::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 +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 +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 +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); +} + + +/** + * 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 +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { + using element_type = typename std::remove_cvref_t::element_type; + + // For better error messages, don't use these as constraints on + // the tag_invoke CPO. + static_assert( + deserializable, + "The specified type inside the unique_ptr must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "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(*ptr)); + out.reset(ptr); + return SUCCESS; +} + +/** + * This CPO (Customization Point Object) will help deserialize into optional types. + */ +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { + using value_type = typename std::remove_cvref_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(out.value())); + return SUCCESS; +} + + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + fallback::ondemand::object obj; + if constexpr (std::is_same_v, fallback::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + +} // namespace simdjson + +#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H +#endif // SIMDJSON_SUPPORTS_CONCEPTS +/* end file simdjson/generic/ondemand/std_deserialize.h for fallback */ + +// 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 */ +#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 fallback { +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::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::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::started(value_iterator &iter) noexcept { + bool has_value; + SIMDJSON_TRY(iter.started_array().get(has_value)); + return array(iter); +} + +simdjson_inline simdjson_result 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::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 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(starting_point), size_t(final_point - starting_point)); +} + +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline simdjson_result 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 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 array::reset() & noexcept { + return iter.reset_array(); +} + +inline simdjson_result 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 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); +} + +simdjson_inline simdjson_result 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 fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::array &&value +) noexcept + : implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept + : implementation_simdjson_result_base(error) +{ +} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::is_empty() & noexcept { + if (error()) { return error(); } + return first.is_empty(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} +simdjson_inline simdjson_result simdjson_result::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 */ +#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 fallback { +namespace ondemand { + +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result array_iterator::operator*() noexcept { + 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 { + 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 fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::array_iterator &&value +) noexcept + : fallback::implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : fallback::implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::operator*() noexcept { + if (error()) { return error(); } + return *first; +} +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return !error(); } + return first == other.first; +} +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +simdjson_inline simdjson_result &simdjson_result::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::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 */ +#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 fallback { +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 value::get_array() noexcept { + return array::start(iter); +} +simdjson_inline simdjson_result value::get_object() noexcept { + return object::start(iter); +} +simdjson_inline simdjson_result value::start_or_resume_object() noexcept { + if (iter.at_start()) { + return get_object(); + } else { + return object::resume(iter); + } +} + +simdjson_inline simdjson_result value::get_raw_json_string() noexcept { + return iter.get_raw_json_string(); +} +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept { + return iter.get_string(allow_replacement); +} +template +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 value::get_wobbly_string() noexcept { + return iter.get_wobbly_string(); +} +simdjson_inline simdjson_result value::get_double() noexcept { + return iter.get_double(); +} +simdjson_inline simdjson_result value::get_double_in_string() noexcept { + return iter.get_double_in_string(); +} +simdjson_inline simdjson_result value::get_uint64() noexcept { + return iter.get_uint64(); +} +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept { + return iter.get_uint64_in_string(); +} +simdjson_inline simdjson_result value::get_int64() noexcept { + return iter.get_int64(); +} +simdjson_inline simdjson_result value::get_int64_in_string() noexcept { + return iter.get_int64_in_string(); +} +simdjson_inline simdjson_result value::get_bool() noexcept { + return iter.get_bool(); +} +simdjson_inline simdjson_result value::is_null() noexcept { + return iter.is_null(); +} + +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result 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 +simdjson_inline value::operator T() noexcept(false) { + return get(); +} +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 value::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result value::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result value::count_elements() & noexcept { + simdjson_result 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 value::count_fields() & noexcept { + simdjson_result answer; + auto a = get_object(); + answer = a.count_fields(); + iter.move_at_start(); + return answer; +} +simdjson_inline simdjson_result value::at(size_t index) noexcept { + auto a = get_array(); + return a.at(index); +} + +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result value::find_field(const char *key) noexcept { + return start_or_resume_object().find_field(key); +} + +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} + +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result value::operator[](const char *key) noexcept { + return start_or_resume_object()[key]; +} + +simdjson_inline simdjson_result value::type() noexcept { + return iter.type(); +} + +simdjson_inline simdjson_result 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 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 value::is_integer() noexcept { + return iter.is_integer(); +} +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept { + return iter.get_number_type(); +} +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept { + return iter.get_number(); +} + +simdjson_inline std::string_view value::raw_json_token() noexcept { + return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length()); +} + +simdjson_inline simdjson_result 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 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::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::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; + } +} + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::value &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + if (error()) { return error(); } + return {}; +} + +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} + +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} + +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept { + if (error()) { return error(); } + return first[key]; +} + +simdjson_inline simdjson_result simdjson_result::get_array() noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template<> simdjson_inline error_code simdjson_result::get(fallback::ondemand::value &out) noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} + +template simdjson_inline simdjson_result simdjson_result::get() noexcept { + if (error()) { return error(); } + return first.get(); +} +template simdjson_inline error_code simdjson_result::get(T &out) noexcept { + if (error()) { return error(); } + return first.get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept { + if (error()) { return error(); } + return std::move(first); +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator fallback::ondemand::array() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::object() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); +} + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer( + std::string_view json_pointer) noexcept { + if (error()) { + return error(); + } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} + +} // 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 */ +#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 fallback { +namespace ondemand { + +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept + : iter{std::forward(_iter)} +{ + logger::log_start_value(iter, "document"); +} + +simdjson_inline document document::start(json_iterator &&iter) noexcept { + return document(std::forward(iter)); +} + +inline void document::rewind() noexcept { + iter.rewind(); +} + +inline std::string document::to_debug_string() noexcept { + return iter.to_string(); +} + +inline simdjson_result 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 document::start_or_resume_object() noexcept { + if (iter.at_root()) { + return get_object(); + } else { + return object::resume(resume_value_iterator()); + } +} +simdjson_inline simdjson_result document::get_value() noexcept { + // Make sure we start any arrays or objects before returning, so that start_root_() + // 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 document::get_array() & noexcept { + auto value = get_root_value_iterator(); + return array::start_root(value); +} +simdjson_inline simdjson_result 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 document::get_uint64() noexcept { + return get_root_value_iterator().get_root_uint64(true); +} +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept { + return get_root_value_iterator().get_root_uint64_in_string(true); +} +simdjson_inline simdjson_result document::get_int64() noexcept { + return get_root_value_iterator().get_root_int64(true); +} +simdjson_inline simdjson_result document::get_int64_in_string() noexcept { + return get_root_value_iterator().get_root_int64_in_string(true); +} +simdjson_inline simdjson_result document::get_double() noexcept { + return get_root_value_iterator().get_root_double(true); +} +simdjson_inline simdjson_result document::get_double_in_string() noexcept { + return get_root_value_iterator().get_root_double_in_string(true); +} +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept { + return get_root_value_iterator().get_root_string(true, allow_replacement); +} +template +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 document::get_wobbly_string() noexcept { + return get_root_value_iterator().get_root_wobbly_string(true); +} +simdjson_inline simdjson_result document::get_raw_json_string() noexcept { + return get_root_value_iterator().get_root_raw_json_string(true); +} +simdjson_inline simdjson_result document::get_bool() noexcept { + return get_root_value_iterator().get_root_bool(true); +} +simdjson_inline simdjson_result document::is_null() noexcept { + return get_root_value_iterator().is_root_null(true); +} + +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result 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 document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } + +#if SIMDJSON_EXCEPTIONS +template +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } +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 document::count_elements() & noexcept { + auto a = get_array(); + simdjson_result 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 document::count_fields() & noexcept { + auto a = get_object(); + simdjson_result 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 document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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 document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result 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 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; + } +} + + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base( + error + ) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(fallback::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); +} + + +simdjson_inline int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} + +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION + +} // namespace simdjson + + +namespace simdjson { +namespace fallback { +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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); +} +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + + + +namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} + + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { if (error()) { return error(); } - return first.begin(); + return first.is_string(); } -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(fallback::ondemand::document_reference &out) & noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(fallback::ondemand::document_reference &out) && noexcept { if (error()) { return error(); } - return first.find_field_unordered(key); + out = first; + return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { if (error()) { return error(); } - return first.find_field_unordered(key); + return first.is_negative(); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { if (error()) { return error(); } - return first[key]; + return first.is_integer(); } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { if (error()) { return error(); } - return first[key]; + return first.get_number_type(); } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { if (error()) { return error(); } - return first.find_field(key); + return first.get_number(); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator fallback::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { if (error()) { return error(); } - return first.find_field(key); + return first.current_location(); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { if (error()) { return error(); } - return first.get_array(); + return first.raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } - return first.get_object(); + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace fallback { +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 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 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 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 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 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 document_stream::iterator::operator*() noexcept { + return simdjson_result(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(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(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(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(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(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); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 fallback { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); +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 simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +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 simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +simdjson_inline value &field::value() & noexcept { + return second; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return first.key(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first.type(); + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_scalar(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_string(); + return first.unescaped_key(allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(fallback::ondemand::document_reference &out) & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.unescaped_key(receiver, allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(fallback::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); + +} // 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 */ +#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 fallback { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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 simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); + +#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 } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); +#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; } -simdjson_inline simdjson_result::operator fallback::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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; } -simdjson_inline simdjson_result::operator fallback::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +// 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_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result::operator fallback::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator fallback::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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]; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } } - return first.at_path(json_path); + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -} // 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 */ -#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 -#include +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} -namespace simdjson { -namespace fallback { -namespace ondemand { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} -#ifdef SIMDJSON_THREADS_ENABLED +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(); +} -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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(); +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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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); +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +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); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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()); } -#endif // SIMDJSON_THREADS_ENABLED +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 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 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 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 depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -inline size_t document_stream::size_in_bytes() const noexcept { - return len; +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; } -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 token_position json_iterator::position() const noexcept { + return token.position(); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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_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_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; } -simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +#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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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; } } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +#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; } -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; } +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); } - #endif // SIMDJSON_THREADS_ENABLED + return true; } -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]; +} // namespace ondemand +} // namespace fallback +} // namespace simdjson - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +namespace simdjson { - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 fallback { +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; } -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) { doc.iter.consume_character(','); } - // 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(); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} - // 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(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++; - } +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} - while (cur_struct_index <= static_cast(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++; - } +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -#ifdef SIMDJSON_THREADS_ENABLED +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} -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; } +simdjson_inline number::operator double() const noexcept { + return get_double(); +} - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); +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); } -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(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -#endif // SIMDJSON_THREADS_ENABLED +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 fallback @@ -50667,588 +56995,669 @@ inline void document_stream::start_stage1_thread() noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 +#include + namespace simdjson { namespace fallback { namespace ondemand { +namespace logger { -// clang 6 does not think the default constructor can be noexcept, so we make it explicit -simdjson_inline field::field() noexcept : std::pair() {} +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. -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -simdjson_inline simdjson_result 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); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); +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; } -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; } -template -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; +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -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; +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); } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +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); } - -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(first.buf), end_quote - first.buf); +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); } -simdjson_inline value &field::value() & noexcept { - return second; +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++; } } - -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +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++; } } -} // namespace ondemand -} // namespace fallback -} // namespace simdjson +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); +} -namespace simdjson { +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); +} -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +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); } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +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); } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +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); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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); } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +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); } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +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 -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +template +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)...); } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +template +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)...); + 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 fallback } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_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): #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/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.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/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): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace fallback { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } - -#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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -#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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); } - -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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); } - - -// 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; - } +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return value(iter.child()); } - -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); } - -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); } - -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace fallback { +namespace ondemand { +// +// object_iterator +// -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_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 fallback @@ -51256,1516 +57665,1923 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + fallback::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 fallback { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; } + } // namespace ondemand } // namespace fallback } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace fallback { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); -} - -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace fallback } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::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 simdjson_result::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_OBJECT_INL_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/field.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/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/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 { -namespace fallback { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); +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)); } -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); + + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; + +inline simdjson_result 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()); } - return value(iter.child()); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); +inline simdjson_result 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_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); + +inline simdjson_result 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_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; + +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline simdjson_result object::begin() noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - return object_iterator(iter); +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); + } } -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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 -inline simdjson_result 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 child; +#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 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 - // 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 +#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 { - child = find_field(key); + throw simdjson::simdjson_error(error); } - if(child.error()) { - return child; // we do not continue if there was an 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); } - // 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)); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); } - return child; } +#endif -inline simdjson_result 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; +#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); } - return at_pointer(json_pointer); } - -simdjson_inline simdjson_result 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; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline simdjson_result 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; +#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 +}}} // namespace simdjson::fallback::ondemand -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -} // namespace ondemand -} // namespace fallback -} // namespace simdjson +/* 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 fallback { +namespace ondemand { -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; + +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 simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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 simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +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; } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { + return _position < other._position; } - -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} +} // namespace ondemand +} // namespace fallback +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -simdjson_inline simdjson_result simdjson_result::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 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 +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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): #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/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): #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 fallback { namespace ondemand { -// -// object_iterator -// - -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +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_inline simdjson_result object_iterator::operator*() noexcept { - 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_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); + +simdjson_warn_unused simdjson_inline simdjson_result 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace fallback -} // namespace simdjson + // 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"); + } +} -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result::simdjson_result( - fallback::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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; -} + // 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; + } -} // namespace simdjson + // 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; } + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + // If the loop ended, we're out of fields to look at. + return false; +} -/* 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 */ +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -namespace simdjson { -namespace fallback { -namespace ondemand { + // 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(); -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { -} + // 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; -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; } + // 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()) { - // 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]); + // 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 - if (implementation) { - SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); - SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + 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 { - 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 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 -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()); -} + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } #endif + } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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); - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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. } - - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); + // 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 -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); - json.remove_utf8_bom(); + 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); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; - } - return document::start({ reinterpret_cast(json.data()), this, true }); + 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; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +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 parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - return iterate(padded_string_view(json)); -} - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); + _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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - padded_string_view json = result.value_unsafe(); - return iterate(json); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; +} -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 fallback { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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 +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 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 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 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()); + 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 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 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()); + 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 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.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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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_warn_unused simdjson_inline simdjson_result 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 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; - } +simdjson_inline simdjson_result 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -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++; - } +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; } -} // namespace ondemand -} // namespace fallback -} // namespace simdjson - -namespace simdjson { +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(fallback::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(fallback::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -} // 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 +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(); } -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} -namespace simdjson { +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; } -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)); + // 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(); + } -inline simdjson_result 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 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); + return SUCCESS; } -inline simdjson_result 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()); - } -} -inline simdjson_result 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_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(); } -inline simdjson_result 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); + 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(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + return _json_iter->peek(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + 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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -} // 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 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_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -#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 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); - } +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() == '"'; } -#endif -#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&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); - } +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 -#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 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); - } +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 -}}} // namespace simdjson::fallback::ondemand - -#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 */ -#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 fallback { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{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 uint32_t token_iterator::current_offset() const noexcept { - return *(_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 const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_position++)]; +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_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 void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { - return *(position+1) - *position; + +simdjson_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -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 simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +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 ); } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_inline token_position token_iterator::position() const noexcept { - return _position; +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_position; + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._position; +simdjson_inline simdjson_result 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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._position; + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._position; + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._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 @@ -52774,1116 +59590,2050 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +#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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace fallback { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -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 value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +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). -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +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_warn_unused simdjson_inline simdjson_result 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(); - 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"); +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(c)]) { + return true; } } - return SUCCESS; + return false; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +#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(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(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_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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { - assert_at_next(); +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"}; - // 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"); +// 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_warn_unused simdjson_inline simdjson_result 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; +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) {} - // - // 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_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; +} - // 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) - // ``` - // +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 { - 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 + is_valid = true; } - 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; } +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; } +} - // If the loop ended, we're out of fields to look at. - return false; +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +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; + } +} - // 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(); +namespace internal { - // 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; +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 - // 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()) { +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -#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 +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); } +} - // 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 +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++] = '"'; + } +} - // 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; } +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++] = '"'; + } +} - // 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; - } +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 +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); +} +#endif - // 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; } +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(); } - // 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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} - // 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); +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif - // 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; +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + 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; - // 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. + // 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(); } - // 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 value_iterator::field_key() noexcept { - assert_at_next(); +#endif - 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); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif - 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_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - _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"); - } +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - return SUCCESS; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} - 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +} // namespace builder +} // namespace fallback +} // namespace simdjson + +#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 + +/* 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace fallback { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +template + requires(!require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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); + + +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_inline simdjson_result 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; + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result 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.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; +template +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; } -simdjson_inline simdjson_result 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.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; + +template +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 + requires(std::is_class_v && (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:]); + } } - 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; + }; + + b.append('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; + +} // namespace builder +} // namespace fallback +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { - return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_warn_unused simdjson_inline simdjson_result 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); + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for fallback */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace fallback { +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::fallback::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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// 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 +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; } - 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"); + + // 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 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 +struct path_accessor { + using value = ::simdjson::fallback::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(current); + } } - 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"); + // 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); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // 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); + } } - 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"); +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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // Get type of member by name + template + 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; } - 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"); + + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline simdjson_result 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; -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -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 ); + 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; + } - return _json_iter->skip_child(depth()); -} + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -// 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 + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + if (!found) { + return false; + } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + 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; -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; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -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()); + 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 +inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::fallback::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::fallback::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace fallback } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(fallback::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for fallback */ +#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/amalgamated.h for fallback */ /* including simdjson/fallback/end.h: #include "simdjson/fallback/end.h" */ @@ -54572,7 +62322,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -54596,6 +62346,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace haswell } // namespace simdjson @@ -54662,7 +62437,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -54671,55 +62446,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -54741,7 +62469,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -54752,28 +62480,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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; + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -54783,7 +62527,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -55125,7 +62869,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -55209,8 +62953,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -55220,8 +62964,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -55258,7 +63002,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -55323,13 +63067,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -55346,22 +63091,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -55371,7 +63132,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -55489,7 +63250,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -55671,7 +63432,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -56010,7 +63771,7 @@ struct simdjson_result : public haswell::implementatio simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -56044,7 +63805,7 @@ struct simdjson_result : public haswell::implementatio * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -56091,7 +63852,22 @@ struct simdjson_result : public haswell::implementatio simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -56585,14 +64361,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -56612,7 +64388,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -56703,6 +64479,7 @@ 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, ... } ) @@ -56909,6 +64686,12 @@ class raw_json_string { */ 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, @@ -57048,10 +64831,10 @@ struct simdjson_result : public haswell::imp simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -57067,6 +64850,7 @@ struct simdjson_result : public haswell::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace haswell { @@ -57185,7 +64969,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -57273,6 +65059,11 @@ class parser { * 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 @@ -57280,10 +65071,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -57309,14 +65100,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -57418,13 +65211,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -57452,6 +65271,315 @@ struct simdjson_result : public haswell::implementati #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(haswell::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -57564,7 +65692,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -57588,11 +65716,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -57666,7 +65825,28 @@ struct simdjson_result : public haswell::implementatio simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -57711,7 +65891,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -57735,6 +65916,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -57753,7 +65939,6 @@ namespace simdjson { template<> struct simdjson_result : public haswell::implementation_simdjson_result_base { -public: 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; @@ -57766,6 +65951,8 @@ struct simdjson_result : public haswell::impl simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -57893,7 +66080,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -57959,7 +66146,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -57982,7 +66169,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -58000,18 +66187,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -58023,7 +66210,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -58033,7 +66220,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -58098,7 +66285,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -58107,7 +66294,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -58183,7 +66370,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -58257,11 +66444,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -58461,7 +66664,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -58485,11 +66688,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -58542,7 +66775,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -58551,7 +66784,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -58564,7 +66797,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -58586,14 +66819,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -58605,7 +66838,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -58615,12 +66848,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -58689,7 +66927,7 @@ struct simdjson_result : public haswell::implementa simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -58702,6 +66940,9 @@ struct simdjson_result : public haswell::implementa template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using haswell::implementation_simdjson_result_base::operator*; + using haswell::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator haswell::ondemand::array() & noexcept(false); @@ -58741,6 +66982,11 @@ struct simdjson_result : public haswell::implementa simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -58767,7 +67013,7 @@ struct simdjson_result : public haswell:: simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -58818,6 +67064,11 @@ struct simdjson_result : public haswell:: simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -58910,7 +67161,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -58960,6 +67211,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -58973,6 +67225,7 @@ class document_stream { * @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 * @@ -59016,6 +67269,11 @@ class document_stream { */ 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. */ @@ -59027,6 +67285,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -59290,6 +67549,9 @@ struct simdjson_result : public haswell::implementatio /* 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): #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 { @@ -59316,7 +67578,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -59487,11 +67749,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -59530,12 +67852,42 @@ struct simdjson_result : public haswell::implementati simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -59664,6 +68016,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -59735,28 +68101,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -59770,7 +68138,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -59779,7 +68146,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -59792,8 +68158,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -59810,7 +68191,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -59819,9 +68199,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - haswell::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, haswell::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -59852,7 +68236,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -59878,7 +68261,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, haswell::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + haswell::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 +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 +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 +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); +} /** @@ -59896,7 +68317,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -59921,17 +68341,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -59940,10 +68360,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + haswell::ondemand::object obj; + if constexpr (std::is_same_v, haswell::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for haswell */ // Inline definitions @@ -60036,7 +68775,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -60227,6 +68966,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace haswell } // namespace simdjson @@ -60263,7 +69005,9 @@ simdjson_inline simdjson_result &simdjson_res ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -60320,7 +69064,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -60362,15 +69106,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -60967,7 +69711,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -60993,15 +69737,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -61021,8 +69765,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -61041,1164 +69785,1957 @@ simdjson_inline simdjson_result document::count_fields() & noexcept { if(answer.error() == SUCCESS) { rewind(); } return answer; } -simdjson_inline simdjson_result document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); +simdjson_inline simdjson_result document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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 document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result 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 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; + } +} + + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 haswell +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + haswell::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base( + error + ) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); +simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::end() & noexcept { - return {}; +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator haswell::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } +#endif -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 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(starting_point), size_t(final_point - starting_point)); +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); } -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); } -simdjson_inline simdjson_result 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 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 int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); } -simdjson_inline bool document::is_negative() noexcept { - return get_root_value_iterator().is_root_negative(); +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); } -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); } -simdjson_inline simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); } +#endif // SIMDJSON_STATIC_REFLECTION +} // namespace simdjson -simdjson_inline simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); -} -simdjson_inline simdjson_result 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; - } -} +namespace simdjson { +namespace haswell { +namespace ondemand { -simdjson_inline simdjson_result 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 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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); } - +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace haswell } // namespace simdjson + + namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} -simdjson_inline simdjson_result::simdjson_result( - haswell::ondemand::document &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base( - error - ) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result::rewind() noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result simdjson_result::end() & noexcept { +simdjson_inline simdjson_result simdjson_result::end() & noexcept { return {}; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } - template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { +simdjson_inline simdjson_result simdjson_result::get() & noexcept { if (error()) { return error(); } return first.get(); } template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } - return std::forward(first).get(); + return std::forward(first).get(); } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(haswell::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator haswell::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace haswell { +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 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 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 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 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(); + } } -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(haswell::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { + std::unique_lock 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(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} +#endif // SIMDJSON_THREADS_ENABLED -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); +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 simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +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 bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +inline size_t document_stream::size_in_bytes() const noexcept { + return len; } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); +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 simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { } - -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { + return simdjson_result(stream->doc, stream->error); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; } -simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator haswell::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); } -#endif +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; -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); + #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 } -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} +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(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. + */ -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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(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(); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); +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); + } } -} // namespace simdjson - +simdjson_inline size_t document_stream::iterator::current_index() const noexcept { + return stream->doc_index; +} -namespace simdjson { -namespace haswell { -namespace ondemand { +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(); -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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } + // 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(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++; + } -} // namespace ondemand -} // namespace haswell -} // namespace simdjson + while (cur_struct_index <= static_cast(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(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; +} -namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), 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; } -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); + // If there's anything left, start the stage 1 thread! + if (next_batch_start() < len) { + start_stage1_thread(); + } } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); + +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); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace haswell +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + haswell::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 haswell { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); +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 simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +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 simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +simdjson_inline value &field::value() & noexcept { + return second; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +} // namespace ondemand +} // namespace haswell +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + haswell::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return first.key(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first.type(); + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_scalar(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_string(); + return first.unescaped_key(allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(haswell::ondemand::document_reference &out) & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.unescaped_key(receiver, allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(haswell::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); + +} // 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 */ +#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 haswell { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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 simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); + +#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 } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); +#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; } -simdjson_inline simdjson_result::operator haswell::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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; } -simdjson_inline simdjson_result::operator haswell::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +// 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_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result::operator haswell::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator haswell::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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]; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } } - return first.at_path(json_path); + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -} // 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 */ -#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 -#include +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} -namespace simdjson { -namespace haswell { -namespace ondemand { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} -#ifdef SIMDJSON_THREADS_ENABLED +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(); +} -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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(); +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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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); +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +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); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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()); } -#endif // SIMDJSON_THREADS_ENABLED +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 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 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 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 depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -inline size_t document_stream::size_in_bytes() const noexcept { - return len; +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; } -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 token_position json_iterator::position() const noexcept { + return token.position(); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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_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_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; } -simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +#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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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; } } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +#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; } -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; } +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); } - #endif // SIMDJSON_THREADS_ENABLED + return true; } -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]; +} // namespace ondemand +} // namespace haswell +} // namespace simdjson - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +namespace simdjson { - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 haswell { +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; } -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) { doc.iter.consume_character(','); } - // 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(); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} - // 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(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++; - } +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} - while (cur_struct_index <= static_cast(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++; - } +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -#ifdef SIMDJSON_THREADS_ENABLED +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} -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; } +simdjson_inline number::operator double() const noexcept { + return get_double(); +} - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); +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); } -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(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -#endif // SIMDJSON_THREADS_ENABLED +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 haswell @@ -62206,588 +71743,669 @@ inline void document_stream::start_stage1_thread() noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - haswell::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 +#include + namespace simdjson { namespace haswell { namespace ondemand { +namespace logger { -// clang 6 does not think the default constructor can be noexcept, so we make it explicit -simdjson_inline field::field() noexcept : std::pair() {} +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. -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -simdjson_inline simdjson_result 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); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); +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; } -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; } -template -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; +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -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; +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); } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +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); } - -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(first.buf), end_quote - first.buf); +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); } -simdjson_inline value &field::value() & noexcept { - return second; +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++; } } - -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +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++; } } -} // namespace ondemand -} // namespace haswell -} // namespace simdjson +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); +} -namespace simdjson { +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); +} -simdjson_inline simdjson_result::simdjson_result( - haswell::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +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); } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +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); } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +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); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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); } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +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); } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +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 -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +template +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)...); } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +template +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)...); + 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 haswell } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_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): #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/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.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/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): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace haswell { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } - -#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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -#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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); } - -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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); } - - -// 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; - } +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return value(iter.child()); } - -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); } - -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); } - -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace haswell +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace haswell { +namespace ondemand { +// +// object_iterator +// -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_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 haswell @@ -62795,1516 +72413,1923 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + haswell::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 haswell { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; +} + + } // namespace ondemand } // namespace haswell } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace haswell { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace haswell } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(haswell::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 simdjson_result::unescape_wobbly(haswell::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_OBJECT_INL_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/field.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/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/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 { -namespace haswell { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); +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)); } -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); + + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; + +inline simdjson_result 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()); } - return value(iter.child()); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); +inline simdjson_result 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); } -simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); + +inline simdjson_result 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); } -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; + +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline simdjson_result object::begin() noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - return object_iterator(iter); +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); + } } -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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 -inline simdjson_result 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 child; +#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 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 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 +#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 { - child = find_field(key); + throw simdjson::simdjson_error(error); } - if(child.error()) { - return child; // we do not continue if there was an 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); } - // 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)); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); } - return child; } +#endif -inline simdjson_result 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; +#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); } - return at_pointer(json_pointer); } - -simdjson_inline simdjson_result 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; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline simdjson_result 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; +#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 -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -} // namespace ondemand -} // namespace haswell -} // namespace simdjson +/* 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 haswell { +namespace ondemand { -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; + +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 simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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 simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +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; } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; } -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); -} +} // namespace ondemand +} // namespace haswell +} // namespace simdjson -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -simdjson_inline simdjson_result simdjson_result::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 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 +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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): #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/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): #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 haswell { namespace ondemand { -// -// object_iterator -// - -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +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_inline simdjson_result object_iterator::operator*() noexcept { - 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_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); + +simdjson_warn_unused simdjson_inline simdjson_result 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace haswell -} // namespace simdjson + // 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"); + } +} -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result::simdjson_result( - haswell::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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; -} + // 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; + } -} // namespace simdjson + // 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; } + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + // If the loop ended, we're out of fields to look at. + return false; +} -/* 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 */ +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -namespace simdjson { -namespace haswell { -namespace ondemand { + // 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(); -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { -} + // 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; -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; } + // 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()) { - // 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]); + // 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 - if (implementation) { - SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); - SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + 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 { - 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 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 -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()); -} + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } #endif + } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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); - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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. } - - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); + // 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 -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); - json.remove_utf8_bom(); + 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); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; - } - return document::start({ reinterpret_cast(json.data()), this, true }); + 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; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +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 parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - return iterate(padded_string_view(json)); -} - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); + _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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - padded_string_view json = result.value_unsafe(); - return iterate(json); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; +} -} // namespace ondemand -} // namespace haswell -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 haswell { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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 +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 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 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 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()); + 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 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 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()); + 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 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.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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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_warn_unused simdjson_inline simdjson_result 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 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; - } +simdjson_inline simdjson_result 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -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++; - } +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; } -} // namespace ondemand -} // namespace haswell -} // namespace simdjson - -namespace simdjson { +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(haswell::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(haswell::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -} // 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 +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(); } -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} -namespace simdjson { +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; } -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)); + // 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(); + } + -inline simdjson_result 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); + return SUCCESS; } -inline simdjson_result 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 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()); - } -} +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(); } -inline simdjson_result 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); + 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(); } -inline simdjson_result 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); + assert_at_non_root_start(); + return _json_iter->peek(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + 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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -} // 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 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); - } +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() == '"'; } -#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 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); - } +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 -#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&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); - } +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 -#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 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); - } +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 ); } -#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 */ -#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 haswell { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{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 uint32_t token_iterator::current_offset() const noexcept { - return *(_position); +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); } - -simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_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 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 simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -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 simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +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 ); } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_inline token_position token_iterator::position() const noexcept { - return _position; +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_position; + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._position; +simdjson_inline simdjson_result 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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._position; + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._position; + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._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 @@ -64313,1116 +74338,2050 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +#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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace haswell { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -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 value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +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). -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +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_warn_unused simdjson_inline simdjson_result 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(); - 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"); +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(c)]) { + return true; } } - return SUCCESS; + return false; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +#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(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(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_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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { - assert_at_next(); +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"}; - // 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"); +// 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_warn_unused simdjson_inline simdjson_result 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; +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) {} - // - // 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_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; +} - // 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) - // ``` - // +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 { - 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 + is_valid = true; } - 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; } +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; } +} - // If the loop ended, we're out of fields to look at. - return false; +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +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; + } +} - // 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(); +namespace internal { - // 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; +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 - // 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()) { +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -#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 +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); } +} - // 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 +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++] = '"'; + } +} - // 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; } +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++] = '"'; + } +} - // 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; - } +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 +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); +} +#endif - // 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; } +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(); } - // 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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} + +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif - // 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 SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + start_object(); - // 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; + if (it == end) { + end_object(); + return; // Handle empty range } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; - // 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. + // 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(); } - // 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 value_iterator::field_key() noexcept { - assert_at_next(); +#endif - 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); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif - 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_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - _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"); - } +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - return SUCCESS; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} - 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +} // 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 + +/* 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace haswell { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +template + requires(!require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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); + + +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_inline simdjson_result 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; + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result 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.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; +template +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; } -simdjson_inline simdjson_result 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.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; + +template +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 + requires(std::is_class_v && (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:]); + } } - 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; + }; + + b.append('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; + +} // namespace builder +} // namespace haswell +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_warn_unused simdjson_inline simdjson_result 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 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); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for haswell */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace haswell { +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::haswell::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 +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]; + } } - 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"); + + constexpr std::string_view key_view() const { + return {key, N - 1}; } - return result; +}; + +// Helper to create field step +template +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// 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 +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; } - 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"); + + // 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 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 +struct path_accessor { + using value = ::simdjson::haswell::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(current); + } } - 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"); + // 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); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + + // 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); + } } - 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"); + +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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Get type of member by name + template + 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; + } -simdjson_inline simdjson_result 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"); + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - 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 ); + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } - return _json_iter->skip_child(depth()); -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + 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; + } -// 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 + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -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; -} + if (!found) { + return false; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -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()); + 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 +inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::haswell::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::haswell::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace haswell } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(haswell::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for haswell */ +#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/amalgamated.h for haswell */ /* including simdjson/haswell/end.h: #include "simdjson/haswell/end.h" */ @@ -65729,7 +76688,6 @@ namespace simd { friend simdjson_really_inline uint64_t operator==(const simd8 lhs, const simd8 rhs) { return _mm512_cmpeq_epi8_mask(lhs, rhs); } - static const int SIZE = sizeof(base::value); template @@ -66048,7 +77006,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 64; - simdjson_inline static 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_backslash() { return ((quote_bits - 1) & bs_bits) != 0; } @@ -66072,6 +77030,35 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + + +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 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 @@ -66198,7 +77185,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -66207,55 +77194,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -66277,7 +77217,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -66288,28 +77228,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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; + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -66319,7 +77275,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -66661,7 +77617,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -66745,8 +77701,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -66756,8 +77712,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -66794,7 +77750,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -66859,13 +77815,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -66882,22 +77839,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -66907,7 +77880,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -67025,7 +77998,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -67207,7 +78180,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -67546,7 +78519,7 @@ struct simdjson_result : public icelake::implementatio simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -67580,7 +78553,7 @@ struct simdjson_result : public icelake::implementatio * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -67627,7 +78600,22 @@ struct simdjson_result : public icelake::implementatio simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -68121,14 +79109,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -68148,7 +79136,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -68239,6 +79227,7 @@ 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, ... } ) @@ -68445,6 +79434,12 @@ class raw_json_string { */ 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, @@ -68584,10 +79579,10 @@ struct simdjson_result : public icelake::imp simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -68603,6 +79598,7 @@ struct simdjson_result : public icelake::imp /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace icelake { @@ -68721,7 +79717,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -68809,6 +79807,11 @@ class parser { * 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 @@ -68816,10 +79819,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -68845,14 +79848,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -68954,13 +79959,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -68988,6 +80019,315 @@ struct simdjson_result : public icelake::implementati #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(icelake::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -69100,7 +80440,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -69124,11 +80464,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -69202,7 +80573,28 @@ struct simdjson_result : public icelake::implementatio simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -69247,7 +80639,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -69271,6 +80664,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -69289,7 +80687,6 @@ namespace simdjson { template<> struct simdjson_result : public icelake::implementation_simdjson_result_base { -public: 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; @@ -69302,6 +80699,8 @@ struct simdjson_result : public icelake::impl simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -69429,7 +80828,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -69495,7 +80894,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -69518,7 +80917,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -69536,18 +80935,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -69559,7 +80958,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -69569,7 +80968,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -69634,7 +81033,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -69643,7 +81042,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -69719,7 +81118,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -69793,11 +81192,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -69997,7 +81412,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -70021,11 +81436,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -70078,7 +81523,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -70087,7 +81532,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -70100,7 +81545,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -70122,14 +81567,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -70141,7 +81586,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -70151,12 +81596,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -70225,7 +81675,7 @@ struct simdjson_result : public icelake::implementa simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -70238,6 +81688,9 @@ struct simdjson_result : public icelake::implementa template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using icelake::implementation_simdjson_result_base::operator*; + using icelake::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator icelake::ondemand::array() & noexcept(false); @@ -70277,6 +81730,11 @@ struct simdjson_result : public icelake::implementa simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -70303,7 +81761,7 @@ struct simdjson_result : public icelake:: simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -70354,6 +81812,11 @@ struct simdjson_result : public icelake:: simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -70446,7 +81909,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -70496,6 +81959,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -70509,6 +81973,7 @@ class document_stream { * @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 * @@ -70552,6 +82017,11 @@ class document_stream { */ 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. */ @@ -70563,6 +82033,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -70826,6 +82297,9 @@ struct simdjson_result : public icelake::implementatio /* 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): #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 { @@ -70852,7 +82326,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -71023,11 +82497,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -71066,12 +82600,42 @@ struct simdjson_result : public icelake::implementati simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -71200,6 +82764,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -71271,28 +82849,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -71306,7 +82886,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -71315,7 +82894,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -71328,8 +82906,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -71346,7 +82939,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -71355,9 +82947,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - icelake::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, icelake::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -71388,7 +82984,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -71414,7 +83009,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, icelake::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + icelake::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 +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 +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 +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); +} /** @@ -71432,7 +83065,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -71457,17 +83089,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -71476,10 +83108,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + icelake::ondemand::object obj; + if constexpr (std::is_same_v, icelake::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for icelake */ // Inline definitions @@ -71572,7 +83523,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -71763,6 +83714,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace icelake } // namespace simdjson @@ -71799,7 +83753,9 @@ simdjson_inline simdjson_result &simdjson_res ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -71856,7 +83812,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -71898,15 +83854,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -72503,7 +84459,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -72529,15 +84485,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -72557,8 +84513,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -72577,1164 +84533,1957 @@ simdjson_inline simdjson_result document::count_fields() & noexcept { if(answer.error() == SUCCESS) { rewind(); } return answer; } -simdjson_inline simdjson_result document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); +simdjson_inline simdjson_result document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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 document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result 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 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; + } +} + + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 icelake +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + icelake::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base( + error + ) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); +simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::end() & noexcept { - return {}; +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator icelake::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } +#endif -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 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(starting_point), size_t(final_point - starting_point)); +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); } -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); } -simdjson_inline simdjson_result 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 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 int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); } -simdjson_inline bool document::is_negative() noexcept { - return get_root_value_iterator().is_root_negative(); +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); } -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); } -simdjson_inline simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); } +#endif // SIMDJSON_STATIC_REFLECTION +} // namespace simdjson -simdjson_inline simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); -} -simdjson_inline simdjson_result 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; - } -} +namespace simdjson { +namespace icelake { +namespace ondemand { -simdjson_inline simdjson_result 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 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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); } - +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace icelake } // namespace simdjson + + namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} -simdjson_inline simdjson_result::simdjson_result( - icelake::ondemand::document &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base( - error - ) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result::rewind() noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result simdjson_result::end() & noexcept { +simdjson_inline simdjson_result simdjson_result::end() & noexcept { return {}; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } - template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { +simdjson_inline simdjson_result simdjson_result::get() & noexcept { if (error()) { return error(); } return first.get(); } template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } - return std::forward(first).get(); + return std::forward(first).get(); } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(icelake::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator icelake::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace icelake { +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 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 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 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 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(); + } } -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(icelake::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { + std::unique_lock 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(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} +#endif // SIMDJSON_THREADS_ENABLED -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); +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 simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +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 bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +inline size_t document_stream::size_in_bytes() const noexcept { + return len; } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); +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 simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { } - -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { + return simdjson_result(stream->doc, stream->error); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; } -simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator icelake::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); } -#endif +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; -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); + #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 } -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} +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(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. + */ -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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(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(); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); +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); + } } -} // namespace simdjson - +simdjson_inline size_t document_stream::iterator::current_index() const noexcept { + return stream->doc_index; +} -namespace simdjson { -namespace icelake { -namespace ondemand { +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(); -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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } + // 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(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++; + } -} // namespace ondemand -} // namespace icelake -} // namespace simdjson + while (cur_struct_index <= static_cast(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(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; +} -namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), 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; } -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); + // If there's anything left, start the stage 1 thread! + if (next_batch_start() < len) { + start_stage1_thread(); + } } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); + +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); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace icelake +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + icelake::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 icelake { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); +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 simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +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 simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +simdjson_inline value &field::value() & noexcept { + return second; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +} // namespace ondemand +} // namespace icelake +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + icelake::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return first.key(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first.type(); + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_scalar(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_string(); + return first.unescaped_key(allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(icelake::ondemand::document_reference &out) & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.unescaped_key(receiver, allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(icelake::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); + +} // 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 */ +#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 icelake { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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 simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); + +#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 } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); +#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; } -simdjson_inline simdjson_result::operator icelake::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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; } -simdjson_inline simdjson_result::operator icelake::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +// 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_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result::operator icelake::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator icelake::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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]; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } } - return first.at_path(json_path); + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -} // 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 */ -#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 -#include +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} -namespace simdjson { -namespace icelake { -namespace ondemand { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} -#ifdef SIMDJSON_THREADS_ENABLED +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(); +} -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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(); +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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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); +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +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); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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()); } -#endif // SIMDJSON_THREADS_ENABLED +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 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 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 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 depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -inline size_t document_stream::size_in_bytes() const noexcept { - return len; +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; } -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 token_position json_iterator::position() const noexcept { + return token.position(); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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_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_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; } -simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +#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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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; } } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +#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; } -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; } +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); } - #endif // SIMDJSON_THREADS_ENABLED + return true; } -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]; +} // namespace ondemand +} // namespace icelake +} // namespace simdjson - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +namespace simdjson { - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 icelake { +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; } -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) { doc.iter.consume_character(','); } - // 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(); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} - // 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(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++; - } +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} - while (cur_struct_index <= static_cast(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++; - } +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -#ifdef SIMDJSON_THREADS_ENABLED +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} -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; } +simdjson_inline number::operator double() const noexcept { + return get_double(); +} - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); +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); } -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(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -#endif // SIMDJSON_THREADS_ENABLED +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 icelake @@ -73742,588 +86491,669 @@ inline void document_stream::start_stage1_thread() noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - icelake::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 +#include + namespace simdjson { namespace icelake { namespace ondemand { +namespace logger { -// clang 6 does not think the default constructor can be noexcept, so we make it explicit -simdjson_inline field::field() noexcept : std::pair() {} +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. -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -simdjson_inline simdjson_result 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); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); +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; } -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; } -template -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; +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -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; +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); } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +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); } - -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(first.buf), end_quote - first.buf); +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); } -simdjson_inline value &field::value() & noexcept { - return second; +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++; } } - -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +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++; } } -} // namespace ondemand -} // namespace icelake -} // namespace simdjson +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); +} -namespace simdjson { +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); +} -simdjson_inline simdjson_result::simdjson_result( - icelake::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +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); } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +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); } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +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); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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); } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +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); } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +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 -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +template +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)...); } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +template +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)...); + 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 icelake } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_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): #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/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.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/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): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace icelake { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } - -#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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -#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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); } - -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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); } - - -// 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; - } +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return value(iter.child()); } - -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); } - -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); } - -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace icelake +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace icelake { +namespace ondemand { +// +// object_iterator +// -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_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 icelake @@ -74331,1516 +87161,1923 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + icelake::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 icelake { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; +} + + } // namespace ondemand } // namespace icelake } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace icelake { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); -} - -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace icelake } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::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 simdjson_result::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 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_OBJECT_INL_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/field.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/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/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 { -namespace icelake { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); +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)); } -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); + + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; + +inline simdjson_result 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()); } - return value(iter.child()); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); +inline simdjson_result 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); } -simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); + +inline simdjson_result 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); } -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; + +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline simdjson_result object::begin() noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - return object_iterator(iter); +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); + } } -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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 -inline simdjson_result 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 child; +#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 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 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 +#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 { - child = find_field(key); + throw simdjson::simdjson_error(error); } - if(child.error()) { - return child; // we do not continue if there was an 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); } - // 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)); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); } - return child; } +#endif -inline simdjson_result 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; +#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); } - return at_pointer(json_pointer); } - -simdjson_inline simdjson_result 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; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline simdjson_result 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; +#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 -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -} // namespace ondemand -} // namespace icelake -} // namespace simdjson +/* 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 icelake { +namespace ondemand { -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; + +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 simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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 simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +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; } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { + return _position < other._position; } - -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} +} // namespace ondemand +} // namespace icelake +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -simdjson_inline simdjson_result simdjson_result::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 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 +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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): #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/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): #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 icelake { namespace ondemand { -// -// object_iterator -// - -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +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_inline simdjson_result object_iterator::operator*() noexcept { - 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_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); + +simdjson_warn_unused simdjson_inline simdjson_result 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace icelake -} // namespace simdjson + // 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"); + } +} -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result::simdjson_result( - icelake::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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; -} + // 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; + } -} // namespace simdjson + // 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; } + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + // If the loop ended, we're out of fields to look at. + return false; +} -/* 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 */ +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -namespace simdjson { -namespace icelake { -namespace ondemand { + // 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(); -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { -} + // 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; -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; } + // 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()) { - // 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]); + // 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 - if (implementation) { - SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); - SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + 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 { - 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 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 -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()); -} + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } #endif + } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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); - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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. } - - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); + // 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 -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); - json.remove_utf8_bom(); + 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); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; - } - return document::start({ reinterpret_cast(json.data()), this, true }); + 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; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +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 parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - return iterate(padded_string_view(json)); -} - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); + _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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - padded_string_view json = result.value_unsafe(); - return iterate(json); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; +} -} // namespace ondemand -} // namespace icelake -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 icelake { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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 +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 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 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 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()); + 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 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 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()); + 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 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.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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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_warn_unused simdjson_inline simdjson_result 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 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; - } +simdjson_inline simdjson_result 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -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++; - } +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; } -} // namespace ondemand -} // namespace icelake -} // namespace simdjson - -namespace simdjson { +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(icelake::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(icelake::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -} // 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 +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(); } -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} -namespace simdjson { +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; } -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)); + // 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(); + } -inline simdjson_result 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 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); + return SUCCESS; } -inline simdjson_result 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 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); -} +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(); } -inline simdjson_result 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); + 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(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + return _json_iter->peek(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + 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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -} // 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 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); - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -#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 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); - } +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() == '"'; } -#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&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); - } +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 -#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 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); - } +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 -}}} // 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 */ -#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 icelake { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{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 uint32_t token_iterator::current_offset() const noexcept { - return *(_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 const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_position++)]; +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_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 void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { - return *(position+1) - *position; + +simdjson_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -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 simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +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 ); } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_inline token_position token_iterator::position() const noexcept { - return _position; +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_position; + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._position; +simdjson_inline simdjson_result 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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._position; + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._position; + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._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 @@ -75849,1116 +89086,2050 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +#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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace icelake { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -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 value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +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). -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +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_warn_unused simdjson_inline simdjson_result 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(); - 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"); +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(c)]) { + return true; } } - return SUCCESS; + return false; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +#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(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(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_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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { - assert_at_next(); +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"}; - // 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"); +// 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_warn_unused simdjson_inline simdjson_result 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; +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) {} - // - // 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_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; +} - // 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) - // ``` - // +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 { - 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 + is_valid = true; } - 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; } +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; } +} - // If the loop ended, we're out of fields to look at. - return false; +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +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; + } +} - // 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(); +namespace internal { - // 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; +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 - // 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()) { +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -#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 +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); } +} - // 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 +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++] = '"'; + } +} - // 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; } +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++] = '"'; + } +} - // 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; - } +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 +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); +} +#endif - // 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; } +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(); } - // 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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} - // 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); +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif - // 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; +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + 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; - // 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. + // 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(); } - // 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 value_iterator::field_key() noexcept { - assert_at_next(); +#endif - 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); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif - 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_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - _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"); - } +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - return SUCCESS; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} - 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +} // 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 + +/* 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace icelake { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +template + requires(!require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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); + + +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_inline simdjson_result 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; + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result 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.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; +template +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; } -simdjson_inline simdjson_result 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.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; + +template +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 + requires(std::is_class_v && (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:]); + } } - 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; + }; + + b.append('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; + +} // namespace builder +} // namespace icelake +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { - return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_warn_unused simdjson_inline simdjson_result 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); + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for icelake */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace icelake { +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::icelake::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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// 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 +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; } - 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"); + + // 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 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 +struct path_accessor { + using value = ::simdjson::icelake::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(current); + } } - 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"); + // 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); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // 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); + } } - 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"); +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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // Get type of member by name + template + 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; } - 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"); + + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline simdjson_result 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; -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -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 ); + 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; + } - return _json_iter->skip_child(depth()); -} + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -// 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 + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + if (!found) { + return false; + } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + 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; -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; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -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()); + 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 +inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::icelake::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::icelake::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace icelake } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(icelake::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for icelake */ +#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/amalgamated.h for icelake */ /* including simdjson/icelake/end.h: #include "simdjson/icelake/end.h" */ @@ -77742,7 +91913,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static backslash_and_quote + simdjson_inline backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); simdjson_inline bool has_quote_first() { @@ -77783,6 +91954,32 @@ backslash_and_quote::copy_and_find(const uint8_t *src, uint8_t *dst) { }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 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 @@ -77851,7 +92048,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -77860,55 +92057,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -77930,7 +92080,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -77941,28 +92091,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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; + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -77972,7 +92138,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -78314,7 +92480,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -78398,8 +92564,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -78409,8 +92575,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -78447,7 +92613,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -78512,13 +92678,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -78535,22 +92702,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -78560,7 +92743,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -78678,7 +92861,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -78860,7 +93043,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -79199,7 +93382,7 @@ struct simdjson_result : public ppc64::implementation_si simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -79233,7 +93416,7 @@ struct simdjson_result : public ppc64::implementation_si * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -79280,7 +93463,22 @@ struct simdjson_result : public ppc64::implementation_si simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -79774,14 +93972,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -79801,7 +93999,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -79892,6 +94090,7 @@ 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, ... } ) @@ -80098,6 +94297,12 @@ class raw_json_string { */ 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, @@ -80237,10 +94442,10 @@ struct simdjson_result : public ppc64::impleme simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -80256,6 +94461,7 @@ struct simdjson_result : public ppc64::impleme /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace ppc64 { @@ -80374,7 +94580,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -80462,6 +94670,11 @@ class parser { * 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 @@ -80469,10 +94682,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -80498,14 +94711,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -80607,13 +94822,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -80641,6 +94882,315 @@ struct simdjson_result : public ppc64::implementation_s #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(ppc64::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -80753,7 +95303,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -80777,11 +95327,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -80855,7 +95436,28 @@ struct simdjson_result : public ppc64::implementation_si simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -80900,7 +95502,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -80924,6 +95527,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -80942,7 +95550,6 @@ namespace simdjson { template<> struct simdjson_result : public ppc64::implementation_simdjson_result_base { -public: 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; @@ -80955,6 +95562,8 @@ struct simdjson_result : public ppc64::implemen simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -81082,7 +95691,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -81148,7 +95757,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -81171,7 +95780,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -81189,18 +95798,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -81212,7 +95821,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -81222,7 +95831,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -81287,7 +95896,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -81296,7 +95905,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -81372,7 +95981,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -81446,11 +96055,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -81650,7 +96275,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -81674,11 +96299,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -81731,7 +96386,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -81740,7 +96395,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -81753,7 +96408,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -81775,14 +96430,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -81794,7 +96449,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -81804,12 +96459,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -81878,7 +96538,7 @@ struct simdjson_result : public ppc64::implementation simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -81891,6 +96551,9 @@ struct simdjson_result : public ppc64::implementation template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using ppc64::implementation_simdjson_result_base::operator*; + using ppc64::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator ppc64::ondemand::array() & noexcept(false); @@ -81930,6 +96593,11 @@ struct simdjson_result : public ppc64::implementation simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -81956,7 +96624,7 @@ struct simdjson_result : public ppc64::impl simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -82007,6 +96675,11 @@ struct simdjson_result : public ppc64::impl simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -82099,7 +96772,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -82149,6 +96822,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -82162,6 +96836,7 @@ class document_stream { * @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 * @@ -82205,6 +96880,11 @@ class document_stream { */ 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. */ @@ -82216,6 +96896,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -82479,6 +97160,9 @@ struct simdjson_result : public ppc64::implementation_si /* 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): #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 { @@ -82505,7 +97189,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -82676,11 +97360,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -82719,12 +97463,42 @@ struct simdjson_result : public ppc64::implementation_s simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -82853,6 +97627,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -82924,28 +97712,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -82959,7 +97749,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -82968,7 +97757,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -82981,8 +97769,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -82999,7 +97802,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -83008,9 +97810,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - ppc64::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, ppc64::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -83041,7 +97847,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -83067,7 +97872,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, ppc64::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + ppc64::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 +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 +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 +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); +} /** @@ -83085,7 +97928,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -83110,17 +97952,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -83129,10 +97971,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + ppc64::ondemand::object obj; + if constexpr (std::is_same_v, ppc64::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for ppc64 */ // Inline definitions @@ -83225,7 +98386,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -83416,6 +98577,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace ppc64 } // namespace simdjson @@ -83452,7 +98616,9 @@ simdjson_inline simdjson_result &simdjson_resul ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -83509,7 +98675,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -83551,15 +98717,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -84156,7 +99322,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -84182,15 +99348,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -84210,8 +99376,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -84230,1164 +99396,1957 @@ simdjson_inline simdjson_result document::count_fields() & noexcept { if(answer.error() == SUCCESS) { rewind(); } return answer; } -simdjson_inline simdjson_result document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); +simdjson_inline simdjson_result document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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 document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result 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 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; + } +} + + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 ppc64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + ppc64::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base( + error + ) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); +simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::end() & noexcept { - return {}; +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator ppc64::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } +#endif -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 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(starting_point), size_t(final_point - starting_point)); +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); } -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); } -simdjson_inline simdjson_result 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 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 int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); } -simdjson_inline bool document::is_negative() noexcept { - return get_root_value_iterator().is_root_negative(); +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); } -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); } -simdjson_inline simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); } +#endif // SIMDJSON_STATIC_REFLECTION +} // namespace simdjson -simdjson_inline simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); -} -simdjson_inline simdjson_result 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; - } -} +namespace simdjson { +namespace ppc64 { +namespace ondemand { -simdjson_inline simdjson_result 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 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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); } - +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace ppc64 } // namespace simdjson + + namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} -simdjson_inline simdjson_result::simdjson_result( - ppc64::ondemand::document &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base( - error - ) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result::rewind() noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result simdjson_result::end() & noexcept { +simdjson_inline simdjson_result simdjson_result::end() & noexcept { return {}; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } - template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { +simdjson_inline simdjson_result simdjson_result::get() & noexcept { if (error()) { return error(); } return first.get(); } template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } - return std::forward(first).get(); + return std::forward(first).get(); } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(ppc64::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator ppc64::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace ppc64 { +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 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 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 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 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(); + } } -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { + std::unique_lock 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(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} +#endif // SIMDJSON_THREADS_ENABLED -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); +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 simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +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 bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +inline size_t document_stream::size_in_bytes() const noexcept { + return len; } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); +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 simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { } - -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { + return simdjson_result(stream->doc, stream->error); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; } -simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator ppc64::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); } -#endif +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; -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); + #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 } -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} +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(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. + */ -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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(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(); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); +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); + } } -} // namespace simdjson - +simdjson_inline size_t document_stream::iterator::current_index() const noexcept { + return stream->doc_index; +} -namespace simdjson { -namespace ppc64 { -namespace ondemand { +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(); -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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } + // 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(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++; + } -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson + while (cur_struct_index <= static_cast(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(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; +} -namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), 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; } -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); + // If there's anything left, start the stage 1 thread! + if (next_batch_start() < len) { + start_stage1_thread(); + } } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); + +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); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace ppc64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + ppc64::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 ppc64 { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); +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 simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +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 simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +simdjson_inline value &field::value() & noexcept { + return second; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +} // namespace ondemand +} // namespace ppc64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + ppc64::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return first.key(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first.type(); + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_scalar(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_string(); + return first.unescaped_key(allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document_reference &out) & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.unescaped_key(receiver, allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(ppc64::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); + +} // 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 */ +#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 ppc64 { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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 simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); + +#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 } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); +#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; } -simdjson_inline simdjson_result::operator ppc64::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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; } -simdjson_inline simdjson_result::operator ppc64::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +// 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_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result::operator ppc64::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator ppc64::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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]; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } } - return first.at_path(json_path); + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -} // 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 */ -#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 -#include +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} -namespace simdjson { -namespace ppc64 { -namespace ondemand { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} -#ifdef SIMDJSON_THREADS_ENABLED +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(); +} -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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(); +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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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); +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +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); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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()); } -#endif // SIMDJSON_THREADS_ENABLED +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 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 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 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 depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -inline size_t document_stream::size_in_bytes() const noexcept { - return len; +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; } -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 token_position json_iterator::position() const noexcept { + return token.position(); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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_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_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; } -simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +#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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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; } } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +#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; } -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; } +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); } - #endif // SIMDJSON_THREADS_ENABLED + return true; } -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]; +} // namespace ondemand +} // namespace ppc64 +} // namespace simdjson - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +namespace simdjson { - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 ppc64 { +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; } -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) { doc.iter.consume_character(','); } - // 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(); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} - // 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(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++; - } +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} - while (cur_struct_index <= static_cast(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++; - } +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -#ifdef SIMDJSON_THREADS_ENABLED +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} -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; } +simdjson_inline number::operator double() const noexcept { + return get_double(); +} - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); +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); } -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(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -#endif // SIMDJSON_THREADS_ENABLED +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 ppc64 @@ -85395,588 +101354,669 @@ inline void document_stream::start_stage1_thread() noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - ppc64::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 +#include + namespace simdjson { namespace ppc64 { namespace ondemand { +namespace logger { -// clang 6 does not think the default constructor can be noexcept, so we make it explicit -simdjson_inline field::field() noexcept : std::pair() {} +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. -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -simdjson_inline simdjson_result 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); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); +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; } -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; } -template -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; +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -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; +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); } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +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); } - -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(first.buf), end_quote - first.buf); +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); } -simdjson_inline value &field::value() & noexcept { - return second; +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++; } } - -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +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++; } } -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson +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); +} -namespace simdjson { +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); +} -simdjson_inline simdjson_result::simdjson_result( - ppc64::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +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); } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +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); } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +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); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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); } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +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); } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +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 -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +template +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)...); } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +template +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)...); + 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 ppc64 } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_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): #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/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.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/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): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace ppc64 { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } - -#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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -#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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); } - -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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); } - - -// 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; - } +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return value(iter.child()); } - -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); } - -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); } - -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace ppc64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace ppc64 { +namespace ondemand { +// +// object_iterator +// -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_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 ppc64 @@ -85984,1516 +102024,1923 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + ppc64::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 ppc64 { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; +} + + } // namespace ondemand } // namespace ppc64 } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace ppc64 { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); -} - -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace ppc64 } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::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 simdjson_result::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 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_OBJECT_INL_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/field.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/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/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 { -namespace ppc64 { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); +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)); } -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); + + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; + +inline simdjson_result 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()); } - return value(iter.child()); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); +inline simdjson_result 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); } -simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); + +inline simdjson_result 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); } -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; + +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline simdjson_result object::begin() noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - return object_iterator(iter); +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); + } } -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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 -inline simdjson_result 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 child; +#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 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 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 +#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 { - child = find_field(key); + throw simdjson::simdjson_error(error); } - if(child.error()) { - return child; // we do not continue if there was an 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); } - // 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)); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); } - return child; } +#endif -inline simdjson_result 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; +#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); } - return at_pointer(json_pointer); } - -simdjson_inline simdjson_result 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; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline simdjson_result 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; +#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 -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson +/* 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 ppc64 { +namespace ondemand { -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; + +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 simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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 simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +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; } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { + return _position < other._position; } - -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} +} // namespace ondemand +} // namespace ppc64 +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -simdjson_inline simdjson_result simdjson_result::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 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 +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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): #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/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): #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 ppc64 { namespace ondemand { -// -// object_iterator -// - -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +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_inline simdjson_result object_iterator::operator*() noexcept { - 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_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); + +simdjson_warn_unused simdjson_inline simdjson_result 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson + // 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"); + } +} -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result::simdjson_result( - ppc64::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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; -} + // 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; + } -} // namespace simdjson + // 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; } + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + // If the loop ended, we're out of fields to look at. + return false; +} -/* 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 */ +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -namespace simdjson { -namespace ppc64 { -namespace ondemand { + // 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(); -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { -} + // 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; -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; } + // 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()) { - // 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]); + // 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 - if (implementation) { - SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); - SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + 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 { - 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 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 -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()); -} + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } #endif + } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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); - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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. } - - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); + // 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 -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); - json.remove_utf8_bom(); + 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); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; - } - return document::start({ reinterpret_cast(json.data()), this, true }); + 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; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +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 parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - return iterate(padded_string_view(json)); -} - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); + _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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - padded_string_view json = result.value_unsafe(); - return iterate(json); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; +} -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 ppc64 { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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 +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 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 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 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()); + 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 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 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()); + 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 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.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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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_warn_unused simdjson_inline simdjson_result 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 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; - } +simdjson_inline simdjson_result 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -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++; - } +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; } -} // namespace ondemand -} // namespace ppc64 -} // namespace simdjson - -namespace simdjson { +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(ppc64::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(ppc64::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -} // 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 +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(); } -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} -namespace simdjson { +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; } -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)); + // 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(); + } -inline simdjson_result 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 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); + return SUCCESS; } -inline simdjson_result 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 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); -} +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(); } -inline simdjson_result 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); + 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(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + return _json_iter->peek(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + 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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -} // 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 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); - } +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -#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 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); - } +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() == '"'; } -#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&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); - } +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 -#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 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); - } +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 -}}} // 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 */ -#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 ppc64 { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{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 uint32_t token_iterator::current_offset() const noexcept { - return *(_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 const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_position++)]; +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_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 void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { - return *(position+1) - *position; + +simdjson_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -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 simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +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 ); } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_inline token_position token_iterator::position() const noexcept { - return _position; +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_position; + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._position; +simdjson_inline simdjson_result 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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._position; + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._position; + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._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 @@ -87502,1116 +103949,2050 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +#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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace ppc64 { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -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 value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +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). -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +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_warn_unused simdjson_inline simdjson_result 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(); - 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"); +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(c)]) { + return true; } } - return SUCCESS; + return false; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +#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(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(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_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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { - assert_at_next(); +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"}; - // 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"); +// 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_warn_unused simdjson_inline simdjson_result 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; +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) {} - // - // 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_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; +} - // 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) - // ``` - // +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 { - 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 + is_valid = true; } - 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; } +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; } +} - // If the loop ended, we're out of fields to look at. - return false; +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +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; + } +} - // 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(); +namespace internal { - // 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; +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 - // 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()) { +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -#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 +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); } +} - // 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 +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++] = '"'; + } +} - // 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; } +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++] = '"'; + } +} - // 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; - } +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 +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); +} +#endif - // 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; } +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(); } - // 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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} - // 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); +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif - // 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; +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + 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; - // 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. + // 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(); } - // 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 value_iterator::field_key() noexcept { - assert_at_next(); +#endif - 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); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif - 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_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - _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"); - } +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - return SUCCESS; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} - 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +} // 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace ppc64 { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +template + requires(!require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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); + + +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_inline simdjson_result 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; + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result 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.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; +template +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; } -simdjson_inline simdjson_result 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.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; + +template +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 + requires(std::is_class_v && (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:]); + } } - 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; + }; + + b.append('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; + +} // namespace builder +} // namespace ppc64 +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { - return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_warn_unused simdjson_inline simdjson_result 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); + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for ppc64 */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace ppc64 { +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::ppc64::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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// 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 +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; } - 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"); + + // 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 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 +struct path_accessor { + using value = ::simdjson::ppc64::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(current); + } } - 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"); + // 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); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // 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); + } } - 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"); +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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // Get type of member by name + template + 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; } - 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"); + + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline simdjson_result 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; -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -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 ); + 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; + } - return _json_iter->skip_child(depth()); -} + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -// 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 + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + if (!found) { + return false; + } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + 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; -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; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -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()); + 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 +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::ppc64::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace ppc64 } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(ppc64::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for ppc64 */ +#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/amalgamated.h for ppc64 */ /* including simdjson/ppc64/end.h: #include "simdjson/ppc64/end.h" */ @@ -89729,7 +107110,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -89755,6 +107136,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + uint64_t((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace westmere } // namespace simdjson @@ -89821,7 +107227,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -89830,55 +107236,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -89900,7 +107259,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -89911,28 +107270,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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; + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -89942,7 +107317,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -90284,7 +107659,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -90368,8 +107743,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -90379,8 +107754,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -90417,7 +107792,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -90482,13 +107857,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -90505,22 +107881,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -90530,7 +107922,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -90648,7 +108040,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -90830,7 +108222,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -91169,7 +108561,7 @@ struct simdjson_result : public westmere::implementat simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -91203,7 +108595,7 @@ struct simdjson_result : public westmere::implementat * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -91250,7 +108642,22 @@ struct simdjson_result : public westmere::implementat simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -91744,14 +109151,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -91771,7 +109178,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -91862,6 +109269,7 @@ 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, ... } ) @@ -92068,6 +109476,12 @@ class raw_json_string { */ 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, @@ -92207,10 +109621,10 @@ struct simdjson_result : public westmere::i simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -92226,6 +109640,7 @@ struct simdjson_result : public westmere::i /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace westmere { @@ -92344,7 +109759,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -92432,6 +109849,11 @@ class parser { * 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 @@ -92439,10 +109861,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -92468,14 +109890,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -92577,13 +110001,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -92611,6 +110061,315 @@ struct simdjson_result : public westmere::implementa #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(westmere::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -92723,7 +110482,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -92747,11 +110506,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -92825,7 +110615,28 @@ struct simdjson_result : public westmere::implementat simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -92870,7 +110681,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -92894,6 +110706,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -92912,7 +110729,6 @@ namespace simdjson { template<> struct simdjson_result : public westmere::implementation_simdjson_result_base { -public: 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; @@ -92925,6 +110741,8 @@ struct simdjson_result : public westmere::im simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -93052,7 +110870,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -93118,7 +110936,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -93141,7 +110959,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -93159,18 +110977,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -93182,7 +111000,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -93192,7 +111010,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -93257,7 +111075,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -93266,7 +111084,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -93342,7 +111160,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -93416,11 +111234,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -93620,7 +111454,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -93644,11 +111478,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -93701,7 +111565,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -93710,7 +111574,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -93723,7 +111587,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -93745,14 +111609,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -93764,7 +111628,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -93774,12 +111638,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -93848,7 +111717,7 @@ struct simdjson_result : public westmere::implemen simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -93861,6 +111730,9 @@ struct simdjson_result : public westmere::implemen template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using westmere::implementation_simdjson_result_base::operator*; + using westmere::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator westmere::ondemand::array() & noexcept(false); @@ -93900,6 +111772,11 @@ struct simdjson_result : public westmere::implemen simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -93926,7 +111803,7 @@ struct simdjson_result : public westmere simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -93977,6 +111854,11 @@ struct simdjson_result : public westmere simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -94069,7 +111951,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -94119,6 +112001,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -94132,6 +112015,7 @@ class document_stream { * @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 * @@ -94175,6 +112059,11 @@ class document_stream { */ 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. */ @@ -94186,6 +112075,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -94449,6 +112339,9 @@ struct simdjson_result : public westmere::implementat /* 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): #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 { @@ -94475,7 +112368,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -94646,11 +112539,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -94689,12 +112642,42 @@ struct simdjson_result : public westmere::implementa simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -94823,6 +112806,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -94894,28 +112891,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -94929,7 +112928,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -94938,7 +112936,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -94951,8 +112948,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -94969,7 +112981,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -94978,9 +112989,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - westmere::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, westmere::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -95011,7 +113026,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -95037,7 +113051,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, westmere::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + westmere::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 +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 +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 +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); +} /** @@ -95055,7 +113107,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -95080,17 +113131,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -95099,10 +113150,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + westmere::ondemand::object obj; + if constexpr (std::is_same_v, westmere::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for westmere */ // Inline definitions @@ -95195,7 +113565,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -95386,6 +113756,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace westmere } // namespace simdjson @@ -95422,7 +113795,9 @@ simdjson_inline simdjson_result &simdjson_re ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -95479,7 +113854,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -95521,15 +113896,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -96126,7 +114501,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -96152,15 +114527,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -96180,8 +114555,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -96200,1164 +114575,1957 @@ simdjson_inline simdjson_result document::count_fields() & noexcept { if(answer.error() == SUCCESS) { rewind(); } return answer; } -simdjson_inline simdjson_result document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); +simdjson_inline simdjson_result document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); +} +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; +} + +simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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 document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); +} + +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); +} + +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} + + +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} + +simdjson_inline simdjson_result 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 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; + } +} + + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 westmere +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + westmere::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base( + error + ) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} + +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); +} +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; +} + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} + +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); +simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::end() & noexcept { - return {}; +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator westmere::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } +#endif -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 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(starting_point), size_t(final_point - starting_point)); +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); } -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); } -simdjson_inline simdjson_result 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 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 int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); } -simdjson_inline bool document::is_negative() noexcept { - return get_root_value_iterator().is_root_negative(); +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); } -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); } -simdjson_inline simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); } +#endif // SIMDJSON_STATIC_REFLECTION +} // namespace simdjson -simdjson_inline simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); -} -simdjson_inline simdjson_result 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; - } -} +namespace simdjson { +namespace westmere { +namespace ondemand { -simdjson_inline simdjson_result 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 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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); } - +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace westmere } // namespace simdjson + + namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} -simdjson_inline simdjson_result::simdjson_result( - westmere::ondemand::document &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base( - error - ) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline error_code simdjson_result::rewind() noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } first.rewind(); return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { if (error()) { return error(); } return first.begin(); } -simdjson_inline simdjson_result simdjson_result::end() & noexcept { +simdjson_inline simdjson_result simdjson_result::end() & noexcept { return {}; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { if (error()) { return error(); } return first.find_field(key); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { if (error()) { return error(); } return first.get_value(); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { if (error()) { return error(); } return first.is_null(); } - template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { +simdjson_inline simdjson_result simdjson_result::get() & noexcept { if (error()) { return error(); } return first.get(); } template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } - return std::forward(first).get(); + return std::forward(first).get(); } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(westmere::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator westmere::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace westmere { +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 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 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 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 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(); + } } -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(westmere::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; +inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { + std::unique_lock 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(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} +#endif // SIMDJSON_THREADS_ENABLED -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); +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 simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +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 bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +inline size_t document_stream::size_in_bytes() const noexcept { + return len; } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); +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 simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { } - -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { + return simdjson_result(stream->doc, stream->error); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; } -simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator westmere::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); } -#endif +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; -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); + #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 } -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} +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(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. + */ -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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(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(); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); +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); + } } -} // namespace simdjson - +simdjson_inline size_t document_stream::iterator::current_index() const noexcept { + return stream->doc_index; +} -namespace simdjson { -namespace westmere { -namespace ondemand { +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(); -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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } + // 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(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++; + } -} // namespace ondemand -} // namespace westmere -} // namespace simdjson + while (cur_struct_index <= static_cast(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(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; +} -namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), 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; } -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); + // If there's anything left, start the stage 1 thread! + if (next_batch_start() < len) { + start_stage1_thread(); + } } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); + +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); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +#endif // SIMDJSON_THREADS_ENABLED + +} // namespace ondemand +} // namespace westmere +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + westmere::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 westmere { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); +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 simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +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 simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +simdjson_inline value &field::value() & noexcept { + return second; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +} // namespace ondemand +} // namespace westmere +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + westmere::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return std::forward(first).get(out); + return first.key(); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first.type(); + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_scalar(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_string(); + return first.unescaped_key(allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(westmere::ondemand::document_reference &out) & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.unescaped_key(receiver, allow_replacement); } -template <> -simdjson_inline error_code simdjson_result::get(westmere::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); + +} // 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 */ +#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 westmere { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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 simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); + +#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 } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); +#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; } -simdjson_inline simdjson_result::operator westmere::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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; } -simdjson_inline simdjson_result::operator westmere::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + + +// 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_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result::operator westmere::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator westmere::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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]; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } } - return first.at_path(json_path); + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -} // 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 */ -#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 -#include +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; +} -namespace simdjson { -namespace westmere { -namespace ondemand { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; +} -#ifdef SIMDJSON_THREADS_ENABLED +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(); +} -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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(); +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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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); +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +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); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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()); } -#endif // SIMDJSON_THREADS_ENABLED +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 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 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 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 depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -inline size_t document_stream::size_in_bytes() const noexcept { - return len; +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; } -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 token_position json_iterator::position() const noexcept { + return token.position(); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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_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_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; } -simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +#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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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; } } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +#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; } -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; } +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); } - #endif // SIMDJSON_THREADS_ENABLED + return true; } -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]; +} // namespace ondemand +} // namespace westmere +} // namespace simdjson - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +namespace simdjson { - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 westmere { +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; } -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) { doc.iter.consume_character(','); } - // 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(); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); +} - // 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(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++; - } +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; +} - while (cur_struct_index <= static_cast(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++; - } +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; +} - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -#ifdef SIMDJSON_THREADS_ENABLED +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; +} -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; } +simdjson_inline number::operator double() const noexcept { + return get_double(); +} - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); +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); } -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(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; +} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -#endif // SIMDJSON_THREADS_ENABLED +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 westmere @@ -97365,588 +116533,669 @@ inline void document_stream::start_stage1_thread() noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - westmere::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 +#include + namespace simdjson { namespace westmere { namespace ondemand { +namespace logger { -// clang 6 does not think the default constructor can be noexcept, so we make it explicit -simdjson_inline field::field() noexcept : std::pair() {} +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. -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -simdjson_inline simdjson_result 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); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); +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; } -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +static inline log_level log_threshold() +{ + static log_level threshold = get_log_level_from_env(); + return threshold; } -template -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; +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -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; +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); } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +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); } - -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(first.buf), end_quote - first.buf); +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); } -simdjson_inline value &field::value() & noexcept { - return second; +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++; } } - -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +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++; } } -} // namespace ondemand -} // namespace westmere -} // namespace simdjson +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); +} -namespace simdjson { +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); +} -simdjson_inline simdjson_result::simdjson_result( - westmere::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +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); } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +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); } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +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); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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); } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +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); } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +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 -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +template +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)...); } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +template +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)...); + 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 westmere } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_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): #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/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/parser.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/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): #include "simdjson/generic/ondemand/json_iterator.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ +/* amalgamation skipped (editor-only): #endif */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ namespace simdjson { namespace westmere { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } - -#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 +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -#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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); } - -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; +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); } - - -// 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; - } +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return value(iter.child()); } - -SIMDJSON_POP_DISABLE_WARNINGS - -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); } - -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_root_object().error() ); + return object(iter); } - -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace westmere +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace westmere { +namespace ondemand { +// +// object_iterator +// -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_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} + +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 westmere @@ -97954,1516 +117203,1923 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + westmere::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 westmere { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; +} + + } // namespace ondemand } // namespace westmere } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace westmere { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); -} - -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace westmere } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::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 simdjson_result::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_OBJECT_INL_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/field.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/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/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 { -namespace westmere { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); +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)); } -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); + + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); + +inline simdjson_result 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); } -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; + +inline simdjson_result 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()); } - return value(iter.child()); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); +inline simdjson_result 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_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); + +inline simdjson_result 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_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; + +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline simdjson_result object::begin() noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } -#endif - return object_iterator(iter); +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); + } } -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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); + } } +#endif -inline simdjson_result 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 child; +#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 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 - // 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 +#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 { - child = find_field(key); + throw simdjson::simdjson_error(error); } - if(child.error()) { - return child; // we do not continue if there was an 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); } - // 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)); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); } - return child; } +#endif -inline simdjson_result 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; +#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); } - return at_pointer(json_pointer); } - -simdjson_inline simdjson_result 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; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline simdjson_result 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; +#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 +}}} // namespace simdjson::westmere::ondemand -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H -} // namespace ondemand -} // namespace westmere -} // namespace simdjson +/* 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 westmere { +namespace ondemand { -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); + + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; + +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 simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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 simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +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; } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { + return _position < other._position; } - -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); +simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { + return _position <= other._position; } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} +} // namespace ondemand +} // namespace westmere +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -simdjson_inline simdjson_result simdjson_result::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 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 +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_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): #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/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): #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 westmere { namespace ondemand { -// -// object_iterator -// - -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +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_inline simdjson_result object_iterator::operator*() noexcept { - 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_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); + +simdjson_warn_unused simdjson_inline simdjson_result 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); + if(error) { return error; } + return started_object(); +} - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace westmere -} // namespace simdjson + // 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"); + } +} -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result::simdjson_result( - westmere::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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; -} + // 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; + } -} // namespace simdjson + // 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; } + } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H + // If the loop ended, we're out of fields to look at. + return false; +} -/* 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 */ +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -namespace simdjson { -namespace westmere { -namespace ondemand { + // 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(); -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { -} + // 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; -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; } + // 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()) { - // 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]); + // 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 - if (implementation) { - SIMDJSON_TRY( implementation->set_capacity(new_capacity) ); - SIMDJSON_TRY( implementation->set_max_depth(new_max_depth) ); + 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 { - 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 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 -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()); -} + if (_json_iter->start_position(_depth) != start_position()) { return OUT_OF_ORDER_ITERATION; } #endif + } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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); - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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. } - - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); + // 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 -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); - json.remove_utf8_bom(); + 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); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; - } - return document::start({ reinterpret_cast(json.data()), this, true }); + 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; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +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 parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - return iterate(padded_string_view(json)); -} - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); + _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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - padded_string_view json = result.value_unsafe(); - return iterate(json); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; +} -} // namespace ondemand -} // namespace westmere -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 westmere { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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 +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 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 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 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()); + 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 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 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()); + 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 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.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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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_warn_unused simdjson_inline simdjson_result 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 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; - } +simdjson_inline simdjson_result 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -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++; - } +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; } -} // namespace ondemand -} // namespace westmere -} // namespace simdjson - -namespace simdjson { +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); +} -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(westmere::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(westmere::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -} // 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 +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(); } -/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. + assert_at_start(); + return _json_iter->peek(); +} -namespace simdjson { +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; } -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)); + // 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(); + } -inline simdjson_result 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 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); + return SUCCESS; } -inline simdjson_result 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()); - } -} -inline simdjson_result 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_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(); } -inline simdjson_result 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); + 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(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + return _json_iter->peek(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); -} +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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + 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; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -} // 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 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_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -#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 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); - } +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() == '"'; } -#endif -#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&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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); - } +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 -#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 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); - } +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 -}}} // namespace simdjson::westmere::ondemand - -#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 */ -#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 westmere { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{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 uint32_t token_iterator::current_offset() const noexcept { - return *(_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 const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_position++)]; +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_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 void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); } -simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { - return *(position+1) - *position; + +simdjson_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -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 simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +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 ); } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_inline token_position token_iterator::position() const noexcept { - return _position; +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_position; + +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._position; +simdjson_inline simdjson_result 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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._position; + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._position; + +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; + +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._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 @@ -99472,1116 +119128,2050 @@ simdjson_inline bool token_iterator::operator<=(const token_iterator &other) con namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +#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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace westmere { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -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 value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +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). -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +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_warn_unused simdjson_inline simdjson_result 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(); - 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"); +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(c)]) { + return true; } } - return SUCCESS; + return false; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +#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(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(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_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_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(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { - assert_at_next(); +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"}; - // 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"); +// 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_warn_unused simdjson_inline simdjson_result 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; +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) {} - // - // 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_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; +} - // 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) - // ``` - // +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 { - 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 + is_valid = true; } - 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; } +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; } +} - // If the loop ended, we're out of fields to look at. - return false; +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +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; + } +} - // 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(); +namespace internal { - // 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; +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 - // 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()) { +template +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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(); + } + } +} -#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 +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); } +} - // 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 +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++] = '"'; + } +} - // 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; } +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++] = '"'; + } +} - // 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; - } +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 +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); +} +#endif - // 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; } +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(); } - // 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 +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} - // 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); +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif - // 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; +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + 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; - // 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. + // 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(); } - // 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 value_iterator::field_key() noexcept { - assert_at_next(); +#endif - 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); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} +#endif - 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_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); + } + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - _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"); - } +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - return SUCCESS; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} - 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } } +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +} // namespace builder +} // namespace westmere +} // namespace simdjson + +#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 + +/* 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace westmere { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +template + requires(!require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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); + + +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_inline simdjson_result 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; + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_inline simdjson_result 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.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; +template +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; } -simdjson_inline simdjson_result 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.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; + +template +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 + requires(std::is_class_v && (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:]); + } } - 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; + }; + + b.append('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; + +} // namespace builder +} // namespace westmere +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { - return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_warn_unused simdjson_inline simdjson_result 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); + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for westmere */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace westmere { +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::westmere::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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// 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 +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; } - 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"); + + // 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 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 +struct path_accessor { + using value = ::simdjson::westmere::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(current); + } } - 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"); + // 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); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // 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); + } } - 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"); +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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // Get type of member by name + template + 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; } - 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"); + + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline simdjson_result 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; -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -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 ); + 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; + } - return _json_iter->skip_child(depth()); -} + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -// 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 + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + if (!found) { + return false; + } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + 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; -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; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -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()); + 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 +inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::westmere::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::westmere::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace westmere } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(westmere::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for westmere */ +#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/amalgamated.h for westmere */ /* including simdjson/westmere/end.h: #include "simdjson/westmere/end.h" */ @@ -101171,7 +121761,7 @@ using namespace simd; struct backslash_and_quote { public: static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static 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_backslash() { return bs_bits != 0; } @@ -101200,6 +121790,31 @@ simdjson_inline backslash_and_quote backslash_and_quote::copy_and_find(const uin }; } + +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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + static_cast((is_backslash | is_quote | is_control).to_bitmask()) + }; +} + } // unnamed namespace } // namespace lsx } // namespace simdjson @@ -101268,7 +121883,7 @@ class value_iterator; /* 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_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS #ifndef SIMDJSON_ONDEMAND_DESERIALIZE_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ @@ -101277,55 +121892,8 @@ class value_iterator; /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } -}; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns - -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; - -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; - -template -using tag_invoke_result = - std::invoke_result; - -template -using tag_invoke_result_t = - std::invoke_result_t; - -template using tag_t = std::decay_t; - - struct deserialize_tag; /// These types are deserializable in a built-in way @@ -101347,7 +121915,7 @@ template concept custom_deserializable = tag_invocable; template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; template concept nothrow_custom_deserializable = nothrow_tag_invocable; @@ -101358,28 +121926,44 @@ concept nothrow_deserializable = nothrow_custom_deserializable || is_bu /// 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; + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + // Customization Point for value template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } // Customization Point for document reference template requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { return tag_invoke(*this, object, output); } @@ -101389,7 +121973,7 @@ inline constexpr struct deserialize_tag { } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#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" */ @@ -101731,7 +122315,7 @@ class value_iterator { simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - simdjson_inline error_code error() const 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; @@ -101815,8 +122399,8 @@ class value_iterator { simdjson_inline const uint8_t *peek_non_root_scalar(const char *type) noexcept; - simdjson_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() 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). @@ -101826,8 +122410,8 @@ class value_iterator { */ simdjson_inline simdjson_result advance_to_value() noexcept; - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - simdjson_inline error_code error_unless_more_tokens(uint32_t tokens=1) const 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; /** @@ -101864,7 +122448,7 @@ class value_iterator { /** @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_inline error_code 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; @@ -101929,13 +122513,14 @@ class value { * * 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 simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -101952,22 +122537,38 @@ class value { * 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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - #if SIMDJSON_SUPPORTS_DESERIALIZATION + #if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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(out.value()); } else { static_assert(!sizeof(T), "The get 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 " @@ -101977,7 +122578,7 @@ class value { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -102095,7 +122696,7 @@ class value { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + 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. @@ -102277,7 +122878,7 @@ class value { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -102616,7 +123217,7 @@ struct simdjson_result : public lsx::implementation_simdjs simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -102650,7 +123251,7 @@ struct simdjson_result : public lsx::implementation_simdjs * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -102697,7 +123298,22 @@ struct simdjson_result : public lsx::implementation_simdjs simdjson_result operator[](int) noexcept = delete; /** - * Get the type of this JSON value. + * 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 @@ -103191,14 +123807,14 @@ class json_iterator { * @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_inline error_code 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; /** * 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_inline error_code optional_error(error_code error, const char *message) noexcept; + 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 @@ -103218,7 +123834,7 @@ class json_iterator { simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - simdjson_inline error_code consume_character(char c) 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; @@ -103309,6 +123925,7 @@ 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, ... } ) @@ -103515,6 +124132,12 @@ class raw_json_string { */ 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, @@ -103654,10 +124277,10 @@ struct simdjson_result : public lsx::implementat simdjson_inline ~simdjson_result() noexcept = default; ///< @private simdjson_inline simdjson_result raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape(lsx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept; }; - } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H @@ -103673,6 +124296,7 @@ struct simdjson_result : public lsx::implementat /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ #include +#include namespace simdjson { namespace lsx { @@ -103791,7 +124415,9 @@ class parser { simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; @@ -103879,6 +124505,11 @@ class parser { * 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 @@ -103886,10 +124517,10 @@ class parser { * using a sanitizer that verifies that no uninitialized byte is read, then you should initialize the * SIMDJSON_PADDING bytes to avoid runtime warnings. * - * ### Threads + * This is checked automatically with all iterate_many function calls, except for the two + * that take pointers (const char* or const uint8_t*). * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * ### Threads * * ### Parser Capacity * @@ -103915,14 +124546,16 @@ class parser { */ inline simdjson_result 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 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe + /** @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 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 iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @private We do not want to allow implicit conversion from C string to std::string. */ simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; @@ -104024,13 +124657,39 @@ class parser { 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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); /** @private [for benchmarking access] The implementation to use */ std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; std::unique_ptr string_buf{}; + #if SIMDJSON_DEVELOPMENT_CHECKS std::unique_ptr start_positions{}; #endif @@ -104058,6 +124717,315 @@ struct simdjson_result : public lsx::implementation_simdj #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 +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(lsx::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::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::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 + 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 + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + 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 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 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + // 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 */ @@ -104170,7 +125138,7 @@ class array { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 @@ -104194,11 +125162,42 @@ class array { * - INDEX_OUT_OF_BOUNDS if the array index is larger than an array length */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** * Go to the end of the array, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; /** * Begin array iteration. @@ -104272,7 +125271,28 @@ struct simdjson_result : public lsx::implementation_simdjs simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -104317,7 +125337,8 @@ class array_iterator { * * Part of the std::iterator interface. */ - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** * Check if we are at the end of the JSON. * @@ -104341,6 +125362,11 @@ class array_iterator { */ 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: value_iterator iter{}; @@ -104359,7 +125385,6 @@ namespace simdjson { template<> struct simdjson_result : public lsx::implementation_simdjson_result_base { -public: 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; @@ -104372,6 +125397,8 @@ struct simdjson_result : public lsx::implementati simdjson_inline bool operator==(const simdjson_result &) const noexcept; simdjson_inline bool operator!=(const simdjson_result &) const noexcept; simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // namespace simdjson @@ -104499,7 +125526,7 @@ class document { * @returns INCORRECT_TYPE if the JSON value is not a string. Otherwise, we return SUCCESS. */ template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; /** * Cast this JSON value to a string. * @@ -104565,7 +125592,7 @@ class document { */ template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -104588,7 +125615,7 @@ class document { */ template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -104606,18 +125633,18 @@ class document { * 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 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -104629,7 +125656,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -104639,7 +125666,7 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ @@ -104704,7 +125731,7 @@ class document { * 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_inline operator std::string_view() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a raw_json_string. * @@ -104713,7 +125740,7 @@ class document { * @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_inline operator raw_json_string() noexcept(false) simdjson_lifetime_bound; /** * Cast this JSON value to a bool. * @@ -104789,7 +125816,7 @@ class document { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -104863,11 +125890,27 @@ class document { * 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). * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 type() noexcept; @@ -105067,7 +126110,7 @@ class document { * JSONPath queries that trivially convertible to JSON Pointer queries: key * names and array indices. * - * https://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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. @@ -105091,11 +126134,41 @@ class document { * the JSON document. */ simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION protected: /** * Consumes the document. */ - simdjson_inline error_code consume() noexcept; + 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; @@ -105148,7 +126221,7 @@ class document_reference { simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -105157,7 +126230,7 @@ class document_reference { simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -105170,7 +126243,7 @@ class document_reference { } template simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -105192,14 +126265,14 @@ class document_reference { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS if constexpr (custom_deserializable) { return deserialize(*this, out); } else { @@ -105211,7 +126284,7 @@ class document_reference { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -105221,12 +126294,17 @@ class document_reference { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ template simdjson_inline error_code get(T &out) && noexcept; simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 @@ -105295,7 +126373,7 @@ struct simdjson_result : public lsx::implementation_sim simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -105308,6 +126386,9 @@ struct simdjson_result : public lsx::implementation_sim template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + + using lsx::implementation_simdjson_result_base::operator*; + using lsx::implementation_simdjson_result_base::operator->; template ::value == false>::type> explicit simdjson_inline operator T() noexcept(false); simdjson_inline operator lsx::ondemand::array() & noexcept(false); @@ -105347,6 +126428,11 @@ struct simdjson_result : public lsx::implementation_sim simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -105373,7 +126459,7 @@ struct simdjson_result : public lsx::implemen simdjson_inline simdjson_result get_double_in_string() noexcept; simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result get_wobbly_string() noexcept; simdjson_inline simdjson_result get_raw_json_string() noexcept; simdjson_inline simdjson_result get_bool() noexcept; @@ -105424,6 +126510,11 @@ struct simdjson_result : public lsx::implemen simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION }; @@ -105516,7 +126607,7 @@ class document_stream { /** * Construct an uninitialized document_stream. * - * ```c++ + * ```cpp * document_stream docs; * auto error = parser.iterate_many(json).get(docs); * ``` @@ -105566,6 +126657,7 @@ class document_stream { * Default constructor. */ simdjson_inline iterator() noexcept; + simdjson_inline iterator(const iterator &other) noexcept = default; /** * Get the current document (or error). */ @@ -105579,6 +126671,7 @@ class document_stream { * @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 * @@ -105622,6 +126715,11 @@ class document_stream { */ 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. */ @@ -105633,6 +126731,7 @@ class document_stream { friend class document_stream; friend class json_iterator; }; + using iterator = document_stream::iterator; /** * Start iterating the documents in the stream. @@ -105896,6 +126995,9 @@ struct simdjson_result : public lsx::implementation_simdjs /* 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): #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 { @@ -105922,7 +127024,7 @@ class object { * 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 }`: * - * ```c++ + * ```cpp * simdjson::ondemand::parser parser; * auto obj = parser.parse(R"( { "x": 1, "y": 2, "z": 3 } )"_padded); * double z = obj.find_field("z"); @@ -106093,11 +127195,71 @@ class object { */ simdjson_inline simdjson_result 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (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_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; @@ -106136,12 +127298,42 @@ struct simdjson_result : public lsx::implementation_simdj simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; - inline simdjson_result reset() noexcept; inline simdjson_result is_empty() noexcept; inline simdjson_result count_fields() & noexcept; inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(out); + } +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // namespace simdjson @@ -106270,6 +127462,20 @@ inline simdjson_result to_json_string(simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result x); inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +inline std::string to_json_string(const T& obj); +#endif + } // namespace simdjson /** @@ -106341,28 +127547,30 @@ inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result #include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif namespace simdjson { -template -constexpr bool require_custom_serialization = false; ////////////////////////////// // Number deserialization ////////////////////////////// template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -106376,7 +127584,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { double x; SIMDJSON_TRY(val.get_double().get(x)); @@ -106385,7 +127592,6 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { } template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { using limits = std::numeric_limits; @@ -106398,8 +127604,23 @@ error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { 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 - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { std::string_view str; SIMDJSON_TRY(val.get_string().get(str)); @@ -106416,7 +127637,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothr * doc.get>(). */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::value_type; static_assert( @@ -106425,9 +127645,13 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { static_assert( std::is_default_constructible_v, "The specified type inside the container must default constructible."); - lsx::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); + if constexpr (std::is_same_v, lsx::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); + } + for (auto v : arr) { if constexpr (concepts::returns_reference) { if (auto const err = v.get().get(concepts::emplace_one(out)); @@ -106458,7 +127682,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * string-keyed types. */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { using value_type = typename std::remove_cvref_t::mapped_type; static_assert( @@ -106484,7 +127707,45 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { return SUCCESS; } +template +error_code tag_invoke(deserialize_tag, lsx::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; + + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); + + lsx::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 +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 +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 +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); +} /** @@ -106502,7 +127763,6 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { * @return status of the conversion */ template - requires(!require_custom_serialization) error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { using element_type = typename std::remove_cvref_t::element_type; @@ -106527,17 +127787,17 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser /** * This CPO (Customization Point Object) will help deserialize into optional types. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); + // 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(); @@ -106546,10 +127806,329 @@ error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deser return SUCCESS; } + +#if SIMDJSON_STATIC_REFLECTION + + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + lsx::ondemand::object obj; + if constexpr (std::is_same_v, lsx::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; +#endif +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} + +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + 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 &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + 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 &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_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 &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_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 &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(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS /* end file simdjson/generic/ondemand/std_deserialize.h for lsx */ // Inline definitions @@ -106642,7 +128221,7 @@ simdjson_inline simdjson_result array::begin() noexcept { simdjson_inline simdjson_result array::end() noexcept { return array_iterator(iter); } -simdjson_inline error_code array::consume() noexcept { +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; @@ -106833,6 +128412,9 @@ simdjson_inline array_iterator &array_iterator::operator++() noexcept { return *this; } +simdjson_inline bool array_iterator::at_end() const noexcept { + return iter.at_end(); +} } // namespace ondemand } // namespace lsx } // namespace simdjson @@ -106869,7 +128451,9 @@ simdjson_inline simdjson_result &simdjson_result< ++(first); return *this; } - +simdjson_inline bool simdjson_result::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // namespace simdjson #endif // SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H @@ -106926,7 +128510,7 @@ simdjson_inline simdjson_result value::get_string(bool allow_r return iter.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 value::get_wobbly_string() noexcept { @@ -106968,15 +128552,15 @@ template<> simdjson_inline simdjson_result value::get() noexcept { retu template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } +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 @@ -107573,7 +129157,7 @@ simdjson_inline simdjson_result document::get_string(bool allo return get_root_value_iterator().get_root_string(true, allow_replacement); } template -simdjson_inline error_code document::get_string(string_type& receiver, bool allow_replacement) noexcept { +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 document::get_wobbly_string() noexcept { @@ -107599,15 +129183,15 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } +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 document::get() && noexcept { return get_raw_json_string(); } template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } @@ -107627,8 +129211,8 @@ simdjson_inline document::operator object() & noexcept(false) { return get_objec 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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { return get_raw_json_string(); } +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(); } @@ -107677,7 +129261,7 @@ simdjson_inline simdjson_result document::operator[](const char *key) & n return start_or_resume_object()[key]; } -simdjson_inline error_code document::consume() noexcept { +simdjson_warn_unused simdjson_inline error_code document::consume() noexcept { bool scalar = false; auto error = is_scalar().get(scalar); if(error) { return error; } @@ -107779,6 +129363,54 @@ simdjson_inline simdjson_result document::at_path(std::string_view json_p } } + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 lsx } // namespace simdjson @@ -107886,7 +129518,7 @@ simdjson_inline simdjson_result simdjson_result -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } @@ -107922,12 +129554,12 @@ simdjson_deprecated simdjson_inline simdjson_result simdjson_result(first).get(); } template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } return std::forward(first).get(out); } @@ -107937,8 +129569,8 @@ template<> simdjson_deprecated simdjson_inline simdjson_result(first); } -template<> simdjson_inline error_code simdjson_result::get(lsx::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(lsx::ondemand::document &out) && noexcept { +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(lsx::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(lsx::ondemand::document &out) && noexcept { if (error()) { return error(); } out = std::forward(first); return SUCCESS; @@ -107984,1416 +129616,2242 @@ simdjson_inline simdjson_result simdjson_result::value == false>::type> simdjson_inline simdjson_result::operator T() noexcept(false) { if (error()) { throw simdjson_error(error()); } - return first; + return first; +} +simdjson_inline simdjson_result::operator lsx::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lsx::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lsx::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lsx::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif + + +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline bool simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); +} + + +simdjson_inline int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} + +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION + +} // namespace simdjson + + +namespace simdjson { +namespace lsx { +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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); +} +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION +} // namespace ondemand +} // namespace lsx +} // namespace simdjson + + + +namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} + + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline error_code simdjson_result::rewind() noexcept { + if (error()) { return error(); } + first.rewind(); + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); +} +template +simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); +} +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(lsx::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + if (error()) { throw simdjson_error(error()); } + return first.get(); } -simdjson_inline simdjson_result::operator lsx::ondemand::array() & noexcept(false) { +simdjson_inline simdjson_result::operator lsx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator lsx::ondemand::object() & noexcept(false) { +simdjson_inline simdjson_result::operator lsx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator double() noexcept(false) { +simdjson_inline simdjson_result::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator lsx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result::operator lsx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { +simdjson_inline simdjson_result::operator bool() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator lsx::ondemand::value() noexcept(false) { +simdjson_inline simdjson_result::operator lsx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif - -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { if (error()) { return error(); } return first.current_location(); } -simdjson_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); -} - - -simdjson_inline int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); -} - -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { if (error()) { return error(); } return first.raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { if (error()) { return error(); } return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } return first.at_path(json_path); } - +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION } // 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 */ +#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 +#include namespace simdjson { namespace lsx { 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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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); } +#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 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 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 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 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 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 simdjson_result document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } +} + +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 document_stream::iterator::operator*() noexcept { + return simdjson_result(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(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(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(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(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(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 lsx } // namespace simdjson - - namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), error) {} - -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); -} -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +simdjson_inline simdjson_result::simdjson_result( + lsx::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 */ +#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 lsx { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); + +simdjson_inline simdjson_result 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 simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } + template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); -} -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); -} -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); -} -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); -} -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); +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; } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); + +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; } -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + + +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); + +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(first.buf), end_quote - first.buf); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { - if (error()) { return error(); } - return std::forward(first).get(out); + +simdjson_inline value &field::value() & noexcept { + return second; } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); + +} // namespace ondemand +} // namespace lsx +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result( + lsx::ondemand::field &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } -template <> -simdjson_inline error_code simdjson_result::get(lsx::ondemand::document_reference &out) & noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.key(); } -template <> -simdjson_inline error_code simdjson_result::get(lsx::ondemand::document_reference &out) && noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.is_negative(); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.is_integer(); + return first.unescaped_key(allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - return first.get_number_type(); + return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - return first.get_number(); -} -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); -} -simdjson_inline simdjson_result::operator lsx::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator lsx::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; -} -simdjson_inline simdjson_result::operator lsx::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + return std::move(first.value()); } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +} // 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 */ +#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 lsx { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result::operator lsx::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +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; } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +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 } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +#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 -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +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; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); +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 first.at_path(json_path); + return count == 0; } -} // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H +// 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 -/* 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 */ + // 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; + } -#include -#include + // 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; + } + } -namespace simdjson { -namespace lsx { -namespace ondemand { + return report_error(TAPE_ERROR, "not enough close braces"); +} -#ifdef SIMDJSON_THREADS_ENABLED +SIMDJSON_POP_DISABLE_WARNINGS -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -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(); +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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 } -#endif // SIMDJSON_THREADS_ENABLED +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); +} -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; - } +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -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 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]; } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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 size_t document_stream::size_in_bytes() const noexcept { - return len; +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } + } + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -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 bool json_iterator::is_alive() const noexcept { + return parser; } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +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 simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -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 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 bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +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 document_stream::iterator document_stream::begin() noexcept { - start(); - // If there are no documents, we're finished. - return iterator(this, error == EMPTY); +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 document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +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); } -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; +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()); +} - #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 +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; } -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]; +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; +} - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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. - */ +simdjson_inline depth_t json_iterator::depth() const noexcept { + return _depth; +} - if (error) { continue; } // If the error was EMPTY, we may want to load another batch. - doc_index = batch_start; - } - } +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -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) { doc.iter.consume_character(','); } - // 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(); +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; } -inline size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; +simdjson_inline token_position json_iterator::position() const noexcept { + return token.position(); } -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 simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); +#endif } -simdjson_inline size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif } -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(); +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; +} - // 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(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++; +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; +} - while (cur_struct_index <= static_cast(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++; - } +#if SIMDJSON_DEVELOPMENT_CHECKS - return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; +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; } -inline error_code document_stream::iterator::error() const noexcept { - return stream->error; +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; } } -#ifdef SIMDJSON_THREADS_ENABLED +#endif -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(); - } +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; } -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); +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; } -#endif // SIMDJSON_THREADS_ENABLED - } // namespace ondemand } // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result::simdjson_result( - lsx::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} +} // namespace simdjson -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_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): #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/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): #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 lsx { 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() {} - -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ +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; } -simdjson_inline simdjson_result 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); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } +#endif -simdjson_inline simdjson_result 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 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; -} -template -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 number_type number::get_number_type() const noexcept { + return type; } -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 bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } - -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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -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(first.buf), end_quote - first.buf); +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); } -simdjson_inline value &field::value() & noexcept { - return second; +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; } -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; } -} // namespace ondemand -} // namespace lsx -} // namespace simdjson - -namespace simdjson { +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); +} -simdjson_inline simdjson_result::simdjson_result( - lsx::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ + +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; } -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +simdjson_inline number::operator double() const noexcept { + return get_double(); } -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +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 simdjson_result simdjson_result::escaped_key() noexcept { - if (error()) { return error(); } - return first.escaped_key(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; } -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -template -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +simdjson_inline void number::append_double(double value) noexcept { + payload.floating_point_number = value; + type = number_type::floating_point_number; } -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +simdjson_inline void number::skip_double() noexcept { + type = number_type::floating_point_number; } +} // namespace ondemand +} // namespace lsx +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #include "simdjson/generic/ondemand/value_iterator.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#include +#include + namespace simdjson { namespace lsx { namespace ondemand { +namespace logger { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(other.token)), - parser{other.parser}, - _string_buf_loc{other._string_buf_loc}, - error{other.error}, - _depth{other._depth}, - _root{other._root}, - _streaming{other._streaming} +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 +static inline std::string string_format(const std::string& format, const Args&... args) { - other.parser = nullptr; + SIMDJSON_PUSH_DISABLE_ALL_WARNINGS + int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; + auto size = static_cast(size_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -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; + +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; } -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} +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) { - logger::log_headers(); -#if SIMDJSON_CHECK_EOF - assert_more_tokens(); -#endif + return level >= log_threshold(); } -#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} +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); +} -{ - logger::log_headers(); -#if SIMDJSON_CHECK_EOF - assert_more_tokens(); -#endif +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); } -#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 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 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; +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); +} -// 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 +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); +} - // 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!!! +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; } - 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; + 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); + } } +} - // 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; +template +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)...); +} + +template +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)...); + 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); } } - - return report_error(TAPE_ERROR, "not enough close braces"); } -SIMDJSON_POP_DISABLE_WARNINGS +} // namespace logger +} // namespace ondemand +} // namespace lsx +} // namespace simdjson -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; -} +/* 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): #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 */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +namespace simdjson { +namespace lsx { +namespace ondemand { + +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); +} +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); } -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); +} +simdjson_inline simdjson_result 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 void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +simdjson_inline simdjson_result 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 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]; +simdjson_inline simdjson_result object::end() noexcept { + return object_iterator(iter); } -inline std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 child; -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } + // 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 (at_end()) { - return OUT_OF_BOUNDS; + if(child.error()) { + return child; // we do not continue if there was an error } - return reinterpret_cast(token.peek()); + // 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; } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +inline simdjson_result 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); } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_result 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 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 simdjson_result 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 const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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); -} +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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); -} +template + requires(std::is_class_v && (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) || ...); + }; -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); + // 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) { + // 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; } -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); +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +} // namespace ondemand +} // namespace lsx +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); } -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 simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); } - -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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { - return token.peek(last_position()); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); } - -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 simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -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 simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; } - -simdjson_inline depth_t json_iterator::depth() const noexcept { - return _depth; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } - -simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -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 simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline token_position json_iterator::position() const noexcept { - return token.position(); +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -simdjson_inline simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); } -simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape_wobbly(in, _string_buf_loc); -#endif +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -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_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } -simdjson_inline error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; - } - return TAPE_ERROR; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#if SIMDJSON_DEVELOPMENT_CHECKS +} // namespace simdjson -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; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H -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; } -} +/* 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 */ -#endif +namespace simdjson { +namespace lsx { +namespace ondemand { + +// +// object_iterator +// +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} -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_inline simdjson_result object_iterator::operator*() noexcept { + 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 { + // 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_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; + 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 lsx @@ -109401,738 +131859,824 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result( + lsx::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ +} + +simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/implementation_simdjson_result_base-inl.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 lsx { 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; +simdjson_inline parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { - return out << type.value(); +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 parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } + json.remove_utf8_bom(); -simdjson_inline number_type number::get_number_type() const noexcept { - return type; + // 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(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; + } + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +inline simdjson_result 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(is_int64()) { - return double(payload.signed_integer); + if(allow_comma_separated && batch_size < len) { batch_size = len; } + return document_stream(*this, buf, len, batch_size, allow_comma_separated); +} + +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); +} +inline simdjson_result 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 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 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 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; } - 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 simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +simdjson_inline simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +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& parser::get_parser_instance() { + std::unique_ptr& 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& 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 parser_instance = nullptr; + return parser_instance; } + } // namespace ondemand } // namespace lsx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_INL_H +#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 */ +#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_LOGGER_INL_H */ +/* 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/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): #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 */ -#include -#include - namespace simdjson { + namespace lsx { 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 -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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(); -} +simdjson_inline raw_json_string::raw_json_string(const uint8_t * _buf) noexcept : buf{_buf} {} -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); +simdjson_inline const char * raw_json_string::raw() const noexcept { + return reinterpret_cast(buf); } -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); +simdjson_inline char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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++; } +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; } -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); +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; } -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); +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()); } -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); +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; } -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); +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; } -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); +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; } -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); +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; } -template -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)...); +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); } -template -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)...); - 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); +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 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 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 logger } // namespace ondemand } // namespace lsx } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} + +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(lsx::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 simdjson_result::unescape_wobbly(lsx::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_OBJECT_INL_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/field.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/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/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 { -namespace lsx { -namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); +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)); } -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); -} -simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); -} -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 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(starting_point), size_t(final_point - starting_point)); +inline simdjson_result 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); } -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +inline simdjson_result 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); } -simdjson_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +inline simdjson_result 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()); + } } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +inline simdjson_result 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); } -simdjson_inline simdjson_result 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::end() noexcept { - return object_iterator(iter); +inline simdjson_result 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 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 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 to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -inline simdjson_result 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 to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result 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; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_object(); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } - -} // namespace ondemand -} // namespace lsx } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +namespace simdjson { namespace lsx { namespace ondemand { -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); +#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); + } } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; +#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); + } } -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; +#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); + } } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); +#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 -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +#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); + } } - -simdjson_inline simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return 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); } - return first.at_path(json_path); } - -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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 -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); +#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); + } } - -simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { - if (error()) { return error(); } - return first.raw_json(); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } -} // namespace simdjson +#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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_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): #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/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): #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 lsx { namespace ondemand { -// -// object_iterator -// +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} +{ +} -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); +} -simdjson_inline simdjson_result object_iterator::operator*() noexcept { - 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 const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -simdjson_inline bool object_iterator::operator==(const object_iterator &other) const noexcept { - return !(*this != other); + +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -simdjson_inline bool object_iterator::operator!=(const object_iterator &) const noexcept { - return iter.is_open(); +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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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_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_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; +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_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. -// +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 lsx @@ -110140,1895 +132684,3150 @@ SIMDJSON_POP_DISABLE_WARNINGS namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - lsx::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ -} - -simdjson_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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 simdjson_result::simdjson_result(lsx::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_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): #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/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): #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 lsx { namespace ondemand { -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { +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 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; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); +} - // 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]); +simdjson_warn_unused simdjson_inline simdjson_result 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 value_iterator::started_object() noexcept { + assert_at_container_start(); #if SIMDJSON_DEVELOPMENT_CHECKS - start_positions.reset(new (std::nothrow) token_position[new_max_depth]); + _json_iter->set_start_position(_depth, start_position()); #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) ); + 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"); + } } - _capacity = new_capacity; - _max_depth = new_max_depth; return SUCCESS; } + +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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 -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()); + // 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 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 -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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; } - json.remove_utf8_bom(); + // 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; + } - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + // 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; } - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); -} - -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } + // 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 - json.remove_utf8_bom(); + // 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); - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } + // 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; + } - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; + // 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. } - return document::start({ reinterpret_cast(json.data()), this, true }); + // If the loop ended, we're out of fields to look at. The program should + // never reach this point. + return false; } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_warn_unused simdjson_inline simdjson_result 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 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 simdjson_result 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 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 parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); - } - return iterate(padded_string_view(json)); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); +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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception - SIMDJSON_TRY( result.error() ); - const padded_string &json = result.value_unsafe(); - return iterate(json); +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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { + auto error = check_root_array(); + if (error) { return error; } + return started_array(); +} - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Allocate if needed - if (capacity() < json.length()) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); + 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"); } +} - // Run stage 1. - SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); +} +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_warn_unused simdjson_inline simdjson_result 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_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_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; +simdjson_warn_unused simdjson_inline simdjson_result 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; } - -} // namespace ondemand -} // namespace lsx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 lsx { -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(buf); } - - -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_warn_unused simdjson_inline simdjson_result 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 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 simdjson_result 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 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 value_iterator::is_negative() noexcept { + return numberparsing::is_negative(peek_non_root_scalar("numbersign")); } - -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 value_iterator::is_root_negative() noexcept { + return numberparsing::is_negative(peek_root_scalar("numbersign")); } - -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 simdjson_result value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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. } - if(r[pos] != '"') { return false; } - return true; + 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 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; +simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + auto answer = numberparsing::get_number_type(tmpbuf); + if (check_trailing && (answer.error() == SUCCESS) && !_json_iter->is_single_token()) { return TRAILING_CONTENT; } + return answer; } - -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); +simdjson_inline simdjson_result 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.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_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; +simdjson_warn_unused simdjson_inline simdjson_result 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); } - -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +template +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } - -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { + return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); } - - -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_warn_unused simdjson_inline simdjson_result 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_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +simdjson_warn_unused simdjson_inline simdjson_result 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_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++; +simdjson_warn_unused simdjson_inline simdjson_result 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 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; + } -} // namespace ondemand -} // namespace lsx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -simdjson_inline simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); -} -simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::unescape(lsx::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 simdjson_result::unescape_wobbly(lsx::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); + 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; } -} // 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { +simdjson_warn_unused simdjson_inline simdjson_result 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; + } -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)); + 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 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.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; } - -inline simdjson_result 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); +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } -inline simdjson_result 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); +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result 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()); +simdjson_inline simdjson_result 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; } -inline simdjson_result 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); -} +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 ); -inline simdjson_result 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); + return _json_iter->skip_child(depth()); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +// 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 -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline bool value_iterator::at_end() const noexcept { + return _json_iter->at_end(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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; } -} // 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 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); - } +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -#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); - } +simdjson_warn_unused simdjson_inline depth_t value_iterator::depth() const noexcept { + return _depth; } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_warn_unused simdjson_inline error_code value_iterator::error() const noexcept { + return _json_iter->error; } -#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); - } +simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { + return _json_iter->string_buf_loc(); } -#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); - } +simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { + return *_json_iter; } -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); - } +simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { + return *_json_iter; } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); + +simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { + return _json_iter->peek(start_position()); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); +simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { + return _json_iter->peek_length(start_position()); } -#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); - } +simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { + return _json_iter->peek_root_length(start_position()); } -#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); - } +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(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.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); } -#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); + +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 { - return (out << error); + 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(); } -} -#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 */ -#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 lsx { -namespace ondemand { -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{position} -{ + return SUCCESS; } -simdjson_inline uint32_t token_iterator::current_offset() const noexcept { - return *(_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(); } -simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_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 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; + assert_at_non_root_start(); + return _json_iter->peek(); } -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 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 token_position token_iterator::position() const noexcept { - return _position; -} -simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { - _position = target_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 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; + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._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 bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._position; + +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -} // namespace ondemand -} // namespace lsx -} // namespace simdjson +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() == '"'; +} -namespace simdjson { +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 simdjson_result::simdjson_result(lsx::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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 ); +} -} // namespace simdjson +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 ); +} -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +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 ); +} -/* 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 */ +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); +} -namespace simdjson { -namespace lsx { -namespace ondemand { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -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_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); +simdjson_inline simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); return started_object(); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_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 ); } -simdjson_warn_unused simdjson_inline simdjson_result 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(); - end_container(); - return false; - } - return true; +inline void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -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; +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -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_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline simdjson_result 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 report_error(TAPE_ERROR, "Missing comma between object fields"); + return json_type::unknown; } } -simdjson_warn_unused simdjson_inline simdjson_result 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; +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; +} - // - // 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; +simdjson_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); +} - // 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; - } +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); +} - // 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; } - } +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); +} - // If the loop ended, we're out of fields to look at. - return false; +simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_warn_unused simdjson_inline simdjson_result 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; +} // namespace ondemand +} // namespace lsx +} // namespace simdjson - // 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(); +namespace simdjson { - // 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; +simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} - // 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()) { +} // namespace simdjson -#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 - } +#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H +/* end file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ - // 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 +// 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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_INL_H - // 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; } +/* 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 */ - // 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; - } +/* + * 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. + */ - // 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 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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif - // 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 +namespace simdjson { +namespace lsx { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; - // 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. +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(c)]) { 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 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); +#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(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(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_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { - assert_at_next(); +SIMDJSON_CONSTEXPR_LAMBDA inline size_t +find_next_json_quotable_character(const std::string_view view, + size_t location) noexcept { - 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; + for (auto pos = view.begin() + location; pos != view.end(); ++pos) { + if (json_quotable_character[static_cast(*pos)]) { + return pos - view.begin(); + } + } + return size_t(view.size()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); -} +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"}; -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +// 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; } -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_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_warn_unused simdjson_inline simdjson_result 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() ); +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; } - _json_iter->descend_to(depth()+1); -#if SIMDJSON_DEVELOPMENT_CHECKS - _json_iter->set_start_position(_depth, start_position()); -#endif - return true; + // 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_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"); - } +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; } - return SUCCESS; + std::unique_ptr 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_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +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_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { - assert_at_next(); +simdjson_inline size_t string_builder::size() const noexcept { + return position; +} - 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_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; } } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); -} -simdjson_warn_unused simdjson_inline simdjson_result 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_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 value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); +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; + } } -template -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +namespace internal { + +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); + +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 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_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 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_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 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_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 simdjson_result 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; +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); } -simdjson_warn_unused simdjson_inline simdjson_result 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; +#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 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_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 simdjson_result 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_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 simdjson_result 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; +#if SIMDJSON_SUPPORTS_CONCEPTS +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } } -simdjson_inline simdjson_result 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; + +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); +#endif + +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + 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(); + } } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); + +#endif + +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); } -simdjson_inline simdjson_result 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; +#endif + +simdjson_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; + } + return std::string_view(buffer.get(), position); } -simdjson_inline simdjson_result 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. +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); } - 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; + return simdjson::OUT_OF_CAPACITY; } -simdjson_inline simdjson_result 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.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; +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++] = '{'; } - 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 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.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; + +simdjson_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } - 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 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); + +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; + } } -template -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; + +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_root_wobbly_string(bool check_trailing) noexcept { - return get_root_raw_json_string(check_trailing).unescape_wobbly(json_iter()); + +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); } - 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"); + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); } - 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"); + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + else { + append(value); } +} - 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"); +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); } - - 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_convertible::value) { + escape_and_append_with_quotes(value); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); } - 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"); + else { + append(value); } - return result; } +#endif -simdjson_warn_unused simdjson_inline simdjson_result 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.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; +} // namespace builder +} // namespace lsx +} // namespace simdjson + +#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 + +/* 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 +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet + +namespace simdjson { +namespace lsx { +namespace builder { + +template + requires(concepts::container_but_not_string && !require_custom_serialization) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; } - 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"); + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); } - return result; + b.append(']'); } -simdjson_warn_unused simdjson_inline simdjson_result 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; +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); } -simdjson_inline simdjson_result 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"); +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &m) { + if (m.empty()) { + b.append_raw("{}"); + return; } - return result; + 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_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()); +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -// 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(); +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); +#endif } -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; +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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 void value_iterator::abandon() noexcept { - _json_iter->abandon(); +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -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; +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline uint8_t *&value_iterator::string_buf_loc() noexcept { - return _json_iter->string_buf_loc(); + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline const json_iterator &value_iterator::json_iter() const noexcept { - return *_json_iter; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline json_iterator &value_iterator::json_iter() noexcept { - return *_json_iter; + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_inline const uint8_t *value_iterator::peek_start() const noexcept { - return _json_iter->peek(start_position()); +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_inline uint32_t value_iterator::peek_start_length() const noexcept { - return _json_iter->peek_length(start_position()); + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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 uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -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 +simdjson_warn_unused simdjson_result 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); } -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); +template +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; } -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(); - } +template +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 + requires(std::is_class_v && (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) || ...); + }; - return SUCCESS; -} + 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()))) { -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(); } + if constexpr (std::meta::is_public(mem)) { + constexpr std::string_view key = std::define_static_string(std::meta::identifier_of(mem)); - 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(); } + // Only serialize this field if it's in our list of requested fields + if constexpr (should_extract(key)) { + if (!first) { + b.append(','); + } + first = false; - assert_at_non_root_start(); - return _json_iter->peek(); -} + // 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(':'); -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; } + // Serialize the value + atom(b, obj.[:mem:]); + } + } + }; - assert_at_root(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); + b.append('}'); } -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); +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -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; +} // namespace builder +} // namespace lsx +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } - -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -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() == '"'; -} +} // namespace simdjson -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 // SIMDJSON_STATIC_REFLECTION -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 +/* end file simdjson/generic/ondemand/json_builder.h for lsx */ -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 ); -} +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 -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 ); -} +/* 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 */ -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} +// 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 -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} +#include +#include +#include -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} +namespace simdjson { +namespace lsx { +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 { -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); +// 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; + +// 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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -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 ); +// Helper to create array index step +consteval auto make_index_step(std::size_t idx) { + return path_step<1>(step_type::array_index, "", idx); } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); +// 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 +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 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 +struct path_accessor { + using value = ::simdjson::lsx::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); + } + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(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 + static consteval std::enable_if_t, 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 + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(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 + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(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(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 + 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 + 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 + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; + } + + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + 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 +inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::lsx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ + +// JSON Pointer parser: /field/0/nested (slash-separated) +template +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 +struct pointer_accessor { + using parser = json_pointer_parser; + 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) { + 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::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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 + static inline simdjson_result access_impl(simdjson_result 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } + + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + 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 current = doc_or_val.get_value(); + return access_impl<0>(current); + } + + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + 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 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::lsx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace lsx } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lsx::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for lsx */ +#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/amalgamated.h for lsx */ /* including simdjson/lsx/end.h: #include "simdjson/lsx/end.h" */ @@ -112457,881 +136256,1964 @@ namespace simd { ); } - // Order-sensitive comparisons - simdjson_inline simd8 max_val(const simd8 other) const { return __lasx_xvmax_b(*this, other); } - simdjson_inline simd8 min_val(const simd8 other) const { return __lasx_xvmin_b(*this, other); } - simdjson_inline simd8 operator>(const simd8 other) const { return __lasx_xvslt_b(other, *this); } - simdjson_inline simd8 operator<(const simd8 other) const { return __lasx_xvslt_b(*this, other); } - }; + // Order-sensitive comparisons + simdjson_inline simd8 max_val(const simd8 other) const { return __lasx_xvmax_b(*this, other); } + simdjson_inline simd8 min_val(const simd8 other) const { return __lasx_xvmin_b(*this, other); } + simdjson_inline simd8 operator>(const simd8 other) const { return __lasx_xvslt_b(other, *this); } + simdjson_inline simd8 operator<(const simd8 other) const { return __lasx_xvslt_b(*this, other); } + }; + + // Unsigned bytes + template<> + struct simd8: base8_numeric { + simdjson_inline simd8() : base8_numeric() {} + simdjson_inline simd8(const __m256i _value) : base8_numeric(_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 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( + 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 saturating_add(const simd8 other) const { return __lasx_xvsadd_bu(*this, other); } + simdjson_inline simd8 saturating_sub(const simd8 other) const { return __lasx_xvssub_bu(*this, other); } + + // Order-specific operations + simdjson_inline simd8 max_val(const simd8 other) const { return __lasx_xvmax_bu(*this, other); } + simdjson_inline simd8 min_val(const simd8 other) const { return __lasx_xvmin_bu(other, *this); } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); } + simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; } + simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; } + simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); } + simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); } + + // Bit-specific operations + simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); } + simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); } + simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); } + simdjson_inline simd8 any_bits_set(simd8 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 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 bits) const { return !bits_not_set_anywhere(bits); } + template + simdjson_inline simd8 shr() const { return simd8(__lasx_xvsrli_b(*this, N)); } + template + simdjson_inline simd8 shl() const { return simd8(__lasx_xvslli_b(*this, N)); } + }; + + template + struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8); + static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); + const simd8 chunks[NUM_CHUNKS]; + + simd8x64(const simd8x64& o) = delete; // no copy allowed + simd8x64& operator=(const simd8& other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {} + simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::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)*0); + this->chunks[1].store(ptr+sizeof(simd8)*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 reduce_or() const { + return this->chunks[0] | this->chunks[1]; + } + + simdjson_inline uint64_t eq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64( + this->chunks[0] == mask, + this->chunks[1] == mask + ).to_bitmask(); + } + + simdjson_inline uint64_t eq(const simd8x64 &other) const { + return simd8x64( + 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 mask = simd8::splat(m); + return simd8x64( + this->chunks[0] <= mask, + this->chunks[1] <= mask + ).to_bitmask(); + } + }; // struct simd8x64 + +} // 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 v(src); + v.store(dst); + return { + static_cast((v == '\\').to_bitmask()), // bs_bits + static_cast((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 v(src); + v.store(dst); + simd8 is_quote = (v == '"'); + simd8 is_backslash = (v == '\\'); + simd8 is_control = (v < 32); + return { + (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/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) +#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 */ +#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 lasx { +/** + * 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::lasx::number_type */ +using number_type = simdjson::lasx::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 lasx +} // 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 */ +#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 struct is_builtin_deserializable : std::false_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; +template <> struct is_builtin_deserializable : std::true_type {}; + +template +concept is_builtin_deserializable_v = is_builtin_deserializable::value; + +template +concept custom_deserializable = tag_invocable; + +template +concept deserializable = custom_deserializable || is_builtin_deserializable_v || concepts::optional_type; + +template +concept nothrow_custom_deserializable = nothrow_tag_invocable; + +// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. +template +concept nothrow_deserializable = nothrow_custom_deserializable || is_builtin_deserializable_v; + +/// 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; + + // Customization Point for array + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(array_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for object + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(object_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for value + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + return tag_invoke(*this, object, output); + } + + // Customization Point for document reference + template + requires custom_deserializable + simdjson_warn_unused constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { + 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 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 */ +/* 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 lasx { +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 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. + * + * @{ + */ - // Unsigned bytes - template<> - struct simd8: base8_numeric { - simdjson_inline simd8() : base8_numeric() {} - simdjson_inline simd8(const __m256i _value) : base8_numeric(_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 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( - 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 - ); - } + /** + * 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 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 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 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 started_root_object() noexcept; - // Saturated math - simdjson_inline simd8 saturating_add(const simd8 other) const { return __lasx_xvsadd_bu(*this, other); } - simdjson_inline simd8 saturating_sub(const simd8 other) const { return __lasx_xvssub_bu(*this, other); } + /** + * 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 has_next_field() noexcept; - // Order-specific operations - simdjson_inline simd8 max_val(const simd8 other) const { return __lasx_xvmax_bu(*this, other); } - simdjson_inline simd8 min_val(const simd8 other) const { return __lasx_xvmin_bu(other, *this); } - // Same as >, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8 gt_bits(const simd8 other) const { return this->saturating_sub(other); } - // Same as <, but only guarantees true is nonzero (< guarantees true = -1) - simdjson_inline simd8 lt_bits(const simd8 other) const { return other.saturating_sub(*this); } - simdjson_inline simd8 operator<=(const simd8 other) const { return other.max_val(*this) == other; } - simdjson_inline simd8 operator>=(const simd8 other) const { return other.min_val(*this) == other; } - simdjson_inline simd8 operator>(const simd8 other) const { return this->gt_bits(other).any_bits_set(); } - simdjson_inline simd8 operator<(const simd8 other) const { return this->lt_bits(other).any_bits_set(); } + /** + * Get the current field's key. + */ + simdjson_warn_unused simdjson_inline simdjson_result field_key() noexcept; - // Bit-specific operations - simdjson_inline simd8 bits_not_set() const { return *this == uint8_t(0); } - simdjson_inline simd8 bits_not_set(simd8 bits) const { return (*this & bits).bits_not_set(); } - simdjson_inline simd8 any_bits_set() const { return ~this->bits_not_set(); } - simdjson_inline simd8 any_bits_set(simd8 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 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 bits) const { return !bits_not_set_anywhere(bits); } - template - simdjson_inline simd8 shr() const { return simd8(__lasx_xvsrli_b(*this, N)); } - template - simdjson_inline simd8 shl() const { return simd8(__lasx_xvslli_b(*this, N)); } - }; + /** + * Pass the : in the field and move to its value. + */ + simdjson_warn_unused simdjson_inline error_code field_value() noexcept; - template - struct simd8x64 { - static constexpr int NUM_CHUNKS = 64 / sizeof(simd8); - static_assert(NUM_CHUNKS == 2, "LASX kernel should use two registers per 64-byte block."); - const simd8 chunks[NUM_CHUNKS]; + /** + * 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; - simd8x64(const simd8x64& o) = delete; // no copy allowed - simd8x64& operator=(const simd8& other) = delete; // no assignment allowed - simd8x64() = delete; // no default constructor allowed + /** + * 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 find_field_raw(const std::string_view key) noexcept; - simdjson_inline simd8x64(const simd8 chunk0, const simd8 chunk1) : chunks{chunk0, chunk1} {} - simdjson_inline simd8x64(const T ptr[64]) : chunks{simd8::load(ptr), simd8::load(ptr+32)} {} + /** + * 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 find_field_unordered_raw(const std::string_view key) noexcept; - 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)*0); - this->chunks[1].store(ptr+sizeof(simd8)*1); - } + /** + * @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. + * @{ + */ - 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); - } + /** + * 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 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 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 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 started_root_array() noexcept; - simdjson_inline simd8 reduce_or() const { - return this->chunks[0] | this->chunks[1]; - } + /** + * 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 has_next_element() noexcept; - simdjson_inline uint64_t eq(const T m) const { - const simd8 mask = simd8::splat(m); - return simd8x64( - this->chunks[0] == mask, - this->chunks[1] == mask - ).to_bitmask(); - } + /** + * Get a child value iterator. + */ + simdjson_warn_unused simdjson_inline value_iterator child() const noexcept; - simdjson_inline uint64_t eq(const simd8x64 &other) const { - return simd8x64( - 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 mask = simd8::splat(m); - return simd8x64( - this->chunks[0] <= mask, - this->chunks[1] <= mask - ).to_bitmask(); - } - }; // struct simd8x64 + /** + * @defgroup scalar Scalar values + * @addtogroup scalar + * @{ + */ -} // namespace simd -} // unnamed namespace -} // namespace lasx -} // namespace simdjson + simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept; + simdjson_warn_unused simdjson_inline bool is_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; -#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 + simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept; + template + 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 get_root_wobbly_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; + simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; -/* 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 */ + 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; -namespace simdjson { -namespace lasx { -namespace { + simdjson_inline void assert_is_valid() const noexcept; + simdjson_inline bool is_valid() const noexcept; -using namespace simd; + /** @} */ +protected: + /** + * Restarts an array iteration. + * @returns Whether the array has any elements (returns false for empty). + */ + simdjson_inline simdjson_result reset_array() noexcept; + /** + * Restarts an object iteration. + * @returns Whether the object has any fields (returns false for empty). + */ + simdjson_inline simdjson_result 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; -// Holds backslashes and quotes locations. -struct backslash_and_quote { -public: - static constexpr uint32_t BYTES_PROCESSED = 32; - simdjson_inline static backslash_and_quote copy_and_find(const uint8_t *src, uint8_t *dst); + /** + * 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 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 simdjson_result parse_null(const uint8_t *json) const noexcept; + simdjson_inline simdjson_result 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; - uint32_t bs_bits; - uint32_t quote_bits; -}; // struct backslash_and_quote + /** + * 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 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 v(src); - v.store(dst); - return { - static_cast((v == '\\').to_bitmask()), // bs_bits - static_cast((v == '"').to_bitmask()), // quote_bits - }; -} + 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; -} // unnamed namespace -} // namespace lasx -} // namespace simdjson + 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; -#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/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) -#error simdjson/generic/ondemand/dependencies.h must be included before simdjson/generic/ondemand/amalgamated.h! -#endif + 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; -// 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_BASE_H + /** + * 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 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; -/* 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 */ + 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; -namespace simdjson { -namespace lasx { -/** - * A fast, simple, DOM-like interface that parses JSON as you use it. - * - * Designed for maximum speed and a lower memory profile. - */ -namespace ondemand { + /** + * 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; -/** Represents the depth of a JSON value (number of nested arrays/objects). */ -using depth_t = int32_t; + 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; -/** @copydoc simdjson::lasx::number_type */ -using number_type = simdjson::lasx::number_type; + /** Get the starting position of this value */ + simdjson_inline token_position start_position() const noexcept; -/** @private Position in the JSON buffer indexes */ -using token_position = const uint32_t *; + /** @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; -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; + friend class document; + friend class object; + friend class array; + friend class value; + friend class field; +}; // value_iterator } // namespace ondemand } // namespace lasx } // 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 */ -#if SIMDJSON_SUPPORTS_DESERIALIZATION - -#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 */ - -#include namespace simdjson { -namespace tag_invoke_fn_ns { -void tag_invoke(); - -struct tag_invoke_fn { - template - requires requires(Tag tag, Args &&...args) { - tag_invoke(std::forward(tag), std::forward(args)...); - } - constexpr auto operator()(Tag tag, Args &&...args) const - noexcept(noexcept(tag_invoke(std::forward(tag), - std::forward(args)...))) - -> decltype(tag_invoke(std::forward(tag), - std::forward(args)...)) { - return tag_invoke(std::forward(tag), std::forward(args)...); - } +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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; }; -} // namespace tag_invoke_fn_ns - -inline namespace tag_invoke_ns { -inline constexpr tag_invoke_fn_ns::tag_invoke_fn tag_invoke = {}; -} // namespace tag_invoke_ns -template -concept tag_invocable = requires(Tag tag, Args... args) { - tag_invoke(std::forward(tag), std::forward(args)...); -}; +} // namespace simdjson -template -concept nothrow_tag_invocable = - tag_invocable && requires(Tag tag, Args... args) { - { - tag_invoke(std::forward(tag), std::forward(args)...) - } noexcept; - }; +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H -template -using tag_invoke_result = - std::invoke_result; +/* 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -template -using tag_invoke_result_t = - std::invoke_result_t; +#include -template using tag_t = std::decay_t; +namespace simdjson { +namespace lasx { +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; -struct deserialize_tag; + /** + * 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 + simdjson_inline simdjson_result get() +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } -/// These types are deserializable in a built-in way -template struct is_builtin_deserializable : std::false_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template <> struct is_builtin_deserializable : std::true_type {}; -template -concept is_builtin_deserializable_v = is_builtin_deserializable::value; + /** + * 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + #if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { + return deserialize(*this, out); + } else if constexpr (concepts::optional_type) { + using value_type = typename std::remove_cvref_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; + } -template -concept custom_deserializable = tag_invocable; + if (!out) { + out.emplace(); + } + return get(out.value()); + } else { + static_assert(!sizeof(T), "The get 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 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(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(out); // to get rid of unused errors + return UNINITIALIZED; +#endif + } -template -concept deserializable = custom_deserializable || is_builtin_deserializable_v; + /** + * 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 get_array() noexcept; -template -concept nothrow_custom_deserializable = nothrow_tag_invocable; + /** + * 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 get_object() noexcept; -// built-in types are noexcept and if an error happens, the value simply gets ignored and the error is returned. -template -concept nothrow_deserializable = nothrow_custom_deserializable || is_builtin_deserializable_v; + /** + * 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 get_uint64() noexcept; -/// Deserialize Tag -inline constexpr struct deserialize_tag { - using value_type = lasx::ondemand::value; - using document_type = lasx::ondemand::document; - using document_reference_type = lasx::ondemand::document_reference; + /** + * 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 get_uint64_in_string() noexcept; - // Customization Point for value - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(value_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); - } + /** + * 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 get_int64() noexcept; - // Customization Point for document - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); - } + /** + * 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 get_int64_in_string() noexcept; - // Customization Point for document reference - template - requires custom_deserializable - [[nodiscard]] constexpr /* error_code */ auto operator()(document_reference_type &object, T& output) const noexcept(nothrow_custom_deserializable) { - return tag_invoke(*this, object, output); - } + /** + * 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 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 get_double_in_string() noexcept; -} deserialize{}; + /** + * Cast this JSON value to a string. + * + * The string is guaranteed to be valid UTF-8. + * + * Equivalent to get(). + * + * 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 get_string(bool allow_replacement = false) noexcept; -} // namespace simdjson + /** + * 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 + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; -#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION + /** + * 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 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 get_raw_json_string() noexcept; -/* 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 + /** + * 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 get_bool() noexcept; -/* 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 */ + /** + * 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 is_null() noexcept; -namespace simdjson { -namespace lasx { -namespace ondemand { +#if SIMDJSON_EXCEPTIONS + /** + * Cast this JSON value to an instance of type T. The programmer is responsible for + * providing an implementation of get 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 + 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(). + * + * @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 -/** - * 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 + * Begin array iteration. + * + * Part of the std::iterable interface. + * + * @returns INCORRECT_TYPE If the JSON value is not an array. + */ + simdjson_inline simdjson_result begin() & noexcept; + /** + * Sentinel representing the end of the array. + * + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result 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 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 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 */ - token_position _start_position{}; + simdjson_inline simdjson_result at(size_t index) noexcept; + /** + * Look up a field by name on an object (order-sensitive). + * + * 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. -public: - simdjson_inline value_iterator() noexcept = default; + * **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 find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field(const char *key) noexcept; /** - * Denote that we're starting a document. + * 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. + * + * It is the default, however, 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 void start_document() noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) noexcept; + simdjson_result operator[](int) noexcept = delete; /** - * Skips a non-iterated or partially-iterated JSON value, whether it is a scalar, array or object. + * 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. * - * Optimized for scalars. + * 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_warn_unused simdjson_inline error_code skip_child() noexcept; + simdjson_inline simdjson_result type() noexcept; /** - * Tell whether the iterator is at the EOF mark + * 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 bool at_end() const noexcept; - + simdjson_inline simdjson_result is_scalar() noexcept; /** - * Tell whether the iterator is at the start of the value + * 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 bool at_start() const noexcept; + simdjson_inline simdjson_result is_string() noexcept; /** - * Tell whether the value is open--if the value has not been used, or the array/object is still open. + * Checks whether the value is a negative number. + * + * @returns true if the number if negative. */ - simdjson_inline bool is_open() const noexcept; + 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 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 get_number_type() noexcept; /** - * Tell whether the value is at an object's first field (just after the {). + * 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_inline bool at_first_field() const noexcept; + simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; /** - * Abandon all iteration. + * 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 void abandon() noexcept; + simdjson_inline std::string_view raw_json_token() noexcept; /** - * Get the child value as a value_iterator. + * 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 value_iterator child_value() const noexcept; + simdjson_inline simdjson_result raw_json() noexcept; /** - * Get the depth of this value. + * Returns the current location in the document if in bounds. */ - simdjson_inline int32_t depth() const noexcept; + simdjson_inline simdjson_result current_location() noexcept; /** - * Get the JSON type of this value. + * Returns the current depth in the document if in bounds. * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". + * 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 simdjson_result type() const noexcept; + simdjson_inline int32_t current_depth() const noexcept; /** - * @addtogroup object Object iteration + * Get the value associated with the given JSON pointer. We use the RFC 6901 + * https://tools.ietf.org/html/rfc6901 standard. * - * 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. + * 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 at_pointer(std::string_view json_pointer) noexcept; /** - * Start an object iteration. + * 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. * - * @returns Whether the object had any fields (returns false for empty). - * @error INCORRECT_TYPE if there is no opening { + * @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_warn_unused simdjson_inline simdjson_result start_object() noexcept; + simdjson_inline simdjson_result at_path(std::string_view at_path) noexcept; + + +protected: /** - * Start an object iteration from the root. + * 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. * - * @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 + * (It should already be started; this is just a self-documentation method.) */ - simdjson_warn_unused simdjson_inline simdjson_result start_root_object() noexcept; + static simdjson_inline value start(const value_iterator &iter) noexcept; + /** - * Checks whether an object could be started from the root. May be called by start_root_object. + * 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 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; + friend struct simdjson_result; + friend class field; +}; + +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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 get_array() noexcept; + simdjson_inline simdjson_result get_object() noexcept; + + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result is_null() noexcept; + + template simdjson_inline simdjson_result get() noexcept; + + template simdjson_inline error_code get(T &out) noexcept; + +#if SIMDJSON_EXCEPTIONS + template + 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 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 bool() noexcept(false); +#endif + simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). * - * @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 + * 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_warn_unused simdjson_inline error_code check_root_object() noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field(const char *key) noexcept; + /** - * Start an object iteration after the user has already checked and moved past the {. + * Look up a field by name on an object, without regard to key order. * - * Does not move the iterator unless the object is empty ({}). + * **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. * - * @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. + * It is the default, however, 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_warn_unused simdjson_inline simdjson_result started_object() noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) noexcept; + simdjson_result operator[](int) noexcept = delete; + /** - * Start an object iteration from the root, after the user has already checked and moved past the {. + * 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. * - * Does not move the iterator unless the object is empty ({}). + * 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. * - * @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. + * 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_warn_unused simdjson_inline simdjson_result started_root_object() noexcept; + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + simdjson_inline simdjson_result is_negative() noexcept; + simdjson_inline simdjson_result is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + + /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ + simdjson_inline simdjson_result raw_json_token() noexcept; + simdjson_inline simdjson_result raw_json() noexcept; + + /** @copydoc simdjson_inline simdjson_result current_location() noexcept */ + simdjson_inline simdjson_result current_location() noexcept; + /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ + simdjson_inline simdjson_result current_depth() const noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(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 */ +#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 lasx { +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 +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 +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; - /** - * 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 has_next_field() 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; - /** - * Get the current field's key. - */ - simdjson_warn_unused simdjson_inline simdjson_result field_key() 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; - /** - * Pass the : in the field and move to its value. - */ - simdjson_warn_unused simdjson_inline error_code field_value() noexcept; +} // namespace logger +} // namespace ondemand +} // namespace lasx +} // namespace simdjson - /** - * 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; +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H - /** - * 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 find_field_raw(const std::string_view key) noexcept; +/* 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 lasx { +namespace ondemand { +/** + * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`) + * detected by stage 1. + * + * @private This is not intended for external use. + */ +class token_iterator { +public: /** - * 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 } - * ^ - * ``` + * Create a new invalid token_iterator. * - * 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.). + * Exists so you can declare a variable and later assign to it before use. */ - simdjson_warn_unused simdjson_inline simdjson_result find_field_unordered_raw(const std::string_view key) noexcept; - - /** @} */ + 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; /** - * @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. - * @{ + * Advance to the next token (returning the current one). */ - + simdjson_inline const uint8_t *return_current_and_advance() noexcept; /** - * 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 [. + * Reports the current offset in bytes from the start of the underlying buffer. */ - simdjson_warn_unused simdjson_inline simdjson_result start_array() noexcept; + simdjson_inline uint32_t current_offset() const noexcept; /** - * Check for an opening [ and start an array iteration while at the root. + * Get the JSON text for a given token (relative). * - * @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 + * 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_warn_unused simdjson_inline simdjson_result start_root_array() noexcept; + simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept; /** - * Checks whether an array could be started from the root. May be called by start_root_array. + * Get the maximum length of the JSON text for a given token. * - * @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 + * 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_warn_unused simdjson_inline error_code check_root_array() noexcept; + simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept; + /** - * Start an array iteration, after the user has already checked and moved past the [. + * Get the JSON text for a given token. * - * Does not move the iterator unless the array is empty ([]). + * This is not null-terminated; it is a view into the JSON. + * + * @param position The position of the token. * - * @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 started_array() noexcept; + simdjson_inline const uint8_t *peek(token_position position) const noexcept; /** - * Start an array iteration from the root, after the user has already checked and moved past the [. + * Get the maximum length of the JSON text for a given token. * - * Does not move the iterator unless the array is empty ([]). + * The length will include any whitespace at the end of the token. * - * @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. + * @param position The position of the token. */ - simdjson_warn_unused simdjson_inline simdjson_result started_root_array() noexcept; - + simdjson_inline uint32_t peek_length(token_position position) const noexcept; /** - * Moves to the next element in an array. + * Get the maximum length of the JSON text for a root token. * - * Looks for , and ]. If ] is found, the array is finished and the iterator advances past it. - * Otherwise, it advances to the next value. + * The length will include any whitespace at the end of the token. * - * @return Whether there is another element in the array. - * @error TAPE_ERROR If there is a comma missing between elements. + * @param position The position of the token (start of the document). */ - simdjson_warn_unused simdjson_inline simdjson_result has_next_element() noexcept; - + simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; /** - * Get a child value iterator. + * Return the current index. */ - simdjson_warn_unused simdjson_inline value_iterator child() const noexcept; - - /** @} */ - + simdjson_inline token_position position() const noexcept; /** - * @defgroup scalar Scalar values - * @addtogroup scalar - * @{ + * Reset to a previously saved index. */ + simdjson_inline void set_position(token_position target_position) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_string(bool allow_replacement) noexcept; - template - simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_int64() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_double() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_bool() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_null() noexcept; - simdjson_warn_unused simdjson_inline bool is_negative() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_integer() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; - - simdjson_warn_unused simdjson_inline simdjson_result get_root_string(bool check_trailing, bool allow_replacement) noexcept; - template - 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 get_root_wobbly_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_raw_json_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_uint64_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_int64(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_int64_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_double(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_double_in_string(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_bool(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline bool is_root_negative() noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_root_integer(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_number_type(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result get_root_number(bool check_trailing) noexcept; - simdjson_warn_unused simdjson_inline simdjson_result is_root_null(bool check_trailing) noexcept; - - 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; + // 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 void assert_is_valid() const noexcept; - simdjson_inline bool is_valid() 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; + simdjson_inline bool operator<=(const token_iterator &other) const noexcept; - /** @} */ protected: - /** - * Restarts an array iteration. - * @returns Whether the array has any elements (returns false for empty). - */ - simdjson_inline simdjson_result reset_array() noexcept; - /** - * Restarts an object iteration. - * @returns Whether the object has any fields (returns false for empty). - */ - simdjson_inline simdjson_result 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 parse_null(const uint8_t *json) const noexcept; - simdjson_inline simdjson_result 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; + simdjson_inline token_iterator(const uint8_t *buf, token_position position) 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. + * Get the index of the JSON text for a given token (relative). * - * So the contract is: first call 'peek_...' and then call 'advance_...' only - * if you have determined that it is a type you can handle. + * This is not null-terminated; it is a view into the JSON. * - * Unfortunately, it makes the code more verbose, longer and maybe more error prone. + * @param delta The relative position of the token to retrieve. e.g. 0 = current token, + * 1 = next token, -1 = prev token. */ - - 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_inline error_code start_container(uint8_t start_char, const char *incorrect_type_message, const char *type) noexcept; - simdjson_inline error_code end_container() noexcept; - + simdjson_inline uint32_t peek_index(int32_t delta=0) const noexcept; /** - * Advance to a place expecting a value (increasing depth). + * Get the index of the JSON text for a given token. * - * @return The current token (the one left behind). - * @error TAPE_ERROR If the document ended early. - */ - simdjson_inline simdjson_result advance_to_value() noexcept; - - simdjson_inline error_code incorrect_type_error(const char *message) const noexcept; - 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. + * This is not null-terminated; it is a view into the JSON. * - * 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. + * @param position The position of the token. * - * 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; + simdjson_inline uint32_t peek_index(token_position 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_inline error_code report_error(error_code error, const char *message) noexcept; + const uint8_t *buf{}; + token_position _position{}; - friend class document; + friend class json_iterator; + friend class value_iterator; friend class object; - friend class array; - friend class value; - friend class field; -}; // value_iterator + template + 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 + 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 lasx @@ -113340,717 +138222,503 @@ class value_iterator { namespace simdjson { template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { +struct simdjson_result : public lasx::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(lasx::ondemand::value_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 }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_VALUE_H */ +/* 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/value_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/deserialize.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/token_iterator.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -#include - namespace simdjson { - namespace lasx { 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. + * Iterates through JSON tokens, keeping track of depth and string buffer. + * + * @private This is not intended for external use. */ -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; - +class json_iterator { +protected: + token_iterator token{}; + ondemand::parser *parser{}; /** - * 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. + * Next free location in the string buffer. * - * @returns A value of the given type, parsed from the JSON. - * @returns INCORRECT_TYPE If the JSON value is not the given type. + * Used by raw_json_string::unescape() to have a place to unescape strings to. */ - template - simdjson_inline simdjson_result get() -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); - T out{}; - SIMDJSON_TRY(get(out)); - return out; - } - - + uint8_t *_string_buf_loc{}; /** - * Get this value as the given type. - * - * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool + * JSON error, if there is one. * - * @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 - simdjson_inline error_code get(T &out) -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - #if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { - return deserialize(*this, out); - } else { - static_assert(!sizeof(T), "The get 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 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(out); // to get rid of unused errors - return UNINITIALIZED; - } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION - // 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(out); // to get rid of unused errors - return UNINITIALIZED; -#endif - } - - /** - * Cast this JSON value to an array. + * INCORRECT_TYPE and NO_SUCH_FIELD are *not* stored here, ever. * - * @returns An object that can be used to iterate the array. - * @returns INCORRECT_TYPE If the JSON value is not an array. + * 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. */ - simdjson_inline simdjson_result get_array() noexcept; - + error_code error{SUCCESS}; /** - * Cast this JSON value to an object. + * Depth of the current token in the JSON. * - * @returns An object that can be used to look up or iterate fields. - * @returns INCORRECT_TYPE If the JSON value is not an object. + * - 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 simdjson_result get_object() noexcept; - + depth_t _depth{}; /** - * 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. + * 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); */ - simdjson_inline simdjson_result get_uint64() noexcept; - + token_position _root{}; /** - * 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. + * 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. */ - simdjson_inline simdjson_result get_uint64_in_string() noexcept; + 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; /** - * 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. + * Skips a JSON value, whether it is a scalar, array or object. */ - simdjson_inline simdjson_result get_int64() noexcept; + simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) 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. + * Tell whether the iterator is still at the start */ - simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline bool at_root() const 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. + * 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 simdjson_result get_double() noexcept; + simdjson_inline bool streaming() const 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. + * Get the root value iterator */ - simdjson_inline simdjson_result get_double_in_string() noexcept; - + simdjson_inline token_position root_position() const noexcept; /** - * Cast this JSON value to a string. - * - * The string is guaranteed to be valid UTF-8. - * - * Equivalent to get(). - * - * 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. + * Assert that we are at the document depth (== 1) */ - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - + simdjson_inline void assert_at_document_depth() const 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. + * Assert that we are at the root of the document */ - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline void assert_at_root() const 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. + * Tell whether the iterator is at the EOF mark */ - simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline bool at_end() const 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. + * Tell whether the iterator is live (has not been moved). */ - simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline bool is_alive() const noexcept; /** - * Cast this JSON value to a bool. - * - * @returns A bool value. - * @returns INCORRECT_TYPE if the JSON value is not true or false. + * Abandon this iterator, setting depth to 0 (as if the document is finished). */ - simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline void abandon() 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'. + * Advance the current token without modifying depth. */ - simdjson_inline simdjson_result is_null() noexcept; + simdjson_inline const uint8_t *return_current_and_advance() noexcept; -#if SIMDJSON_EXCEPTIONS /** - * Cast this JSON value to an instance of type T. The programmer is responsible for - * providing an implementation of get 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 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). * - * @returns An instance of type T + * @return whether there is a single token */ - template - explicit simdjson_inline operator T() noexcept(false); + simdjson_inline bool is_single_token() const noexcept; + /** - * Cast this JSON value to an array. + * Assert that there are at least the given number of tokens left. * - * @returns An object that can be used to iterate the array. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array. + * Has no effect in release builds. */ - simdjson_inline operator array() noexcept(false); + simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept; /** - * Cast this JSON value to an object. + * Assert that the given position addresses an actual token (is within bounds). * - * @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. + * Has no effect in release builds. */ - simdjson_inline operator object() noexcept(false); + simdjson_inline void assert_valid_position(token_position position) const noexcept; /** - * Cast this JSON value to an unsigned integer. + * Get the JSON text for a given token (relative). * - * @returns A signed 64-bit integer. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer. + * 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 operator uint64_t() noexcept(false); + simdjson_inline const uint8_t *peek(int32_t delta=0) const noexcept; /** - * Cast this JSON value to a signed integer. + * Get the maximum length of the JSON text for the current token (or relative). * - * @returns A signed 64-bit integer. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit integer. + * 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 operator int64_t() noexcept(false); + simdjson_inline uint32_t peek_length(int32_t delta=0) const noexcept; /** - * Cast this JSON value to a double. + * Get a pointer to the current location in the input buffer. * - * @returns A double. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a valid floating-point number. + * 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 operator double() noexcept(false); + simdjson_inline const uint8_t *unsafe_pointer() const noexcept; /** - * Cast this JSON value to a string. + * Get the JSON text for a given token. * - * The string is guaranteed to be valid UTF-8. + * This is not null-terminated; it is a view into the JSON. * - * Equivalent to get(). + * @param position The position of the token to retrieve. * - * @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. + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used ... */ - simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline const uint8_t *peek(token_position position) const noexcept; /** - * Cast this JSON value to a raw_json_string. + * Get the maximum length of the JSON text for the current token (or relative). * - * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). + * The length will include any whitespace at the end of the token. * - * @returns A pointer to the raw JSON for the given string. - * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + * @param position The position of the token to retrieve. */ - simdjson_inline operator raw_json_string() noexcept(false); + simdjson_inline uint32_t peek_length(token_position position) const noexcept; /** - * Cast this JSON value to a bool. + * Get the maximum length of the JSON text for the current root token. * - * @returns A bool value. - * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false. + * The length will include any whitespace at the end of the token. + * + * @param position The position of the token to retrieve. */ - simdjson_inline operator bool() noexcept(false); -#endif - + simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; /** - * Begin array iteration. + * Get the JSON text for the last token in the document. * - * Part of the std::iterable interface. + * This is not null-terminated; it is a view into the JSON. * - * @returns INCORRECT_TYPE If the JSON value is not an array. + * TODO consider a string_view, assuming the length will get stripped out by the optimizer when + * it is not used ... */ - simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline const uint8_t *peek_last() const noexcept; + /** - * Sentinel representing the end of the array. + * Ascend one level. * - * Part of the std::iterable interface. - */ - simdjson_inline simdjson_result 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. + * Validates that the depth - 1 == parent_depth. * - * Performance hint: You should only call count_elements() as a last - * resort as it may require scanning the document twice or more. + * @param parent_depth the expected parent depth. */ - simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline void ascend_to(depth_t parent_depth) 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. + * Descend one level. * - * To check that an object is empty, it is more performant to use - * the is_empty() method on the object instance. + * Validates that the new depth == child_depth. * - * Performance hint: You should only call count_fields() as a last - * resort as it may require scanning the document twice or more. + * @param child_depth the expected child depth. */ - simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline void descend_to(depth_t child_depth) noexcept; + simdjson_inline void descend_to(depth_t child_depth, int32_t delta) 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 + * Get current depth. */ - simdjson_inline simdjson_result at(size_t index) noexcept; - /** - * Look up a field by name on an object (order-sensitive). - * - * 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 }`: - * - * ```c++ - * 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. + simdjson_inline depth_t depth() const noexcept; - * **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. + /** + * Get current (writeable) location in the string buffer. */ - simdjson_inline simdjson_result find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field(const char *key) noexcept; + simdjson_inline uint8_t *&string_buf_loc() 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. - * - * It is the default, however, 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). + * Report an unrecoverable error, preventing further iteration. * - * @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. + * @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_inline simdjson_result find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) noexcept; - simdjson_result operator[](int) noexcept = delete; + simdjson_warn_unused simdjson_inline error_code report_error(error_code error, const char *message) noexcept; /** - * 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". + * 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_inline simdjson_result type() noexcept; + simdjson_warn_unused simdjson_inline error_code optional_error(error_code error, const char *message) 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". + * 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_inline simdjson_result is_scalar() noexcept; + 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; /** - * 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". + * 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 is_string() noexcept; + simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept; + simdjson_inline simdjson_result 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; /** - * Checks whether the value is a negative number. - * - * @returns true if the number if negative. + * Returns the current location in the document if in bounds. */ - simdjson_inline bool is_negative() noexcept; + inline simdjson_result current_location() const 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. + * Updates this json iterator so that it is back at the beginning of the document, + * as if it had just been created. */ - simdjson_inline simdjson_result is_integer() noexcept; + inline void rewind() 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 + * 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 ]. */ - simdjson_inline simdjson_result get_number_type() noexcept; + 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 + 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 + 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 lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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; +}; + +} // 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 */ +#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 */ - /** - * 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 get_number() noexcept; +namespace simdjson { +namespace lasx { +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 { /** - * 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 + * return the automatically determined type of + * the number: number_type::floating_point_number, + * number_type::signed_integer or number_type::unsigned_integer. * - * See also value::raw_json(). + * 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 std::string_view raw_json_token() noexcept; - + simdjson_inline ondemand::number_type get_number_type() const 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. + * return true if the automatically determined type of + * the number is number_type::unsigned_integer. */ - simdjson_inline simdjson_result raw_json() noexcept; - + simdjson_inline bool is_uint64() const noexcept; /** - * Returns the current location in the document if in bounds. + * return the value as a uint64_t, only valid if is_uint64() is true. */ - simdjson_inline simdjson_result current_location() noexcept; + simdjson_inline uint64_t get_uint64() const noexcept; + simdjson_inline operator uint64_t() 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. + * return true if the automatically determined type of + * the number is number_type::signed_integer. */ - simdjson_inline int32_t current_depth() const noexcept; - + simdjson_inline bool is_int64() 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 + * return the value as a int64_t, only valid if is_int64() is true. */ - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline int64_t get_int64() const noexcept; + simdjson_inline operator int64_t() const 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 + * return true if the automatically determined type of + * the number is number_type::floating_point_number. */ - simdjson_inline simdjson_result at_path(std::string_view at_path) noexcept; - - -protected: + simdjson_inline bool is_double() const noexcept; /** - * Create a value. + * return the value as a double, only valid if is_double() is true. */ - simdjson_inline value(const value_iterator &iter) noexcept; + simdjson_inline double get_double() const noexcept; + simdjson_inline operator double() const noexcept; /** - * Skip this value, allowing iteration to continue. + * Convert the number to a double. Though it always succeed, the conversion + * may be lossy if the number cannot be represented exactly. */ - simdjson_inline void skip() noexcept; + simdjson_inline double as_double() const noexcept; + +protected: /** - * Start a value at the current position. - * - * (It should already be started; this is just a self-documentation method.) + * 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. */ - static simdjson_inline value start(const value_iterator &iter) noexcept; - + friend class value_iterator; + template + 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 + 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; /** - * Resume a value. + * End of friend declarations. */ - static simdjson_inline value resume(const value_iterator &iter) noexcept; /** - * Get the object, starting or resuming it as necessary + * Our attributes are a union type (size = 64 bits) + * followed by a type indicator. */ - simdjson_inline simdjson_result 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; + union { + double floating_point_number; + int64_t signed_integer; + uint64_t unsigned_integer; + } payload{0}; + number_type type{number_type::signed_integer}; +}; - value_iterator iter{}; +/** + * 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; - friend class document; - friend class array_iterator; - friend class field; - friend class object; - friend struct simdjson_result; - friend struct simdjson_result; - friend class field; -}; +#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 &type) noexcept(false); +#endif } // namespace ondemand } // namespace lasx @@ -114059,335 +138727,644 @@ class value { namespace simdjson { template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { +struct simdjson_result : public lasx::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(lasx::ondemand::value &&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 +}; - simdjson_inline simdjson_result get_array() noexcept; - simdjson_inline simdjson_result get_object() noexcept; - - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result is_null() noexcept; +} // namespace simdjson - template simdjson_inline simdjson_result get() noexcept; +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H - template simdjson_inline error_code get(T &out) noexcept; +/* 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 */ -#if SIMDJSON_EXCEPTIONS - template - 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 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 bool() noexcept(false); -#endif - simdjson_inline simdjson_result count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; +namespace simdjson { +namespace lasx { +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: /** - * Look up a field by name on an object (order-sensitive). + * Create a new invalid raw_json_string. * - * 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 }`: + * 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. * - * ```c++ - * 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"); - * ``` + * The given location must be just *after* the beginning quote (") in the JSON file. * - * **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 }`. + * 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 "). * - * @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. + * It is possible for this function to return a null pointer if the instance + * has outlived its existence. */ - simdjson_inline simdjson_result find_field(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field(const char *key) noexcept; + simdjson_inline const char * raw() const noexcept; /** - * Look up a field by name on an object, without regard to key order. + * 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. * - * **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. + * 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. * - * It is the default, however, 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. + * 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. * - * 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). + * Performance: the comparison is done byte-by-byte which might be inefficient for + * long strings. * - * @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. + * 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 simdjson_result find_field_unordered(std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) noexcept; - simdjson_result operator[](int) noexcept = delete; + simdjson_inline bool unsafe_is_equal(std::string_view target) const noexcept; /** - * Get the type of this JSON value. + * 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. * - * 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). + * 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 simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; + simdjson_inline bool unsafe_is_equal(const char* target) const noexcept; - /** @copydoc simdjson_inline std::string_view value::raw_json_token() const noexcept */ - simdjson_inline simdjson_result raw_json_token() noexcept; - simdjson_inline simdjson_result raw_json() 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; - /** @copydoc simdjson_inline simdjson_result current_location() noexcept */ - simdjson_inline simdjson_result current_location() noexcept; - /** @copydoc simdjson_inline int32_t current_depth() const noexcept */ - simdjson_inline simdjson_result current_depth() const noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) 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; -} // namespace simdjson + /** + * 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; -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_H +private: -/* 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 lasx { -namespace ondemand { + /** + * This will set the inner pointer to zero, effectively making + * this instance unusable. + */ + simdjson_inline void consume() noexcept { buf = nullptr; } -// 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 { + /** + * Checks whether the inner pointer is non-null and thus usable. + */ + simdjson_inline simdjson_warn_unused bool alive() const noexcept { return buf != nullptr; } -enum class log_level : int32_t { - info = 0, - error = 1 + /** + * 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 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 unescape_wobbly(json_iterator &iter) const noexcept; + const uint8_t * buf{}; + friend class object; + friend class field; + friend class parser; + friend struct simdjson_result; }; -#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 -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 -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; +simdjson_unused simdjson_inline std::ostream &operator<<(std::ostream &, const raw_json_string &) 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; +/** + * 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; -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 lasx } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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 raw() const noexcept; + simdjson_inline char operator[](size_t) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; + simdjson_inline simdjson_warn_unused simdjson_result 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 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 */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_H */ +/* 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): #include "simdjson/generic/ondemand/logger.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +#include +#include + namespace simdjson { namespace lasx { namespace ondemand { /** - * Iterates through JSON tokens (`{` `}` `[` `]` `,` `:` `""` `123` `true` `false` `null`) - * detected by stage 1. + * 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. * - * @private This is not intended for external use. + * 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. */ -class token_iterator { +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 new invalid token_iterator. + * Create a JSON parser. * - * Exists so you can declare a variable and later assign to it before use. + * The new parser will have zero capacity. */ - 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; + 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; /** - * 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). + * Start iterating an on-demand JSON document. * - * This is not null-terminated; it is a view into the JSON. + * ondemand::parser parser; + * document doc = parser.iterate(json); * - * @param delta The relative position of the token to retrieve. e.g. 0 = current token, - * 1 = next token, -1 = prev token. + * 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. * - * 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. + * ### IMPORTANT: Validate what you use * - * The length will include any whitespace at the end of the token. + * 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. * - * @param delta The relative position of the token to retrieve. e.g. 0 = current token, - * 1 = next token, -1 = prev token. + * ### 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_inline uint32_t peek_length(int32_t delta=0) const noexcept; + simdjson_warn_unused simdjson_result iterate(padded_string_view json) & noexcept; +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + simdjson_warn_unused simdjson_result iterate_allow_incomplete_json(padded_string_view json) & noexcept; +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; + /** @overload simdjson_result 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 iterate(std::string &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; + /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ + simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete; /** - * Get the JSON text for a given token. + * @private * - * This is not null-terminated; it is a view into the JSON. + * Start iterating an on-demand JSON document. * - * @param position The position of the token. + * 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_inline const uint8_t *peek(token_position position) const noexcept; + simdjson_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept; + + /** - * Get the maximum length of the JSON text for a given token. + * Parse a buffer containing many JSON documents. * - * The length will include any whitespace at the end of the token. + * 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 * - * @param position The position of the token. + * 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). */ - simdjson_inline uint32_t peek_length(token_position position) const noexcept; + inline simdjson_result 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 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 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 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 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 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 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; /** - * Get the maximum length of the JSON text for a root token. + * 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 length will include any whitespace at the end of the token. + * 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 position The position of the token (start of the document). + * @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_inline uint32_t peek_root_length(token_position position) const noexcept; + simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept; + + #ifdef SIMDJSON_THREADS_ENABLED /** - * Return the current index. + * 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. */ - simdjson_inline token_position position() const noexcept; + bool threaded{true}; + #else /** - * Reset to a previously saved index. + * When SIMDJSON_THREADS_ENABLED is not defined, the parser instance cannot use threads. */ - 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; + 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 unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept; /** - * Get the index of the JSON text for a given token (relative). + * 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 is not null-terminated; it is a view into the JSON. + * 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()). * - * @param delta The relative position of the token to retrieve. e.g. 0 = current token, - * 1 = next token, -1 = prev token. + * ## 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 uint32_t peek_index(int32_t delta=0) const noexcept; + simdjson_inline simdjson_result unescape_wobbly(raw_json_string in, uint8_t *&dst) const noexcept; + +#if SIMDJSON_DEVELOPMENT_CHECKS /** - * Get the index of the JSON text for a given token. + * 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. * - * This is not null-terminated; it is a view into the JSON. + * A parser should only be used for one document at a time. * - * @param position The position of the token. + * Our simdjson::from functions use this parser instance. * + * You can free the related parser by calling release_parser(). */ - simdjson_inline uint32_t peek_index(token_position position) const noexcept; + 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(); - const uint8_t *buf{}; - token_position _position{}; +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& get_parser_instance(); + /** Get the thread-local parser instance, it might be null */ + static simdjson_inline simdjson_warn_unused std::unique_ptr& get_threadlocal_parser_if_exists(); + /** @private [for benchmarking access] The implementation to use */ + std::unique_ptr implementation{}; + size_t _capacity{0}; + size_t _max_capacity; + size_t _max_depth{DEFAULT_MAX_DEPTH}; + std::unique_ptr string_buf{}; + +#if SIMDJSON_DEVELOPMENT_CHECKS + std::unique_ptr start_positions{}; +#endif friend class json_iterator; - friend class value_iterator; - friend class object; - template - 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 - 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; + friend class document_stream; }; } // namespace ondemand @@ -114397,339 +139374,549 @@ class token_iterator { namespace simdjson { template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { +struct simdjson_result : public lasx::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(lasx::ondemand::token_iterator &&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; - 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 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 +#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_ONDEMAND_JSON_ITERATOR_H */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ +/* 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): #include "simdjson/generic/ondemand/token_iterator.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ -namespace simdjson { -namespace lasx { -namespace ondemand { +namespace simdjson { + + +#if SIMDJSON_SUPPORTS_CONCEPTS + +namespace lasx { +namespace builder { + class string_builder; +}} + +template +struct has_custom_serialization : std::false_type {}; + +inline constexpr struct serialize_tag { + template + requires custom_deserializable + constexpr void operator()(lasx::builder::string_builder& b, T& obj) const{ + return tag_invoke(*this, b, obj); + } + + +} serialize{}; +template +struct has_custom_serialization(), std::declval())) +>> : std::true_type {}; + +template +constexpr bool require_custom_serialization = has_custom_serialization::value; +#else +struct has_custom_serialization : std::false_type {}; +#endif // SIMDJSON_SUPPORTS_CONCEPTS +namespace lasx { +namespace builder { /** - * Iterates through JSON tokens, keeping track of depth and string buffer. + * 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). * - * @private This is not intended for external use. + * Ultimately, this class can support kernel-specific optimizations. E.g., + * it may make use of SIMD instructions to escape strings faster. */ -class json_iterator { -protected: - token_iterator token{}; - ondemand::parser *parser{}; +class string_builder { +public: + simdjson_inline string_builder(size_t initial_capacity = DEFAULT_INITIAL_CAPACITY); + + static constexpr size_t DEFAULT_INITIAL_CAPACITY = 1024; + /** - * Next free location in the string buffer. - * - * Used by raw_json_string::unescape() to have a place to unescape strings to. + * 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. */ - uint8_t *_string_buf_loc{}; + template::value>::type> + simdjson_inline void append(number_type v) noexcept; + /** - * 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. + * Append character c. */ - error_code error{SUCCESS}; + simdjson_inline void append(char c) noexcept; + /** - * 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. + * Append the string 'null'. */ - depth_t _depth{}; + simdjson_inline void append_null() noexcept; + /** - * 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); + * Clear the content. */ - token_position _root{}; + simdjson_inline void clear() noexcept; + /** - * 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. + * Append the std::string_view, after escaping it. + * There is no UTF-8 validation. */ - bool _streaming{false}; + simdjson_inline void escape_and_append(std::string_view input) noexcept; -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. + * Append the std::string_view surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. */ - simdjson_warn_unused simdjson_inline error_code skip_child(depth_t parent_depth) noexcept; + simdjson_inline void escape_and_append_with_quotes(std::string_view input) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + 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; /** - * Tell whether the iterator is still at the start + * Append the character surrounded by double quotes, after escaping it. + * There is no UTF-8 validation. */ - simdjson_inline bool at_root() const noexcept; + simdjson_inline void escape_and_append_with_quotes(const char* input) 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(). + * Append the C string directly, without escaping. + * There is no UTF-8 validation. */ - simdjson_inline bool streaming() const noexcept; + simdjson_inline void append_raw(const char *c) noexcept; /** - * Get the root value iterator + * Append "{" to the buffer. */ - simdjson_inline token_position root_position() const noexcept; + simdjson_inline void start_object() noexcept; + /** - * Assert that we are at the document depth (== 1) + * Append "}" to the buffer. */ - simdjson_inline void assert_at_document_depth() const noexcept; + simdjson_inline void end_object() noexcept; + /** - * Assert that we are at the root of the document + * Append "[" to the buffer. */ - simdjson_inline void assert_at_root() const noexcept; + simdjson_inline void start_array() noexcept; /** - * Tell whether the iterator is at the EOF mark + * Append "]" to the buffer. */ - simdjson_inline bool at_end() const noexcept; + simdjson_inline void end_array() noexcept; /** - * Tell whether the iterator is live (has not been moved). + * Append "," to the buffer. */ - simdjson_inline bool is_alive() const noexcept; + simdjson_inline void append_comma() noexcept; /** - * Abandon this iterator, setting depth to 0 (as if the document is finished). + * Append ":" to the buffer. */ - simdjson_inline void abandon() noexcept; + simdjson_inline void append_colon() noexcept; /** - * Advance the current token without modifying depth. + * 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. */ - simdjson_inline const uint8_t *return_current_and_advance() noexcept; + template + simdjson_inline void append_key_value(key_type key, value_type value) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + template + simdjson_inline void append_key_value(value_type value) noexcept; + + // Support for optional types (std::optional, etc.) + template + requires(!require_custom_serialization) + simdjson_inline void append(const T &opt); + + template + requires(require_custom_serialization) + simdjson_inline void append(const T &val); + // Support for string-like types + template + requires(std::is_convertible::value || + std::is_same::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 +requires (!std::is_convertible::value) + simdjson_inline void append(const R &range) noexcept; +#endif /** - * 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 + * Append the std::string_view directly, without escaping. + * There is no UTF-8 validation. */ - simdjson_inline bool is_single_token() const noexcept; + simdjson_inline void append_raw(std::string_view input) noexcept; /** - * Assert that there are at least the given number of tokens left. - * - * Has no effect in release builds. + * Append len characters from str. + * There is no UTF-8 validation. */ - simdjson_inline void assert_more_tokens(uint32_t required_tokens=1) const noexcept; + simdjson_inline void append_raw(const char *str, size_t len) noexcept; +#if SIMDJSON_EXCEPTIONS /** - * Assert that the given position addresses an actual token (is within bounds). + * Creates an std::string from the written JSON buffer. + * Throws if memory allocation failed * - * Has no effect in release builds. + * 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 void assert_valid_position(token_position position) const noexcept; + simdjson_inline operator std::string() const noexcept(false); + /** - * 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. + * Creates an std::string_view from the written JSON buffer. + * Throws if memory allocation failed. * - * TODO consider a string_view, assuming the length will get stripped out by the optimizer when - * it is not used ... + * 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 const uint8_t *peek(int32_t delta=0) const noexcept; + simdjson_inline operator std::string_view() const noexcept(false) simdjson_lifetime_bound; +#endif + /** - * 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. + * Returns a view on the written JSON buffer. Returns an error + * if memory allocation failed. * - * @param delta The relative position of the token to retrieve. e.g. 0 = next token, -1 = prev token. + * 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 uint32_t peek_length(int32_t delta=0) const noexcept; + simdjson_inline simdjson_result view() 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. + * 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. * - * You may be pointing outside of the input buffer: it is not generally - * safe to dereference this pointer. + * 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 const uint8_t *unsafe_pointer() const noexcept; + simdjson_inline simdjson_result c_str() 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 ... + * Return true if the content is valid UTF-8. */ - simdjson_inline const uint8_t *peek(token_position position) const noexcept; + simdjson_inline bool validate_unicode() 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. + * 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 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 +simdjson_warn_unused simdjson_result 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 +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 */ + +// 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 */ +#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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace ondemand { + +/** + * A forward-only JSON array. + */ +class array { +public: + /** + * Create a new invalid array. * - * @param position The position of the token to retrieve. + * Exists so you can declare a variable and later assign to it before use. */ - simdjson_inline uint32_t peek_length(token_position position) const noexcept; + simdjson_inline array() noexcept = default; + /** - * Get the maximum length of the JSON text for the current root token. + * Begin array iteration. * - * The length will include any whitespace at the end of the token. + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result begin() noexcept; + /** + * Sentinel representing the end of the array. * - * @param position The position of the token to retrieve. + * Part of the std::iterable interface. */ - simdjson_inline uint32_t peek_root_length(token_position position) const noexcept; + simdjson_inline simdjson_result end() noexcept; /** - * Get the JSON text for the last token in the document. + * 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. * - * This is not null-terminated; it is a view into the JSON. + * To check that an array is empty, it is more performant to use + * the is_empty() method. + */ + simdjson_inline simdjson_result 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 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. * - * TODO consider a string_view, assuming the length will get stripped out by the optimizer when - * it is not used ... + * @returns true if the array contains some elements (not empty) */ - simdjson_inline const uint8_t *peek_last() const noexcept; - + inline simdjson_result reset() & noexcept; /** - * Ascend one level. + * 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. * - * Validates that the depth - 1 == parent_depth. + * 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 * - * @param parent_depth the expected parent depth. + * 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 */ - simdjson_inline void ascend_to(depth_t parent_depth) noexcept; + inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; /** - * Descend one level. + * 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. * - * Validates that the new depth == child_depth. + * https://www.rfc-editor.org/rfc/rfc9535 (RFC 9535) * - * @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; + * @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 at_path(std::string_view json_path) noexcept; /** - * Get current depth. + * 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 depth_t depth() const noexcept; + simdjson_inline simdjson_result raw_json() noexcept; /** - * Get current (writeable) location in the string buffer. + * 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 uint8_t *&string_buf_loc() noexcept; + simdjson_inline simdjson_result at(size_t index) noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS /** - * Report an unrecoverable error, preventing further iteration. + * Get this array as the given type. * - * @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. + * @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. */ - simdjson_inline error_code report_error(error_code error, const char *message) noexcept; - + template + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + return deserialize(*this, out); + } /** - * 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. + * 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. */ - simdjson_inline error_code optional_error(error_code error, const char *message) noexcept; - + template + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS +protected: /** - * 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. + * Go to the end of the array, no matter where you are right now. */ - 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_warn_unused simdjson_inline error_code consume() 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. + * 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 [. */ - simdjson_inline simdjson_result unescape(raw_json_string in, bool allow_replacement) noexcept; - simdjson_inline simdjson_result unescape_wobbly(raw_json_string in) noexcept; - - simdjson_inline void reenter_child(token_position position, depth_t child_depth) noexcept; - - 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; - + static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; /** - * Returns the current location in the document if in bounds. + * 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. */ - inline simdjson_result current_location() const noexcept; + static simdjson_inline simdjson_result 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 started(value_iterator &iter) noexcept; /** - * Updates this json iterator so that it is back at the beginning of the document, - * as if it had just been created. + * 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. */ - inline void rewind() noexcept; + simdjson_inline array(const value_iterator &iter) 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 ]. + * Iterator marking current position. + * + * iter.is_alive() == false indicates iteration is complete. */ - 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; + value_iterator iter{}; - 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 - 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 - 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 + friend class document; + friend struct simdjson_result; + friend struct simdjson_result; + friend class array_iterator; +}; } // namespace ondemand } // namespace lasx @@ -114738,162 +139925,127 @@ class json_iterator { namespace simdjson { template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { +struct simdjson_result : public lasx::implementation_simdjson_result_base { public: - simdjson_inline simdjson_result(lasx::ondemand::json_iterator &&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 begin() noexcept; + simdjson_inline simdjson_result end() noexcept; + inline simdjson_result count_elements() & noexcept; + inline simdjson_result is_empty() & noexcept; + inline simdjson_result reset() & noexcept; + simdjson_inline simdjson_result at(size_t index) noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } +#endif // SIMDJSON_SUPPORTS_CONCEPTS }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_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): #define SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_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): #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 lasx { namespace ondemand { /** - * The type of a JSON value. - */ -enum class json_type { - // 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; + * A forward-only JSON array. + * + * This is an input_iterator, meaning: + * - It is forward-only + * - * must be called exactly once per element. + * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) + */ +class array_iterator { +public: + /** Create a new, invalid array iterator. */ + simdjson_inline array_iterator() noexcept = default; + + // + // Iterator interface + // /** - * return true if the automatically determined type of - * the number is number_type::signed_integer. + * Get the current element. + * + * Part of the std::iterator interface. */ - simdjson_inline bool is_int64() const noexcept; + simdjson_inline simdjson_result + operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. /** - * return the value as a int64_t, only valid if is_int64() is true. + * 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 int64_t get_int64() const noexcept; - simdjson_inline operator int64_t() const noexcept; - - + simdjson_inline bool operator==(const array_iterator &) const noexcept; /** - * return true if the automatically determined type of - * the number is number_type::floating_point_number. + * 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 is_double() const noexcept; + simdjson_inline bool operator!=(const array_iterator &) const noexcept; /** - * return the value as a double, only valid if is_double() is true. + * Move to the next element. + * + * Part of the std::iterator interface. */ - simdjson_inline double get_double() const noexcept; - simdjson_inline operator double() const noexcept; + simdjson_inline array_iterator &operator++() noexcept; /** - * Convert the number to a double. Though it always succeed, the conversion - * may be lossy if the number cannot be represented exactly. + * Check if the array is at the end. */ - simdjson_inline double as_double() const noexcept; + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; +private: + value_iterator iter{}; -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 - 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 - 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. - */ + simdjson_inline array_iterator(const value_iterator &iter) noexcept; - /** - * 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}; + friend class array; + friend class value; + friend struct simdjson_result; }; -/** - * 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 &type) noexcept(false); -#endif - } // namespace ondemand } // namespace lasx } // namespace simdjson @@ -114901,1131 +140053,853 @@ inline std::ostream& operator<<(std::ostream& out, simdjson_result &t namespace simdjson { template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - simdjson_inline simdjson_result(lasx::ondemand::json_type &&value) noexcept; ///< @private +struct simdjson_result : public lasx::implementation_simdjson_result_base { + 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; - simdjson_inline ~simdjson_result() noexcept = default; ///< @private + + // + // Iterator interface + // + + simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline bool operator==(const simdjson_result &) const noexcept; + simdjson_inline bool operator!=(const simdjson_result &) const noexcept; + simdjson_inline simdjson_result &operator++() noexcept; + + simdjson_warn_unused simdjson_inline bool at_end() const noexcept; }; } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_RAW_JSON_STRING_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_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): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_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/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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + namespace simdjson { namespace lasx { 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. + * A JSON document. It holds a json_iterator instance. * - * 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(). + * Used by tokens to get text, and string buffer location. * + * You must keep the document around during iteration. */ -class raw_json_string { +class document { public: /** - * Create a new invalid raw_json_string. + * Create a new invalid document. * * Exists so you can declare a variable and later assign to it before use. */ - simdjson_inline raw_json_string() noexcept = default; + 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; /** - * Create a new invalid raw_json_string pointed at the given location in the JSON. + * Cast this JSON value to an array. * - * The given location must be just *after* the beginning quote (") in the JSON file. + * @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 get_array() & noexcept; + /** + * Cast this JSON value to an object. * - * It *must* be terminated by a ", and be a valid JSON string. + * @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 raw_json_string(const uint8_t * _buf) noexcept; + simdjson_inline simdjson_result get_object() & noexcept; /** - * Get the raw pointer to the beginning of the string in the JSON (just after the "). + * Cast this JSON value to an unsigned integer. * - * It is possible for this function to return a null pointer if the instance - * has outlived its existence. + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. */ - simdjson_inline const char * raw() const noexcept; - + simdjson_inline simdjson_result get_uint64() 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. + * Cast this JSON value (inside string) to an unsigned integer. * - * 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. + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit unsigned integer. + */ + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + /** + * Cast this JSON value to a signed integer. * - * Performance: the comparison may be done using memcmp which may be efficient - * for long strings. + * @returns A signed 64-bit integer. + * @returns INCORRECT_TYPE If the JSON value is not a 64-bit integer. */ - simdjson_inline bool unsafe_is_equal(size_t length, std::string_view target) const noexcept; + simdjson_inline simdjson_result 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 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 get_double() 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. + * Cast this JSON value (inside string) to a double. * - * Performance: the comparison is done byte-by-byte which might be inefficient for - * long strings. + * @returns A double. + * @returns INCORRECT_TYPE If the JSON value is not a valid floating-point number. + */ + simdjson_inline simdjson_result get_double_in_string() noexcept; + /** + * Cast this JSON value to a string. * - * If target is a compile-time constant, and your compiler likes you, - * you should be able to do the following without performance penalty... + * The string is guaranteed to be valid UTF-8. * - * static_assert(raw_json_string::is_free_from_unescaped_quote(target), ""); - * s.unsafe_is_equal(target); + * 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 bool unsafe_is_equal(std::string_view target) const noexcept; - + simdjson_inline simdjson_result get_string(bool allow_replacement = false) 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. + * Attempts to fill the provided std::string reference with the parsed value of the current string. * - * If target is a compile-time constant, and your compiler likes you, - * you should be able to do the following without performance penalty... + * The string is guaranteed to be valid UTF-8. * - * static_assert(raw_json_string::is_free_from_unescaped_quote(target), ""); - * s.unsafe_is_equal(target); + * 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. */ - simdjson_inline bool unsafe_is_equal(const char* target) const noexcept; - + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) 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). + * 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 bool is_equal(std::string_view target) const noexcept; - + simdjson_inline simdjson_result get_wobbly_string() noexcept; /** - * This compares the current instance to the C string target: returns true if - * they are byte-by-byte equal (no escaping is done). + * 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 bool is_equal(const char* target) const noexcept; - + simdjson_inline simdjson_result get_raw_json_string() 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!). + * Cast this JSON value to a bool. + * + * @returns A bool value. + * @returns INCORRECT_TYPE if the JSON value is not true or false. */ - 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: - - + simdjson_inline simdjson_result get_bool() noexcept; /** - * This will set the inner pointer to zero, effectively making - * this instance unusable. + * 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 void consume() noexcept { buf = nullptr; } + simdjson_inline simdjson_result get_value() noexcept; /** - * Checks whether the inner pointer is non-null and thus usable. + * 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_warn_unused bool alive() const noexcept { return buf != nullptr; } + simdjson_inline simdjson_result is_null() noexcept; /** - * Unescape this JSON string, replacing \\ with \, \n with newline, etc. - * The result will be a valid UTF-8. + * Get this value as the given type. * - * ## IMPORTANT: string_view lifetime + * Supported types: object, array, raw_json_string, string_view, uint64_t, int64_t, double, bool * - * The string_view is only valid until the next parse() call on the parser. + * You may use get_double(), get_bool(), get_uint64(), get_int64(), + * get_object(), get_array(), get_raw_json_string(), or get_string() instead. * - * @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. + * @returns A value of the given type, parsed from the JSON. + * @returns INCORRECT_TYPE If the JSON value is not the given type. */ - simdjson_inline simdjson_warn_unused simdjson_result unescape(json_iterator &iter, bool allow_replacement) const noexcept; - + template + simdjson_inline simdjson_result get() & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); + T out{}; + SIMDJSON_TRY(get(out)); + return out; + } /** - * 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 + * @overload template simdjson_result get() & noexcept * - * The string_view is only valid until the next parse() call on the parser. + * 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. * - * @param iter A json_iterator, which contains a buffer where the string will be written. + * The member function is still remains specialize-able for compatibility + * reasons, but we completely disallow its use when a tag_invoke customization + * is provided. */ - simdjson_inline simdjson_warn_unused simdjson_result unescape_wobbly(json_iterator &iter) const noexcept; - const uint8_t * buf{}; - friend class object; - friend class field; - friend class parser; - friend struct simdjson_result; -}; - -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 lasx -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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 raw() const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept; - simdjson_inline simdjson_warn_unused simdjson_result 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 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 */ -/* 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 - -namespace simdjson { -namespace lasx { -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; + template + simdjson_inline simdjson_result get() && +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { + static_assert(!std::is_same::value && !std::is_same::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(*this).get(); + } -/** - * A JSON fragment iterator. - * - * This holds the actual iterator as well as the buffer for writing strings. - */ -class parser { -public: /** - * Create a JSON parser. + * Get this value as the given type. * - * The new parser will have zero capacity. + * 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. */ - 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; + template + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) +#else + noexcept +#endif + { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { + return deserialize(*this, out); + } else { + static_assert(!sizeof(T), "The get 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 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(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(out); // to get rid of unused errors + return UNINITIALIZED; +#endif // SIMDJSON_SUPPORTS_CONCEPTS + } - /** Deallocate the JSON parser. */ - inline ~parser() noexcept = default; + /** @overload template error_code get(T &out) & noexcept */ + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS /** - * 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. + * Cast this JSON value to an instance of type T. The programmer is responsible for + * providing an implementation of get 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.) * - * ### IMPORTANT: Validate what you use + * See https://github.com/simdjson/simdjson/blob/master/doc/basics.md#adding-support-for-custom-types * - * 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. + * @returns An instance of type T + */ + template + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + + /** + * Cast this JSON value to an array. * - * ### IMPORTANT: Buffer Lifetime + * @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. * - * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as - * long as the document iteration. + * @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. * - * ### IMPORTANT: Document Lifetime + * @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. * - * 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. + * @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. * - * ### REQUIRED: Buffer Padding + * @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 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. + * The string is guaranteed to be valid UTF-8. * - * ### std::string references + * @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. * - * 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. + * The string is guaranteed to be valid UTF-8, and may have escapes in it (e.g. \\ or \n). * - * 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: + * @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. * - * std::string json = R"({ "foo": 1 } { "foo": 2 } { "foo": 3 } )"; - * document doc = parser.iterate(simdjson::pad(json)); + * @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. * - * @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). + * 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. * - * @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. + * @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_warn_unused simdjson_result iterate(padded_string_view json) & noexcept; -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON - simdjson_warn_unused simdjson_result iterate_allow_incomplete_json(padded_string_view json) & noexcept; -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const char *json, size_t len, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const uint8_t *json, size_t len, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(std::string_view json, size_t capacity) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(std::string &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(const simdjson_result &json) & noexcept; - /** @overload simdjson_result iterate(padded_string_view json) & noexcept */ - simdjson_warn_unused simdjson_result iterate(padded_string &&json) & noexcept = delete; - + simdjson_inline operator value() noexcept(false); +#endif /** - * @private + * 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 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. * - * Start iterating an on-demand JSON document. + * To check that an object is empty, it is more performant to use + * the is_empty() method. + */ + simdjson_inline simdjson_result 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. * - * ondemand::parser parser; - * json_iterator doc = parser.iterate(json); + * @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 at(size_t index) & noexcept; + /** + * Begin array iteration. * - * ### IMPORTANT: Buffer Lifetime + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result begin() & noexcept; + /** + * Sentinel representing the end of the array. * - * Because parsing is done while you iterate, you *must* keep the JSON buffer around at least as - * long as the document iteration. + * Part of the std::iterable interface. + */ + simdjson_inline simdjson_result end() & noexcept; + + /** + * Look up a field by name on an object (order-sensitive). * - * ### IMPORTANT: Document Lifetime + * 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 }`: * - * 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. + * ```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"); + * ``` * - * 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. + * **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 }`. * - * ### 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. + * 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. * - * @param json The JSON to parse. + * 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. * - * @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. + * @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_warn_unused simdjson_result iterate_raw(padded_string_view json) & noexcept; - + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field(const char *key) & 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.) + * Look up a field by name on an object, without regard to key order. * - * 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. + * **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. * - * 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. + * It is the default, however, 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. * - * 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. + * 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). * - * ### REQUIRED: Buffer Padding + * 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. * - * 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. + * 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. * - * ### Threads + * @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 find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result 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. * - * When compiled with SIMDJSON_THREADS_ENABLED, this method will use a single thread under the - * hood to do some lookahead. + * 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. * - * ### Parser Capacity + * 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. * - * If the parser's current capacity is less than batch_size, it will allocate enough capacity - * to handle it (up to max_capacity). + * 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). * - * @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). + * 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. */ - inline simdjson_result 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 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 iterate_many(const std::string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const std::string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - /** @overload parse_many(const uint8_t *buf, size_t len, size_t batch_size) */ - inline simdjson_result iterate_many(const padded_string &s, size_t batch_size = DEFAULT_BATCH_SIZE, bool allow_comma_separated = false) noexcept; - inline simdjson_result iterate_many(const padded_string &&s, size_t batch_size, bool allow_comma_separated = false) = delete;// unsafe - - /** @private We do not want to allow implicit conversion from C string to std::string. */ - simdjson_result iterate_many(const char *buf, size_t batch_size = DEFAULT_BATCH_SIZE) noexcept = delete; + simdjson_inline simdjson_result type() noexcept; - /** 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. + * 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_pure simdjson_inline size_t max_depth() const noexcept; + simdjson_inline simdjson_result is_scalar() 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. + * Checks whether the document is a string. * - * @param capacity The new capacity. - * @param max_depth The new max_depth. Defaults to DEFAULT_MAX_DEPTH. - * @return The error, if there is one. + * @returns true if the type is string + * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". */ - simdjson_warn_unused error_code allocate(size_t capacity, size_t max_depth=DEFAULT_MAX_DEPTH) noexcept; + simdjson_inline simdjson_result is_string() 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. + * Checks whether the document is a negative number. + * + * @returns true if the number if negative. */ - bool threaded{false}; - #endif + simdjson_inline bool is_negative() noexcept; /** - * 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. + * 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). * - * @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. + * @returns true if the number if negative. */ - simdjson_inline simdjson_result unescape(raw_json_string in, uint8_t *&dst, bool allow_replacement = false) const noexcept; - + simdjson_inline simdjson_result is_integer() 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 + * 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. * - * The string_view is only valid as long as the bytes in dst. + * 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(). * - * @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 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 - -private: - /** @private [for benchmarking access] The implementation to use */ - std::unique_ptr implementation{}; - size_t _capacity{0}; - size_t _max_capacity; - size_t _max_depth{DEFAULT_MAX_DEPTH}; - std::unique_ptr string_buf{}; -#if SIMDJSON_DEVELOPMENT_CHECKS - std::unique_ptr start_positions{}; -#endif - - friend class json_iterator; - friend class document_stream; -}; - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; -}; - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_PARSER_H -/* end file simdjson/generic/ondemand/parser.h for lasx */ - -// 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 */ -#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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - -namespace simdjson { -namespace lasx { -namespace ondemand { + * 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 get_number_type() noexcept; -/** - * A forward-only JSON array. - */ -class array { -public: /** - * Create a new invalid array. + * 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. * - * Exists so you can declare a variable and later assign to it before use. + * 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_inline array() noexcept = default; + simdjson_warn_unused simdjson_inline simdjson_result get_number() noexcept; /** - * Begin array iteration. + * Get the raw JSON for this token. * - * Part of the std::iterable interface. + * 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 begin() noexcept; + simdjson_inline simdjson_result raw_json_token() noexcept; + /** - * Sentinel representing the end of the array. - * - * Part of the std::iterable interface. + * 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). */ - simdjson_inline simdjson_result end() noexcept; + inline void rewind() 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. + * Returns debugging information. */ - simdjson_inline simdjson_result count_elements() & noexcept; + inline std::string to_debug_string() 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. + * Some unrecoverable error conditions may render the document instance unusable. + * The is_alive() method returns true when the document is still suitable. */ - simdjson_inline simdjson_result is_empty() & noexcept; + inline bool is_alive() 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 the current location in the document if in bounds. + */ + inline simdjson_result 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. * - * @returns true if the array contains some elements (not empty) + * 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. */ - inline simdjson_result reset() & noexcept; + 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, interpreting the current node - * as the root of its own JSON document. + * https://tools.ietf.org/html/rfc6901 standard. * * ondemand::parser parser; - * auto json = R"([ { "foo": { "a": [ 10, 20, 30 ] }} ])"_padded; + * auto json = R"({ "foo": { "a": [ 10, 20, 30 ] }})"_padded; * auto doc = parser.iterate(json); - * doc.at_pointer("/0/foo/a/1") == 20 + * doc.at_pointer("/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. + * It is allowed for a key to be the empty string: * - * 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. + * ondemand::parser parser; + * auto json = R"({ "": { "a": [ 10, 20, 30 ] }})"_padded; + * auto doc = parser.iterate(json); + * doc.at_pointer("//a/1") == 20 * - * Also note that at_pointer() relies on find_field() which implies that we do not unescape keys when matching. + * 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). */ - inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 + * 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 - */ - inline simdjson_result at_path(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 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 at(size_t index) noexcept; -protected: - /** - * Go to the end of the array, no matter where you are right now. - */ - 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 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 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 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; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; /** - * Iterator marking current position. - * - * iter.is_alive() == false indicates iteration is complete. + * 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. */ - value_iterator iter{}; - - friend class value; - friend class document; - friend struct simdjson_result; - friend struct simdjson_result; - friend class array_iterator; -}; - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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 begin() noexcept; - simdjson_inline simdjson_result end() noexcept; - inline simdjson_result count_elements() & noexcept; - inline simdjson_result is_empty() & noexcept; - inline simdjson_result reset() & noexcept; - simdjson_inline simdjson_result at(size_t index) noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; simdjson_inline simdjson_result raw_json() noexcept; -}; - -} // 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 */ -#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 "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 lasx { -namespace ondemand { - -/** - * A forward-only JSON array. - * - * This is an input_iterator, meaning: - * - It is forward-only - * - * must be called exactly once per element. - * - ++ must be called exactly once in between each * (*, ++, *, ++, * ...) - */ -class array_iterator { -public: - /** 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 operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. +#if SIMDJSON_STATIC_REFLECTION /** - * Check if we are at the end of the JSON. + * Extract only specific fields from the JSON object into a struct. * - * Part of the std::iterator interface. + * This allows selective deserialization of only the fields you need, + * potentially improving performance by skipping unwanted fields. * - * @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. + * Example: + * ```cpp + * struct Car { + * std::string make; + * std::string model; + * int year; + * double price; + * }; * - * Part of the std::iterator interface. + * Car car; + * doc.extract_into<"make", "model">(car); + * // Only 'make' and 'model' fields are extracted from JSON + * ``` * - * @return true if there are more elements in the JSON array. + * @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 */ - simdjson_inline bool operator!=(const array_iterator &) const noexcept; + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +protected: /** - * Move to the next element. - * - * Part of the std::iterator interface. + * Consumes the document. */ - simdjson_inline array_iterator &operator++() noexcept; - -private: - value_iterator iter{}; - - simdjson_inline array_iterator(const value_iterator &iter) noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; - friend class array; - friend class value; - friend struct simdjson_result; -}; - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { + simdjson_inline document(ondemand::json_iterator &&iter) noexcept; + simdjson_inline const uint8_t *text(uint32_t idx) const noexcept; -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; + simdjson_inline value_iterator resume_value_iterator() noexcept; + simdjson_inline value_iterator get_root_value_iterator() noexcept; + simdjson_inline simdjson_result start_or_resume_object() noexcept; + static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept; // - // Iterator interface + // Fields // + json_iterator iter{}; ///< Current position in the document + static constexpr depth_t DOCUMENT_DEPTH = 0; ///< document depth is always 0 - simdjson_inline simdjson_result operator*() noexcept; // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline bool operator==(const simdjson_result &) const noexcept; - simdjson_inline bool operator!=(const simdjson_result &) const noexcept; - simdjson_inline simdjson_result &operator++() noexcept; + 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; }; -} // 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 */ -#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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ - - -namespace simdjson { -namespace lasx { -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. + * 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 { +class document_reference { 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 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 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 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 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 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 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 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 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 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 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 - 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 get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; simdjson_inline simdjson_result 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 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 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 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 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 simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept @@ -116036,25 +140910,15 @@ class document { SIMDJSON_TRY(get(out)); return out; } - /** - * @overload template simdjson_result 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 simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION +#if SIMDJSON_SUPPORTS_CONCEPTS noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { - static_assert(!std::is_same::value && !std::is_same::value, "You should never hold either an ondemand::array or ondemand::object without a corresponding ondemand::document being alive; that would be Undefined Behaviour."); + static_assert(!std::is_same::value && !std::is_same::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(*this).get(); } @@ -116070,15 +140934,15 @@ class document { * @returns SUCCESS If the parse succeeded and the out parameter was set to the value. */ template - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + simdjson_warn_unused simdjson_inline error_code get(T &out) & +#if SIMDJSON_SUPPORTS_CONCEPTS + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) #else noexcept #endif { -#if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { +#if SIMDJSON_SUPPORTS_CONCEPTS + if constexpr (custom_deserializable) { return deserialize(*this, out); } else { static_assert(!sizeof(T), "The get method with type T is not implemented by the simdjson library. " @@ -116089,7 +140953,7 @@ class document { static_cast(out); // to get rid of unused errors return UNINITIALIZED; } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION +#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. " @@ -116099,391 +140963,817 @@ class document { " You may also add support for custom types, see our documentation."); static_cast(out); // to get rid of unused errors return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION +#endif // SIMDJSON_SUPPORTS_CONCEPTS } /** @overload template error_code get(T &out) & noexcept */ - template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; + template simdjson_inline error_code get(T &out) && noexcept; + simdjson_inline simdjson_result raw_json() noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 + 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 count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + + simdjson_inline simdjson_result current_location() noexcept; + simdjson_inline int32_t current_depth() const noexcept; + simdjson_inline bool is_negative() noexcept; + simdjson_inline simdjson_result is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + simdjson_inline simdjson_result raw_json_token() noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + +private: + document *doc{nullptr}; +}; +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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 get_array() & noexcept; + simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result get_value() noexcept; + simdjson_inline simdjson_result is_null() noexcept; + + template simdjson_inline simdjson_result get() & noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; + + template simdjson_inline error_code get(T &out) & noexcept; + template simdjson_inline error_code get(T &out) && noexcept; +#if SIMDJSON_EXCEPTIONS + + using lasx::implementation_simdjson_result_base::operator*; + using lasx::implementation_simdjson_result_base::operator->; + template ::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 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 bool() noexcept(false); + simdjson_inline operator lasx::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + simdjson_inline simdjson_result 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 is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ + simdjson_inline simdjson_result raw_json_token() noexcept; + + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 : public lasx::implementation_simdjson_result_base { +public: + 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 get_array() & noexcept; + simdjson_inline simdjson_result get_object() & noexcept; + simdjson_inline simdjson_result get_uint64() noexcept; + simdjson_inline simdjson_result get_uint64_in_string() noexcept; + simdjson_inline simdjson_result get_int64() noexcept; + simdjson_inline simdjson_result get_int64_in_string() noexcept; + simdjson_inline simdjson_result get_double() noexcept; + simdjson_inline simdjson_result get_double_in_string() noexcept; + simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; + template + simdjson_warn_unused simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result get_wobbly_string() noexcept; + simdjson_inline simdjson_result get_raw_json_string() noexcept; + simdjson_inline simdjson_result get_bool() noexcept; + simdjson_inline simdjson_result get_value() noexcept; + simdjson_inline simdjson_result is_null() noexcept; + + template simdjson_inline simdjson_result get() & noexcept; + template simdjson_inline simdjson_result get() && noexcept; + + template simdjson_inline error_code get(T &out) & noexcept; + template simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS + template + 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 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 bool() noexcept(false); + simdjson_inline operator lasx::ondemand::value() noexcept(false); +#endif + simdjson_inline simdjson_result count_elements() & noexcept; + simdjson_inline simdjson_result count_fields() & noexcept; + simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline simdjson_result end() & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(const char *key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](const char *key) & noexcept; + simdjson_result operator[](int) & noexcept = delete; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; + simdjson_inline simdjson_result type() noexcept; + simdjson_inline simdjson_result is_scalar() noexcept; + simdjson_inline simdjson_result is_string() noexcept; + simdjson_inline simdjson_result current_location() noexcept; + simdjson_inline simdjson_result current_depth() const noexcept; + simdjson_inline simdjson_result is_negative() noexcept; + simdjson_inline simdjson_result is_integer() noexcept; + simdjson_inline simdjson_result get_number_type() noexcept; + simdjson_inline simdjson_result get_number() noexcept; + /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ + simdjson_inline simdjson_result raw_json_token() noexcept; + + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +#if SIMDJSON_STATIC_REFLECTION + template + requires(std::is_class_v && (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 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 */ +/* 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 +#include +#include +#endif + +namespace simdjson { +namespace lasx { +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(); /** - * Cast this JSON value to an instance of type T. The programmer is responsible for - * providing an implementation of get 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.) + * 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. * - * See https://github.com/simdjson/simdjson/blob/master/doc/basics.md#adding-support-for-custom-types + * ```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(); * - * @returns An instance of type T */ - template - explicit simdjson_inline operator T() & noexcept(false); - template - explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + inline size_t truncated_bytes() const noexcept; + + class iterator { + public: + using value_type = simdjson_result; + using reference = simdjson_result; + 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; /** - * Cast this JSON value to an array. + * 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. * - * @returns An object that can be used to iterate the array. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not an array. + * @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. */ - simdjson_inline operator array() & noexcept(false); + inline void start() noexcept; + /** - * Cast this JSON value to an object. + * Parse the next document found in the buffer previously given to document_stream. * - * @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. + * The content should be a valid JSON document encoded as UTF-8. If there is a + * UTF-8 BOM, the parser skips it. * - * @returns A signed 64-bit integer. - * @exception simdjson_error(INCORRECT_TYPE) If the JSON value is not a 64-bit unsigned integer. + * 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. */ - simdjson_inline operator uint64_t() noexcept(false); + 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; /** - * 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. + * 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. */ - simdjson_inline operator int64_t() noexcept(false); + 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 worker{new(std::nothrow) stage1_worker()}; /** - * 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. + * The parser used to run stage 1 in the background. Will be swapped + * with the regular parser when finished. */ - simdjson_inline operator double() noexcept(false); + 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; + friend struct simdjson::internal::simdjson_result_base; +}; // document_stream + +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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; +}; + +} // 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 */ +#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 lasx { +namespace ondemand { + +/** + * A JSON field (key/value pair) in an object. + * + * Returned from object iteration. + * + * Extends from std::pair so you can use C++ algorithms that rely on pairs. + */ +class field : public std::pair { +public: /** - * Cast this JSON value to a string. - * - * The string is guaranteed to be valid UTF-8. + * Create a new invalid field. * - * @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. + * Exists so you can declare a variable and later assign to it before use. */ - simdjson_inline operator std::string_view() noexcept(false); + simdjson_inline field() 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). + * 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. * - * @returns A pointer to the raw JSON for the given string. - * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not a string. + * This consumes the key: once you have called unescaped_key(), you cannot + * call it again nor can you call key(). */ - simdjson_inline operator raw_json_string() noexcept(false); + simdjson_inline simdjson_warn_unused simdjson_result unescaped_key(bool allow_replacement = false) noexcept; /** - * Cast this JSON value to a bool. + * 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. * - * @returns A bool value. - * @exception simdjson_error(INCORRECT_TYPE) if the JSON value is not true or false. + * This consumes the key: once you have called unescaped_key(), you cannot + * call it again nor can you call key(). */ - simdjson_inline operator bool() noexcept(false); + template + simdjson_inline simdjson_warn_unused error_code unescaped_key(string_type& receiver, bool allow_replacement = false) 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 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). + * 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 operator value() noexcept(false); -#endif + simdjson_inline raw_json_string key() const 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. + * 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 simdjson_result 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 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 simdjson_result count_fields() & noexcept; + simdjson_inline std::string_view escaped_key() const 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 + * Get the field value. */ - simdjson_inline simdjson_result at(size_t index) & noexcept; + simdjson_inline ondemand::value &value() & noexcept; /** - * Begin array iteration. - * - * Part of the std::iterable interface. + * @overload ondemand::value &ondemand::value() & noexcept */ - simdjson_inline simdjson_result begin() & noexcept; + simdjson_inline ondemand::value value() && noexcept; + +protected: + simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept; + static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept; + static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept; + friend struct simdjson_result; + friend class object_iterator; +}; + +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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 unescaped_key(bool allow_replacement = false) noexcept; + template + simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; + simdjson_inline simdjson_result key() noexcept; + simdjson_inline simdjson_result key_raw_json_token() noexcept; + simdjson_inline simdjson_result escaped_key() noexcept; + simdjson_inline simdjson_result 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 */ +#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): #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 lasx { +namespace ondemand { + +/** + * A forward-only JSON object field iterator. + */ +class object { +public: /** - * Sentinel representing the end of the array. + * Create a new invalid object. * - * Part of the std::iterable interface. + * Exists so you can declare a variable and later assign to it before use. */ - simdjson_inline simdjson_result end() & noexcept; + simdjson_inline object() noexcept = default; + simdjson_inline simdjson_result begin() noexcept; + simdjson_inline simdjson_result end() noexcept; /** * Look up a field by name on an object (order-sensitive). * * 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 }`: * - * ```c++ + * ```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. 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 find_field(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result 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. - * - * It is the default, however, 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 + * 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. - * - * @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 find_field_unordered(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result 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). - * - * @error TAPE_ERROR when the JSON value is a bad token like "}" "," or "alse". - */ - simdjson_inline simdjson_result 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 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 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 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 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 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 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 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. + * 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. */ - inline bool at_end() const noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; /** - * Returns the current depth in the document if in bounds. + * Look up a field by name on an object, without regard to key order. * - * 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. + * **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. + * + * It is the default, however, 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 int32_t current_depth() const noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ + simdjson_inline simdjson_result 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. + * 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; @@ -116497,1168 +141787,1645 @@ class document { * 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() 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. * - * 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. + * 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 + * 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 at_pointer(std::string_view json_pointer) noexcept; + inline simdjson_result 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://datatracker.ietf.org/doc/html/draft-normington-jsonpath-00 - * - * 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 at_path(std::string_view json_path) noexcept; + inline simdjson_result at_path(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 + * 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 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 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 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 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 + simdjson_warn_unused simdjson_inline error_code get(T &out) + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) { + static_assert(custom_deserializable); + 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 + simdjson_inline simdjson_result get() + noexcept(custom_deserializable ? nothrow_custom_deserializable : true) + { + static_assert(std::is_default_constructible::value, "The specified type is not default constructible."); + T out{}; + SIMDJSON_TRY(get(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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) & noexcept; +#endif // SIMDJSON_STATIC_REFLECTION +#endif // SIMDJSON_SUPPORTS_CONCEPTS protected: /** - * Consumes the document. + * Go to the end of the object, no matter where you are right now. */ - simdjson_inline error_code consume() noexcept; + simdjson_warn_unused simdjson_inline error_code consume() noexcept; + static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; + static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; + static simdjson_inline object resume(const value_iterator &iter) noexcept; + simdjson_inline object(const value_iterator &iter) noexcept; - simdjson_inline document(ondemand::json_iterator &&iter) noexcept; - simdjson_inline const uint8_t *text(uint32_t idx) const noexcept; + simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept; - simdjson_inline value_iterator resume_value_iterator() noexcept; - simdjson_inline value_iterator get_root_value_iterator() noexcept; - simdjson_inline simdjson_result start_or_resume_object() noexcept; - static simdjson_inline document start(ondemand::json_iterator &&iter) noexcept; + value_iterator iter{}; + + friend class value; + friend class document; + friend struct simdjson_result; +}; + +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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 begin() noexcept; + simdjson_inline simdjson_result end() noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; + simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; + simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; + simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; + simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; + inline simdjson_result reset() noexcept; + inline simdjson_result is_empty() noexcept; + inline simdjson_result count_fields() & noexcept; + inline simdjson_result raw_json() noexcept; + #if SIMDJSON_SUPPORTS_CONCEPTS + // TODO: move this code into object-inl.h + + template + simdjson_inline simdjson_result get() noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + return first; + } + return first.get(); + } + template + simdjson_warn_unused simdjson_inline error_code get(T& out) noexcept { + if (error()) { return error(); } + if constexpr (std::is_same_v) { + out = first; + } else { + SIMDJSON_TRY( first.get(out) ); + } + return SUCCESS; + } + +#if SIMDJSON_STATIC_REFLECTION + // TODO: move this code into object-inl.h + template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) + simdjson_warn_unused simdjson_inline error_code extract_into(T& out) noexcept { + if (error()) { return error(); } + return first.extract_into(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 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 */ +/* 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 lasx { +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; // - // Fields + // Iterator interface // - 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; + // Reads key and value, yielding them to the user. + // MUST ONLY BE CALLED ONCE PER ITERATION. + simdjson_inline simdjson_result 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 ',' + simdjson_inline object_iterator &operator++() noexcept; + +private: + /** + * 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; friend class object; - friend class array; - friend class field; - friend class token; - friend class document_stream; - friend class document_reference; }; +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +template<> +struct simdjson_result : public lasx::implementation_simdjson_result_base { +public: + 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; + + // + // Iterator interface + // + + // Reads key and value, yielding them to the user. + simdjson_inline simdjson_result 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 &) const noexcept; + // Assumes it's being compared with the end. true if depth >= iter->depth. + simdjson_inline bool operator!=(const simdjson_result &) const noexcept; + // Checks for ']' and ',' + simdjson_inline simdjson_result &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 */ +#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 { /** - * 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. + * 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. */ -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 get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; +inline simdjson_result 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 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 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 to_json_string(lasx::ondemand::array& x) noexcept; +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result x); +inline simdjson_result to_json_string(simdjson_result 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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) +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 lasx { 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::lasx::ondemand::value x); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::lasx::ondemand::array value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::lasx::ondemand::document& value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x); +#endif +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&& 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::lasx::ondemand::object value); +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); +#endif +}}} // namespace simdjson::lasx::ondemand + +#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H +/* end file simdjson/generic/ondemand/serialization.h for lasx */ + +// 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 */ +#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 +#include +#if SIMDJSON_STATIC_REFLECTION +#include +// #include // for std::define_static_string - header not available yet +#endif + +namespace simdjson { + +////////////////////////////// +// Number deserialization +////////////////////////////// + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits; + + uint64_t x; + SIMDJSON_TRY(val.get_uint64().get(x)); + if (x > (limits::max)()) { + return NUMBER_OUT_OF_RANGE; + } + out = static_cast(x); + return SUCCESS; +} + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + double x; + SIMDJSON_TRY(val.get_double().get(x)); + out = static_cast(x); + return SUCCESS; +} + +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { + using limits = std::numeric_limits; + + 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(x); + return SUCCESS; +} - simdjson_inline simdjson_result is_null() noexcept; - template - simdjson_inline simdjson_result get() & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(std::is_default_constructible::value, "Cannot initialize the specified type."); - T out{}; - SIMDJSON_TRY(get(out)); - return out; +////////////////////////////// +// 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; } - template - simdjson_inline simdjson_result get() && -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { - static_assert(!std::is_same::value && !std::is_same::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(*this).get(); + out = x[0]; + return SUCCESS; +} + +// any string-like type (can be constructed from std::string_view) +template +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { + 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>(). + */ +template +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t::value_type; + static_assert( + deserializable, + "The specified type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "The specified type inside the container must default constructible."); + lasx::ondemand::array arr; + if constexpr (std::is_same_v, lasx::ondemand::array>) { + arr = val; + } else { + SIMDJSON_TRY(val.get_array().get(arr)); } - /** - * 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 - simdjson_inline error_code get(T &out) & -#if SIMDJSON_SUPPORTS_DESERIALIZATION - noexcept(custom_deserializable ? nothrow_custom_deserializable : true) -#else - noexcept -#endif - { -#if SIMDJSON_SUPPORTS_DESERIALIZATION - if constexpr (custom_deserializable) { - return deserialize(*this, out); + for (auto v : arr) { + if constexpr (concepts::returns_reference) { + if (auto const err = v.get().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(out.pop_back()); + } + return err; + } } else { - static_assert(!sizeof(T), "The get 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 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(out); // to get rid of unused errors - return UNINITIALIZED; + value_type temp; + if (auto const err = v.get().get(temp); err) { + return err; + } + concepts::emplace_one(out, std::move(temp)); } -#else // SIMDJSON_SUPPORTS_DESERIALIZATION - // 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(out); // to get rid of unused errors - return UNINITIALIZED; -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION } + return SUCCESS; +} - /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; - simdjson_inline simdjson_result raw_json() noexcept; - simdjson_inline operator document&() const noexcept; -#if SIMDJSON_EXCEPTIONS - template - 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 count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; +/** + * We want to support std::map and std::unordered_map but only for + * string-keyed types. + */ + template +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { + using value_type = typename std::remove_cvref_t::mapped_type; + static_assert( + deserializable, + "The specified value type inside the container must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "The specified value type inside the container must default constructible."); + lasx::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().get(this_value)); + [[maybe_unused]] std::pair 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; +} - simdjson_inline simdjson_result current_location() noexcept; - simdjson_inline int32_t current_depth() const noexcept; - simdjson_inline bool is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; - simdjson_inline simdjson_result raw_json_token() noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +template +error_code tag_invoke(deserialize_tag, lasx::ondemand::object &obj, T &out) noexcept { + using value_type = typename std::remove_cvref_t::mapped_type; -private: - document *doc{nullptr}; -}; -} // namespace ondemand -} // namespace lasx -} // namespace simdjson + out.clear(); + for (auto field : obj) { + std::string_view key; + SIMDJSON_TRY(field.unescaped_key().get(key)); -namespace simdjson { + lasx::ondemand::value value_obj; + SIMDJSON_TRY(field.value().get(value_obj)); -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; + value_type this_value; + SIMDJSON_TRY(value_obj.get(this_value)); + out.emplace(typename T::key_type(key), std::move(this_value)); + } + return SUCCESS; +} - simdjson_inline simdjson_result get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; - simdjson_inline simdjson_result is_null() noexcept; +template +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 simdjson_inline simdjson_result get() & noexcept; - template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; +template +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 simdjson_inline error_code get(T &out) & noexcept; - template simdjson_inline error_code get(T &out) && noexcept; -#if SIMDJSON_EXCEPTIONS - template ::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 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 bool() noexcept(false); - simdjson_inline operator lasx::ondemand::value() noexcept(false); -#endif - simdjson_inline simdjson_result count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result 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 is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; - /** @copydoc simdjson_inline std::string_view document::raw_json_token() const noexcept */ - simdjson_inline simdjson_result raw_json_token() noexcept; +template +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); +} - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; -}; +/** + * 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 +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { + using element_type = typename std::remove_cvref_t::element_type; -} // namespace simdjson + // For better error messages, don't use these as constraints on + // the tag_invoke CPO. + static_assert( + deserializable, + "The specified type inside the unique_ptr must itself be deserializable"); + static_assert( + std::is_default_constructible_v, + "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(*ptr)); + out.reset(ptr); + return SUCCESS; +} +/** + * This CPO (Customization Point Object) will help deserialize into optional types. + */ +template +error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept(nothrow_deserializable::value_type, decltype(val)>) { + using value_type = typename std::remove_cvref_t::value_type; -namespace simdjson { + // 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; + } -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; + if (!out) { + out.emplace(); + } + SIMDJSON_TRY(val.template get(out.value())); + return SUCCESS; +} - simdjson_inline simdjson_result get_array() & noexcept; - simdjson_inline simdjson_result get_object() & noexcept; - simdjson_inline simdjson_result get_uint64() noexcept; - simdjson_inline simdjson_result get_uint64_in_string() noexcept; - simdjson_inline simdjson_result get_int64() noexcept; - simdjson_inline simdjson_result get_int64_in_string() noexcept; - simdjson_inline simdjson_result get_double() noexcept; - simdjson_inline simdjson_result get_double_in_string() noexcept; - simdjson_inline simdjson_result get_string(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code get_string(string_type& receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result get_wobbly_string() noexcept; - simdjson_inline simdjson_result get_raw_json_string() noexcept; - simdjson_inline simdjson_result get_bool() noexcept; - simdjson_inline simdjson_result get_value() noexcept; - simdjson_inline simdjson_result is_null() noexcept; - template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; +#if SIMDJSON_STATIC_REFLECTION - template simdjson_inline error_code get(T &out) & noexcept; - template simdjson_inline error_code get(T &out) && noexcept; -#if SIMDJSON_EXCEPTIONS - template - 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 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 bool() noexcept(false); - simdjson_inline operator lasx::ondemand::value() noexcept(false); + +template +constexpr bool user_defined_type = (std::is_class_v +&& !std::is_same_v && !std::is_same_v && !concepts::optional_type && +!concepts::appendable_containers); + + +template + requires(user_defined_type && std::is_class_v) +error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept { + lasx::ondemand::object obj; + if constexpr (std::is_same_v, lasx::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) { + // 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 + requires(std::is_enum_v) +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 int_val; + SIMDJSON_TRY(val.get(int_val)); + out = static_cast(int_val); + return SUCCESS; #endif - simdjson_inline simdjson_result count_elements() & noexcept; - simdjson_inline simdjson_result count_fields() & noexcept; - simdjson_inline simdjson_result at(size_t index) & noexcept; - simdjson_inline simdjson_result begin() & noexcept; - simdjson_inline simdjson_result end() & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(const char *key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](const char *key) & noexcept; - simdjson_result operator[](int) & noexcept = delete; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(const char *key) & noexcept; - simdjson_inline simdjson_result type() noexcept; - simdjson_inline simdjson_result is_scalar() noexcept; - simdjson_inline simdjson_result is_string() noexcept; - simdjson_inline simdjson_result current_location() noexcept; - simdjson_inline simdjson_result current_depth() const noexcept; - simdjson_inline simdjson_result is_negative() noexcept; - simdjson_inline simdjson_result is_integer() noexcept; - simdjson_inline simdjson_result get_number_type() noexcept; - simdjson_inline simdjson_result get_number() noexcept; - /** @copydoc simdjson_inline std::string_view document_reference::raw_json_token() const noexcept */ - simdjson_inline simdjson_result raw_json_token() noexcept; +} - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; -}; +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::unique_ptr &out) noexcept { + if (!out) { + out = std::make_unique(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} +template + requires(user_defined_type>) +error_code tag_invoke(deserialize_tag, simdjson_value &val, std::shared_ptr &out) noexcept { + if (!out) { + out = std::make_shared(); + if (!out) { + return MEMALLOC; + } + } + if (auto err = val.get(*out)) { + out.reset(); + return err; + } + return SUCCESS; +} -} // namespace simdjson +#endif // SIMDJSON_STATIC_REFLECTION -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_H +//////////////////////////////////////// +// Unique pointers +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} -/* 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 */ +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} -#ifdef SIMDJSON_THREADS_ENABLED -#include -#include -#include -#endif +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} -namespace simdjson { -namespace lasx { -namespace ondemand { +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} -#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(); +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_string().get(*out)); + return SUCCESS; +} -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(); +//////////////////////////////////////// +// Shared pointers +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_bool().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_int64().get(*out)); + return SUCCESS; +} + +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_uint64().get(*out)); + return SUCCESS; +} - 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}; +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_double().get(*out)); + return SUCCESS; +} - /** - * We lock using a mutex. - */ - std::mutex locking_mutex{}; - std::condition_variable cond_var{}; +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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(); + if (!out) { return MEMALLOC; } + } + SIMDJSON_TRY(val.get_string().get(*out)); + return SUCCESS; +} - 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. - * - * ```c++ - * 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; +//////////////////////////////////////// +// Explicit optional specializations +//////////////////////////////////////// - simdjson_inline ~document_stream() noexcept; +//////////////////////////////////////// +// Explicit smart pointer specializations for string and int types +//////////////////////////////////////// +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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; + } - /** - * Returns the input size in bytes. - */ - inline size_t size_in_bytes() const noexcept; + if (!out) { + out = std::make_unique(); + } + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + *out = std::string{str}; + return SUCCESS; +} - /** - * 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; +error_code tag_invoke(deserialize_tag, auto &val, std::shared_ptr &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; + } - class iterator { - public: - using value_type = simdjson_result; - using reference = simdjson_result; - using pointer = void; - using difference_type = std::ptrdiff_t; - using iterator_category = std::input_iterator_tag; + if (!out) { + out = std::make_shared(); + } + std::string_view str; + SIMDJSON_TRY(val.get_string().get(str)); + *out = std::string{str}; + return SUCCESS; +} - /** - * Default constructor. - */ - simdjson_inline iterator() noexcept; - /** - * 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; - /** - * @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; +error_code tag_invoke(deserialize_tag, auto &val, std::unique_ptr &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; + } - /** - * @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; + if (!out) { + out = std::make_unique(); + } + int64_t temp; + SIMDJSON_TRY(val.get_int64().get(temp)); + *out = static_cast(temp); + return SUCCESS; +} - /** - * Returns error of the stream (if any). - */ - inline error_code error() const noexcept; +} // namespace simdjson - 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; +#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H +#endif // SIMDJSON_SUPPORTS_CONCEPTS +/* end file simdjson/generic/ondemand/std_deserialize.h for lasx */ - friend class document; - friend class document_stream; - friend class json_iterator; - }; +// 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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H - /** - * 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; +/* 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 */ -private: +namespace simdjson { +namespace lasx { +namespace ondemand { - document_stream &operator=(const document_stream &) = delete; // Disallow copying - document_stream(const document_stream &other) = delete; // Disallow copying +// +// ### 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. +// - /** - * 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; +simdjson_inline array::array(const value_iterator &_iter) noexcept + : iter{_iter} +{ +} - /** - * Parse the first document in the buffer. Used by begin(), to handle allocation and - * initialization. - */ - inline void start() noexcept; +simdjson_inline simdjson_result 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::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::started(value_iterator &iter) noexcept { + bool has_value; + SIMDJSON_TRY(iter.started_array().get(has_value)); + return array(iter); +} - /** - * 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; +simdjson_inline simdjson_result 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::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; +} - /** Move the json_iterator of the document to the location of the next document in the stream. */ - inline void next_document() noexcept; +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); +} - /** Get the next document index. */ - inline size_t next_batch_start() const noexcept; +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_inline simdjson_result 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 - /** Pass the next batch through stage 1 with the given parser. */ - inline error_code run_stage1(ondemand::parser &p, size_t batch_start) noexcept; +simdjson_inline simdjson_result 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; +} - // 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{}; +inline simdjson_result array::reset() & noexcept { + return iter.reset_array(); +} - #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 simdjson_result 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; } - inline void load_from_stage1_thread() noexcept; + // 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; + } - /** Start a thread to run stage 1 on the next batch. */ - inline void start_stage1_thread() noexcept; + // 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" - /** Wait for the stage 1 thread to finish and capture the results. */ - inline void finish_stage1_thread() noexcept; + // 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; + } - /** 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 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{}; + // 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; +} - friend struct stage1_worker; - #endif // SIMDJSON_THREADS_ENABLED +inline simdjson_result 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); +} - friend class parser; - friend class document; - friend class json_iterator; - friend struct simdjson_result; - friend struct simdjson::internal::simdjson_result_base; -}; // document_stream +simdjson_inline simdjson_result 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 lasx } // namespace simdjson namespace simdjson { -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; -}; -} // namespace simdjson +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::array &&value +) noexcept + : implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept + : implementation_simdjson_result_base(error) +{ +} -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_H +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::is_empty() & noexcept { + if (error()) { return error(); } + return first.is_empty(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); +} +simdjson_inline simdjson_result simdjson_result::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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_ITERATOR_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_FIELD_H */ +/* 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/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): #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 lasx { namespace ondemand { -/** - * A JSON field (key/value pair) in an object. - * - * Returned from object iteration. - * - * Extends from std::pair so you can use C++ algorithms that rely on pairs. - */ -class field : public std::pair { -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 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 - 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; +simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} -protected: - simdjson_inline field(raw_json_string key, ondemand::value &&value) noexcept; - static simdjson_inline simdjson_result start(value_iterator &parent_iter) noexcept; - static simdjson_inline simdjson_result start(const value_iterator &parent_iter, raw_json_string key) noexcept; - friend struct simdjson_result; - friend class object_iterator; -}; +simdjson_inline simdjson_result array_iterator::operator*() noexcept { + 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 { + 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 lasx } // namespace simdjson namespace simdjson { -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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 unescaped_key(bool allow_replacement = false) noexcept; - template - simdjson_inline error_code unescaped_key(string_type &receiver, bool allow_replacement = false) noexcept; - simdjson_inline simdjson_result key() noexcept; - simdjson_inline simdjson_result key_raw_json_token() noexcept; - simdjson_inline simdjson_result escaped_key() noexcept; - simdjson_inline simdjson_result value() noexcept; -}; +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::array_iterator &&value +) noexcept + : lasx::implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); +} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : lasx::implementation_simdjson_result_base({}, error) +{ +} +simdjson_inline simdjson_result simdjson_result::operator*() noexcept { + if (error()) { return error(); } + return *first; +} +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return !error(); } + return first == other.first; +} +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; +} +simdjson_inline simdjson_result &simdjson_result::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::at_end() const noexcept { + return !first.iter.is_valid() || first.at_end(); +} } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_INL_H /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ -/* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_OBJECT_H */ +/* 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/implementation_simdjson_result_base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator.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 lasx { 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; - - simdjson_inline simdjson_result begin() noexcept; - simdjson_inline simdjson_result end() noexcept; - /** - * Look up a field by name on an object (order-sensitive). - * - * 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 }`: - * - * ```c++ - * 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 find_field(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; +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; +} - /** - * 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. - * - * It is the default, however, 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 find_field_unordered(std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - /** @overload simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; */ - simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; +simdjson_inline simdjson_result value::get_array() noexcept { + return array::start(iter); +} +simdjson_inline simdjson_result value::get_object() noexcept { + return object::start(iter); +} +simdjson_inline simdjson_result value::start_or_resume_object() noexcept { + if (iter.at_start()) { + return get_object(); + } else { + return object::resume(iter); + } +} - /** - * 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 at_pointer(std::string_view json_pointer) noexcept; +simdjson_inline simdjson_result value::get_raw_json_string() noexcept { + return iter.get_raw_json_string(); +} +simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept { + return iter.get_string(allow_replacement); +} +template +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 value::get_wobbly_string() noexcept { + return iter.get_wobbly_string(); +} +simdjson_inline simdjson_result value::get_double() noexcept { + return iter.get_double(); +} +simdjson_inline simdjson_result value::get_double_in_string() noexcept { + return iter.get_double_in_string(); +} +simdjson_inline simdjson_result value::get_uint64() noexcept { + return iter.get_uint64(); +} +simdjson_inline simdjson_result value::get_uint64_in_string() noexcept { + return iter.get_uint64_in_string(); +} +simdjson_inline simdjson_result value::get_int64() noexcept { + return iter.get_int64(); +} +simdjson_inline simdjson_result value::get_int64_in_string() noexcept { + return iter.get_int64_in_string(); +} +simdjson_inline simdjson_result value::get_bool() noexcept { + return iter.get_bool(); +} +simdjson_inline simdjson_result value::is_null() noexcept { + return iter.is_null(); +} - /** - * 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 at_path(std::string_view json_path) noexcept; +template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } - /** - * 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 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 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 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 raw_json() noexcept; -protected: - /** - * Go to the end of the object, no matter where you are right now. - */ - simdjson_inline error_code consume() noexcept; - static simdjson_inline simdjson_result start(value_iterator &iter) noexcept; - static simdjson_inline simdjson_result start_root(value_iterator &iter) noexcept; - static simdjson_inline simdjson_result started(value_iterator &iter) noexcept; - static simdjson_inline object resume(const value_iterator &iter) noexcept; - simdjson_inline object(const value_iterator &iter) noexcept; +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); } - simdjson_warn_unused simdjson_inline error_code find_field_raw(const std::string_view key) noexcept; +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline value::operator T() noexcept(false) { + return get(); +} +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 - value_iterator iter{}; +simdjson_inline simdjson_result value::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result value::end() & noexcept { + return {}; +} +simdjson_inline simdjson_result value::count_elements() & noexcept { + simdjson_result 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 value::count_fields() & noexcept { + simdjson_result answer; + auto a = get_object(); + answer = a.count_fields(); + iter.move_at_start(); + return answer; +} +simdjson_inline simdjson_result value::at(size_t index) noexcept { + auto a = get_array(); + return a.at(index); +} - friend class value; - friend class document; - friend struct simdjson_result; -}; +simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept { + return start_or_resume_object().find_field(key); +} +simdjson_inline simdjson_result value::find_field(const char *key) noexcept { + return start_or_resume_object().find_field(key); +} -} // namespace ondemand -} // namespace lasx -} // namespace simdjson +simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept { + return start_or_resume_object().find_field_unordered(key); +} -namespace simdjson { +simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result value::operator[](const char *key) noexcept { + return start_or_resume_object()[key]; +} -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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 value::type() noexcept { + return iter.type(); +} - simdjson_inline simdjson_result begin() noexcept; - simdjson_inline simdjson_result end() noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field(std::string_view key) && noexcept; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) & noexcept; - simdjson_inline simdjson_result find_field_unordered(std::string_view key) && noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) & noexcept; - simdjson_inline simdjson_result operator[](std::string_view key) && noexcept; - simdjson_inline simdjson_result at_pointer(std::string_view json_pointer) noexcept; - simdjson_inline simdjson_result at_path(std::string_view json_path) noexcept; +simdjson_inline simdjson_result 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)); +} - inline simdjson_result reset() noexcept; - inline simdjson_result is_empty() noexcept; - inline simdjson_result count_fields() & noexcept; - inline simdjson_result raw_json() noexcept; +simdjson_inline simdjson_result value::is_string() noexcept { + json_type this_type; + auto error = type().get(this_type); + if(error) { return error; } + return (this_type == json_type::string); +} -}; -} // namespace simdjson +simdjson_inline bool value::is_negative() noexcept { + return iter.is_negative(); +} -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_H +simdjson_inline simdjson_result value::is_integer() noexcept { + return iter.is_integer(); +} +simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept { + return iter.get_number_type(); +} +simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept { + return iter.get_number(); +} -/* 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 */ +simdjson_inline std::string_view value::raw_json_token() noexcept { + return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length()); +} -namespace simdjson { -namespace lasx { -namespace ondemand { +simdjson_inline simdjson_result 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(); + } +} -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; +simdjson_inline simdjson_result value::current_location() noexcept { + return iter.json_iter().current_location(); +} - // - // Iterator interface - // +simdjson_inline int32_t value::current_depth() const noexcept{ + return iter.json_iter().depth(); +} - // Reads key and value, yielding them to the user. - // MUST ONLY BE CALLED ONCE PER ITERATION. - simdjson_inline simdjson_result 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 ',' - simdjson_inline object_iterator &operator++() noexcept; +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; +} -private: - /** - * 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 simdjson_result 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 object_iterator(const value_iterator &iter) noexcept; - friend struct simdjson_result; - friend class object; -}; +simdjson_inline simdjson_result 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; + } +} } // namespace ondemand } // namespace lasx @@ -117666,1577 +143433,1813 @@ class object_iterator { namespace simdjson { -template<> -struct simdjson_result : public lasx::implementation_simdjson_result_base { -public: - 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; +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::value &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ +} +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ +} +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + if (error()) { return error(); } + return first.count_elements(); +} +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); +} +simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { + if (error()) { return error(); } + return first.at(index); +} +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + if (error()) { return error(); } + return {}; +} - // - // Iterator interface - // +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field(key); +} - // Reads key and value, yielding them to the user. - simdjson_inline simdjson_result 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 &) const noexcept; - // Assumes it's being compared with the end. true if depth >= iter->depth. - simdjson_inline bool operator!=(const simdjson_result &) const noexcept; - // Checks for ']' and ',' - simdjson_inline simdjson_result &operator++() noexcept; -}; +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} -} // namespace simdjson +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept { + if (error()) { return error(); } + return first[key]; +} -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H +simdjson_inline simdjson_result simdjson_result::get_array() noexcept { + if (error()) { return error(); } + return first.get_array(); +} +simdjson_inline simdjson_result simdjson_result::get_object() noexcept { + if (error()) { return error(); } + return first.get_object(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); +} +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); +} +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); +} +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); +} +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); +} +template +simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); +} +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); +} +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); +} +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); +} +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); +} -/* 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 */ +template<> simdjson_inline error_code simdjson_result::get(lasx::ondemand::value &out) noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} -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 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 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 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 to_json_string(lasx::ondemand::array& x) noexcept; -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -inline simdjson_result to_json_string(simdjson_result x); -} // namespace simdjson +template simdjson_inline simdjson_result simdjson_result::get() noexcept { + if (error()) { return error(); } + return first.get(); +} +template simdjson_inline error_code simdjson_result::get(T &out) noexcept { + if (error()) { return error(); } + return first.get(out); +} -/** - * 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 lasx { namespace ondemand { +template<> simdjson_inline simdjson_result simdjson_result::get() noexcept { + if (error()) { return error(); } + return std::move(first); +} -/** - * 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::lasx::ondemand::value x); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::lasx::ondemand::array value); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::lasx::ondemand::document& value); -#if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x); -#endif -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&& 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::lasx::ondemand::object value); +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); +} +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); +} +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); +} +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); +} +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); +} +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); +} #if SIMDJSON_EXCEPTIONS -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x); -#endif -}}} // namespace simdjson::lasx::ondemand - -#endif // SIMDJSON_GENERIC_ONDEMAND_SERIALIZATION_H -/* end file simdjson/generic/ondemand/serialization.h for lasx */ - -// 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 */ -#if SIMDJSON_SUPPORTS_DESERIALIZATION - -#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/array.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +template +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first.get(); +} +simdjson_inline simdjson_result::operator lasx::ondemand::array() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lasx::ondemand::object() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +#endif -#include -#include +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} -namespace simdjson { -template -constexpr bool require_custom_serialization = false; +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); +} -////////////////////////////// -// Number deserialization -////////////////////////////// +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - using limits = std::numeric_limits; +simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); +} - uint64_t x; - SIMDJSON_TRY(val.get_uint64().get(x)); - if (x > (limits::max)()) { - return NUMBER_OUT_OF_RANGE; +simdjson_inline simdjson_result simdjson_result::at_pointer( + std::string_view json_pointer) noexcept { + if (error()) { + return error(); } - out = static_cast(x); - return SUCCESS; + return first.at_pointer(json_pointer); } -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - double x; - SIMDJSON_TRY(val.get_double().get(x)); - out = static_cast(x); - return SUCCESS; +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); } -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, auto &val, T &out) noexcept { - using limits = std::numeric_limits; +} // namespace simdjson - 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(x); - return SUCCESS; -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(std::is_nothrow_constructible_v) { - std::string_view str; - SIMDJSON_TRY(val.get_string().get(str)); - out = T{str}; - return SUCCESS; -} +/* 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 lasx { +namespace ondemand { -/** - * 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>(). - */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { - using value_type = typename std::remove_cvref_t::value_type; - static_assert( - deserializable, - "The specified type inside the container must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the container must default constructible."); +simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept + : iter{std::forward(_iter)} +{ + logger::log_start_value(iter, "document"); +} - lasx::ondemand::array arr; - SIMDJSON_TRY(val.get_array().get(arr)); - for (auto v : arr) { - if constexpr (concepts::returns_reference) { - if (auto const err = v.get().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(out.pop_back()); - } - return err; - } - } else { - value_type temp; - if (auto const err = v.get().get(temp); err) { - return err; - } - concepts::emplace_one(out, std::move(temp)); - } - } - return SUCCESS; +simdjson_inline document document::start(json_iterator &&iter) noexcept { + return document(std::forward(iter)); } +inline void document::rewind() noexcept { + iter.rewind(); +} -/** - * We want to support std::map and std::unordered_map but only for - * string-keyed types. - */ - template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(false) { - using value_type = typename std::remove_cvref_t::mapped_type; - static_assert( - deserializable, - "The specified value type inside the container must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified value type inside the container must default constructible."); - lasx::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().get(this_value)); - [[maybe_unused]] std::pair 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; +inline std::string document::to_debug_string() noexcept { + return iter.to_string(); } +inline simdjson_result 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(); +} -/** - * 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 - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::element_type, ValT>) { - using element_type = typename std::remove_cvref_t::element_type; - // For better error messages, don't use these as constraints on - // the tag_invoke CPO. - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); +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 document::start_or_resume_object() noexcept { + if (iter.at_root()) { + return get_object(); + } else { + return object::resume(resume_value_iterator()); + } +} +simdjson_inline simdjson_result document::get_value() noexcept { + // Make sure we start any arrays or objects before returning, so that start_root_() + // gets called. - auto ptr = new (std::nothrow) element_type(); - if (ptr == nullptr) { - return MEMALLOC; + // 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_TRY(val.template get(*ptr)); - out.reset(ptr); - return SUCCESS; +} +simdjson_inline simdjson_result document::get_array() & noexcept { + auto value = get_root_value_iterator(); + return array::start_root(value); +} +simdjson_inline simdjson_result document::get_object() & noexcept { + auto value = get_root_value_iterator(); + return object::start_root(value); } /** - * This CPO (Customization Point Object) will help deserialize into optional types. + * 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. */ -template - requires(!require_custom_serialization) -error_code tag_invoke(deserialize_tag, ValT &val, T &out) noexcept(nothrow_deserializable::value_type, ValT>) { - using value_type = typename std::remove_cvref_t::value_type; - - static_assert( - deserializable, - "The specified type inside the unique_ptr must itself be deserializable"); - static_assert( - std::is_default_constructible_v, - "The specified type inside the unique_ptr must default constructible."); - if (!out) { - out.emplace(); - } - SIMDJSON_TRY(val.template get(out.value())); - return SUCCESS; +simdjson_inline simdjson_result document::get_uint64() noexcept { + return get_root_value_iterator().get_root_uint64(true); +} +simdjson_inline simdjson_result document::get_uint64_in_string() noexcept { + return get_root_value_iterator().get_root_uint64_in_string(true); +} +simdjson_inline simdjson_result document::get_int64() noexcept { + return get_root_value_iterator().get_root_int64(true); +} +simdjson_inline simdjson_result document::get_int64_in_string() noexcept { + return get_root_value_iterator().get_root_int64_in_string(true); +} +simdjson_inline simdjson_result document::get_double() noexcept { + return get_root_value_iterator().get_root_double(true); +} +simdjson_inline simdjson_result document::get_double_in_string() noexcept { + return get_root_value_iterator().get_root_double_in_string(true); +} +simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept { + return get_root_value_iterator().get_root_string(true, allow_replacement); +} +template +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 document::get_wobbly_string() noexcept { + return get_root_value_iterator().get_root_wobbly_string(true); +} +simdjson_inline simdjson_result document::get_raw_json_string() noexcept { + return get_root_value_iterator().get_root_raw_json_string(true); +} +simdjson_inline simdjson_result document::get_bool() noexcept { + return get_root_value_iterator().get_root_bool(true); +} +simdjson_inline simdjson_result document::is_null() noexcept { + return get_root_value_iterator().is_root_null(true); } -} // namespace simdjson - -#endif // SIMDJSON_ONDEMAND_DESERIALIZE_H -#endif // SIMDJSON_SUPPORTS_DESERIALIZATION -/* end file simdjson/generic/ondemand/std_deserialize.h for lasx */ - -// 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_ARRAY_INL_H +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -/* 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 */ +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); } -namespace simdjson { -namespace lasx { -namespace ondemand { +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } -// -// ### 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. -// +#if SIMDJSON_EXCEPTIONS +template +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } +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(); } -simdjson_inline array::array(const value_iterator &_iter) noexcept - : iter{_iter} -{ +#endif +simdjson_inline simdjson_result document::count_elements() & noexcept { + auto a = get_array(); + simdjson_result 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 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 document::count_fields() & noexcept { + auto a = get_object(); + simdjson_result 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 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 document::at(size_t index) & noexcept { + auto a = get_array(); + return a.at(index); } -simdjson_inline simdjson_result array::started(value_iterator &iter) noexcept { - bool has_value; - SIMDJSON_TRY(iter.started_array().get(has_value)); - return array(iter); +simdjson_inline simdjson_result document::begin() & noexcept { + return get_array().begin(); +} +simdjson_inline simdjson_result document::end() & noexcept { + return {}; } -simdjson_inline simdjson_result 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 document::find_field(std::string_view key) & noexcept { + return start_or_resume_object().find_field(key); } -simdjson_inline simdjson_result array::end() noexcept { - return array_iterator(iter); +simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { + return start_or_resume_object().find_field(key); } -simdjson_inline error_code array::consume() noexcept { - auto error = iter.json_iter().skip_child(iter.depth()-1); +simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { + return start_or_resume_object().find_field_unordered(key); +} +simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { + return start_or_resume_object()[key]; +} +simdjson_inline simdjson_result 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 array::raw_json() noexcept { - const uint8_t * starting_point{iter.peek_start()}; +simdjson_inline simdjson_result 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._json_iter->unsafe_pointer()}; - return std::string_view(reinterpret_cast(starting_point), size_t(final_point - starting_point)); + // 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(starting_point), size_t(final_point - starting_point)); +} + +simdjson_inline simdjson_result document::type() noexcept { + return get_root_value_iterator().type(); +} + +simdjson_inline simdjson_result 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 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_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline simdjson_result 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_inline bool document::is_negative() noexcept { + return get_root_value_iterator().is_root_negative(); } -SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline simdjson_result 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; +simdjson_inline simdjson_result document::is_integer() noexcept { + return get_root_value_iterator().is_root_integer(true); } -inline simdjson_result array::reset() & noexcept { - return iter.reset_array(); +simdjson_inline simdjson_result document::get_number_type() noexcept { + return get_root_value_iterator().get_root_number_type(true); } -inline simdjson_result 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; } +simdjson_inline simdjson_result document::get_number() noexcept { + return get_root_value_iterator().get_root_number(true); +} - // 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" +simdjson_inline simdjson_result document::raw_json_token() noexcept { + auto _iter = get_root_value_iterator(); + return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +} - // 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; +simdjson_inline simdjson_result 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(); } - - // If there is a /, we're not done yet, call recursively. - if (i < json_pointer.length()) { - child = child.at_pointer(json_pointer.substr(i)); + 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; } - return child; } -inline simdjson_result 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); +simdjson_inline simdjson_result 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 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; + + +#if SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION + +template + requires(std::is_class_v && (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) { + // 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 lasx } // namespace simdjson namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::array &&value -) noexcept - : implementation_simdjson_result_base( - std::forward(value) +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::document &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) ) { } -simdjson_inline simdjson_result::simdjson_result( +simdjson_inline simdjson_result::simdjson_result( error_code error -) noexcept - : implementation_simdjson_result_base(error) +) noexcept : + implementation_simdjson_result_base( + error + ) { } - -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::is_empty() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } - return first.is_empty(); + return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); -} -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } - return first.at_path(json_path); + first.rewind(); + return SUCCESS; } -simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & 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 */ -#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 lasx { -namespace ondemand { - -simdjson_inline array_iterator::array_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} - -simdjson_inline simdjson_result array_iterator::operator*() noexcept { - 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); + return first.begin(); } -simdjson_inline bool array_iterator::operator!=(const array_iterator &) const noexcept { - return iter.is_open(); +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; } -simdjson_inline array_iterator &array_iterator::operator++() noexcept { - 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 simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::array_iterator &&value -) noexcept - : lasx::implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); } -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : lasx::implementation_simdjson_result_base({}, error) -{ +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; } - -simdjson_inline simdjson_result simdjson_result::operator*() noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } - return *first; + return first[key]; } -simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return !error(); } - return first == other.first; +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } -simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); } -simdjson_inline simdjson_result &simdjson_result::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 simdjson_result simdjson_result::get_array() & noexcept { + if (error()) { return error(); } + return first.get_array(); } - -} // 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 */ -#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 lasx { -namespace ondemand { - -simdjson_inline value::value(const value_iterator &_iter) noexcept - : iter{_iter} -{ +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + if (error()) { return error(); } + return first.get_object(); } -simdjson_inline value value::start(const value_iterator &iter) noexcept { - return iter; +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { + if (error()) { return error(); } + return first.get_uint64(); } -simdjson_inline value value::resume(const value_iterator &iter) noexcept { - return iter; +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { + if (error()) { return error(); } + return first.get_uint64_in_string(); } - -simdjson_inline simdjson_result value::get_array() noexcept { - return array::start(iter); +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { + if (error()) { return error(); } + return first.get_int64(); } -simdjson_inline simdjson_result value::get_object() noexcept { - return object::start(iter); +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { + if (error()) { return error(); } + return first.get_int64_in_string(); } -simdjson_inline simdjson_result value::start_or_resume_object() noexcept { - if (iter.at_start()) { - return get_object(); - } else { - return object::resume(iter); - } +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { + if (error()) { return error(); } + return first.get_double(); } - -simdjson_inline simdjson_result value::get_raw_json_string() noexcept { - return iter.get_raw_json_string(); +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { + if (error()) { return error(); } + return first.get_double_in_string(); } -simdjson_inline simdjson_result value::get_string(bool allow_replacement) noexcept { - return iter.get_string(allow_replacement); +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(allow_replacement); } template -simdjson_inline error_code value::get_string(string_type& receiver, bool allow_replacement) noexcept { - return iter.get_string(receiver, allow_replacement); +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { + if (error()) { return error(); } + return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result value::get_wobbly_string() noexcept { - return iter.get_wobbly_string(); +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { + if (error()) { return error(); } + return first.get_wobbly_string(); } -simdjson_inline simdjson_result value::get_double() noexcept { - return iter.get_double(); +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { + if (error()) { return error(); } + return first.get_raw_json_string(); } -simdjson_inline simdjson_result value::get_double_in_string() noexcept { - return iter.get_double_in_string(); +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { + if (error()) { return error(); } + return first.get_bool(); } -simdjson_inline simdjson_result value::get_uint64() noexcept { - return iter.get_uint64(); +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { + if (error()) { return error(); } + return first.get_value(); } -simdjson_inline simdjson_result value::get_uint64_in_string() noexcept { - return iter.get_uint64_in_string(); +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { + if (error()) { return error(); } + return first.is_null(); } -simdjson_inline simdjson_result value::get_int64() noexcept { - return iter.get_int64(); + +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { + if (error()) { return error(); } + return first.get(); } -simdjson_inline simdjson_result value::get_int64_in_string() noexcept { - return iter.get_int64_in_string(); +template +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); } -simdjson_inline simdjson_result value::get_bool() noexcept { - return iter.get_bool(); +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { + if (error()) { return error(); } + return first.get(out); } -simdjson_inline simdjson_result value::is_null() noexcept { - return iter.is_null(); +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { + if (error()) { return error(); } + return std::forward(first).get(out); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_array(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_object(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_number(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_double(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result value::get() noexcept { return get_bool(); } - - -template<> simdjson_inline error_code value::get(array& out) noexcept { return get_array().get(out); } -template<> simdjson_inline error_code value::get(object& out) noexcept { return get_object().get(out); } -template<> simdjson_inline error_code value::get(raw_json_string& out) noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code value::get(std::string_view& out) noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code value::get(number& out) noexcept { return get_number().get(out); } -template<> simdjson_inline error_code value::get(double& out) noexcept { return get_double().get(out); } -template<> simdjson_inline error_code value::get(uint64_t& out) noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code value::get(int64_t& out) noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code value::get(bool& out) noexcept { return get_bool().get(out); } - -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline value::operator T() noexcept(false) { - return get(); -} -simdjson_inline value::operator array() noexcept(false) { - return get_array(); -} -simdjson_inline value::operator object() noexcept(false) { - return get_object(); +template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first); } -simdjson_inline value::operator uint64_t() noexcept(false) { - return get_uint64(); +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(lasx::ondemand::document &out) & noexcept = delete; +template<> simdjson_warn_unused simdjson_inline error_code simdjson_result::get(lasx::ondemand::document &out) && noexcept { + if (error()) { return error(); } + out = std::forward(first); + return SUCCESS; } -simdjson_inline value::operator int64_t() noexcept(false) { - return get_int64(); + +simdjson_inline simdjson_result simdjson_result::type() noexcept { + if (error()) { return error(); } + return first.type(); } -simdjson_inline value::operator double() noexcept(false) { - return get_double(); + +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { + if (error()) { return error(); } + return first.is_scalar(); } -simdjson_inline value::operator std::string_view() noexcept(false) { - return get_string(false); + +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { + if (error()) { return error(); } + return first.is_string(); } -simdjson_inline value::operator raw_json_string() noexcept(false) { - return get_raw_json_string(); + +simdjson_inline bool simdjson_result::is_negative() noexcept { + if (error()) { return error(); } + return first.is_negative(); } -simdjson_inline value::operator bool() noexcept(false) { - return get_bool(); + +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { + if (error()) { return error(); } + return first.is_integer(); } -#endif -simdjson_inline simdjson_result value::begin() & noexcept { - return get_array().begin(); +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { + if (error()) { return error(); } + return first.get_number_type(); } -simdjson_inline simdjson_result value::end() & noexcept { - return {}; + +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { + if (error()) { return error(); } + return first.get_number(); } -simdjson_inline simdjson_result value::count_elements() & noexcept { - simdjson_result 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; + + +#if SIMDJSON_EXCEPTIONS +template ::value == false>::type> +simdjson_inline simdjson_result::operator T() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result value::count_fields() & noexcept { - simdjson_result answer; - auto a = get_object(); - answer = a.count_fields(); - iter.move_at_start(); - return answer; +simdjson_inline simdjson_result::operator lasx::ondemand::array() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result value::at(size_t index) noexcept { - auto a = get_array(); - return a.at(index); +simdjson_inline simdjson_result::operator lasx::ondemand::object() & noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result value::find_field(std::string_view key) noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result value::find_field(const char *key) noexcept { - return start_or_resume_object().find_field(key); +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result value::find_field_unordered(std::string_view key) noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator double() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result value::find_field_unordered(const char *key) noexcept { - return start_or_resume_object().find_field_unordered(key); +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result value::operator[](std::string_view key) noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } -simdjson_inline simdjson_result value::operator[](const char *key) noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } - -simdjson_inline simdjson_result value::type() noexcept { - return iter.type(); +simdjson_inline simdjson_result::operator lasx::ondemand::value() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; } +#endif -simdjson_inline simdjson_result 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 simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); } -simdjson_inline simdjson_result 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 simdjson_result::at_end() const noexcept { + if (error()) { return error(); } + return first.at_end(); } -simdjson_inline bool value::is_negative() noexcept { - return iter.is_negative(); +simdjson_inline int32_t simdjson_result::current_depth() const noexcept { + if (error()) { return error(); } + return first.current_depth(); } -simdjson_inline simdjson_result value::is_integer() noexcept { - return iter.is_integer(); -} -simdjson_warn_unused simdjson_inline simdjson_result value::get_number_type() noexcept { - return iter.get_number_type(); -} -simdjson_warn_unused simdjson_inline simdjson_result value::get_number() noexcept { - return iter.get_number(); +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); } -simdjson_inline std::string_view value::raw_json_token() noexcept { - return std::string_view(reinterpret_cast(iter.peek_start()), iter.peek_start_length()); +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); } -simdjson_inline simdjson_result 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 simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { return error(); } + return first.at_path(json_path); } -simdjson_inline simdjson_result value::current_location() noexcept { - return iter.json_iter().current_location(); +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); } +#endif // SIMDJSON_STATIC_REFLECTION -simdjson_inline int32_t value::current_depth() const noexcept{ - return iter.json_iter().depth(); -} +} // namespace simdjson -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::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; - } -} +namespace simdjson { +namespace lasx { +namespace ondemand { -simdjson_inline simdjson_result 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; - } +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 document_reference::get_array() & noexcept { return doc->get_array(); } +simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } +simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } +simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } +simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } +simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } +template +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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } +simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } +simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } +simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } +simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } +template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } +#if SIMDJSON_EXCEPTIONS +template +simdjson_inline document_reference::operator T() noexcept(false) { return get(); } +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 document_reference::count_elements() & noexcept { return doc->count_elements(); } +simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } +simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } +simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } +simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } +simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } +simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } +simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } +simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } +simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } +simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } +simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } +simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } +simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } +simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } +simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } +simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } +simdjson_inline simdjson_result 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 + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code document_reference::extract_into(T& out) & noexcept { + return doc->extract_into(out); } - +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION } // namespace ondemand } // namespace lasx } // namespace simdjson + + namespace simdjson { +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::document_reference value, error_code error) + noexcept : implementation_simdjson_result_base(std::forward(value), error) {} -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::value &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { + +simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { if (error()) { return error(); } return first.count_elements(); } -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { if (error()) { return error(); } return first.count_fields(); } -simdjson_inline simdjson_result simdjson_result::at(size_t index) noexcept { +simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { if (error()) { return error(); } return first.at(index); } -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { +simdjson_inline error_code simdjson_result::rewind() noexcept { if (error()) { return error(); } - return {}; + first.rewind(); + return SUCCESS; } - -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) noexcept { +simdjson_inline simdjson_result simdjson_result::begin() & noexcept { if (error()) { return error(); } - return first.find_field(key); + return first.begin(); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) noexcept { - if (error()) { return error(); } - return first.find_field(key); +simdjson_inline simdjson_result simdjson_result::end() & noexcept { + return {}; } - -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) noexcept { +simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { if (error()) { return error(); } return first.find_field_unordered(key); } - -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { if (error()) { return error(); } return first[key]; } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) noexcept { +simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { if (error()) { return error(); } return first[key]; } - -simdjson_inline simdjson_result simdjson_result::get_array() noexcept { +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { if (error()) { return error(); } return first.get_array(); } -simdjson_inline simdjson_result simdjson_result::get_object() noexcept { +simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { if (error()) { return error(); } return first.get_object(); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { if (error()) { return error(); } return first.get_uint64(); } -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { if (error()) { return error(); } return first.get_uint64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { if (error()) { return error(); } return first.get_int64(); } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { if (error()) { return error(); } return first.get_int64_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double() noexcept { if (error()) { return error(); } return first.get_double(); } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { if (error()) { return error(); } return first.get_double_in_string(); } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { +simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(allow_replacement); } template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { +simdjson_warn_unused simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { if (error()) { return error(); } return first.get_string(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { if (error()) { return error(); } return first.get_wobbly_string(); } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { +simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { if (error()) { return error(); } return first.get_raw_json_string(); } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { +simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { if (error()) { return error(); } return first.get_bool(); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { +simdjson_inline simdjson_result simdjson_result::get_value() noexcept { if (error()) { return error(); } - return first.is_null(); + return first.get_value(); } - -template<> simdjson_inline error_code simdjson_result::get(lasx::ondemand::value &out) noexcept { +simdjson_inline simdjson_result simdjson_result::is_null() noexcept { if (error()) { return error(); } - out = first; - return SUCCESS; + return first.is_null(); } - -template simdjson_inline simdjson_result simdjson_result::get() noexcept { +template +simdjson_inline simdjson_result simdjson_result::get() & noexcept { if (error()) { return error(); } return first.get(); } -template simdjson_inline error_code simdjson_result::get(T &out) noexcept { +template +simdjson_inline simdjson_result simdjson_result::get() && noexcept { + if (error()) { return error(); } + return std::forward(first).get(); +} +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) & noexcept { if (error()) { return error(); } return first.get(out); } - -template<> simdjson_inline simdjson_result simdjson_result::get() noexcept { +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::get(T &out) && noexcept { if (error()) { return error(); } - return std::move(first); + return std::forward(first).get(out); } - -simdjson_inline simdjson_result simdjson_result::type() noexcept { +simdjson_inline simdjson_result simdjson_result::type() noexcept { if (error()) { return error(); } return first.type(); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { +simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { if (error()) { return error(); } return first.is_scalar(); } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { +simdjson_inline simdjson_result simdjson_result::is_string() noexcept { if (error()) { return error(); } return first.is_string(); } -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { +template <> +simdjson_warn_unused simdjson_inline error_code simdjson_result::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::get(lasx::ondemand::document_reference &out) && noexcept { + if (error()) { return error(); } + out = first; + return SUCCESS; +} +simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { if (error()) { return error(); } return first.is_negative(); } -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { +simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { if (error()) { return error(); } return first.is_integer(); } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { +simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { if (error()) { return error(); } return first.get_number_type(); } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { +simdjson_inline simdjson_result simdjson_result::get_number() noexcept { if (error()) { return error(); } return first.get_number(); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline simdjson_result::operator T() noexcept(false) { +simdjson_inline simdjson_result::operator T() noexcept(false) { + static_assert(std::is_same::value == false, "You should not call get when T is a document"); + static_assert(std::is_same::value == false, "You should not call get when T is a document"); if (error()) { throw simdjson_error(error()); } return first.get(); } -simdjson_inline simdjson_result::operator lasx::ondemand::array() noexcept(false) { +simdjson_inline simdjson_result::operator lasx::ondemand::array() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator lasx::ondemand::object() noexcept(false) { +simdjson_inline simdjson_result::operator lasx::ondemand::object() & noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { +simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { +simdjson_inline simdjson_result::operator int64_t() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator double() noexcept(false) { +simdjson_inline simdjson_result::operator double() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { +simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { +simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { +simdjson_inline simdjson_result::operator bool() noexcept(false) { + if (error()) { throw simdjson_error(error()); } + return first; +} +simdjson_inline simdjson_result::operator lasx::ondemand::value() noexcept(false) { if (error()) { throw simdjson_error(error()); } return first; } #endif -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +simdjson_inline simdjson_result simdjson_result::current_location() noexcept { + if (error()) { return error(); } + return first.current_location(); +} + +simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { + if (error()) { return error(); } + return first.raw_json_token(); +} + +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} + +simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} +#if SIMDJSON_STATIC_REFLECTION +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_inline error_code simdjson_result::extract_into(T& out) & noexcept { + if (error()) { return error(); } + return first.extract_into(out); +} +#endif // SIMDJSON_STATIC_REFLECTION +} // 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 */ +#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 +#include + +namespace simdjson { +namespace lasx { +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 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 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 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 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 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 simdjson_result simdjson_result::raw_json() noexcept { - if (error()) { return error(); } - return first.raw_json(); +simdjson_inline document_stream::~document_stream() noexcept +{ + #ifdef SIMDJSON_THREADS_ENABLED + worker.reset(); + #endif } -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +inline size_t document_stream::size_in_bytes() const noexcept { + return len; } -simdjson_inline simdjson_result simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); +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 simdjson_result simdjson_result::at_pointer( - std::string_view json_pointer) noexcept { - if (error()) { - return error(); - } - return first.at_pointer(json_pointer); +simdjson_inline document_stream::iterator::iterator() noexcept + : stream{nullptr}, finished{true} { } -simdjson_inline simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept + : stream{_stream}, finished{is_end} { } -} // namespace simdjson +simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { + return simdjson_result(stream->doc, stream->error); +} -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H +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; +} -/* 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 */ +simdjson_inline bool document_stream::iterator::at_end() const noexcept { + return finished; +} -namespace simdjson { -namespace lasx { -namespace ondemand { -simdjson_inline document::document(ondemand::json_iterator &&_iter) noexcept - : iter{std::forward(_iter)} -{ - logger::log_start_value(iter, "document"); +simdjson_inline bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { + return finished != other.finished; } -simdjson_inline document document::start(json_iterator &&iter) noexcept { - return document(std::forward(iter)); +simdjson_inline bool document_stream::iterator::operator==(const document_stream::iterator &other) const noexcept { + return finished == other.finished; } -inline void document::rewind() noexcept { - iter.rewind(); +simdjson_inline document_stream::iterator document_stream::begin() noexcept { + start(); + // If there are no documents, we're finished. + return iterator(this, error == EMPTY); } -inline std::string document::to_debug_string() noexcept { - return iter.to_string(); +simdjson_inline document_stream::iterator document_stream::end() noexcept { + return iterator(this, true); } -inline simdjson_result document::current_location() const noexcept { - return iter.current_location(); -} +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; -inline int32_t document::current_depth() const noexcept { - return iter.depth(); + #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 bool document::at_end() const noexcept { - return iter.at_end(); -} +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(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. + */ -inline bool document::is_alive() noexcept { - return iter.is_alive(); + if (error) { continue; } // If the error was EMPTY, we may want to load another batch. + doc_index = batch_start; + } + } } -simdjson_inline value_iterator document::resume_value_iterator() noexcept { - return value_iterator(&iter, 1, iter.root_position()); + +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(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(); } -simdjson_inline value_iterator document::get_root_value_iterator() noexcept { - return resume_value_iterator(); + +inline size_t document_stream::next_batch_start() const noexcept { + return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; } -simdjson_inline simdjson_result document::start_or_resume_object() noexcept { - if (iter.at_root()) { - return get_object(); + +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 object::resume(resume_value_iterator()); + return p.implementation->stage1(&buf[_batch_start], batch_size, stage1_mode::streaming_partial); } } -simdjson_inline simdjson_result document::get_value() noexcept { - // Make sure we start any arrays or objects before returning, so that start_root_() - // 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()); +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(stream->buf) + current_index(); + while(svlen > 1 && (std::isspace(start[svlen-1]) || start[svlen-1] == '\0')) { + svlen--; + } + return std::string_view(start, svlen); + } } - 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()); + cur_struct_index++; + } + + while (cur_struct_index <= static_cast(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; } - default: - // Unfortunately, scalar documents are a special case in simdjson and they cannot - // be safely converted to value instances. - return SCALAR_DOCUMENT_AS_VALUE; + if (depth == 0) { break; } + cur_struct_index++; } + + return std::string_view(reinterpret_cast(stream->buf) + current_index(), stream->parser->implementation->structural_indexes[cur_struct_index] - current_index() + stream->batch_start + 1);; } -simdjson_inline simdjson_result document::get_array() & noexcept { - auto value = get_root_value_iterator(); - return array::start_root(value); -} -simdjson_inline simdjson_result document::get_object() & noexcept { - auto value = get_root_value_iterator(); - return object::start_root(value); + +inline error_code document_stream::iterator::error() const noexcept { + return stream->error; } -/** - * 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. - */ +#ifdef SIMDJSON_THREADS_ENABLED -simdjson_inline simdjson_result document::get_uint64() noexcept { - return get_root_value_iterator().get_root_uint64(true); -} -simdjson_inline simdjson_result document::get_uint64_in_string() noexcept { - return get_root_value_iterator().get_root_uint64_in_string(true); -} -simdjson_inline simdjson_result document::get_int64() noexcept { - return get_root_value_iterator().get_root_int64(true); -} -simdjson_inline simdjson_result document::get_int64_in_string() noexcept { - return get_root_value_iterator().get_root_int64_in_string(true); -} -simdjson_inline simdjson_result document::get_double() noexcept { - return get_root_value_iterator().get_root_double(true); -} -simdjson_inline simdjson_result document::get_double_in_string() noexcept { - return get_root_value_iterator().get_root_double_in_string(true); -} -simdjson_inline simdjson_result document::get_string(bool allow_replacement) noexcept { - return get_root_value_iterator().get_root_string(true, allow_replacement); -} -template -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 document::get_wobbly_string() noexcept { - return get_root_value_iterator().get_root_wobbly_string(true); -} -simdjson_inline simdjson_result document::get_raw_json_string() noexcept { - return get_root_value_iterator().get_root_raw_json_string(true); -} -simdjson_inline simdjson_result document::get_bool() noexcept { - return get_root_value_iterator().get_root_bool(true); -} -simdjson_inline simdjson_result document::is_null() noexcept { - return get_root_value_iterator().is_root_null(true); +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(); + } } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } +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(); -template<> simdjson_inline error_code document::get(array& out) & noexcept { return get_array().get(out); } -template<> simdjson_inline error_code document::get(object& out) & noexcept { return get_object().get(out); } -template<> simdjson_inline error_code document::get(raw_json_string& out) & noexcept { return get_raw_json_string().get(out); } -template<> simdjson_inline error_code document::get(std::string_view& out) & noexcept { return get_string(false).get(out); } -template<> simdjson_inline error_code document::get(double& out) & noexcept { return get_double().get(out); } -template<> simdjson_inline error_code document::get(uint64_t& out) & noexcept { return get_uint64().get(out); } -template<> simdjson_inline error_code document::get(int64_t& out) & noexcept { return get_int64().get(out); } -template<> simdjson_inline error_code document::get(bool& out) & noexcept { return get_bool().get(out); } -template<> simdjson_inline error_code document::get(value& out) & noexcept { return get_value().get(out); } + worker->run(this, & this->stage1_thread_parser, _next_batch_start); +} -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +#endif // SIMDJSON_THREADS_ENABLED -#if SIMDJSON_EXCEPTIONS -template -simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } -template -simdjson_inline document::operator T() & noexcept(false) { return get(); } -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) { return get_string(false); } -simdjson_inline document::operator raw_json_string() noexcept(false) { 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(); } +} // namespace ondemand +} // namespace lasx +} // namespace simdjson -#endif -simdjson_inline simdjson_result document::count_elements() & noexcept { - auto a = get_array(); - simdjson_result 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 document::count_fields() & noexcept { - auto a = get_object(); - simdjson_result 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 document::at(size_t index) & noexcept { - auto a = get_array(); - return a.at(index); -} -simdjson_inline simdjson_result document::begin() & noexcept { - return get_array().begin(); -} -simdjson_inline simdjson_result document::end() & noexcept { - return {}; -} +namespace simdjson { -simdjson_inline simdjson_result document::find_field(std::string_view key) & noexcept { - return start_or_resume_object().find_field(key); -} -simdjson_inline simdjson_result document::find_field(const char *key) & noexcept { - return start_or_resume_object().find_field(key); -} -simdjson_inline simdjson_result document::find_field_unordered(std::string_view key) & noexcept { - return start_or_resume_object().find_field_unordered(key); -} -simdjson_inline simdjson_result document::find_field_unordered(const char *key) & noexcept { - return start_or_resume_object().find_field_unordered(key); -} -simdjson_inline simdjson_result document::operator[](std::string_view key) & noexcept { - return start_or_resume_object()[key]; -} -simdjson_inline simdjson_result document::operator[](const char *key) & noexcept { - return start_or_resume_object()[key]; +simdjson_inline simdjson_result::simdjson_result( + error_code error +) noexcept : + implementation_simdjson_result_base(error) +{ } - -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::simdjson_result( + lasx::ondemand::document_stream &&value +) noexcept : + implementation_simdjson_result_base( + std::forward(value) + ) +{ } -simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -simdjson_inline simdjson_result document::type() noexcept { - return get_root_value_iterator().type(); -} +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H -simdjson_inline simdjson_result 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)); +/* 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 lasx { +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() {} + +simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept + : std::pair(key, std::forward(value)) +{ } -simdjson_inline simdjson_result 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 simdjson_result 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 bool document::is_negative() noexcept { - return get_root_value_iterator().is_root_negative(); +simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { + return field(key, parent_iter.child()); } -simdjson_inline simdjson_result document::is_integer() noexcept { - return get_root_value_iterator().is_root_integer(true); +simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); + first.consume(); + return answer; } -simdjson_inline simdjson_result document::get_number_type() noexcept { - return get_root_value_iterator().get_root_number_type(true); +template +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 simdjson_result document::get_number() noexcept { - return get_root_value_iterator().get_root_number(true); +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 simdjson_result document::raw_json_token() noexcept { - auto _iter = get_root_value_iterator(); - return std::string_view(reinterpret_cast(_iter.peek_start()), _iter.peek_root_length()); +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(first.buf-1), second.iter._json_iter->token.peek(-1) - first.buf + 1); } -simdjson_inline simdjson_result 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 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(first.buf), end_quote - first.buf); } -simdjson_inline simdjson_result 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 value &field::value() & noexcept { + return second; +} + +simdjson_inline value field::value() && noexcept { + return std::forward(*this).second; } } // namespace ondemand @@ -119245,1061 +145248,1192 @@ simdjson_inline simdjson_result document::at_path(std::string_view json_p namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::document &&value +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::field &&value ) noexcept : - implementation_simdjson_result_base( - std::forward(value) + implementation_simdjson_result_base( + std::forward(value) ) { } -simdjson_inline simdjson_result::simdjson_result( +simdjson_inline simdjson_result::simdjson_result( error_code error ) noexcept : - implementation_simdjson_result_base( - error - ) + implementation_simdjson_result_base(error) { } -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + +simdjson_inline simdjson_result simdjson_result::key() noexcept { if (error()) { return error(); } - return first[key]; + return first.key(); } -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { + +simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { if (error()) { return error(); } - return first[key]; + return first.key_raw_json_token(); } -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + +simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { if (error()) { return error(); } - return first.find_field(key); + return first.escaped_key(); } -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { + +simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { if (error()) { return error(); } - return first.find_field(key); + return first.unescaped_key(allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { + +template +simdjson_warn_unused simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { if (error()) { return error(); } - return first.get_array(); + return first.unescaped_key(receiver, allow_replacement); } -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { + +simdjson_inline simdjson_result simdjson_result::value() noexcept { if (error()) { return error(); } - return first.get_object(); + return std::move(first.value()); } -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); + +} // 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 */ +#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 lasx { +namespace ondemand { + +simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept + : token(std::forward(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 simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); +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 simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); + +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 } -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); + +#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 } -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); +#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; } -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); + +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; } -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); + + +// 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"); } -template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); + +SIMDJSON_POP_DISABLE_WARNINGS + +simdjson_inline bool json_iterator::at_root() const noexcept { + return position() == root_position(); } -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); + +simdjson_inline bool json_iterator::is_single_token() const noexcept { + return parser->implementation->n_structural_indexes == 1; } -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); + +simdjson_inline bool json_iterator::streaming() const noexcept { + return _streaming; } -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); + +simdjson_inline token_position json_iterator::root_position() const noexcept { + return _root; } -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); + +simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { + SIMDJSON_ASSUME( _depth == 1 ); } -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); + +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 } -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); +simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { + assert_valid_position(token._position + required_tokens - 1); } -template -simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); + +simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { +#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 } -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); + +simdjson_inline bool json_iterator::at_end() const noexcept { + return position() == end_position(); } -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { - if (error()) { return error(); } - return std::forward(first).get(out); +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]; } -template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first); -} -template<> simdjson_inline error_code simdjson_result::get(lasx::ondemand::document &out) & noexcept = delete; -template<> simdjson_inline error_code simdjson_result::get(lasx::ondemand::document &out) && noexcept { - if (error()) { return error(); } - out = std::forward(first); - return SUCCESS; +inline std::string json_iterator::to_string() const noexcept { + if( !is_alive() ) { return "dead json_iterator instance"; } + const char * current_structural = reinterpret_cast(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(" ]"); } -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); +inline simdjson_result json_iterator::current_location() const noexcept { + if (!is_alive()) { // Unrecoverable error + if (!at_root()) { + return reinterpret_cast(token.peek(-1)); + } else { + return reinterpret_cast(token.peek()); + } + } + if (at_end()) { + return OUT_OF_BOUNDS; + } + return reinterpret_cast(token.peek()); } -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); +simdjson_inline bool json_iterator::is_alive() const noexcept { + return parser; } -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); +simdjson_inline void json_iterator::abandon() noexcept { + parser = nullptr; + _depth = 0; } -simdjson_inline bool simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); +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 simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { + // deliberately done without safety guard: + return token.peek(); } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); +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 simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +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); +} -#if SIMDJSON_EXCEPTIONS -template ::value == false>::type> -simdjson_inline simdjson_result::operator T() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +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 simdjson_result::operator lasx::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +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 simdjson_result::operator lasx::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; +simdjson_inline const uint8_t *json_iterator::peek_last() const noexcept { + return token.peek(last_position()); } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline depth_t json_iterator::depth() const noexcept { + return _depth; } -simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline uint8_t *&json_iterator::string_buf_loc() noexcept { + return _string_buf_loc; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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 simdjson_result::operator lasx::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline token_position json_iterator::position() const noexcept { + return token.position(); } + +simdjson_inline simdjson_result 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); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape(in, _string_buf_loc, allow_replacement); #endif +} +simdjson_inline simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { +#if SIMDJSON_DEVELOPMENT_CHECKS + auto result = parser->unescape_wobbly(in, _string_buf_loc); + SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); + return result; +#else + return parser->unescape_wobbly(in, _string_buf_loc); +#endif +} -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +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_inline bool simdjson_result::at_end() const noexcept { - if (error()) { return error(); } - return first.at_end(); +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 int32_t simdjson_result::current_depth() const noexcept { - if (error()) { return error(); } - return first.current_depth(); +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 simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +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; } } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +#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_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { return error(); } - return first.at_path(json_path); + +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 lasx } // namespace simdjson - namespace simdjson { -namespace lasx { -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 document_reference::get_array() & noexcept { return doc->get_array(); } -simdjson_inline simdjson_result 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 document_reference::get_uint64() noexcept { return doc->get_root_value_iterator().get_root_uint64(false); } -simdjson_inline simdjson_result document_reference::get_uint64_in_string() noexcept { return doc->get_root_value_iterator().get_root_uint64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_int64() noexcept { return doc->get_root_value_iterator().get_root_int64(false); } -simdjson_inline simdjson_result document_reference::get_int64_in_string() noexcept { return doc->get_root_value_iterator().get_root_int64_in_string(false); } -simdjson_inline simdjson_result document_reference::get_double() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_double_in_string() noexcept { return doc->get_root_value_iterator().get_root_double(false); } -simdjson_inline simdjson_result document_reference::get_string(bool allow_replacement) noexcept { return doc->get_root_value_iterator().get_root_string(false, allow_replacement); } -template -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 document_reference::get_wobbly_string() noexcept { return doc->get_root_value_iterator().get_root_wobbly_string(false); } -simdjson_inline simdjson_result document_reference::get_raw_json_string() noexcept { return doc->get_root_value_iterator().get_root_raw_json_string(false); } -simdjson_inline simdjson_result document_reference::get_bool() noexcept { return doc->get_root_value_iterator().get_root_bool(false); } -simdjson_inline simdjson_result document_reference::get_value() noexcept { return doc->get_value(); } -simdjson_inline simdjson_result document_reference::is_null() noexcept { return doc->get_root_value_iterator().is_root_null(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_array(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_object(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_double(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_uint64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_int64(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_bool(); } -template<> simdjson_inline simdjson_result document_reference::get() & noexcept { return get_value(); } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline document_reference::operator T() noexcept(false) { return get(); } -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 document_reference::count_elements() & noexcept { return doc->count_elements(); } -simdjson_inline simdjson_result document_reference::count_fields() & noexcept { return doc->count_fields(); } -simdjson_inline simdjson_result document_reference::at(size_t index) & noexcept { return doc->at(index); } -simdjson_inline simdjson_result document_reference::begin() & noexcept { return doc->begin(); } -simdjson_inline simdjson_result document_reference::end() & noexcept { return doc->end(); } -simdjson_inline simdjson_result document_reference::find_field(std::string_view key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::find_field(const char *key) & noexcept { return doc->find_field(key); } -simdjson_inline simdjson_result document_reference::operator[](std::string_view key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::operator[](const char *key) & noexcept { return (*doc)[key]; } -simdjson_inline simdjson_result document_reference::find_field_unordered(std::string_view key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::find_field_unordered(const char *key) & noexcept { return doc->find_field_unordered(key); } -simdjson_inline simdjson_result document_reference::type() noexcept { return doc->type(); } -simdjson_inline simdjson_result document_reference::is_scalar() noexcept { return doc->is_scalar(); } -simdjson_inline simdjson_result document_reference::is_string() noexcept { return doc->is_string(); } -simdjson_inline simdjson_result 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 document_reference::is_integer() noexcept { return doc->get_root_value_iterator().is_root_integer(false); } -simdjson_inline simdjson_result document_reference::get_number_type() noexcept { return doc->get_root_value_iterator().get_root_number_type(false); } -simdjson_inline simdjson_result document_reference::get_number() noexcept { return doc->get_root_value_iterator().get_root_number(false); } -simdjson_inline simdjson_result document_reference::raw_json_token() noexcept { return doc->raw_json_token(); } -simdjson_inline simdjson_result document_reference::at_pointer(std::string_view json_pointer) noexcept { return doc->at_pointer(json_pointer); } -simdjson_inline simdjson_result document_reference::at_path(std::string_view json_path) noexcept { return doc->at_path(json_path); } -simdjson_inline simdjson_result document_reference::raw_json() noexcept { return doc->raw_json();} -simdjson_inline document_reference::operator document&() const noexcept { return *doc; } +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::json_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} -} // namespace ondemand -} // namespace lasx } // 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 */ +#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 { -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::document_reference value, error_code error) - noexcept : implementation_simdjson_result_base(std::forward(value), error) {} - +namespace lasx { +namespace ondemand { -simdjson_inline simdjson_result simdjson_result::count_elements() & noexcept { - if (error()) { return error(); } - return first.count_elements(); -} -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} -simdjson_inline simdjson_result simdjson_result::at(size_t index) & noexcept { - if (error()) { return error(); } - return first.at(index); -} -simdjson_inline error_code simdjson_result::rewind() noexcept { - if (error()) { return error(); } - first.rewind(); - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::begin() & noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() & noexcept { - return {}; -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](const char *key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(const char *key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::get_array() & noexcept { - if (error()) { return error(); } - return first.get_array(); -} -simdjson_inline simdjson_result simdjson_result::get_object() & noexcept { - if (error()) { return error(); } - return first.get_object(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64() noexcept { - if (error()) { return error(); } - return first.get_uint64(); -} -simdjson_inline simdjson_result simdjson_result::get_uint64_in_string() noexcept { - if (error()) { return error(); } - return first.get_uint64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_int64() noexcept { - if (error()) { return error(); } - return first.get_int64(); -} -simdjson_inline simdjson_result simdjson_result::get_int64_in_string() noexcept { - if (error()) { return error(); } - return first.get_int64_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_double() noexcept { - if (error()) { return error(); } - return first.get_double(); -} -simdjson_inline simdjson_result simdjson_result::get_double_in_string() noexcept { - if (error()) { return error(); } - return first.get_double_in_string(); -} -simdjson_inline simdjson_result simdjson_result::get_string(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(allow_replacement); -} -template -simdjson_inline error_code simdjson_result::get_string(string_type& receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.get_string(receiver, allow_replacement); -} -simdjson_inline simdjson_result simdjson_result::get_wobbly_string() noexcept { - if (error()) { return error(); } - return first.get_wobbly_string(); -} -simdjson_inline simdjson_result simdjson_result::get_raw_json_string() noexcept { - if (error()) { return error(); } - return first.get_raw_json_string(); -} -simdjson_inline simdjson_result simdjson_result::get_bool() noexcept { - if (error()) { return error(); } - return first.get_bool(); -} -simdjson_inline simdjson_result simdjson_result::get_value() noexcept { - if (error()) { return error(); } - return first.get_value(); -} -simdjson_inline simdjson_result simdjson_result::is_null() noexcept { - if (error()) { return error(); } - return first.is_null(); -} -template -simdjson_inline simdjson_result simdjson_result::get() & noexcept { - if (error()) { return error(); } - return first.get(); -} -template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { - if (error()) { return error(); } - return std::forward(first).get(); -} -template -simdjson_inline error_code simdjson_result::get(T &out) & noexcept { - if (error()) { return error(); } - return first.get(out); -} -template -simdjson_inline error_code simdjson_result::get(T &out) && noexcept { - if (error()) { return error(); } - return std::forward(first).get(out); -} -simdjson_inline simdjson_result simdjson_result::type() noexcept { - if (error()) { return error(); } - return first.type(); -} -simdjson_inline simdjson_result simdjson_result::is_scalar() noexcept { - if (error()) { return error(); } - return first.is_scalar(); -} -simdjson_inline simdjson_result simdjson_result::is_string() noexcept { - if (error()) { return error(); } - return first.is_string(); -} -template <> -simdjson_inline error_code simdjson_result::get(lasx::ondemand::document_reference &out) & noexcept { - if (error()) { return error(); } - out = first; - return SUCCESS; -} -template <> -simdjson_inline error_code simdjson_result::get(lasx::ondemand::document_reference &out) && noexcept { - if (error()) { return error(); } - out = first; - return SUCCESS; -} -simdjson_inline simdjson_result simdjson_result::is_negative() noexcept { - if (error()) { return error(); } - return first.is_negative(); -} -simdjson_inline simdjson_result simdjson_result::is_integer() noexcept { - if (error()) { return error(); } - return first.is_integer(); +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; } -simdjson_inline simdjson_result simdjson_result::get_number_type() noexcept { - if (error()) { return error(); } - return first.get_number_type(); + +#if SIMDJSON_EXCEPTIONS +inline std::ostream& operator<<(std::ostream& out, simdjson_result &type) noexcept(false) { + return out << type.value(); } -simdjson_inline simdjson_result simdjson_result::get_number() noexcept { - if (error()) { return error(); } - return first.get_number(); +#endif + + + +simdjson_inline number_type number::get_number_type() const noexcept { + return type; } -#if SIMDJSON_EXCEPTIONS -template -simdjson_inline simdjson_result::operator T() noexcept(false) { - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - static_assert(std::is_same::value == false, "You should not call get when T is a document"); - if (error()) { throw simdjson_error(error()); } - return first.get(); + +simdjson_inline bool number::is_uint64() const noexcept { + return get_number_type() == number_type::unsigned_integer; } -simdjson_inline simdjson_result::operator lasx::ondemand::array() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline uint64_t number::get_uint64() const noexcept { + return payload.unsigned_integer; } -simdjson_inline simdjson_result::operator lasx::ondemand::object() & noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline number::operator uint64_t() const noexcept { + return get_uint64(); } -simdjson_inline simdjson_result::operator uint64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool number::is_int64() const noexcept { + return get_number_type() == number_type::signed_integer; } -simdjson_inline simdjson_result::operator int64_t() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline int64_t number::get_int64() const noexcept { + return payload.signed_integer; } -simdjson_inline simdjson_result::operator double() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline number::operator int64_t() const noexcept { + return get_int64(); } -simdjson_inline simdjson_result::operator std::string_view() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline bool number::is_double() const noexcept { + return get_number_type() == number_type::floating_point_number; } -simdjson_inline simdjson_result::operator lasx::ondemand::raw_json_string() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline double number::get_double() const noexcept { + return payload.floating_point_number; } -simdjson_inline simdjson_result::operator bool() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +simdjson_inline number::operator double() const noexcept { + return get_double(); } -simdjson_inline simdjson_result::operator lasx::ondemand::value() noexcept(false) { - if (error()) { throw simdjson_error(error()); } - return first; + +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); } -#endif -simdjson_inline simdjson_result simdjson_result::current_location() noexcept { - if (error()) { return error(); } - return first.current_location(); +simdjson_inline void number::append_s64(int64_t value) noexcept { + payload.signed_integer = value; + type = number_type::signed_integer; } -simdjson_inline simdjson_result simdjson_result::raw_json_token() noexcept { - if (error()) { return error(); } - return first.raw_json_token(); +simdjson_inline void number::append_u64(uint64_t value) noexcept { + payload.unsigned_integer = value; + type = number_type::unsigned_integer; } -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); +simdjson_inline void number::append_double(double value) noexcept { + payload.floating_point_number = value; + type = number_type::floating_point_number; } -simdjson_inline simdjson_result simdjson_result::at_path(std::string_view json_path) noexcept { - if (error()) { - return error(); - } - return first.at_path(json_path); +simdjson_inline void number::skip_double() noexcept { + type = number_type::floating_point_number; } +} // namespace ondemand +} // namespace lasx } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_STREAM_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::json_type &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_LOGGER_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): #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/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): #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 -#include +#include +#include namespace simdjson { namespace lasx { namespace ondemand { +namespace logger { -#ifdef SIMDJSON_THREADS_ENABLED +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. -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 lock(locking_mutex); - cond_var.wait(lock, [this]{return has_work == false;}); +// Helper to turn unprintable or newline characters into spaces +static inline char printable_char(char c) { + if (c >= 0x20) { + return c; + } else { + return ' '; + } } -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(); +template +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_s); + if (size <= 0) return std::string(); + std::unique_ptr 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); } -inline void stage1_worker::start_thread() { - std::unique_lock 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 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(); - } - } - ); +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; +} -inline void stage1_worker::stop_thread() { - std::unique_lock 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(); - } +static inline bool should_log(log_level level) +{ + return level >= log_threshold(); } -inline void stage1_worker::run(document_stream * ds, parser * stage1, size_t next_batch_start) { - std::unique_lock 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(); +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); } -#endif // SIMDJSON_THREADS_ENABLED +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); +} -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 +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++; } } -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 -{ +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); } -simdjson_inline document_stream::~document_stream() noexcept -{ - #ifdef SIMDJSON_THREADS_ENABLED - worker.reset(); - #endif +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 size_t document_stream::size_in_bytes() const noexcept { - return len; +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 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]; +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); } -simdjson_inline document_stream::iterator::iterator() noexcept - : stream{nullptr}, finished{true} { +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); } -simdjson_inline document_stream::iterator::iterator(document_stream* _stream, bool is_end) noexcept - : stream{_stream}, finished{is_end} { +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); } -simdjson_inline simdjson_result document_stream::iterator::operator*() noexcept { - return simdjson_result(stream->doc, stream->error); +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); } -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; +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 +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)...); +} + +template +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)...); + 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 lasx +} // 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 */ +#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): #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 */ +/* amalgamation skipped (editor-only): #endif */ +/* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ + +namespace simdjson { +namespace lasx { +namespace ondemand { + +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { + return find_field_unordered(key); +} +simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { + return std::forward(*this).find_field_unordered(key); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} +simdjson_inline simdjson_result 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(key.size()), key.data()); + return NO_SUCH_FIELD; + } + return value(iter.child()); +} + +simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.start_object().error() ); + return object(iter); +} +simdjson_inline simdjson_result 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 bool document_stream::iterator::operator!=(const document_stream::iterator &other) const noexcept { - return finished != other.finished; +simdjson_inline simdjson_result 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(starting_point), size_t(final_point - starting_point)); } -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 simdjson_result object::started(value_iterator &iter) noexcept { + SIMDJSON_TRY( iter.started_object().error() ); + return object(iter); } -simdjson_inline document_stream::iterator document_stream::end() noexcept { - return iterator(this, true); +simdjson_inline object object::resume(const value_iterator &iter) noexcept { + return iter; } -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; +simdjson_inline object::object(const value_iterator &_iter) noexcept + : iter{_iter} +{ +} - #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 +simdjson_inline simdjson_result 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::end() noexcept { + return object_iterator(iter); } -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]; +inline simdjson_result 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 child; - // Check if at end of structural indexes (i.e. at end of batch) - if(cur_struct_index >= static_cast(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); + // 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"); } - #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; - } + 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 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) { doc.iter.consume_character(','); } - // 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 simdjson_result 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 size_t document_stream::next_batch_start() const noexcept { - return batch_start + parser->implementation->structural_indexes[parser->implementation->n_structural_indexes]; +simdjson_inline simdjson_result 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; } -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 simdjson_result 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 size_t document_stream::iterator::current_index() const noexcept { - return stream->doc_index; +simdjson_inline simdjson_result object::reset() & noexcept { + return iter.reset_object(); } -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 SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION - // 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(stream->buf) + current_index(); - while(svlen > 1 && (std::isspace(start[svlen-1]) || start[svlen-1] == '\0')) { - svlen--; +template + requires(std::is_class_v && (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) { + // 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(); } - return std::string_view(start, svlen); + } else { + // For required fields (in the requested list), fail if missing + SIMDJSON_TRY((*this)[key].get(out.[:mem:])); } + } } - cur_struct_index++; - } - - while (cur_struct_index <= static_cast(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(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; + return SUCCESS; } -#ifdef SIMDJSON_THREADS_ENABLED +#endif // SIMDJSON_SUPPORTS_CONCEPTS && SIMDJSON_STATIC_REFLECTION -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; } +} // namespace ondemand +} // namespace lasx +} // namespace simdjson - // If there's anything left, start the stage 1 thread! - if (next_batch_start() < len) { - start_stage1_thread(); - } -} +namespace simdjson { -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(); +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::object &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} - worker->run(this, & this->stage1_thread_parser, _next_batch_start); +simdjson_inline simdjson_result simdjson_result::begin() noexcept { + if (error()) { return error(); } + return first.begin(); +} +simdjson_inline simdjson_result simdjson_result::end() noexcept { + if (error()) { return error(); } + return first.end(); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field_unordered(key); +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { + if (error()) { return error(); } + return first[key]; +} +simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first)[key]; +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { + if (error()) { return error(); } + return first.find_field(key); +} +simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { + if (error()) { return error(); } + return std::forward(first).find_field(key); } -#endif // SIMDJSON_THREADS_ENABLED +simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { + if (error()) { return error(); } + return first.at_pointer(json_pointer); +} -} // namespace ondemand -} // namespace lasx -} // namespace simdjson +simdjson_inline simdjson_result simdjson_result::at_path( + std::string_view json_path) noexcept { + if (error()) { + return error(); + } + return first.at_path(json_path); +} -namespace simdjson { +inline simdjson_result simdjson_result::reset() noexcept { + if (error()) { return error(); } + return first.reset(); +} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ +inline simdjson_result simdjson_result::is_empty() noexcept { + if (error()) { return error(); } + return first.is_empty(); } -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::document_stream &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ + +simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { + if (error()) { return error(); } + return first.count_fields(); } +simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { + if (error()) { return error(); } + return first.raw_json(); } -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_FIELD_INL_H +} // 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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_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): #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/field.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value-inl.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 */ @@ -120307,65 +146441,86 @@ namespace simdjson { namespace lasx { 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() {} - -simdjson_inline field::field(raw_json_string key, ondemand::value &&value) noexcept - : std::pair(key, std::forward(value)) -{ -} - -simdjson_inline simdjson_result 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); -} +// +// object_iterator +// -simdjson_inline simdjson_result field::start(const value_iterator &parent_iter, raw_json_string key) noexcept { - return field(key, parent_iter.child()); -} +simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept + : iter{_iter} +{} -simdjson_inline simdjson_warn_unused simdjson_result 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 answer = first.unescape(second.iter.json_iter(), allow_replacement); - first.consume(); - return answer; +simdjson_inline simdjson_result object_iterator::operator*() noexcept { + 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; } - -template -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 bool object_iterator::operator==(const object_iterator &other) const noexcept { + return !(*this != other); } - -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 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 { + // 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_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(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(first.buf), end_quote - first.buf); -} + simdjson_unused error_code error; + if ((error = iter.skip_child() )) { return *this; } -simdjson_inline value &field::value() & noexcept { - return second; + simdjson_unused bool has_value; + if ((error = iter.has_next_field().get(has_value) )) { return *this; }; + return *this; } +SIMDJSON_POP_DISABLE_WARNINGS -simdjson_inline value field::value() && noexcept { - return std::forward(*this).second; -} +// +// ### 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 lasx @@ -120373,486 +146528,471 @@ simdjson_inline value field::value() && noexcept { namespace simdjson { -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::field &&value -) noexcept : - implementation_simdjson_result_base( - std::forward(value) - ) -{ -} -simdjson_inline simdjson_result::simdjson_result( - error_code error -) noexcept : - implementation_simdjson_result_base(error) -{ -} - -simdjson_inline simdjson_result simdjson_result::key() noexcept { - if (error()) { return error(); } - return first.key(); +simdjson_inline simdjson_result::simdjson_result( + lasx::ondemand::object_iterator &&value +) noexcept + : implementation_simdjson_result_base(std::forward(value)) +{ + first.iter.assert_is_valid(); } - -simdjson_inline simdjson_result simdjson_result::key_raw_json_token() noexcept { - if (error()) { return error(); } - return first.key_raw_json_token(); +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base({}, error) +{ } -simdjson_inline simdjson_result simdjson_result::escaped_key() noexcept { +simdjson_inline simdjson_result simdjson_result::operator*() noexcept { if (error()) { return error(); } - return first.escaped_key(); + return *first; } - -simdjson_inline simdjson_result simdjson_result::unescaped_key(bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(allow_replacement); +// If we're iterating and there is an error, return the error once. +simdjson_inline bool simdjson_result::operator==(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return !error(); } + return first == other.first; } - -template -simdjson_inline error_code simdjson_result::unescaped_key(string_type &receiver, bool allow_replacement) noexcept { - if (error()) { return error(); } - return first.unescaped_key(receiver, allow_replacement); +// If we're iterating and there is an error, return the error once. +simdjson_inline bool simdjson_result::operator!=(const simdjson_result &other) const noexcept { + if (!first.iter.is_valid()) { return error(); } + return first != other.first; } - -simdjson_inline simdjson_result simdjson_result::value() noexcept { - if (error()) { return error(); } - return std::move(first.value()); +// Checks for ']' and ',' +simdjson_inline simdjson_result &simdjson_result::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_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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_ITERATOR_INL_H +#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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_PARSER_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): #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/json_iterator.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): #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 lasx { namespace ondemand { -simdjson_inline json_iterator::json_iterator(json_iterator &&other) noexcept - : token(std::forward(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 parser::parser(size_t max_capacity) noexcept + : _max_capacity{max_capacity} { } -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} +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; } -{ - logger::log_headers(); -#if SIMDJSON_CHECK_EOF - assert_more_tokens(); + // 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; } - -#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 +#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_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +#endif -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; -} +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } -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; - } + json.remove_utf8_bom(); + + // Allocate if needed + if (capacity() < json.length() || !string_buf) { + SIMDJSON_TRY( allocate(json.length(), max_depth()) ); } - return count == 0; + + // Run stage 1. + SIMDJSON_TRY( implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular) ); + return document::start({ reinterpret_cast(json.data()), this }); } +#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { + if (!json.has_sufficient_padding()) { return INSUFFICIENT_PADDING; } -// 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 + json.remove_utf8_bom(); - // 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; + // Allocate if needed + if (capacity() < json.length() || !string_buf) { + SIMDJSON_TRY( allocate(json.length(), max_depth()) ); } - // 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; - } + // Run stage 1. + const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); + if (err) { + if (err != UNCLOSED_STRING) + return err; } - - return report_error(TAPE_ERROR, "not enough close braces"); + return document::start({ reinterpret_cast(json.data()), this, true }); } +#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -SIMDJSON_POP_DISABLE_WARNINGS +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const char *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); +} -simdjson_inline bool json_iterator::at_root() const noexcept { - return position() == root_position(); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const uint8_t *json, size_t len, size_t allocated) & noexcept { + return iterate(padded_string_view(json, len, allocated)); } -simdjson_inline bool json_iterator::is_single_token() const noexcept { - return parser->implementation->n_structural_indexes == 1; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string_view json, size_t allocated) & noexcept { + return iterate(padded_string_view(json, allocated)); } -simdjson_inline bool json_iterator::streaming() const noexcept { - return _streaming; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { + return iterate(pad_with_reserve(json)); } -simdjson_inline token_position json_iterator::root_position() const noexcept { - return _root; +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { + return iterate(padded_string_view(json)); } -simdjson_inline void json_iterator::assert_at_document_depth() const noexcept { - SIMDJSON_ASSUME( _depth == 1 ); +simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + padded_string_view json = result.value_unsafe(); + return iterate(json); } -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_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { + // We don't presently have a way to temporarily get a const T& from a simdjson_result without throwing an exception + SIMDJSON_TRY( result.error() ); + const padded_string &json = result.value_unsafe(); + return iterate(json); } -simdjson_inline void json_iterator::assert_more_tokens(uint32_t required_tokens) const noexcept { - assert_valid_position(token._position + required_tokens - 1); +simdjson_warn_unused simdjson_inline simdjson_result 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(json.data()), json.length(), stage1_mode::regular) ); + return json_iterator(reinterpret_cast(json.data()), this); } -simdjson_inline void json_iterator::assert_valid_position(token_position position) const noexcept { -#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 +inline simdjson_result 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); } -simdjson_inline bool json_iterator::at_end() const noexcept { - return position() == end_position(); +inline simdjson_result 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(buf), len, batch_size, allow_comma_separated); } -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 simdjson_result 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 std::string json_iterator::to_string() const noexcept { - if( !is_alive() ) { return "dead json_iterator instance"; } - const char * current_structural = reinterpret_cast(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 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 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 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; } -inline simdjson_result json_iterator::current_location() const noexcept { - if (!is_alive()) { // Unrecoverable error - if (!at_root()) { - return reinterpret_cast(token.peek(-1)); - } else { - return reinterpret_cast(token.peek()); - } - } - if (at_end()) { - return OUT_OF_BOUNDS; +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; } - return reinterpret_cast(token.peek()); } -simdjson_inline bool json_iterator::is_alive() const noexcept { - return parser; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -simdjson_inline void json_iterator::abandon() noexcept { - parser = nullptr; - _depth = 0; +simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); + dst = end; + return result; } -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 simdjson_warn_unused ondemand::parser& parser::get_parser() { + return *parser::get_parser_instance(); } -simdjson_inline const uint8_t *json_iterator::unsafe_pointer() const noexcept { - // deliberately done without safety guard: - return token.peek(); +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 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 simdjson_warn_unused std::unique_ptr& parser::get_parser_instance() { + std::unique_ptr& parser_instance = get_threadlocal_parser_if_exists(); + if (!parser_instance) { + parser_instance.reset(new ondemand::parser()); + } + return parser_instance; } -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 simdjson_warn_unused std::unique_ptr& 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 parser_instance = nullptr; + return parser_instance; } -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); -} +} // namespace ondemand +} // namespace lasx +} // namespace simdjson -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()); +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::parser &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#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 lasx { +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(buf); } -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 char raw_json_string::operator[](size_t i) const noexcept { + return reinterpret_cast(buf)[i]; } -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 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 depth_t json_iterator::depth() const noexcept { - return _depth; +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 uint8_t *&json_iterator::string_buf_loc() noexcept { - return _string_buf_loc; -} -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 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 token_position json_iterator::position() const noexcept { - return token.position(); +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 simdjson_result 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); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - return result; -#else - return parser->unescape(in, _string_buf_loc, allow_replacement); -#endif +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 simdjson_result json_iterator::unescape_wobbly(raw_json_string in) noexcept { -#if SIMDJSON_DEVELOPMENT_CHECKS - auto result = parser->unescape_wobbly(in, _string_buf_loc); - SIMDJSON_ASSUME(!parser->string_buffer_overflow(_string_buf_loc)); - 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_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 error_code json_iterator::consume_character(char c) noexcept { - if (*peek() == c) { - return_current_and_advance(); - return SUCCESS; +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; + } } - return TAPE_ERROR; + if(r[pos] != '"') { return false; } + return true; } -#if SIMDJSON_DEVELOPMENT_CHECKS +simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { + return a.unsafe_is_equal(c); +} -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_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { + return a == c; } -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; } +simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { + return !(a == c); } -#endif +simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { + return !(a == c); +} -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_inline simdjson_warn_unused simdjson_result 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 raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { + return iter.unescape_wobbly(*this); +} -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); +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++; } - return true; } } // namespace ondemand @@ -120861,2634 +147001,3502 @@ simdjson_warn_unused simdjson_inline bool json_iterator::copy_to_buffer(const ui namespace simdjson { -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::json_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(error) {} +simdjson_inline simdjson_result simdjson_result::raw() const noexcept { + if (error()) { return error(); } + return first.raw(); +} +simdjson_inline char simdjson_result::operator[](size_t i) const noexcept { + if (error()) { return error(); } + return first[i]; +} +simdjson_inline simdjson_warn_unused simdjson_result simdjson_result::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 simdjson_result::unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept { + if (error()) { return error(); } + return first.unescape_wobbly(iter); +} } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_JSON_TYPE_INL_H +#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_JSON_TYPE_INL_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/implementation_simdjson_result_base-inl.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 { -namespace lasx { -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 &type) noexcept(false) { - return out << type.value(); +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)); } -#endif - -simdjson_inline number_type number::get_number_type() const noexcept { - return type; +inline simdjson_result 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); } -simdjson_inline bool number::is_uint64() const noexcept { - return get_number_type() == number_type::unsigned_integer; +inline simdjson_result 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); } -simdjson_inline uint64_t number::get_uint64() const noexcept { - return payload.unsigned_integer; +inline simdjson_result 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()); + } } -simdjson_inline number::operator uint64_t() const noexcept { - return get_uint64(); +inline simdjson_result 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); } -simdjson_inline bool number::is_int64() const noexcept { - return get_number_type() == number_type::signed_integer; +inline simdjson_result 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); } -simdjson_inline int64_t number::get_int64() const noexcept { - return payload.signed_integer; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline number::operator int64_t() const noexcept { - return get_int64(); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline bool number::is_double() const noexcept { - return get_number_type() == number_type::floating_point_number; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline double number::get_double() const noexcept { - return payload.floating_point_number; +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } -simdjson_inline number::operator double() const noexcept { - return get_double(); +inline simdjson_result to_json_string(simdjson_result x) { + if (x.error()) { return x.error(); } + return to_json_string(x.value_unsafe()); } +} // namespace simdjson -simdjson_inline double number::as_double() const noexcept { - if(is_double()) { - return payload.floating_point_number; +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); } - if(is_int64()) { - return double(payload.signed_integer); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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); } - return double(payload.unsigned_integer); } +#endif -simdjson_inline void number::append_s64(int64_t value) noexcept { - payload.signed_integer = value; - type = number_type::signed_integer; +#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); + } } - -simdjson_inline void number::append_u64(uint64_t value) noexcept { - payload.unsigned_integer = value; - type = number_type::unsigned_integer; +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); } - -simdjson_inline void number::append_double(double value) noexcept { - payload.floating_point_number = value; - type = number_type::floating_point_number; +#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 -simdjson_inline void number::skip_double() noexcept { - type = number_type::floating_point_number; +#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); + } } - -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::json_type &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 -#include - -namespace simdjson { -namespace lasx { -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; +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 { - return ' '; + throw simdjson::simdjson_error(error); } } - -template -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_s); - if (size <= 0) return std::string(); - std::unique_ptr 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); +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { + if (x.error()) { throw simdjson::simdjson_error(x.error()); } + return (out << x.value()); +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& 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 -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; +#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); + } +} +inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result 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::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::lasx::ondemand + +#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 */ +#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 */ -static inline log_level log_threshold() -{ - static log_level threshold = get_log_level_from_env(); - return threshold; -} +namespace simdjson { +namespace lasx { +namespace ondemand { -static inline bool should_log(log_level level) +simdjson_inline token_iterator::token_iterator( + const uint8_t *_buf, + token_position position +) noexcept : buf{_buf}, _position{position} { - 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); +simdjson_inline uint32_t token_iterator::current_offset() const noexcept { + return *(_position); } -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); + +simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { + return &buf[*(_position++)]; } -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++; } +simdjson_inline const uint8_t *token_iterator::peek(token_position position) const noexcept { + return &buf[*position]; } -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++; } +simdjson_inline uint32_t token_iterator::peek_index(token_position position) const noexcept { + return *position; } - -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); +simdjson_inline uint32_t token_iterator::peek_length(token_position position) const noexcept { + return *(position+1) - *position; } -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); +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); } -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); +simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { + return &buf[*(_position+delta)]; } - -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); +simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { + return *(_position+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); +simdjson_inline uint32_t token_iterator::peek_length(int32_t delta) const noexcept { + return *(_position+delta+1) - *(_position+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); +simdjson_inline token_position token_iterator::position() const noexcept { + return _position; } - -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); +simdjson_inline void token_iterator::set_position(token_position target_position) noexcept { + _position = target_position; } -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); +simdjson_inline bool token_iterator::operator==(const token_iterator &other) const noexcept { + return _position == other._position; } - -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); - } - } +simdjson_inline bool token_iterator::operator!=(const token_iterator &other) const noexcept { + return _position != other._position; } - -template -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)...); +simdjson_inline bool token_iterator::operator>(const token_iterator &other) const noexcept { + return _position > other._position; } - -template -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)...); - 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); - } - } +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 logger } // namespace ondemand } // namespace lasx } // 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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_INL_H +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::token_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 */ +#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_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): #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/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/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-inl.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 lasx { namespace ondemand { -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) & noexcept { - return find_field_unordered(key); -} -simdjson_inline simdjson_result object::operator[](const std::string_view key) && noexcept { - return std::forward(*this).find_field_unordered(key); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} -simdjson_inline simdjson_result 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(key.size()), key.data()); - return NO_SUCH_FIELD; - } - return value(iter.child()); -} - -simdjson_inline simdjson_result object::start(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_object().error() ); - return object(iter); -} -simdjson_inline simdjson_result object::start_root(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.start_root_object().error() ); - return object(iter); -} -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 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(starting_point), size_t(final_point - starting_point)); -} - -simdjson_inline simdjson_result object::started(value_iterator &iter) noexcept { - SIMDJSON_TRY( iter.started_object().error() ); - return object(iter); +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_inline object object::resume(const value_iterator &iter) noexcept { - return iter; +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_object(); } -simdjson_inline object::object(const value_iterator &_iter) noexcept - : iter{_iter} -{ +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { + SIMDJSON_TRY( start_container('{', "Not an object", "object") ); + return started_root_object(); } -simdjson_inline simdjson_result object::begin() noexcept { +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept { + assert_at_container_start(); #if SIMDJSON_DEVELOPMENT_CHECKS - if (!iter.is_at_iterator_start()) { return OUT_OF_ORDER_ITERATION; } + _json_iter->set_start_position(_depth, start_position()); #endif - return object_iterator(iter); -} -simdjson_inline simdjson_result object::end() noexcept { - return object_iterator(iter); -} - -inline simdjson_result 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 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)); + if (*_json_iter->peek() == '}') { + logger::log_value(*_json_iter, "empty object"); + _json_iter->return_current_and_advance(); + SIMDJSON_TRY(end_container()); + return false; } - return child; + return true; } -inline simdjson_result 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; +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 at_pointer(json_pointer); -} - -simdjson_inline simdjson_result 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; + return SUCCESS; } -simdjson_inline simdjson_result object::is_empty() & noexcept { - bool is_not_empty; - auto error = iter.reset_object().get(is_not_empty); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { + auto error = check_root_object(); if(error) { return error; } - return !is_not_empty; + return started_object(); } -simdjson_inline simdjson_result object::reset() & noexcept { - return iter.reset_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; } -} // namespace ondemand -} // namespace lasx -} // namespace simdjson +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_field() noexcept { + assert_at_next(); -namespace simdjson { + // 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_inline simdjson_result::simdjson_result(lasx::ondemand::object &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result simdjson_result::begin() noexcept { - if (error()) { return error(); } - return first.begin(); -} -simdjson_inline simdjson_result simdjson_result::end() noexcept { - if (error()) { return error(); } - return first.end(); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::find_field_unordered(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field_unordered(key); -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) & noexcept { - if (error()) { return error(); } - return first[key]; -} -simdjson_inline simdjson_result simdjson_result::operator[](std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first)[key]; -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) & noexcept { - if (error()) { return error(); } - return first.find_field(key); -} -simdjson_inline simdjson_result simdjson_result::find_field(std::string_view key) && noexcept { - if (error()) { return error(); } - return std::forward(first).find_field(key); -} + // + // 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; -simdjson_inline simdjson_result simdjson_result::at_pointer(std::string_view json_pointer) noexcept { - if (error()) { return error(); } - return first.at_pointer(json_pointer); -} + // 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; + } -simdjson_inline simdjson_result simdjson_result::at_path( - std::string_view json_path) noexcept { - if (error()) { - return error(); + // 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; } } - return first.at_path(json_path); -} -inline simdjson_result simdjson_result::reset() noexcept { - if (error()) { return error(); } - return first.reset(); + // If the loop ended, we're out of fields to look at. + return false; } -inline simdjson_result simdjson_result::is_empty() noexcept { - if (error()) { return error(); } - return first.is_empty(); -} +SIMDJSON_PUSH_DISABLE_WARNINGS +SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING +simdjson_warn_unused simdjson_inline simdjson_result 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; -simdjson_inline simdjson_result simdjson_result::count_fields() & noexcept { - if (error()) { return error(); } - return first.count_fields(); -} + // 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(); -simdjson_inline simdjson_result simdjson_result::raw_json() noexcept { - if (error()) { return error(); } - return first.raw_json(); -} -} // namespace simdjson + // 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; -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_OBJECT_ITERATOR_INL_H + // 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()) { -/* 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 */ +#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 + } -namespace simdjson { -namespace lasx { -namespace ondemand { + // 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 -// -// object_iterator -// + // 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; } -simdjson_inline object_iterator::object_iterator(const value_iterator &_iter) noexcept - : iter{_iter} -{} + // 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; + } -simdjson_inline simdjson_result object_iterator::operator*() noexcept { - 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(); -} + // 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; } -SIMDJSON_PUSH_DISABLE_WARNINGS -SIMDJSON_DISABLE_STRICT_OVERFLOW_WARNING -simdjson_inline object_iterator &object_iterator::operator++() noexcept { - // 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 + // 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 - simdjson_unused error_code error; - if ((error = iter.skip_child() )) { return *this; } + // 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); - simdjson_unused bool has_value; - if ((error = iter.has_next_field().get(has_value) )) { return *this; }; - return *this; + // 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 -// -// ### 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. -// +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { + assert_at_next(); -} // namespace ondemand -} // namespace lasx -} // namespace simdjson + 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); +} -namespace simdjson { +simdjson_warn_unused simdjson_inline error_code value_iterator::field_value() noexcept { + assert_at_next(); -simdjson_inline simdjson_result::simdjson_result( - lasx::ondemand::object_iterator &&value -) noexcept - : implementation_simdjson_result_base(std::forward(value)) -{ - first.iter.assert_is_valid(); -} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base({}, error) -{ + 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_inline simdjson_result simdjson_result::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::operator==(const simdjson_result &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::operator!=(const simdjson_result &other) const noexcept { - if (!first.iter.is_valid()) { return error(); } - return first != other.first; -} -// Checks for ']' and ',' -simdjson_inline simdjson_result &simdjson_result::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_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_array(); } -} // 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 */ -#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 lasx { -namespace ondemand { - -simdjson_inline parser::parser(size_t max_capacity) noexcept - : _max_capacity{max_capacity} { +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { + SIMDJSON_TRY( start_container('[', "Not an array", "array") ); + return started_root_array(); } -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; } +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; +} - // 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) ); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - _capacity = new_capacity; - _max_depth = new_max_depth; - return SUCCESS; -} + _json_iter->descend_to(depth()+1); #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()); -} + _json_iter->set_start_position(_depth, start_position()); #endif + return true; +} -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_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(json.data()), json.length(), stage1_mode::regular) ); - return document::start({ reinterpret_cast(json.data()), this }); +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; } -#ifdef SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate_allow_incomplete_json(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_PADDING) { return INSUFFICIENT_PADDING; } - - json.remove_utf8_bom(); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { + auto error = check_root_array(); + if (error) { return error; } + return started_array(); +} - // Allocate if needed - if (capacity() < json.length() || !string_buf) { - SIMDJSON_TRY( allocate(json.length(), max_depth()) ); - } +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::has_next_element() noexcept { + assert_at_next(); - // Run stage 1. - const simdjson::error_code err = implementation->stage1(reinterpret_cast(json.data()), json.length(), stage1_mode::regular); - if (err) { - if (err != UNCLOSED_STRING) - return err; + 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"); } - return document::start({ reinterpret_cast(json.data()), this, true }); } -#endif // SIMDJSON_EXPERIMENTAL_ALLOW_INCOMPLETE_JSON -simdjson_warn_unused simdjson_inline simdjson_result 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 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(!not_true); } - -simdjson_warn_unused simdjson_inline simdjson_result 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 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 parser::iterate(std::string_view json, size_t allocated) & noexcept { - return iterate(padded_string_view(json, allocated)); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { + return get_raw_json_string().unescape(json_iter(), allow_replacement); } - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(std::string &json) & noexcept { - if(json.capacity() - json.size() < SIMDJSON_PADDING) { - json.reserve(json.size() + SIMDJSON_PADDING); - } - return iterate(padded_string_view(json)); +template +simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { + std::string_view content; + auto err = get_string(allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; } - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const std::string &json) & noexcept { - return iterate(padded_string_view(json)); +simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { + return get_raw_json_string().unescape_wobbly(json_iter()); } - -simdjson_warn_unused simdjson_inline simdjson_result parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate(const simdjson_result &result) & noexcept { - // We don't presently have a way to temporarily get a const T& from a simdjson_result 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 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 parser::iterate_raw(padded_string_view json) & noexcept { - if (json.padding() < SIMDJSON_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(json.data()), json.length(), stage1_mode::regular) ); - return json_iterator(reinterpret_cast(json.data()), this); +simdjson_warn_unused simdjson_inline simdjson_result 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; } - -inline simdjson_result parser::iterate_many(const uint8_t *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - 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); +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const char *buf, size_t len, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(reinterpret_cast(buf), len, batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const std::string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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; } -inline simdjson_result parser::iterate_many(const padded_string &s, size_t batch_size, bool allow_comma_separated) noexcept { - return iterate_many(s.data(), s.length(), batch_size, allow_comma_separated); +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::capacity() const noexcept { - return _capacity; +simdjson_warn_unused simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_capacity() const noexcept { - return _max_capacity; +simdjson_inline simdjson_result 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_pure simdjson_inline size_t parser::max_depth() const noexcept { - return _max_depth; +simdjson_inline bool value_iterator::is_negative() noexcept { + return numberparsing::is_negative(peek_non_root_scalar("numbersign")); } - -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 bool value_iterator::is_root_negative() noexcept { + return numberparsing::is_negative(peek_root_scalar("numbersign")); } - -simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; - return result; +simdjson_inline simdjson_result value_iterator::is_integer() noexcept { + return numberparsing::is_integer(peek_non_root_scalar("integer")); } - -simdjson_inline simdjson_warn_unused simdjson_result 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(dst), end-dst); - dst = end; - return result; +simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { + return numberparsing::get_number_type(peek_non_root_scalar("integer")); +} +simdjson_inline simdjson_result 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; } -} // namespace ondemand -} // namespace lasx -} // namespace simdjson - -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::parser &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(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 */ -#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 lasx { -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(buf); } - +simdjson_inline simdjson_result 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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 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; } +simdjson_inline simdjson_result 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.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; } - pos++; + logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); + return NUMBER_ERROR; } - return true; + 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_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_warn_unused simdjson_inline simdjson_result 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); } - -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()); +template +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; + auto err = get_root_string(check_trailing, allow_replacement).get(content); + if (err) { return err; } + receiver = content; + return SUCCESS; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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; } - const char * r{raw()}; - size_t pos{0}; - for(;pos < target.size();pos++) { - if(r[pos] != target[pos]) { return false; } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; +} +simdjson_warn_unused simdjson_inline simdjson_result 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 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 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; - } + 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } +simdjson_warn_unused simdjson_inline simdjson_result 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 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.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 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; } +simdjson_warn_unused simdjson_inline simdjson_result 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.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; } - if(r[pos] != '"') { return false; } - return true; + 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 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; - } +simdjson_warn_unused simdjson_inline simdjson_result 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 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"); } - if(r[pos] != '"') { return false; } - return true; + return result; } -simdjson_unused simdjson_inline bool operator==(const raw_json_string &a, std::string_view c) noexcept { - return a.unsafe_is_equal(c); -} +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 ); -simdjson_unused simdjson_inline bool operator==(std::string_view c, const raw_json_string &a) noexcept { - return a == c; + return _json_iter->skip_child(depth()); } -simdjson_unused simdjson_inline bool operator!=(const raw_json_string &a, std::string_view c) noexcept { - return !(a == c); +simdjson_inline value_iterator value_iterator::child() const noexcept { + assert_at_child(); + return { _json_iter, depth()+1, _json_iter->token.position() }; } -simdjson_unused simdjson_inline bool operator!=(std::string_view c, const raw_json_string &a) noexcept { - return !(a == c); +// 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 simdjson_warn_unused simdjson_result raw_json_string::unescape(json_iterator &iter, bool allow_replacement) const noexcept { - return iter.unescape(*this, allow_replacement); +simdjson_inline bool value_iterator::at_start() const noexcept { + return _json_iter->token.position() == start_position(); } -simdjson_inline simdjson_warn_unused simdjson_result raw_json_string::unescape_wobbly(json_iterator &iter) const noexcept { - return iter.unescape_wobbly(*this); +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_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++; - } +simdjson_inline void value_iterator::abandon() noexcept { + _json_iter->abandon(); } -} // namespace ondemand -} // namespace lasx -} // namespace simdjson +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; +} -namespace simdjson { +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 simdjson_result::simdjson_result(lasx::ondemand::raw_json_string &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +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(); } -simdjson_inline simdjson_result simdjson_result::raw() const noexcept { - if (error()) { return error(); } - return first.raw(); + // 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 simdjson_warn_unused simdjson_result simdjson_result::unescape(lasx::ondemand::json_iterator &iter, bool allow_replacement) const noexcept { - if (error()) { return error(); } - return first.unescape(iter, allow_replacement); + +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_inline simdjson_warn_unused simdjson_result simdjson_result::unescape_wobbly(lasx::ondemand::json_iterator &iter) const noexcept { - if (error()) { return error(); } - return first.unescape_wobbly(iter); + +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; } -} // 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): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ +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(); } -namespace simdjson { + 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(); } -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)); + 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; } -inline simdjson_result 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); + 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; } -inline simdjson_result 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); + assert_at_non_root_start(); + _json_iter->return_current_and_advance(); + _json_iter->ascend_to(depth()-1); } -inline simdjson_result 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()); - } +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; } -inline simdjson_result 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); +simdjson_inline bool value_iterator::is_at_start() const noexcept { + return position() == start_position(); } -inline simdjson_result 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); +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() == '"'; } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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 simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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 simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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 simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +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 ); } -inline simdjson_result to_json_string(simdjson_result x) { - if (x.error()) { return x.error(); } - return to_json_string(x.value_unsafe()); +simdjson_inline void value_iterator::move_at_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position); } -} // namespace simdjson -namespace simdjson { namespace lasx { namespace ondemand { +simdjson_inline void value_iterator::move_at_container_start() noexcept { + _json_iter->_depth = _depth; + _json_iter->token.set_position(_start_position + 1); +} -#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); - } +simdjson_inline simdjson_result value_iterator::reset_array() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_array(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); + +simdjson_inline simdjson_result value_iterator::reset_object() noexcept { + if(error()) { return error(); } + move_at_container_start(); + return started_object(); } -#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); - } + +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 -#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 void value_iterator::assert_at_root() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth == 1 ); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); + +inline void value_iterator::assert_at_non_root_start() const noexcept { + assert_at_start(); + SIMDJSON_ASSUME( _depth > 1 ); } -#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); - } + +inline void value_iterator::assert_is_valid() const noexcept { + SIMDJSON_ASSUME( _json_iter != nullptr ); } -#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); - } +simdjson_inline bool value_iterator::is_valid() const noexcept { + return _json_iter != nullptr; } -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); + +simdjson_inline simdjson_result 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; } } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); -} -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result&& x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); + +simdjson_inline token_position value_iterator::start_position() const noexcept { + return _start_position; } -#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_inline token_position value_iterator::position() const noexcept { + return _json_iter->position(); } -#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); - } +simdjson_inline token_position value_iterator::end_position() const noexcept { + return _json_iter->end_position(); } -inline std::ostream& operator<<(std::ostream& out, simdjson::simdjson_result x) { - if (x.error()) { throw simdjson::simdjson_error(x.error()); } - return (out << x.value()); + +simdjson_inline token_position value_iterator::last_position() const noexcept { + return _json_iter->last_position(); } -#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 error_code value_iterator::report_error(error_code error, const char *message) noexcept { + return _json_iter->report_error(error, message); } -#endif -}}} // namespace simdjson::lasx::ondemand -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_TOKEN_ITERATOR_INL_H +} // namespace ondemand +} // namespace lasx +} // namespace simdjson + +namespace simdjson { + +simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::value_iterator &&value) noexcept + : implementation_simdjson_result_base(std::forward(value)) {} +simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept + : implementation_simdjson_result_base(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 +#include +#include +#ifndef SIMDJSON_GENERIC_STRING_BUILDER_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): #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 +#endif +#if SIMDJSON_EXPERIMENTAL_HAS_SSE2 +#include +#endif + namespace simdjson { namespace lasx { -namespace ondemand { +namespace builder { + +static SIMDJSON_CONSTEXPR_LAMBDA std::array + 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}; -simdjson_inline token_iterator::token_iterator( - const uint8_t *_buf, - token_position position -) noexcept : buf{_buf}, _position{position} -{ +/** + +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(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(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(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_inline uint32_t token_iterator::current_offset() const noexcept { - return *(_position); +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(*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"}; -simdjson_inline const uint8_t *token_iterator::return_current_and_advance() noexcept { - return &buf[*(_position++)]; +// 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 const uint8_t *token_iterator::peek(token_position position) const noexcept { - return &buf[*position]; +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 uint32_t token_iterator::peek_index(token_position position) const noexcept { - return *position; + +simdjson_inline void string_builder::grow_buffer(size_t desired_capacity) { + if (!is_valid) { + return; + } + std::unique_ptr 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 uint32_t token_iterator::peek_length(token_position position) const noexcept { - return *(position+1) - *position; + +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 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 size_t string_builder::size() const noexcept { + return position; } -simdjson_inline const uint8_t *token_iterator::peek(int32_t delta) const noexcept { - return &buf[*(_position+delta)]; + +simdjson_inline void string_builder::append(char c) noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = c; + } } -simdjson_inline uint32_t token_iterator::peek_index(int32_t delta) const noexcept { - return *(_position+delta); + +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 uint32_t token_iterator::peek_length(int32_t delta) const noexcept { - return *(_position+delta+1) - *(_position+delta); + +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 token_position token_iterator::position() const noexcept { - return _position; +namespace internal { + +template ::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 ::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(v)); + } + else { + return fast_digit_count_64(static_cast(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 +simdjson_inline void string_builder::append(number_type v) noexcept { + static_assert(std::is_same::value || + std::is_integral::value || + std::is_floating_point::value, + "Unsupported number type"); + // If C++17 is available, we can 'if constexpr' here. + SIMDJSON_IF_CONSTEXPR(std::is_same::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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + unsigned_type pv = static_cast(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::value) { + constexpr size_t max_number_size = 20; + if (capacity_check(max_number_size)) { + using unsigned_type = typename std::make_unsigned::type; + bool negative = v < 0; + unsigned_type pv = static_cast(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::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 token_iterator::set_position(token_position target_position) noexcept { - _position = target_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 token_iterator::operator==(const token_iterator &other) const noexcept { - return _position == other._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 bool token_iterator::operator!=(const token_iterator &other) const noexcept { - return _position != other._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 bool token_iterator::operator>(const token_iterator &other) const noexcept { - return _position > other._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); } -simdjson_inline bool token_iterator::operator>=(const token_iterator &other) const noexcept { - return _position >= other._position; +#if SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void string_builder::escape_and_append_with_quotes() noexcept { + escape_and_append_with_quotes(constevalutil::string_constant::value); } -simdjson_inline bool token_iterator::operator<(const token_iterator &other) const noexcept { - return _position < other._position; +#endif + +simdjson_inline void string_builder::append_raw(const char *c) noexcept { + size_t len = std::strlen(c); + append_raw(c, len); } -simdjson_inline bool token_iterator::operator<=(const token_iterator &other) const noexcept { - return _position <= other._position; + +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(); + } } -} // namespace ondemand -} // namespace lasx -} // namespace simdjson +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 + requires(!require_custom_serialization) +simdjson_inline void string_builder::append(const T &opt) { + if (opt) { + append(*opt); + } else { + append_null(); + } +} -namespace simdjson { +template + requires(require_custom_serialization) +simdjson_inline void string_builder::append(const T &val) { + serialize(*this, val); +} -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::token_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} +template + requires(std::is_convertible::value || + std::is_same::value) +simdjson_inline void string_builder::append(const T &value) { + escape_and_append_with_quotes(value); +} +#endif -} // namespace simdjson +#if SIMDJSON_SUPPORTS_RANGES && SIMDJSON_SUPPORTS_CONCEPTS +// Support for range-based appending (std::ranges::view, etc.) +template + requires(!std::is_convertible::value) +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) { + start_object(); -#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 */ -#ifndef SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H + if (it == end) { + end_object(); + return; // Handle empty range + } + // Append first item without leading comma + append_key_value(it->first, it->second); + ++it; -/* 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 */ + // 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 + } -namespace simdjson { -namespace lasx { -namespace ondemand { + // Append first item without leading comma + append(*it); + ++it; -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} -{ + // Append remaining items with preceding commas + for (; it != end; ++it) { + append_comma(); + append(*it); + } + end_array(); + } } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_object(); -} +#endif -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_root_object() noexcept { - SIMDJSON_TRY( start_container('{', "Not an object", "object") ); - return started_root_object(); +#if SIMDJSON_EXCEPTIONS +simdjson_inline string_builder::operator std::string() const noexcept(false) { + return std::string(operator std::string_view()); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_object() noexcept { - assert_at_container_start(); -#if SIMDJSON_DEVELOPMENT_CHECKS - _json_iter->set_start_position(_depth, start_position()); +simdjson_inline string_builder::operator std::string_view() const + noexcept(false) simdjson_lifetime_bound { + return view(); +} #endif - if (*_json_iter->peek() == '}') { - logger::log_value(*_json_iter, "empty object"); - _json_iter->return_current_and_advance(); - end_container(); - return false; + +simdjson_inline simdjson_result +string_builder::view() const noexcept { + if (!is_valid) { + return simdjson::OUT_OF_CAPACITY; } - return true; + return std::string_view(buffer.get(), position); } -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"); - } +simdjson_inline simdjson_result string_builder::c_str() noexcept { + if (capacity_check(1)) { + buffer.get()[position] = '\0'; + return buffer.get(); } - return SUCCESS; + return simdjson::OUT_OF_CAPACITY; } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_object() noexcept { - auto error = check_root_object(); - if(error) { return error; } - return started_object(); +simdjson_inline bool string_builder::validate_unicode() const noexcept { + return simdjson::validate_utf8(buffer.get(), position); } -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_inline void string_builder::start_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '{'; + } } -simdjson_warn_unused simdjson_inline simdjson_result 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_inline void string_builder::end_object() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '}'; } } -simdjson_warn_unused simdjson_inline simdjson_result 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 +simdjson_inline void string_builder::start_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = '['; } - 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; } +simdjson_inline void string_builder::end_array() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ']'; } - - // 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 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()) { +simdjson_inline void string_builder::append_comma() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ','; + } +} -#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 +simdjson_inline void string_builder::append_colon() noexcept { + if (capacity_check(1)) { + buffer.get()[position++] = ':'; } +} - // 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 +template +simdjson_inline void +string_builder::append_key_value(key_type key, value_type value) noexcept { + static_assert(std::is_same::value || + std::is_convertible::value, + "Unsupported key type"); + escape_and_append_with_quotes(key); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(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 SIMDJSON_SUPPORTS_CONCEPTS +template +simdjson_inline void +string_builder::append_key_value(value_type value) noexcept { + escape_and_append_with_quotes(); + append_colon(); + SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + append_null(); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR( + std::is_convertible::value) { + escape_and_append_with_quotes(value); + } + else SIMDJSON_IF_CONSTEXPR(std::is_same::value) { + escape_and_append_with_quotes(value); + } + else { + append(value); + } +} +#endif - // 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; - } +} // namespace builder +} // namespace lasx +} // namespace simdjson - // 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; } +#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 - // 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 +/* 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 - // 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); +#include +#include +#include +#include +#include +#include +#include +#include +// #include // for std::define_static_string - header not available yet - // 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; - } +namespace simdjson { +namespace lasx { +namespace builder { - // 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. +template + requires(concepts::container_but_not_string && !require_custom_serialization) +constexpr void atom(string_builder &b, const T &t) { + auto it = t.begin(); + auto end = t.end(); + if (it == end) { + b.append_raw("[]"); + return; } - // If the loop ended, we're out of fields to look at. The program should - // never reach this point. - return false; + b.append('['); + atom(b, *it); + ++it; + for (; it != end; ++it) { + b.append(','); + atom(b, *it); + } + b.append(']'); } -SIMDJSON_POP_DISABLE_WARNINGS -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::field_key() noexcept { - assert_at_next(); +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +constexpr void atom(string_builder &b, const T &t) { + b.escape_and_append_with_quotes(t); +} - 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); +template + requires(!require_custom_serialization) +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_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; +template::value && !std::is_same_v>::type> +constexpr void atom(string_builder &b, const number_type t) { + b.append(t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::start_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_array(); +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result value_iterator::start_root_array() noexcept { - SIMDJSON_TRY( start_container('[', "Not an array", "array") ); - return started_root_array(); +// Support for optional types (std::optional, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &opt) { + if (opt) { + atom(b, opt.value()); + } else { + b.append_raw("null"); + } } -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; +// Support for smart pointers (std::unique_ptr, std::shared_ptr, etc.) +template + requires(!require_custom_serialization) +constexpr void atom(string_builder &b, const T &ptr) { + if (ptr) { + atom(b, *ptr); + } else { + b.append_raw("null"); + } } -simdjson_warn_unused simdjson_inline simdjson_result 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()); +// Support for enums - serialize as string representation using expand approach from P2996R12 +template + requires(std::is_enum_v && !require_custom_serialization) +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>(e)); +#else + // Fallback: serialize as integer if reflection not available + atom(b, static_cast>(e)); #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"); +// Support for appendable containers that don't have operator[] (sets, etc.) +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +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); } - return SUCCESS; + b.append(']'); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::started_root_array() noexcept { - auto error = check_root_array(); - if (error) { return error; } - return started_array(); +// append functions that delegate to atom functions for primitive types +template + requires(std::is_arithmetic_v && !std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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"); - } +template + requires(std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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(!not_true); -} -simdjson_warn_unused simdjson_inline simdjson_result 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; +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_string(bool allow_replacement) noexcept { - return get_raw_json_string().unescape(json_iter(), allow_replacement); -} -template -simdjson_warn_unused simdjson_inline error_code value_iterator::get_string(string_type& receiver, bool allow_replacement) noexcept { - std::string_view content; - auto err = get_string(allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; -} -simdjson_warn_unused simdjson_inline simdjson_result value_iterator::get_wobbly_string() noexcept { - return get_raw_json_string().unescape_wobbly(json_iter()); -} -simdjson_warn_unused simdjson_inline simdjson_result 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); +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(!concepts::container_but_not_string && !concepts::string_view_keyed_map && + !concepts::optional_type && !concepts::smart_pointer && + !std::is_same_v && + !std::is_same_v && !std::is_same_v && !require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template + requires(!require_custom_serialization) +void append(string_builder &b, const T &t) { + atom(b, t); +} + +// works for struct +template + requires(std::is_class_v && !concepts::container_but_not_string && + !concepts::string_view_keyed_map && + !concepts::optional_type && + !concepts::smart_pointer && + !concepts::appendable_containers && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && + !std::is_same_v && !require_custom_serialization) +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('}'); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +// works for container that have begin() and end() iterators +template + requires(concepts::container_but_not_string && !require_custom_serialization) +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_warn_unused simdjson_inline simdjson_result 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; + +template + requires (require_custom_serialization) +void append(string_builder &b, const Z &z) { + b.append(z); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + + +template +simdjson_warn_unused simdjson_result 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); } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template +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; } -simdjson_warn_unused simdjson_inline simdjson_result 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; + +template +string_builder& operator<<(string_builder& b, const Z& z) { + append(b, z); + return b; } -simdjson_inline simdjson_result 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; + +// extract_from: Serialize only specific fields from a struct to JSON +template + requires(std::is_class_v && (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('}'); } -simdjson_inline bool value_iterator::is_negative() noexcept { - return numberparsing::is_negative(peek_non_root_scalar("numbersign")); + +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result extract_from(const T &obj, size_t initial_capacity = string_builder::DEFAULT_INITIAL_CAPACITY) { + string_builder b(initial_capacity); + extract_from(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_inline bool value_iterator::is_root_negative() noexcept { - return numberparsing::is_negative(peek_root_scalar("numbersign")); + +} // namespace builder +} // namespace lasx +// Alias the function template to 'to' in the global namespace +template +simdjson_warn_unused simdjson_result 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 +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; } -simdjson_inline simdjson_result value_iterator::is_integer() noexcept { - return numberparsing::is_integer(peek_non_root_scalar("integer")); +// Global namespace function for extract_from +template + requires(std::is_class_v && (sizeof...(FieldNames) > 0)) +simdjson_warn_unused simdjson_result 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(b, obj); + std::string_view s; + if(auto e = b.view().get(s); e) { return e; } + return std::string(s); } -simdjson_inline simdjson_result value_iterator::get_number_type() noexcept { - return numberparsing::get_number_type(peek_non_root_scalar("integer")); + +} // namespace simdjson + +#endif // SIMDJSON_STATIC_REFLECTION + +#endif +/* end file simdjson/generic/ondemand/json_builder.h for lasx */ + +// 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 */ +/** + * 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 emails; }; + * + * std::string email; + * path_accessor::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 +#include +#include + +namespace simdjson { +namespace lasx { +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::lasx::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 +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 +consteval auto make_field_step(const char (&name)[N]) { + return path_step(step_type::field, name, 0); } -simdjson_inline simdjson_result 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; + +// Helper to create array index step +consteval auto make_index_step(std::size_t idx) { + return path_step<1>(step_type::array_index, "", idx); } -simdjson_inline simdjson_result 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. +// 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 +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; } - 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 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.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; + // 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; + } } - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); - return NUMBER_ERROR; + + return count; } - 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 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.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; + + // 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++]; } - logger::log_error(*_json_iter, start_position(), depth(), "Root number more than 1082 characters and not a big integer"); - return NUMBER_ERROR; + out[len] = '\0'; + return i; } - 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 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 -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; - auto err = get_root_string(check_trailing, allow_replacement).get(content); - if (err) { return err; } - receiver = content; - return SUCCESS; -} -simdjson_warn_unused simdjson_inline simdjson_result 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 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 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; + + // Parse an array index at compile time + static consteval std::pair 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}; } - 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"); +}; + +// Compile-time path accessor generator +template +struct path_accessor { + using value = ::simdjson::lasx::ondemand::value; + + static constexpr auto parser = json_path_parser(); + 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 + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + // Validate path at compile time if T is a struct + if constexpr (std::is_class_v) { + 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(doc_or_val.get_value()); } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Extract value at path directly into target with compile-time type validation + // Example: std::string name; path_accessor::extract_field(doc, name); + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "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(doc_or_val.get_value()); + if (json_value.error()) return json_value.error(); + + return json_value.get(target); } - 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"); + +private: + // Get the final type by walking the path through the struct type + template + static consteval std::enable_if_t, 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + +private: + // Walk path and extract directly into final field using compile-time reflection + template + static inline error_code extract_with_reflection(simdjson_result 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(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(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_value, target_ref); + } + } + } + // Skip unexpected characters and continue + else { + return extract_with_reflection(current, target_ref); + } } - 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"); + // 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; + } + } } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; + + // Generate compile-time accessor code by walking the path + template + static inline simdjson_result access_impl(simdjson_result 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_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_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_value); + } + } else { + return access_impl(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(std::meta::substitute(^^concepts::indexable_container_v, {type_reflection})); + } + return false; } - 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 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.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; + // 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; } - 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"); + +private: + // Check if type has member with given name + template + 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; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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.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; + // Get type of member by name + template + 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; } - 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"); + + // Check if non-reflected type is array-like + template + static consteval bool is_container_type() { + using BaseType = std::remove_cvref_t; + if constexpr (requires { typename BaseType::value_type; }) { + return true; + } + if constexpr (std::is_array_v) { + return true; + } + return false; } - return result; -} -simdjson_warn_unused simdjson_inline simdjson_result 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; -} + // Extract element type from non-reflected container + template + using extract_element_type = std::conditional_t< + requires { typename std::remove_cvref_t::value_type; }, + typename std::remove_cvref_t::value_type, + std::conditional_t< + std::is_array_v>, + std::remove_extent_t>, + void + > + >; + + // Validate path matches struct definition + static consteval bool validate_path() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline simdjson_result 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; -} + auto current_type = ^^T; + std::size_t i = parser.skip_root(); -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 ); + 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; + } - return _json_iter->skip_child(depth()); -} + std::string_view field_name = path_view.substr(field_start, i - field_start); -simdjson_inline value_iterator value_iterator::child() const noexcept { - assert_at_child(); - return { _json_iter, depth()+1, _json_iter->token.position() }; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -// 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 + for (auto mem : members) { + if (std::meta::identifier_of(mem) == field_name) { + current_type = std::meta::type_of(mem); + found = true; + break; + } + } -simdjson_inline bool value_iterator::at_end() const noexcept { - return _json_iter->at_end(); -} + if (!found) { + return false; + } -simdjson_inline bool value_iterator::at_start() const noexcept { - return _json_iter->token.position() == start_position(); -} + } else if (path_view[i] == '[') { + ++i; + if (i >= path_view.size()) return false; -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; -} + 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; + } -simdjson_inline void value_iterator::abandon() noexcept { - _json_iter->abandon(); -} + 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; -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; -} + bool found = false; + auto members = std::meta::nonstatic_data_members_of(current_type, std::meta::access_context::unchecked()); -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()); + 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 +inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_val); } -simdjson_inline uint32_t value_iterator::peek_root_length() const noexcept { - return _json_iter->peek_root_length(start_position()); + +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::lasx::ondemand::value> at_path_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = path_accessor; + return accessor::access(doc_or_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(); } +// ============================================================================ +// JSON Pointer Compile-Time Support (RFC 6901) +// ============================================================================ - // Get the JSON and advance the cursor, decreasing depth to signify that we have retrieved the value. - assert_at_start(); - return _json_iter->peek(); -} +// JSON Pointer parser: /field/0/nested (slash-separated) +template +struct json_pointer_parser { + static constexpr std::string_view pointer_str = Pointer.view(); -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; } + // 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]; + } + } + } - // 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); -} + // 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; + } -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(); + // 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; - return SUCCESS; -} + 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; + } -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(); } + return count; + } - 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(); } + // 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; - assert_at_non_root_start(); - return _json_iter->peek(); -} + while (current_token < token_index) { + std::size_t next_slash = pointer_str.find('/', pos); + pos = next_slash + 1; + ++current_token; + } -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; } + std::size_t token_end = pointer_str.find('/', pos); + if (token_end == std::string_view::npos) token_end = pointer_str.size(); - 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; } + return pointer_str.substr(pos, token_end - pos); + } +}; - assert_at_non_root_start(); - _json_iter->return_current_and_advance(); - _json_iter->ascend_to(depth()-1); -} +// JSON Pointer accessor +template +struct pointer_accessor { + using parser = json_pointer_parser; + static constexpr std::string_view pointer_view = Pointer.view(); + static constexpr std::size_t token_count = parser::count_tokens(); -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; -} + // Validate pointer against struct definition + static consteval bool validate_pointer() { + if constexpr (!std::is_class_v) { + return true; + } -simdjson_inline bool value_iterator::is_at_start() const noexcept { - return position() == start_position(); -} + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -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() == '"'; -} + 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(); -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; -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -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 ); -} + if (parser::is_numeric(token)) { + if (!path_accessor::is_array_like_reflected(current_type)) { + return false; + } + current_type = path_accessor::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; + } + } -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 (!found) return false; + } -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 ); -} + pos = token_end + 1; + } -simdjson_inline void value_iterator::move_at_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position); -} + return true; + } -simdjson_inline void value_iterator::move_at_container_start() noexcept { - _json_iter->_depth = _depth; - _json_iter->token.set_position(_start_position + 1); -} + // Recursive accessor + template + static inline simdjson_result access_impl(simdjson_result current) noexcept { + if constexpr (TokenIndex >= token_count) { + return current; + } else { + constexpr std::string_view token = parser::get_token(TokenIndex); -simdjson_inline simdjson_result value_iterator::reset_array() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_array(); -} + 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(next_value); + } else { + auto obj = current.get_object().value_unsafe(); + auto next_value = obj.find_field_unordered(token); + return access_impl(next_value); + } + } + } -simdjson_inline simdjson_result value_iterator::reset_object() noexcept { - if(error()) { return error(); } - move_at_container_start(); - return started_object(); -} + // Access JSON value at pointer + template + static inline simdjson_result access(DocOrValue& doc_or_val) noexcept { + if constexpr (std::is_class_v) { + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); + } -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 ); -} + 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; + } + } -inline void value_iterator::assert_at_root() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth == 1 ); -} + simdjson_result current = doc_or_val.get_value(); + return access_impl<0>(current); + } -inline void value_iterator::assert_at_non_root_start() const noexcept { - assert_at_start(); - SIMDJSON_ASSUME( _depth > 1 ); -} + // Extract value at pointer directly into target with type validation + template + static inline error_code extract_field(DocOrValue& doc_or_val, FieldType& target) noexcept { + static_assert(std::is_class_v, "extract_field requires T to be a struct type for validation"); -inline void value_iterator::assert_is_valid() const noexcept { - SIMDJSON_ASSUME( _json_iter != nullptr ); -} + constexpr bool pointer_valid = validate_pointer(); + static_assert(pointer_valid, "JSON Pointer does not match struct definition"); -simdjson_inline bool value_iterator::is_valid() const noexcept { - return _json_iter != nullptr; -} + constexpr auto final_type = get_final_type(); + static_assert(final_type == ^^FieldType, "Target type does not match the field type at the pointer"); -simdjson_inline simdjson_result 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 TAPE_ERROR; + simdjson_result 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); } -} -simdjson_inline token_position value_iterator::start_position() const noexcept { - return _start_position; -} +private: + // Get final type by walking pointer through struct + template + static consteval std::enable_if_t, std::meta::info> get_final_type() { + auto current_type = ^^T; + std::size_t pos = pointer_view[0] == '/' ? 1 : 0; -simdjson_inline token_position value_iterator::position() const noexcept { - return _json_iter->position(); -} + 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(); -simdjson_inline token_position value_iterator::end_position() const noexcept { - return _json_iter->end_position(); -} + std::string_view token = pointer_view.substr(pos, token_end - pos); -simdjson_inline token_position value_iterator::last_position() const noexcept { - return _json_iter->last_position(); + if (parser::is_numeric(token)) { + current_type = path_accessor::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 +inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } -simdjson_inline error_code value_iterator::report_error(error_code error, const char *message) noexcept { - return _json_iter->report_error(error, message); +// Overload without type parameter (no validation) +template +inline simdjson_result<::simdjson::lasx::ondemand::value> at_pointer_compiled(DocOrValue& doc_or_val) noexcept { + using accessor = pointer_accessor; + return accessor::access(doc_or_val); } +} // namespace json_path } // namespace ondemand } // namespace lasx } // namespace simdjson -namespace simdjson { - -simdjson_inline simdjson_result::simdjson_result(lasx::ondemand::value_iterator &&value) noexcept - : implementation_simdjson_result_base(std::forward(value)) {} -simdjson_inline simdjson_result::simdjson_result(error_code error) noexcept - : implementation_simdjson_result_base(error) {} - -} // namespace simdjson - -#endif // SIMDJSON_GENERIC_ONDEMAND_VALUE_ITERATOR_INL_H -/* end file simdjson/generic/ondemand/value_iterator-inl.h for lasx */ +#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/amalgamated.h for lasx */ /* including simdjson/lasx/end.h: #include "simdjson/lasx/end.h" */ @@ -123526,9 +150534,297 @@ namespace simdjson { * @copydoc simdjson::builtin::ondemand */ namespace ondemand = builtin::ondemand; + /** + * @copydoc simdjson::builtin::builder + */ + namespace builder = builtin::builder; + +#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 + requires(!std::same_as && + !std::same_as && + !std::same_as && + !std::same_as) + inline std::string to_json_string(const T& obj) { + builder::string_builder str_builder; + append(str_builder, obj); + std::string_view view; + if (str_builder.view().get(view) == SUCCESS) { + return std::string(view); + } + return ""; + } +#endif + } // namespace simdjson #endif // SIMDJSON_ONDEMAND_H /* end file simdjson/ondemand.h */ +/* including simdjson/convert.h: #include "simdjson/convert.h" */ +/* begin file simdjson/convert.h */ + +#ifndef SIMDJSON_CONVERT_H +#define SIMDJSON_CONVERT_H + +/* skipped duplicate #include "simdjson/ondemand.h" */ +#include + +#if SIMDJSON_SUPPORTS_CONCEPTS + + +namespace simdjson { +namespace convert { +namespace internal { + +/** + * A utility class for automatically parsing JSON documents. + * This template is NOT part of our public API. + * It is subject to changes. + * @private + */ +template +struct auto_parser { +private: + parser_type m_parser; + ondemand::document m_doc; + error_code m_error{SUCCESS}; + + template + static constexpr bool is_nothrow_gettable = requires(ondemand::document doc) { + { doc.get() } noexcept; + }; +public: + explicit auto_parser(parser_type &&parser, ondemand::document &&doc) noexcept requires(!std::is_pointer_v); + explicit auto_parser(parser_type &&parser, padded_string_view const str) noexcept requires(!std::is_pointer_v); + explicit auto_parser(std::remove_pointer_t &parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v); + explicit auto_parser(std::remove_pointer_t &parser, padded_string_view const str) noexcept requires(std::is_pointer_v); + explicit auto_parser(padded_string_view const str) noexcept requires(std::is_pointer_v); + explicit auto_parser(parser_type parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v); + auto_parser(auto_parser const &) = delete; + auto_parser &operator=(auto_parser const &) = delete; + auto_parser(auto_parser &&) noexcept = default; + auto_parser &operator=(auto_parser &&) noexcept = default; + ~auto_parser() = default; + + simdjson_warn_unused std::remove_pointer_t &parser() noexcept; + + template + simdjson_warn_unused simdjson_inline simdjson_result result() noexcept(is_nothrow_gettable); + template + simdjson_warn_unused simdjson_inline error_code get(T &value) && noexcept(is_nothrow_gettable); + + + simdjson_warn_unused simdjson_inline simdjson_result array() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result object() noexcept; + simdjson_warn_unused simdjson_inline simdjson_result number() noexcept; + + +#if SIMDJSON_EXCEPTIONS + template + simdjson_warn_unused simdjson_inline explicit(false) operator T() noexcept(false); +#endif // SIMDJSON_EXCEPTIONS + + template + simdjson_warn_unused simdjson_inline std::optional optional() noexcept(is_nothrow_gettable); +}; + + +/** + * A utility class for adapting values for the `auto_parser`. + * This template is not part of our public API. It is subject to changes. + * @private + */ +template +struct to_adaptor { + T operator()(simdjson_result &val) const noexcept; + auto operator()(padded_string_view const str) const noexcept; + auto operator()(ondemand::parser &parser, padded_string_view const str) const noexcept; + // The std::string is padded with reserve to ensure there is enough space for padding. + // Some sanitizers may not like this, so you can use simdjson::pad instead. + // simdjson::from(simdjson::pad(str)) + auto operator()(std::string str) const noexcept; + auto operator()(ondemand::parser &parser, std::string str) const noexcept; +}; +// deduction guide +auto_parser(padded_string_view const str) -> auto_parser; +} // namespace internal +} // namespace convert + +/** + * The simdjson::from instance is EXPERIMENTAL AND SUBJECT TO CHANGES. + * + * The `from` instance is a utility adaptor for parsing JSON strings into objects. + * It provides a convenient way to convert JSON data into C++ objects using the `auto_parser`. + * + * Example usage: + * + * ```cpp + * std::map obj = + * simdjson::from(R"({"key": "value"})"_padded); + * ``` + * + * This will parse the JSON string and return an object representation. By default, we + * use the simdjson::ondemand::parser::get_parser() instance. A parser instance should + * be used for just one document at a time. + * + * You can also pass you own parser instance: + * ```cpp + * simdjson::ondemand::parser parser; + * std::map obj = + * simdjson::from(parser, R"({"key": "value"})"_padded); + * ``` + * The parser instance can be reused. + * + * This functionality requires C++20 or better. + */ +static constexpr convert::internal::to_adaptor<> from{}; + +} // namespace simdjson + +#endif // SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_CONVERT_H +/* end file simdjson/convert.h */ +/* including simdjson/convert-inl.h: #include "simdjson/convert-inl.h" */ +/* begin file simdjson/convert-inl.h */ + +#ifndef SIMDJSON_CONVERT_INL_H +#define SIMDJSON_CONVERT_INL_H + +/* skipped duplicate #include "simdjson/convert.h" */ +#if SIMDJSON_SUPPORTS_CONCEPTS +namespace simdjson { +namespace convert { +namespace internal { +// auto_parser method definitions +template +inline auto_parser::auto_parser(parser_type &&parser, ondemand::document &&doc) noexcept requires(!std::is_pointer_v) + : m_parser{std::move(parser)}, m_doc{std::move(doc)} {} + +template +inline auto_parser::auto_parser(parser_type &&parser, padded_string_view const str) noexcept requires(!std::is_pointer_v) + : m_parser{std::move(parser)}, m_doc{}, m_error{SUCCESS} { + m_error = m_parser.iterate(str).get(m_doc); +} + +template +inline auto_parser::auto_parser(std::remove_pointer_t &parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v) + : m_parser{&parser}, m_doc{std::move(doc)} {} + +template +inline auto_parser::auto_parser(std::remove_pointer_t &parser, padded_string_view const str) noexcept requires(std::is_pointer_v) + : m_parser{&parser}, m_doc{}, m_error{SUCCESS} { + m_error = m_parser->iterate(str).get(m_doc); +} + +template +inline auto_parser::auto_parser(padded_string_view const str) noexcept requires(std::is_pointer_v) + : auto_parser{ondemand::parser::get_parser(), str} {} + +template +inline auto_parser::auto_parser(parser_type parser, ondemand::document &&doc) noexcept requires(std::is_pointer_v) + : auto_parser{*parser, std::move(doc)} {} + + + + + +template +inline std::remove_pointer_t &auto_parser::parser() noexcept { + if constexpr (std::is_pointer_v) { + return *m_parser; + } else { + return m_parser; + } +} + +template +template +inline simdjson_result auto_parser::result() noexcept(is_nothrow_gettable) { + if (m_error != SUCCESS) { + return m_error; + } + return m_doc.get(); +} + +template +template +simdjson_warn_unused simdjson_inline error_code auto_parser::get(T &value) && noexcept(is_nothrow_gettable) { + return result().get(value); +} + +template +inline simdjson_result auto_parser::array() noexcept { + return result(); +} + +template +inline simdjson_result auto_parser::object() noexcept { + return result(); +} + +template +inline simdjson_result auto_parser::number() noexcept { + return result(); +} + +#if SIMDJSON_EXCEPTIONS +template +template +inline auto_parser::operator T() noexcept(false) { + if (m_error != SUCCESS) { + throw simdjson_error(m_error); + } + return m_doc.get(); +} +#endif // SIMDJSON_EXCEPTIONS + +template +template +inline std::optional auto_parser::optional() noexcept(is_nothrow_gettable) { + if (m_error != SUCCESS) { + return std::nullopt; + } + T value; + if (m_doc.get().get(value)) [[unlikely]] { + return std::nullopt; + } + return {std::move(value)}; +} + +// to_adaptor method definitions +template +inline T to_adaptor::operator()(simdjson_result &val) const noexcept { + return val.get(); +} + +template +inline auto to_adaptor::operator()(padded_string_view const str) const noexcept { + return auto_parser{str}; +} + +template +inline auto to_adaptor::operator()(ondemand::parser &parser, padded_string_view const str) const noexcept { + return auto_parser{parser, str}; +} + +template +inline auto to_adaptor::operator()(std::string str) const noexcept { + return auto_parser{pad_with_reserve(str)}; +} + +template +inline auto to_adaptor::operator()(ondemand::parser &parser, std::string str) const noexcept { + return auto_parser{parser, pad_with_reserve(str)}; +} +} // namespace internal +} // namespace convert +} // namespace simdjson +#endif // SIMDJSON_SUPPORTS_CONCEPTS +#endif // SIMDJSON_CONVERT_INL_H +/* end file simdjson/convert-inl.h */ #endif // SIMDJSON_H /* end file simdjson.h */ diff --git a/deps/uv/src/unix/signal.c b/deps/uv/src/unix/signal.c index ccaa72db457c59..a0af7f1657896c 100644 --- a/deps/uv/src/unix/signal.c +++ b/deps/uv/src/unix/signal.c @@ -32,6 +32,25 @@ # define SA_RESTART 0 #endif +/* DCP-4748: Android-only. On Android, ART claims SIGSEGV/SIGBUS/SIGFPE/etc. via + * libsigchain; libuv's usual reset-to-SIG_DFL on the last unwatch clobbers that + * handler and emits an ERROR-level libsigchain log on every embedded + * node::FreeEnvironment(). On Android we instead save the disposition that was + * in effect before libuv installed its handler and restore it on the last + * unwatch. This is deliberately gated to __ANDROID__: bionic round-trips the + * sigaction flags correctly (unlike macOS, which drops SA_RESETHAND -- see + * upstream libuv #4299 / reverted #4216), so no other platform's behaviour is + * touched. The table is indexed by signum and accessed only under the global + * signal lock. + */ +#ifdef __ANDROID__ +#ifndef NSIG +# define NSIG 65 +#endif +static struct sigaction uv__signal_saved_sa[NSIG]; +static unsigned char uv__signal_saved[NSIG]; +#endif + typedef struct { uv_signal_t* handle; int signum; @@ -221,9 +240,10 @@ static void uv__signal_handler(int signum) { } -static int uv__signal_register_handler(int signum, int oneshot) { +static int uv__signal_register_handler(int signum, int oneshot, int save) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; + struct sigaction* oldp; /* XXX use a separate signal stack? */ memset(&sa, 0, sizeof(sa)); @@ -234,10 +254,29 @@ static int uv__signal_register_handler(int signum, int oneshot) { if (oneshot) sa.sa_flags |= SA_RESETHAND; - /* XXX save old action so we can restore it later on? */ - if (sigaction(signum, &sa, NULL)) + /* On Android, capture the previous disposition so uv__signal_unregister_handler() + * can restore it instead of resetting to SIG_DFL. `save` is set only on the + * transition from "no libuv handler" to "libuv handler installed" for this + * signum (see uv__signal_start); the oneshot re-registration paths pass + * save=0 so they never overwrite the captured disposition with libuv's own + * handler. Off Android this is a no-op and behaviour is unchanged. + */ + oldp = NULL; +#ifdef __ANDROID__ + if (save && signum > 0 && signum < NSIG) + oldp = &uv__signal_saved_sa[signum]; +#else + (void) save; +#endif + + if (sigaction(signum, &sa, oldp)) return UV__ERR(errno); +#ifdef __ANDROID__ + if (oldp != NULL) + uv__signal_saved[signum] = 1; +#endif + return 0; } @@ -246,8 +285,23 @@ static void uv__signal_unregister_handler(int signum) { /* When this function is called, the signal lock must be held. */ struct sigaction sa; + /* On Android, restore the disposition captured when uv__signal_register_handler() + * first installed our handler for this signum, if we have it; this avoids the + * libsigchain "Setting SIGxxx to SIG_DFL" report and clobbering ART's handler. + * Off Android, reset to SIG_DFL as upstream does. + */ +#ifdef __ANDROID__ + if (signum > 0 && signum < NSIG && uv__signal_saved[signum]) { + sa = uv__signal_saved_sa[signum]; + uv__signal_saved[signum] = 0; + } else { + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_DFL; + } +#else memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; +#endif /* sigaction can only fail with EINVAL or EFAULT; an attempt to deregister a * signal implies that it was successfully registered earlier, so EINVAL @@ -413,7 +467,7 @@ static int uv__signal_start(uv_signal_t* handle, first_handle = uv__signal_first_handle(signum); if (first_handle == NULL || (!oneshot && (first_handle->flags & UV_SIGNAL_ONE_SHOT))) { - err = uv__signal_register_handler(signum, oneshot); + err = uv__signal_register_handler(signum, oneshot, first_handle == NULL); if (err) { /* Registering the signal handler failed. Must be an invalid signal. */ uv__signal_unlock_and_unblock(&saved_sigmask); @@ -568,7 +622,7 @@ static void uv__signal_stop(uv_signal_t* handle) { rem_oneshot = handle->flags & UV_SIGNAL_ONE_SHOT; first_oneshot = first_handle->flags & UV_SIGNAL_ONE_SHOT; if (first_oneshot && !rem_oneshot) { - ret = uv__signal_register_handler(handle->signum, 1); + ret = uv__signal_register_handler(handle->signum, 1, 0); assert(ret == 0); (void)ret; } diff --git a/deps/v8/DEPS b/deps/v8/DEPS index c6b16a0d770bf1..e2809308a05f6b 100644 --- a/deps/v8/DEPS +++ b/deps/v8/DEPS @@ -141,7 +141,7 @@ deps = { } ], 'dep_type': 'cipd', - 'condition': 'host_os == "linux" and host_cpu != "s390" and host_os != "zos" and host_cpu != "ppc"', + 'condition': 'host_os == "linux" and host_cpu != "s390x" and host_os != "zos" and host_cpu != "ppc64"', }, 'buildtools/mac': { 'packages': [ @@ -171,7 +171,7 @@ deps = { } ], 'dep_type': 'cipd', - 'condition': '(host_os == "linux" or host_os == "mac" or host_os == "win") and host_cpu != "s390" and host_os != "zos" and host_cpu != "ppc" and (host_cpu != "arm64" or host_os == "mac")', + 'condition': '(host_os == "linux" or host_os == "mac" or host_os == "win") and host_cpu != "s390x" and host_os != "zos" and host_cpu != "ppc64" and (host_cpu != "arm64" or host_os == "mac")', }, 'test/benchmarks/data': Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f', @@ -481,7 +481,7 @@ deps = { } ], 'dep_type': 'cipd', - 'condition': 'host_cpu != "s390" and host_os != "zos" and host_cpu != "ppc"' + 'condition': 'host_cpu != "s390x" and host_os != "zos" and host_cpu != "ppc64"' }, 'third_party/partition_alloc': { 'url': Var('chromium_url') + '/chromium/src/base/allocator/partition_allocator.git@' + Var('partition_alloc_version'), @@ -545,7 +545,7 @@ deps = { } ], 'dep_type': 'cipd', - 'condition': 'not build_with_chromium and host_cpu != "s390" and host_os != "zos" and host_cpu != "ppc"', + 'condition': 'not build_with_chromium and host_cpu != "s390x" and host_os != "zos" and host_cpu != "ppc64"', }, 'third_party/zlib': Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'caf4afa1afc92e16fef429f182444bed98a46a6c', diff --git a/deps/v8/include/v8-local-handle.h b/deps/v8/include/v8-local-handle.h index bdf1a1d6ff8cb8..80f33043a27a74 100644 --- a/deps/v8/include/v8-local-handle.h +++ b/deps/v8/include/v8-local-handle.h @@ -425,7 +425,7 @@ class V8_TRIVIAL_ABI Local : public LocalBase, // If we're going to perform the type check then we have to check // that the handle isn't empty before doing the checked cast. if (that.IsEmpty()) return Local(); - T::Cast(that.template value()); + // T::Cast(that.template value()); #endif return Local(LocalBase(that)); } diff --git a/deps/v8/include/v8-script.h b/deps/v8/include/v8-script.h index 9d47b751f271eb..debe89b50847ea 100644 --- a/deps/v8/include/v8-script.h +++ b/deps/v8/include/v8-script.h @@ -220,6 +220,13 @@ class V8_EXPORT Module : public Data { Local context, Local specifier, Local import_attributes, Local referrer); + using ResolveModuleByIndexCallback = MaybeLocal (*)( + Local context, size_t module_request_index, + Local referrer); + using ResolveSourceByIndexCallback = MaybeLocal (*)( + Local context, size_t module_request_index, + Local referrer); + /** * Instantiates the module and its dependencies. * @@ -231,6 +238,16 @@ class V8_EXPORT Module : public Data { Local context, ResolveModuleCallback module_callback, ResolveSourceCallback source_callback = nullptr); + /** + * Similar to the variant that takes ResolveModuleCallback and + * ResolveSourceCallback, but uses the index into the array that is returned + * by GetModuleRequests() instead of the specifier and import attributes to + * identify the requests. + */ + V8_WARN_UNUSED_RESULT Maybe InstantiateModule( + Local context, ResolveModuleByIndexCallback module_callback, + ResolveSourceByIndexCallback source_callback = nullptr); + /** * Evaluates the module and its dependencies. * diff --git a/deps/v8/include/v8-statistics.h b/deps/v8/include/v8-statistics.h index 82b78f5ec65729..2dc10e0fbfd304 100644 --- a/deps/v8/include/v8-statistics.h +++ b/deps/v8/include/v8-statistics.h @@ -154,6 +154,13 @@ class V8_EXPORT HeapStatistics { size_t number_of_native_contexts() { return number_of_native_contexts_; } size_t number_of_detached_contexts() { return number_of_detached_contexts_; } + /** + * Returns the total number of bytes allocated since the Isolate was created. + * This includes all heap objects allocated in any space (new, old, code, + * etc.). + */ + uint64_t total_allocated_bytes() { return total_allocated_bytes_; } + /** * Returns a 0/1 boolean, which signifies whether the V8 overwrite heap * garbage with a bit pattern. @@ -175,6 +182,7 @@ class V8_EXPORT HeapStatistics { size_t number_of_detached_contexts_; size_t total_global_handles_size_; size_t used_global_handles_size_; + uint64_t total_allocated_bytes_; friend class V8; friend class Isolate; diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index e5f703bb5e7ddb..b4a3fb1230a205 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -2266,14 +2266,34 @@ int Module::GetIdentityHash() const { return self->hash(); } +Maybe Module::InstantiateModule( + Local context, ResolveModuleByIndexCallback module_callback, + ResolveSourceByIndexCallback source_callback) { + auto i_isolate = i::Isolate::Current(); + EnterV8Scope<> api_scope{i_isolate, context, + RCCId::kAPI_Module_InstantiateModule}; + + i::Module::UserResolveCallbacks callbacks; + callbacks.module_callback_by_index = module_callback; + callbacks.source_callback_by_index = source_callback; + if (!i::Module::Instantiate(i_isolate, Utils::OpenHandle(this), context, + callbacks)) { + return {}; + } + return Just(true); +} + Maybe Module::InstantiateModule(Local context, ResolveModuleCallback module_callback, ResolveSourceCallback source_callback) { auto i_isolate = i::Isolate::Current(); EnterV8Scope<> api_scope{i_isolate, context, RCCId::kAPI_Module_InstantiateModule}; + i::Module::UserResolveCallbacks callbacks; + callbacks.module_callback = module_callback; + callbacks.source_callback = source_callback; if (!i::Module::Instantiate(i_isolate, Utils::OpenHandle(this), context, - module_callback, source_callback)) { + callbacks)) { return {}; } return Just(true); @@ -6564,7 +6584,8 @@ HeapStatistics::HeapStatistics() peak_malloced_memory_(0), does_zap_garbage_(false), number_of_native_contexts_(0), - number_of_detached_contexts_(0) {} + number_of_detached_contexts_(0), + total_allocated_bytes_(0) {} HeapSpaceStatistics::HeapSpaceStatistics() : space_name_(nullptr), @@ -10418,6 +10439,7 @@ void Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) { heap_statistics->number_of_native_contexts_ = heap->NumberOfNativeContexts(); heap_statistics->number_of_detached_contexts_ = heap->NumberOfDetachedContexts(); + heap_statistics->total_allocated_bytes_ = heap->GetTotalAllocatedBytes(); heap_statistics->does_zap_garbage_ = i::heap::ShouldZapGarbage(); #if V8_ENABLE_WEBASSEMBLY diff --git a/deps/v8/src/builtins/loong64/builtins-loong64.cc b/deps/v8/src/builtins/loong64/builtins-loong64.cc index f93e4911af5857..53c4a1c9afe9c8 100644 --- a/deps/v8/src/builtins/loong64/builtins-loong64.cc +++ b/deps/v8/src/builtins/loong64/builtins-loong64.cc @@ -328,7 +328,7 @@ static void GetSharedFunctionInfoBytecodeOrBaseline( if (v8_flags.debug_code) { Label not_baseline; __ GetObjectType(data, scratch1, scratch1); - __ Branch(¬_baseline, ne, scratch1, Operand(CODETYPE)); + __ Branch(¬_baseline, ne, scratch1, Operand(CODE_TYPE)); AssertCodeIsBaseline(masm, data, scratch1); __ Branch(is_baseline); __ bind(¬_baseline); diff --git a/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc b/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc index e5fb03c9401083..c0e1860f4b7f33 100644 --- a/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc +++ b/deps/v8/src/codegen/loong64/macro-assembler-loong64.cc @@ -2618,12 +2618,12 @@ int32_t MacroAssembler::GetOffset(Label* L, OffsetSize bits) { } Register MacroAssembler::GetRkAsRegisterHelper(const Operand& rk, - Register scratch) { + UseScratchRegisterScope temps) { Register r2 = no_reg; if (rk.is_reg()) { r2 = rk.rm(); } else { - r2 = scratch; + r2 = temps.Acquire(); li(r2, rk); } @@ -2635,7 +2635,6 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, bool need_link) { UseScratchRegisterScope temps(this); BlockTrampolinePoolScope block_trampoline_pool(this); - Register scratch = temps.Acquire(); DCHECK_NE(rj, zero_reg); // Be careful to always use shifted_branch_offset only just before the @@ -2671,7 +2670,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); // We don't want any other register but scratch clobbered. - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); offset = GetOffset(L, OffsetSize::kOffset16); beq(rj, sc, offset); } @@ -2693,7 +2692,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); // We don't want any other register but scratch clobbered. - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); offset = GetOffset(L, OffsetSize::kOffset16); bne(rj, sc, offset); } @@ -2712,7 +2711,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); blt(sc, rj, offset); @@ -2733,7 +2732,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bge(rj, sc, offset); @@ -2751,7 +2750,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); blt(rj, sc, offset); @@ -2772,7 +2771,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bge(sc, rj, offset); @@ -2792,7 +2791,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bltu(sc, rj, offset); @@ -2813,7 +2812,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bgeu(rj, sc, offset); @@ -2828,7 +2827,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bltu(rj, sc, offset); @@ -2848,7 +2847,7 @@ bool MacroAssembler::BranchShortOrFallback(Label* L, Condition cond, } else { if (L->is_bound() && !is_near(L, OffsetSize::kOffset16)) return false; if (need_link) pcaddi(ra, 2); - Register sc = GetRkAsRegisterHelper(rk, scratch); + Register sc = GetRkAsRegisterHelper(rk, temps); DCHECK(rj != sc); offset = GetOffset(L, OffsetSize::kOffset16); bgeu(sc, rj, offset); @@ -3079,10 +3078,12 @@ void MacroAssembler::CompareTaggedRootAndBranch(const Register& obj, // Some smi roots contain system pointer size values like stack limits. DCHECK(base::IsInRange(index, RootIndex::kFirstStrongOrReadOnlyRoot, RootIndex::kLastStrongOrReadOnlyRoot)); - Register temp = temps.Acquire(); - DCHECK(!AreAliased(obj, temp)); - LoadRoot(temp, index); - CompareTaggedAndBranch(target, cc, obj, Operand(temp)); + Register scratch1 = temps.Acquire(); + Register scratch2 = temps.Acquire(); + DCHECK(!AreAliased(obj, scratch1, scratch2)); + slli_w(scratch1, obj, 0); + LoadTaggedRoot(scratch2, index); + Branch(target, cc, scratch1, Operand(scratch2)); } // Compare the object in a register to a value from the root list. diff --git a/deps/v8/src/codegen/loong64/macro-assembler-loong64.h b/deps/v8/src/codegen/loong64/macro-assembler-loong64.h index e08ec7e30a8f68..0e352af469f0c8 100644 --- a/deps/v8/src/codegen/loong64/macro-assembler-loong64.h +++ b/deps/v8/src/codegen/loong64/macro-assembler-loong64.h @@ -1286,7 +1286,8 @@ class V8_EXPORT_PRIVATE MacroAssembler : public MacroAssemblerBase { } protected: - inline Register GetRkAsRegisterHelper(const Operand& rk, Register scratch); + inline Register GetRkAsRegisterHelper(const Operand& rk, + UseScratchRegisterScope temps); inline int32_t GetOffset(Label* L, OffsetSize bits); private: diff --git a/deps/v8/src/heap/heap-allocator.cc b/deps/v8/src/heap/heap-allocator.cc index 8664c175dc7a61..1fddc27ff22cea 100644 --- a/deps/v8/src/heap/heap-allocator.cc +++ b/deps/v8/src/heap/heap-allocator.cc @@ -85,25 +85,42 @@ AllocationResult HeapAllocator::AllocateRawLargeInternal( int size_in_bytes, AllocationType allocation, AllocationOrigin origin, AllocationAlignment alignment, AllocationHint hint) { DCHECK_GT(size_in_bytes, heap_->MaxRegularHeapObjectSize(allocation)); + AllocationResult allocation_result; switch (allocation) { case AllocationType::kYoung: - return new_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + allocation_result = + new_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + break; case AllocationType::kOld: - return lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + allocation_result = + lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + break; case AllocationType::kCode: - return code_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + allocation_result = + code_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + break; case AllocationType::kSharedOld: - return shared_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + allocation_result = + shared_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + break; case AllocationType::kTrusted: - return trusted_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + allocation_result = + trusted_lo_space()->AllocateRaw(local_heap_, size_in_bytes, hint); + break; case AllocationType::kSharedTrusted: - return shared_trusted_lo_space()->AllocateRaw(local_heap_, size_in_bytes, - hint); + allocation_result = shared_trusted_lo_space()->AllocateRaw( + local_heap_, size_in_bytes, hint); + break; case AllocationType::kMap: case AllocationType::kReadOnly: case AllocationType::kSharedMap: UNREACHABLE(); } + if (!allocation_result.IsFailure()) { + int allocated_size = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes); + heap_->AddTotalAllocatedBytes(allocated_size); + } + return allocation_result; } namespace { diff --git a/deps/v8/src/heap/heap.cc b/deps/v8/src/heap/heap.cc index 972eab47d0050f..4951ef7bc5926c 100644 --- a/deps/v8/src/heap/heap.cc +++ b/deps/v8/src/heap/heap.cc @@ -7717,6 +7717,10 @@ int Heap::NextStackTraceId() { return last_id; } +uint64_t Heap::GetTotalAllocatedBytes() { + return total_allocated_bytes_.load(std::memory_order_relaxed); +} + EmbedderStackStateScope::EmbedderStackStateScope( Heap* heap, EmbedderStackStateOrigin origin, StackState stack_state) : heap_(heap), diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h index 9747448842d015..05a4f7e88b1c28 100644 --- a/deps/v8/src/heap/heap.h +++ b/deps/v8/src/heap/heap.h @@ -1707,6 +1707,11 @@ class Heap final { bool ShouldUseBackgroundThreads() const; bool ShouldUseIncrementalMarking() const; + void AddTotalAllocatedBytes(size_t size) { + total_allocated_bytes_.fetch_add(size, std::memory_order_relaxed); + } + uint64_t GetTotalAllocatedBytes(); + HeapAllocator* allocator() { return heap_allocator_; } const HeapAllocator* allocator() const { return heap_allocator_; } @@ -2499,6 +2504,8 @@ class Heap final { // no value was provided this will be 0. uint64_t physical_memory_; + std::atomic total_allocated_bytes_ = 0; + // Classes in "heap" can be friends. friend class ActivateMemoryReducerTask; friend class AlwaysAllocateScope; diff --git a/deps/v8/src/heap/main-allocator.cc b/deps/v8/src/heap/main-allocator.cc index ddfdb72e1d983f..95d40952041d9e 100644 --- a/deps/v8/src/heap/main-allocator.cc +++ b/deps/v8/src/heap/main-allocator.cc @@ -297,6 +297,12 @@ void MainAllocator::ResetLab(Address start, Address end, Address extended_end) { MemoryChunkMetadata::UpdateHighWaterMark(top()); } + // This is going to overestimate a bit of the total allocated bytes, since the + // LAB was not used yet. However the leftover compared to the LAB itself is + // quite small, so it seems tolerable. + if (local_heap_) { + local_heap_->heap()->AddTotalAllocatedBytes(end - start); + } allocation_info().Reset(start, end); extended_limit_ = extended_end; diff --git a/deps/v8/src/libplatform/default-platform.cc b/deps/v8/src/libplatform/default-platform.cc index 09ef613af85a64..aa882728b97db1 100644 --- a/deps/v8/src/libplatform/default-platform.cc +++ b/deps/v8/src/libplatform/default-platform.cc @@ -76,7 +76,7 @@ V8_PLATFORM_EXPORT std::unique_ptr NewDefaultJobHandle( platform, std::move(job_task), priority, num_worker_threads)); } -bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate, +V8_PLATFORM_EXPORT bool PumpMessageLoop(v8::Platform* platform, v8::Isolate* isolate, MessageLoopBehavior behavior) { return static_cast(platform)->PumpMessageLoop(isolate, behavior); diff --git a/deps/v8/src/maglev/maglev-graph-builder.cc b/deps/v8/src/maglev/maglev-graph-builder.cc index 1ea08b3d35a1f4..ead18f0e097375 100644 --- a/deps/v8/src/maglev/maglev-graph-builder.cc +++ b/deps/v8/src/maglev/maglev-graph-builder.cc @@ -4070,6 +4070,22 @@ ReduceResult MaglevGraphBuilder::BuildCheckSmi(ValueNode* object, return EmitUnconditionalDeopt(DeoptimizeReason::kSmi); } if (EnsureType(object, NodeType::kSmi) && elidable) return object; + if constexpr (SmiValuesAre31Bits()) { + if (Phi* value_as_phi = object->TryCast()) { + value_as_phi->SetUseRequires31BitValue(); + } + } + // For non-tagged constants, we may be able to skip the runtime check: every + // non-tagged arm of the switch below emits a value-range check, which is + // exactly what `Smi::IsValid` proves. For tagged inputs the runtime check + // (CheckSmi) is a tag-bit check, and value-equivalence (e.g. via the + // checked_value alternative, which may hold a HeapNumber constant) does not + // imply Smi tagging. + if (object->value_representation() != ValueRepresentation::kTagged) { + if (std::optional constant_value = TryGetInt32Constant(object)) { + if (Smi::IsValid(constant_value.value())) return object; + } + } switch (object->value_representation()) { case ValueRepresentation::kInt32: if (!SmiValuesAre32Bits()) { diff --git a/deps/v8/src/objects/module.cc b/deps/v8/src/objects/module.cc index 6ce67230b413a1..b232db1fcb3c97 100644 --- a/deps/v8/src/objects/module.cc +++ b/deps/v8/src/objects/module.cc @@ -205,14 +205,12 @@ MaybeHandle Module::ResolveExport(Isolate* isolate, Handle module, bool Module::Instantiate(Isolate* isolate, Handle module, v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback) { + const Module::UserResolveCallbacks& callbacks) { #ifdef DEBUG PrintStatusMessage(*module, "Instantiating module "); #endif // DEBUG - if (!PrepareInstantiate(isolate, module, context, module_callback, - source_callback)) { + if (!PrepareInstantiate(isolate, module, context, callbacks)) { ResetGraph(isolate, module); DCHECK_EQ(module->status(), kUnlinked); return false; @@ -231,11 +229,9 @@ bool Module::Instantiate(Isolate* isolate, Handle module, return true; } -bool Module::PrepareInstantiate( - Isolate* isolate, DirectHandle module, - v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback) { +bool Module::PrepareInstantiate(Isolate* isolate, DirectHandle module, + v8::Local context, + const UserResolveCallbacks& callbacks) { DCHECK_NE(module->status(), kEvaluating); DCHECK_NE(module->status(), kLinking); if (module->status() >= kPreLinking) return true; @@ -244,8 +240,7 @@ bool Module::PrepareInstantiate( if (IsSourceTextModule(*module)) { return SourceTextModule::PrepareInstantiate( - isolate, Cast(module), context, module_callback, - source_callback); + isolate, Cast(module), context, callbacks); } else { return SyntheticModule::PrepareInstantiate( isolate, Cast(module), context); diff --git a/deps/v8/src/objects/module.h b/deps/v8/src/objects/module.h index 7e6b3bb690a6fc..cab99ea314ba80 100644 --- a/deps/v8/src/objects/module.h +++ b/deps/v8/src/objects/module.h @@ -57,14 +57,20 @@ class Module : public TorqueGeneratedModule { // i.e. has a top-level await. V8_WARN_UNUSED_RESULT bool IsGraphAsync(Isolate* isolate) const; + struct UserResolveCallbacks { + v8::Module::ResolveModuleCallback module_callback = nullptr; + v8::Module::ResolveSourceCallback source_callback = nullptr; + v8::Module::ResolveModuleByIndexCallback module_callback_by_index = nullptr; + v8::Module::ResolveSourceByIndexCallback source_callback_by_index = nullptr; + }; + // Implementation of spec operation ModuleDeclarationInstantiation. // Returns false if an exception occurred during instantiation, true // otherwise. (In the case where the callback throws an exception, that // exception is propagated.) static V8_WARN_UNUSED_RESULT bool Instantiate( Isolate* isolate, Handle module, v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback); + const UserResolveCallbacks& callbacks); // Implementation of spec operation ModuleEvaluation. static V8_WARN_UNUSED_RESULT MaybeDirectHandle Evaluate( @@ -99,9 +105,7 @@ class Module : public TorqueGeneratedModule { static V8_WARN_UNUSED_RESULT bool PrepareInstantiate( Isolate* isolate, DirectHandle module, - v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback); + v8::Local context, const UserResolveCallbacks& callbacks); static V8_WARN_UNUSED_RESULT bool FinishInstantiate( Isolate* isolate, Handle module, ZoneForwardList>* stack, unsigned* dfs_index, diff --git a/deps/v8/src/objects/source-text-module.cc b/deps/v8/src/objects/source-text-module.cc index 1237c90a1e273a..7e87cd010b0ebb 100644 --- a/deps/v8/src/objects/source-text-module.cc +++ b/deps/v8/src/objects/source-text-module.cc @@ -346,9 +346,10 @@ MaybeHandle SourceTextModule::ResolveExportUsingStarExports( bool SourceTextModule::PrepareInstantiate( Isolate* isolate, DirectHandle module, v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback) { - DCHECK_NE(module_callback, nullptr); + const Module::UserResolveCallbacks& callbacks) { + // One of the callbacks must be set, otherwise we cannot resolve. + DCHECK_IMPLIES(callbacks.module_callback == nullptr, + callbacks.module_callback_by_index != nullptr); // Obtain requested modules. DirectHandle module_info(module->info(), isolate); DirectHandle module_requests(module_info->module_requests(), @@ -364,11 +365,23 @@ bool SourceTextModule::PrepareInstantiate( switch (module_request->phase()) { case ModuleImportPhase::kEvaluation: { v8::Local api_requested_module; - if (!module_callback(context, v8::Utils::ToLocal(specifier), - v8::Utils::FixedArrayToLocal(import_attributes), - v8::Utils::ToLocal(Cast(module))) - .ToLocal(&api_requested_module)) { - return false; + if (callbacks.module_callback != nullptr) { + if (!callbacks + .module_callback( + context, v8::Utils::ToLocal(specifier), + v8::Utils::FixedArrayToLocal(import_attributes), + v8::Utils::ToLocal(Cast(module))) + .ToLocal(&api_requested_module)) { + return false; + } + } else { + DCHECK_NOT_NULL(callbacks.module_callback_by_index); + if (!callbacks + .module_callback_by_index( + context, i, v8::Utils::ToLocal(Cast(module))) + .ToLocal(&api_requested_module)) { + return false; + } } DirectHandle requested_module = Utils::OpenDirectHandle(*api_requested_module); @@ -378,11 +391,23 @@ bool SourceTextModule::PrepareInstantiate( case ModuleImportPhase::kSource: { DCHECK(v8_flags.js_source_phase_imports); v8::Local api_requested_module_source; - if (!source_callback(context, v8::Utils::ToLocal(specifier), - v8::Utils::FixedArrayToLocal(import_attributes), - v8::Utils::ToLocal(Cast(module))) - .ToLocal(&api_requested_module_source)) { - return false; + if (callbacks.source_callback != nullptr) { + if (!callbacks + .source_callback( + context, v8::Utils::ToLocal(specifier), + v8::Utils::FixedArrayToLocal(import_attributes), + v8::Utils::ToLocal(Cast(module))) + .ToLocal(&api_requested_module_source)) { + return false; + } + } else { + DCHECK_NOT_NULL(callbacks.source_callback_by_index); + if (!callbacks + .source_callback_by_index( + context, i, v8::Utils::ToLocal(Cast(module))) + .ToLocal(&api_requested_module_source)) { + return false; + } } DirectHandle requested_module_source = Utils::OpenDirectHandle(*api_requested_module_source); @@ -404,7 +429,7 @@ bool SourceTextModule::PrepareInstantiate( DirectHandle requested_module( Cast(requested_modules->get(i)), isolate); if (!Module::PrepareInstantiate(isolate, requested_module, context, - module_callback, source_callback)) { + callbacks)) { return false; } } diff --git a/deps/v8/src/objects/source-text-module.h b/deps/v8/src/objects/source-text-module.h index 05b4576bfa4a69..e74de1ecfc1cd1 100644 --- a/deps/v8/src/objects/source-text-module.h +++ b/deps/v8/src/objects/source-text-module.h @@ -172,8 +172,7 @@ class SourceTextModule static V8_WARN_UNUSED_RESULT bool PrepareInstantiate( Isolate* isolate, DirectHandle module, v8::Local context, - v8::Module::ResolveModuleCallback module_callback, - v8::Module::ResolveSourceCallback source_callback); + const Module::UserResolveCallbacks& callbacks); static V8_WARN_UNUSED_RESULT bool FinishInstantiate( Isolate* isolate, Handle module, ZoneForwardList>* stack, unsigned* dfs_index, diff --git a/deps/v8/src/trap-handler/trap-handler.h b/deps/v8/src/trap-handler/trap-handler.h index 16215ece149026..0c949143891319 100644 --- a/deps/v8/src/trap-handler/trap-handler.h +++ b/deps/v8/src/trap-handler/trap-handler.h @@ -15,49 +15,51 @@ namespace v8::internal::trap_handler { -// X64 on Linux, Windows, MacOS, FreeBSD. -#if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \ - ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN || \ - V8_OS_FREEBSD) -#define V8_TRAP_HANDLER_SUPPORTED true -// Arm64 native on Linux, Windows, MacOS. -#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && \ - ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN) -#define V8_TRAP_HANDLER_SUPPORTED true -// For Linux and Mac, enable the simulator when it's been requested. -#if USE_SIMULATOR && ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_DARWIN) -#define V8_TRAP_HANDLER_VIA_SIMULATOR -#endif -// Arm64 simulator on x64 on Linux, Mac, or Windows. -// -// The simulator case uses some inline assembly code, which cannot be -// compiled with MSVC, so don't enable the trap handler in that case. -// (MSVC #defines _MSC_VER, but so does Clang when targeting Windows, hence -// the check for __clang__.) -#elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_X64 && \ - (V8_OS_LINUX || V8_OS_DARWIN || V8_OS_WIN) && \ - (!defined(_MSC_VER) || defined(__clang__)) -#define V8_TRAP_HANDLER_VIA_SIMULATOR -#define V8_TRAP_HANDLER_SUPPORTED true -// Loong64 (non-simulator) on Linux. -#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_LOONG64 && V8_OS_LINUX -#define V8_TRAP_HANDLER_SUPPORTED true -// Loong64 simulator on x64 on Linux -#elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_X64 && V8_OS_LINUX -#define V8_TRAP_HANDLER_VIA_SIMULATOR -#define V8_TRAP_HANDLER_SUPPORTED true -// RISCV64 (non-simulator) on Linux. -#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_RISCV64 && V8_OS_LINUX && \ - !V8_OS_ANDROID -#define V8_TRAP_HANDLER_SUPPORTED true -// RISCV64 simulator on x64 on Linux -#elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_X64 && V8_OS_LINUX -#define V8_TRAP_HANDLER_VIA_SIMULATOR -#define V8_TRAP_HANDLER_SUPPORTED true -// Everything else is unsupported. -#else +// // X64 on Linux, Windows, MacOS, FreeBSD. +// #if V8_HOST_ARCH_X64 && V8_TARGET_ARCH_X64 && \ +// ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN || \ +// V8_OS_FREEBSD) +// #define V8_TRAP_HANDLER_SUPPORTED true +// // Arm64 native on Linux, Windows, MacOS. +// #elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_ARM64 && \ +// ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_WIN || V8_OS_DARWIN) +// #define V8_TRAP_HANDLER_SUPPORTED true +// // For Linux and Mac, enable the simulator when it's been requested. +// #if USE_SIMULATOR && ((V8_OS_LINUX && !V8_OS_ANDROID) || V8_OS_DARWIN) +// #define V8_TRAP_HANDLER_VIA_SIMULATOR +// #endif +// // Arm64 simulator on x64 on Linux, Mac, or Windows. +// // +// // The simulator case uses some inline assembly code, which cannot be +// // compiled with MSVC, so don't enable the trap handler in that case. +// // (MSVC #defines _MSC_VER, but so does Clang when targeting Windows, hence +// // the check for __clang__.) +// #elif V8_TARGET_ARCH_ARM64 && V8_HOST_ARCH_X64 && \ +// (V8_OS_LINUX || V8_OS_DARWIN || V8_OS_WIN) && \ +// (!defined(_MSC_VER) || defined(__clang__)) +// #define V8_TRAP_HANDLER_VIA_SIMULATOR +// #define V8_TRAP_HANDLER_SUPPORTED true +// // Loong64 (non-simulator) on Linux. +// #elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_LOONG64 && V8_OS_LINUX +// #define V8_TRAP_HANDLER_SUPPORTED true +// // Loong64 simulator on x64 on Linux +// #elif V8_TARGET_ARCH_LOONG64 && V8_HOST_ARCH_X64 && V8_OS_LINUX +// #define V8_TRAP_HANDLER_VIA_SIMULATOR +// #define V8_TRAP_HANDLER_SUPPORTED true +// // RISCV64 (non-simulator) on Linux. +// #elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_RISCV64 && V8_OS_LINUX && \ +// !V8_OS_ANDROID +// #define V8_TRAP_HANDLER_SUPPORTED true +// // RISCV64 simulator on x64 on Linux +// #elif V8_TARGET_ARCH_RISCV64 && V8_HOST_ARCH_X64 && V8_OS_LINUX +// #define V8_TRAP_HANDLER_VIA_SIMULATOR +// #define V8_TRAP_HANDLER_SUPPORTED true +// // Everything else is unsupported. +// #else +// #define V8_TRAP_HANDLER_SUPPORTED false +// #endif + #define V8_TRAP_HANDLER_SUPPORTED false -#endif #if V8_OS_ANDROID && V8_TRAP_HANDLER_SUPPORTED // It would require some careful security review before the trap handler diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 0c6a25de324315..8340387c1b42e7 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -17656,6 +17656,152 @@ TEST(GetHeapSpaceStatistics) { CHECK_EQ(total_physical_size, heap_statistics.total_physical_size()); } +UNINITIALIZED_TEST(GetHeapTotalAllocatedBytes) { + // This test is incompatible with concurrent allocation, which may occur + // while collecting the statistics and break the final `CHECK_EQ`s. + if (i::v8_flags.stress_concurrent_allocation) return; + + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + + const uint32_t number_of_elements = 1; + const uint32_t allocation_size = i::FixedArray::SizeFor(number_of_elements); + const uint32_t trusted_allocation_size = + i::TrustedFixedArray::SizeFor(number_of_elements); + const uint32_t lo_number_of_elements = 256 * 1024; + const uint32_t lo_allocation_size = + i::FixedArray::SizeFor(lo_number_of_elements); + const uint32_t trusted_lo_allocation_size = + i::TrustedFixedArray::SizeFor(lo_number_of_elements); + const uint32_t expected_allocation_size = + allocation_size * 2 + lo_allocation_size * 2 + trusted_allocation_size + + trusted_lo_allocation_size; + + { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + LocalContext env(isolate); + i::Isolate* i_isolate = reinterpret_cast(isolate); + + v8::HeapStatistics heap_stats_before; + isolate->GetHeapStatistics(&heap_stats_before); + size_t initial_allocated = heap_stats_before.total_allocated_bytes(); + + i::MaybeHandle young_alloc = + i_isolate->factory()->TryNewFixedArray(number_of_elements, + i::AllocationType::kYoung); + USE(young_alloc); + i::MaybeHandle old_alloc = + i_isolate->factory()->TryNewFixedArray(number_of_elements, + i::AllocationType::kOld); + USE(old_alloc); + i::Handle trusted_alloc = + i_isolate->factory()->NewTrustedFixedArray(number_of_elements, + i::AllocationType::kTrusted); + USE(trusted_alloc); + i::MaybeHandle old_lo_alloc = + i_isolate->factory()->TryNewFixedArray(lo_number_of_elements, + i::AllocationType::kOld); + USE(old_lo_alloc); + + { + v8::HandleScope inner_handle_scope(isolate); + auto young_lo_alloc = i_isolate->factory()->TryNewFixedArray( + lo_number_of_elements, i::AllocationType::kYoung); + USE(young_lo_alloc); + } + + auto trusted_lo_alloc = i_isolate->factory()->NewTrustedFixedArray( + lo_number_of_elements, i::AllocationType::kTrusted); + USE(trusted_lo_alloc); + + v8::HeapStatistics heap_stats_after; + isolate->GetHeapStatistics(&heap_stats_after); + uint64_t final_allocated = heap_stats_after.total_allocated_bytes(); + + CHECK_GT(final_allocated, initial_allocated); + uint64_t allocated_diff = final_allocated - initial_allocated; + CHECK_GE(allocated_diff, expected_allocation_size); + + // This either tests counting happening when a LAB freed and validate + // there's no double counting on evacuated/promoted objects. + v8::internal::heap::InvokeAtomicMajorGC(i_isolate->heap()); + + v8::HeapStatistics heap_stats_after_gc; + isolate->GetHeapStatistics(&heap_stats_after_gc); + uint64_t total_allocation_after_gc = + heap_stats_after_gc.total_allocated_bytes(); + + CHECK_EQ(total_allocation_after_gc, final_allocated); + } + + isolate->Dispose(); +} + +#if V8_CAN_CREATE_SHARED_HEAP_BOOL + +UNINITIALIZED_TEST(GetHeapTotalAllocatedBytesSharedSpaces) { + // This test is incompatible with concurrent allocation, which may occur + // while collecting the statistics and break the final `CHECK_EQ`s. + if (i::v8_flags.stress_concurrent_allocation) return; + if (COMPRESS_POINTERS_IN_MULTIPLE_CAGES_BOOL) return; + + i::v8_flags.shared_heap = true; + i::FlagList::EnforceFlagImplications(); + + v8::Isolate::CreateParams create_params; + create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); + v8::Isolate* isolate = v8::Isolate::New(create_params); + + { + v8::Isolate::Scope isolate_scope(isolate); + v8::HandleScope handle_scope(isolate); + LocalContext env(isolate); + + v8::HeapStatistics heap_stats_before; + isolate->GetHeapStatistics(&heap_stats_before); + size_t initial_allocated = heap_stats_before.total_allocated_bytes(); + + i::Isolate* i_isolate = reinterpret_cast(isolate); + + const uint32_t number_of_elements = 1; + const uint32_t allocation_size = i::FixedArray::SizeFor(number_of_elements); + const uint32_t trusted_allocation_size = + i::TrustedFixedArray::SizeFor(number_of_elements); + const uint32_t lo_number_of_elements = 256 * 1024; + const uint32_t lo_allocation_size = + i::FixedArray::SizeFor(lo_number_of_elements); + const uint32_t expected_allocation_size = + allocation_size + trusted_allocation_size + lo_allocation_size; + + i::MaybeHandle shared_alloc = + i_isolate->factory()->TryNewFixedArray(number_of_elements, + i::AllocationType::kSharedOld); + USE(shared_alloc); + i::Handle shared_trusted_alloc = + i_isolate->factory()->NewTrustedFixedArray( + number_of_elements, i::AllocationType::kSharedTrusted); + USE(shared_trusted_alloc); + i::MaybeHandle shared_lo_alloc = + i_isolate->factory()->TryNewFixedArray(lo_number_of_elements, + i::AllocationType::kSharedOld); + USE(shared_lo_alloc); + + v8::HeapStatistics heap_stats_after; + isolate->GetHeapStatistics(&heap_stats_after); + uint64_t final_allocated = heap_stats_after.total_allocated_bytes(); + + CHECK_GT(final_allocated, initial_allocated); + uint64_t allocated_diff = final_allocated - initial_allocated; + CHECK_GE(allocated_diff, expected_allocation_size); + } + + isolate->Dispose(); +} + +#endif // V8_CAN_CREATE_SHARED_HEAP_BOOL + TEST(NumberOfNativeContexts) { static const size_t kNumTestContexts = 10; i::Isolate* isolate = CcTest::i_isolate(); diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-500880819.js b/deps/v8/test/mjsunit/maglev/regress/regress-500880819.js new file mode 100644 index 00000000000000..bf6b8f065959fa --- /dev/null +++ b/deps/v8/test/mjsunit/maglev/regress/regress-500880819.js @@ -0,0 +1,31 @@ +// Copyright 2026 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Flags: --allow-natives-syntax --maglev --expose-gc + +let f = new Float64Array(1); f[0] = 5; +let HN5 = f[0]; +globalThis.G = HN5; + +let obj = { smiField: 1 }; +obj.smiField = 2; +obj.smiField = 3; + +function sh(o, x, c) { if (c) o.smiField = x; } +function corrupt(o, x, c) { G = x; sh(o, x, c); } + +%PrepareFunctionForOptimization(sh); +%PrepareFunctionForOptimization(corrupt); +sh(obj, 5, true); +corrupt(obj, HN5, false); +corrupt(obj, HN5, false); +%OptimizeMaglevOnNextCall(sh); +%OptimizeMaglevOnNextCall(corrupt); + +// Trigger: HeapNumber(5.0) ends up in a kSmi-typed field without a Smi check. +corrupt(obj, HN5, true); + +// Force a write-barrier verification path by allocating. +gc(); +assertEquals(5, obj.smiField); diff --git a/deps/v8/test/mjsunit/maglev/regress/regress-501789186.js b/deps/v8/test/mjsunit/maglev/regress/regress-501789186.js new file mode 100644 index 00000000000000..c3baa6f3b15b14 --- /dev/null +++ b/deps/v8/test/mjsunit/maglev/regress/regress-501789186.js @@ -0,0 +1,26 @@ +// Copyright 2026 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Flags: --fuzzing --expose-gc --allow-natives-syntax --disable-abortjs +// Flags: --disable-in-process-stack-traces + +let f64 = new Float64Array(1); +f64[0] = 1.0; +let hn = f64[0]; + +let script_var_1 = hn; +let script_var_2 = 1; +script_var_2 = 2; + +function foo(x) { + script_var_1 = x; + script_var_2 = x; +} + +%PrepareFunctionForOptimization(foo); +%OptimizeMaglevOnNextCall(foo); + +foo(hn); + +assertEquals(1, script_var_2); diff --git a/deps/v8/test/unittests/objects/modules-unittest.cc b/deps/v8/test/unittests/objects/modules-unittest.cc index 08663f975e6468..07a6fee32b63a2 100644 --- a/deps/v8/test/unittests/objects/modules-unittest.cc +++ b/deps/v8/test/unittests/objects/modules-unittest.cc @@ -6,6 +6,9 @@ #include "src/flags/flags.h" #include "test/unittests/test-utils.h" #include "testing/gtest/include/gtest/gtest.h" +#if V8_ENABLE_WEBASSEMBLY +#include "include/v8-wasm.h" +#endif // V8_ENABLE_WEBASSEMBLY namespace { @@ -1259,4 +1262,293 @@ TEST_F(ModuleTest, AsyncEvaluatingInEvaluateEntryPoint) { CHECK_EQ(v8::Promise::kFulfilled, promise1->State()); } +// Test data for index-based module resolution +static std::vector> index_modules_global; + +static MaybeLocal ResolveModuleByIndexCallback( + Local context, size_t module_request_index, + Local referrer) { + Isolate* isolate = Isolate::GetCurrent(); + CHECK_LE(module_request_index, index_modules_global.size()); + return index_modules_global[module_request_index].Get(isolate); +} + +static MaybeLocal ResolveSourceByIndexUnreachableCallback( + Local context, size_t module_request_index, + Local referrer) { + UNREACHABLE(); +} + +TEST_F(ModuleTest, ModuleInstantiationByIndex) { + HandleScope scope(isolate()); + v8::TryCatch try_catch(isolate()); + + Local module; + { + Local source_text = NewString( + "import { x } from './dep1.js';\n" + "export { y } from './dep2.js';\n" + "export const z = x;\n"); + ScriptOrigin origin = ModuleOrigin(NewString("main.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + + Local module_requests = module->GetModuleRequests(); + CHECK_EQ(2, module_requests->Length()); + + // Verify the requests are in expected order + Local module_request_0 = + module_requests->Get(context(), 0).As(); + CHECK( + NewString("./dep1.js")->StrictEquals(module_request_0->GetSpecifier())); + + Local module_request_1 = + module_requests->Get(context(), 1).As(); + CHECK( + NewString("./dep2.js")->StrictEquals(module_request_1->GetSpecifier())); + } + + // Create dependency modules to be resolved by index + { + Local source_text = NewString("export const x = 42;"); + ScriptOrigin origin = ModuleOrigin(NewString("dep1.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + Local dep1 = + ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + index_modules_global.emplace_back(isolate(), dep1); + } + + { + Local source_text = NewString("export const y = 24;"); + ScriptOrigin origin = ModuleOrigin(NewString("dep2.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + Local dep2 = + ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + index_modules_global.emplace_back(isolate(), dep2); + } + + // Instantiate using index-based callback + CHECK(module + ->InstantiateModule(context(), ResolveModuleByIndexCallback, + ResolveSourceByIndexUnreachableCallback) + .FromJust()); + CHECK_EQ(Module::kInstantiated, module->GetStatus()); + + // Verify evaluation works + MaybeLocal result = module->Evaluate(context()); + CHECK_EQ(Module::kEvaluated, module->GetStatus()); + Local promise = Local::Cast(result.ToLocalChecked()); + CHECK_EQ(promise->State(), v8::Promise::kFulfilled); + + CHECK(!try_catch.HasCaught()); + + CHECK_EQ(42, module->GetModuleNamespace() + .As() + ->Get(context(), NewString("z")) + .ToLocalChecked() + ->Int32Value(context()) + .ToChecked()); + CHECK_EQ(24, module->GetModuleNamespace() + .As() + ->Get(context(), NewString("y")) + .ToLocalChecked() + ->Int32Value(context()) + .ToChecked()); + // Clean up + for (auto& mod : index_modules_global) { + mod.Reset(); + } + index_modules_global.clear(); +} + +static bool resolve_module_by_index_failure_called = false; +static MaybeLocal ResolveModuleByIndexFailureCallback( + Local context, size_t module_request_index, + Local referrer) { + CHECK(!resolve_module_by_index_failure_called); + resolve_module_by_index_failure_called = true; + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + std::string message = + "module " + std::to_string(module_request_index) + " not found"; + isolate->ThrowException( + String::NewFromUtf8(isolate, message.c_str()).ToLocalChecked()); + return MaybeLocal(); +} + +TEST_F(ModuleTest, ModuleInstantiationByIndexFailure) { + HandleScope scope(isolate()); + v8::TryCatch try_catch(isolate()); + + Local module; + { + Local source_text = NewString( + "import './dep1.js';\n" + "import './dep2.js';\n" + "import './dep3.js';"); + ScriptOrigin origin = ModuleOrigin(NewString("main.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + + Local module_requests = module->GetModuleRequests(); + CHECK_EQ(3, module_requests->Length()); + } + + // Instantiation should fail and the callback should only be called once. + { + v8::TryCatch inner_try_catch(isolate()); + CHECK(module + ->InstantiateModule(context(), + ResolveModuleByIndexFailureCallback, + ResolveSourceByIndexUnreachableCallback) + .IsNothing()); + CHECK(inner_try_catch.HasCaught()); + CHECK(inner_try_catch.Exception()->StrictEquals( + NewString("module 0 not found"))); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + } + + // Should not leak to the outer try-catch. + CHECK(!try_catch.HasCaught()); +} + +static bool resolve_source_by_index_failure_called = false; +MaybeLocal ResolveSourceByIndexFailureCallback( + Local context, size_t module_request_index, + Local referrer) { + CHECK(!resolve_source_by_index_failure_called); + resolve_source_by_index_failure_called = true; + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + std::string message = + "module source " + std::to_string(module_request_index) + " not found"; + isolate->ThrowException( + String::NewFromUtf8(isolate, message.c_str()).ToLocalChecked()); + return MaybeLocal(); +} + +static MaybeLocal ResolveModuleByIndexUnreachableCallback( + Local context, size_t module_request_index, + Local referrer) { + UNREACHABLE(); +} + +TEST_F(ModuleTest, ModuleInstantiationByIndexWithSourceFaliure) { + bool prev_import_attributes = i::v8_flags.js_source_phase_imports; + i::v8_flags.js_source_phase_imports = true; + HandleScope scope(isolate()); + v8::TryCatch try_catch(isolate()); + + Local module; + { + Local source_text = NewString( + "import source mod from './foo.wasm;'\n" + "export { mod };\n"); + ScriptOrigin origin = ModuleOrigin(NewString("main.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + + Local module_requests = module->GetModuleRequests(); + CHECK_EQ(1, module_requests->Length()); + } + + // Instantiation should fail and the callback should only be called once. + { + v8::TryCatch inner_try_catch(isolate()); + CHECK(module + ->InstantiateModule(context(), + ResolveModuleByIndexUnreachableCallback, + ResolveSourceByIndexFailureCallback) + .IsNothing()); + CHECK(inner_try_catch.HasCaught()); + CHECK(inner_try_catch.Exception()->StrictEquals( + NewString("module source 0 not found"))); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + } + + // Should not leak to the outer try-catch. + CHECK(!try_catch.HasCaught()); + i::v8_flags.js_source_phase_imports = prev_import_attributes; +} + +#if V8_ENABLE_WEBASSEMBLY + +// The bytes of a minimal WebAssembly module. +static const uint8_t kMinimalWasmModuleBytes[]{0x00, 0x61, 0x73, 0x6d, + 0x01, 0x00, 0x00, 0x00}; + +static bool resolve_source_by_index_called = false; +static v8::Global wasm_module_global; +MaybeLocal ResolveSourceByIndexCallback(Local context, + size_t module_request_index, + Local referrer) { + CHECK(!resolve_source_by_index_called); + resolve_source_by_index_called = true; + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + return wasm_module_global.Get(isolate); +} + +TEST_F(ModuleTest, ModuleInstantiationByIndexWithSource) { + bool prev_import_attributes = i::v8_flags.js_source_phase_imports; + i::v8_flags.js_source_phase_imports = true; + HandleScope scope(isolate()); + v8::TryCatch try_catch(isolate()); + + Local module; + { + Local source_text = NewString( + "import source mod from './foo.wasm';\n" + "export { mod };\n"); + ScriptOrigin origin = ModuleOrigin(NewString("main.js"), isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate(), &source).ToLocalChecked(); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + + Local module_requests = module->GetModuleRequests(); + CHECK_EQ(1, module_requests->Length()); + + Local module_request_0 = + module_requests->Get(context(), 0).As(); + CHECK(NewString("./foo.wasm") + ->StrictEquals(module_request_0->GetSpecifier())); + CHECK_EQ(v8::ModuleImportPhase::kSource, module_request_0->GetPhase()); + } + + { + Local wasm_module = + v8::WasmModuleObject::Compile( + isolate(), + {kMinimalWasmModuleBytes, arraysize(kMinimalWasmModuleBytes)}) + .ToLocalChecked(); + wasm_module_global.Reset(isolate(), wasm_module); + } + + // Instantiate using index-based callback + CHECK(module + ->InstantiateModule(context(), + ResolveModuleByIndexUnreachableCallback, + ResolveSourceByIndexCallback) + .FromJust()); + CHECK_EQ(Module::kInstantiated, module->GetStatus()); + + // Verify evaluation works + MaybeLocal result = module->Evaluate(context()); + CHECK_EQ(Module::kEvaluated, module->GetStatus()); + Local promise = Local::Cast(result.ToLocalChecked()); + CHECK_EQ(promise->State(), v8::Promise::kFulfilled); + + CHECK(!try_catch.HasCaught()); + Local mod = module->GetModuleNamespace() + .As() + ->Get(context(), NewString("mod")) + .ToLocalChecked(); + CHECK(mod->StrictEquals(wasm_module_global.Get(isolate()))); + + i::v8_flags.js_source_phase_imports = prev_import_attributes; + wasm_module_global.Reset(); +} + +#endif // V8_ENABLE_WEBASSEMBLY + } // anonymous namespace diff --git a/deps/v8/third_party/zlib/cpu_features.c b/deps/v8/third_party/zlib/cpu_features.c index 34ae7b913af9a2..a2c7d5a9478273 100644 --- a/deps/v8/third_party/zlib/cpu_features.c +++ b/deps/v8/third_party/zlib/cpu_features.c @@ -106,11 +106,18 @@ void ZLIB_INTERNAL cpu_check_features(void) static void _cpu_check_features(void) { #if defined(ARMV8_OS_ANDROID) && defined(__aarch64__) - uint64_t features = android_getCpuFeatures(); + // uint64_t features = android_getCpuFeatures(); + /* + * Crypto extensions (crc32/pmull) are a baseline feature in ARMv8.1-A, and + * RK3588 has Cortex-A76 (ARMv8.2-A) cores, which is new enough that these can be assumed without runtime detection. + * Also android_getCpuFeatures() is somehow not available in the build system. + */ + uint64_t features = ANDROID_CPU_ARM64_FEATURE_CRC32 | ANDROID_CPU_ARM64_FEATURE_PMULL; arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM64_FEATURE_CRC32); arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM64_FEATURE_PMULL); #elif defined(ARMV8_OS_ANDROID) /* aarch32 */ - uint64_t features = android_getCpuFeatures(); + // uint64_t features = android_getCpuFeatures(); + uint64_t features = ANDROID_CPU_ARM_FEATURE_CRC32 | ANDROID_CPU_ARM_FEATURE_PMULL; arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM_FEATURE_CRC32); arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM_FEATURE_PMULL); #elif defined(ARMV8_OS_LINUX) && defined(__aarch64__) diff --git a/deps/zlib/cpu_features.c b/deps/zlib/cpu_features.c index 34ae7b913af9a2..b3dcac4d7ffdab 100644 --- a/deps/zlib/cpu_features.c +++ b/deps/zlib/cpu_features.c @@ -106,11 +106,13 @@ void ZLIB_INTERNAL cpu_check_features(void) static void _cpu_check_features(void) { #if defined(ARMV8_OS_ANDROID) && defined(__aarch64__) - uint64_t features = android_getCpuFeatures(); + // uint64_t features = android_getCpuFeatures(); + uint64_t features = ANDROID_CPU_ARM64_FEATURE_CRC32 | ANDROID_CPU_ARM64_FEATURE_PMULL; arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM64_FEATURE_CRC32); arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM64_FEATURE_PMULL); #elif defined(ARMV8_OS_ANDROID) /* aarch32 */ - uint64_t features = android_getCpuFeatures(); + // uint64_t features = android_getCpuFeatures(); + uint64_t features = ANDROID_CPU_ARM_FEATURE_CRC32 | ANDROID_CPU_ARM_FEATURE_PMULL; arm_cpu_enable_crc32 = !!(features & ANDROID_CPU_ARM_FEATURE_CRC32); arm_cpu_enable_pmull = !!(features & ANDROID_CPU_ARM_FEATURE_PMULL); #elif defined(ARMV8_OS_LINUX) && defined(__aarch64__) diff --git a/deps/zlib/zlib.gyp b/deps/zlib/zlib.gyp index 12449e7b0294c9..677eff9c29a64a 100644 --- a/deps/zlib/zlib.gyp +++ b/deps/zlib/zlib.gyp @@ -201,6 +201,9 @@ 'USE_FILE32API' ], }], + # ['OS=="android"', { + # 'sources': [ '<(android_ndk_path)/sources/android/cpufeatures/cpu-features.c' ], + # }], # Incorporate optimizations where possible. ['(target_arch in "ia32 x64" and OS!="ios") or arm_fpu=="neon"', { 'dependencies': [ 'zlib_data_chunk_simd' ], diff --git a/doc/abi_version_registry.json b/doc/abi_version_registry.json index 0bcccd74e7e730..67be596915bc24 100644 --- a/doc/abi_version_registry.json +++ b/doc/abi_version_registry.json @@ -1,6 +1,6 @@ { "NODE_MODULE_VERSION": [ - { "modules": 141,"runtime": "node", "variant": "v8_14.1", "versions": "25.0.0-pre" }, + { "modules": 141,"runtime": "node", "variant": "v8_14.1", "versions": "25.0.0" }, { "modules": 140,"runtime": "electron", "variant": "electron", "versions": "39" }, { "modules": 139,"runtime": "electron", "variant": "electron", "versions": "38" }, { "modules": 138,"runtime": "node", "variant": "v8_13.7", "versions": "25.0.0-pre" }, diff --git a/doc/api/assert.md b/doc/api/assert.md index e52b9b57c2b43a..0358e630526a15 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -317,11 +317,14 @@ An alias of [`assert.ok()`][]. > Stability: 1.0 - Early development @@ -308,7 +300,7 @@ Error: connect ERR_ACCESS_DENIED Access to this API has been restricted. Use --a ### `--allow-net` > Stability: 1.1 - Active development @@ -981,7 +973,7 @@ only recognizes double `"` for quoting. In Powershell or Git bash, both `'` and `"` are usable. It is possible to run code containing inline types unless the -[`--no-experimental-strip-types`][] flag is provided. +[`--no-strip-types`][] flag is provided. ### `--experimental-addon-modules` @@ -1022,6 +1014,9 @@ in the `$schema` must be replaced with the version of Node.js you are using. }, "testRunner": { "test-isolation": "process" + }, + "watch": { + "watch-preserve-output": true } } ``` @@ -1177,7 +1172,7 @@ top-level awaits, and print their location to help users find them. ### `--experimental-quic` > Stability: 1.1 - Active development @@ -1587,7 +1582,7 @@ changes: This configures Node.js to interpret `--eval` or `STDIN` input as CommonJS or as an ES module. Valid values are `"commonjs"`, `"module"`, `"module-typescript"` and `"commonjs-typescript"`. -The `"-typescript"` values are not available with the flag `--no-experimental-strip-types`. +The `"-typescript"` values are not available with the flag `--no-strip-types`. The default is no value, or `"commonjs"` if `--no-experimental-detect-module` is passed. If `--input-type` is not provided, @@ -1746,10 +1741,11 @@ surface on other platforms, but the performance impact may be severe. added: v22.4.0 --> +> Stability: 1.2 - Release candidate. + The file used to store `localStorage` data. If the file does not exist, it is created the first time `localStorage` is accessed. The same file may be shared -between multiple Node.js processes concurrently. This flag is a no-op if -Node.js is started with the `--no-webstorage` (or `--no-experimental-webstorage`) flag. +between multiple Node.js processes concurrently. ### `--max-http-header-size=size` @@ -1903,30 +1899,27 @@ changes: Disable the experimental [`node:sqlite`][] module. -### `--no-experimental-strip-types` +### `--no-experimental-websocket` -> Stability: 1.2 - Release candidate - -Disable experimental type-stripping for TypeScript files. -For more information, see the [TypeScript type-stripping][] documentation. +Disable exposition of {WebSocket} on the global scope. -### `--no-experimental-websocket` +### `--no-experimental-webstorage` -Disable exposition of {WebSocket} on the global scope. +> Stability: 1.2 - Release candidate. + +Disable [`Web Storage`][] support. ### `--no-extra-info-on-fatal-exception` @@ -1969,21 +1962,31 @@ changes: Disables the family autoselection algorithm unless connection options explicitly enables it. -### `--no-warnings` +### `--no-strip-types` -Silence all process warnings (including deprecations). +Disable type-stripping for TypeScript files. +For more information, see the [TypeScript type-stripping][] documentation. -### `--no-webstorage` +### `--no-warnings` -Disable [`Web Storage`][] support. +Silence all process warnings (including deprecations). ### `--node-memory-debug` @@ -3139,21 +3142,18 @@ On platforms other than Windows and macOS, this loads certificates from the dire and file trusted by OpenSSL, similar to `--use-openssl-ca`, with the difference being that it caches the certificates after first load. -On Windows and macOS, the certificate trust policy is planned to follow -[Chromium's policy for locally trusted certificates][]: +On Windows and macOS, the certificate trust policy is similar to +[Chromium's policy for locally trusted certificates][], but with some differences: On macOS, the following settings are respected: * Default and System Keychains * Trust: * Any certificate where the “When using this certificate” flag is set to “Always Trust” or - * Any certificate where the “Secure Sockets Layer (SSL)” flag is set to “Always Trust.” - * Distrust: - * Any certificate where the “When using this certificate” flag is set to “Never Trust” or - * Any certificate where the “Secure Sockets Layer (SSL)” flag is set to “Never Trust.” + * Any certificate where the “Secure Sockets Layer (SSL)” flag is set to “Always Trust”. + * The certificate must also be valid, with "X.509 Basic Policy" set to “Always Trust”. -On Windows, the following settings are respected (unlike Chromium's policy, distrust -and intermediate CA are not currently supported): +On Windows, the following settings are respected: * Local Machine (accessed via `certlm.msc`) * Trust: @@ -3168,8 +3168,11 @@ and intermediate CA are not currently supported): * Trusted Root Certification Authorities * Enterprise Trust -> Group Policy -> Trusted Root Certification Authorities -On Windows and macOS, Node.js would check that the user settings for the certificates -do not forbid them for TLS server authentication before using them. +On Windows and macOS, Node.js would check that the user settings for the trusted +certificates do not forbid them for TLS server authentication before using them. + +Node.js currently does not support distrust/revocation of certificates +from another source based on system settings. On other systems, Node.js loads certificates from the default certificate file (typically `/etc/ssl/cert.pem`) and default certificate directory (typically @@ -3547,6 +3550,7 @@ one is included in the list below. * `--no-force-async-hooks-checks` * `--no-global-search-paths` * `--no-network-family-autoselection` +* `--no-strip-types` * `--no-warnings` * `--no-webstorage` * `--node-memory-debug` @@ -3988,6 +3992,8 @@ documented here: ### `--harmony-shadow-realm` +### `--heap-snapshot-on-oom` + ### `--interpreted-frames-native-stack` ### `--jitless` @@ -4068,7 +4074,6 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [#42511]: https://github.com/nodejs/node/issues/42511 [Chrome DevTools Protocol]: https://chromedevtools.github.io/devtools-protocol/ [Chromium's policy for locally trusted certificates]: https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/faq.md#does-the-chrome-certificate-verifier-consider-local-trust-decisions -[CommonJS]: modules.md [CommonJS module]: modules.md [DEP0025 warning]: deprecations.md#dep0025-requirenodesys [ECMAScript module]: esm.md#modules-ecmascript-modules @@ -4078,7 +4083,7 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [Loading ECMAScript modules using `require()`]: modules.md#loading-ecmascript-modules-using-require [Module customization hooks]: module.md#customization-hooks [Module customization hooks: enabling]: module.md#enabling -[Modules loaders]: packages.md#modules-loaders +[Module resolution and loading]: packages.md#module-resolution-and-loading [Navigator API]: globals.md#navigator [Node.js issue tracker]: https://github.com/nodejs/node/issues [OSSL_PROVIDER-legacy]: https://www.openssl.org/docs/man3.0/man7/OSSL_PROVIDER-legacy.html @@ -4104,11 +4109,10 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [`--disable-sigusr1`]: #--disable-sigusr1 [`--env-file-if-exists`]: #--env-file-if-existsfile [`--env-file`]: #--env-filefile -[`--experimental-addon-modules`]: #--experimental-addon-modules [`--experimental-sea-config`]: single-executable-applications.md#generating-single-executable-preparation-blobs [`--heap-prof-dir`]: #--heap-prof-dir [`--import`]: #--importmodule -[`--no-experimental-strip-types`]: #--no-experimental-strip-types +[`--no-strip-types`]: #--no-strip-types [`--openssl-config`]: #--openssl-configfile [`--preserve-symlinks`]: #--preserve-symlinks [`--print`]: #-p---print-script @@ -4145,7 +4149,7 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [debugging security implications]: https://nodejs.org/en/docs/guides/debugging-getting-started/#security-implications [deprecation warnings]: deprecations.md#list-of-deprecated-apis [emit_warning]: process.md#processemitwarningwarning-options -[environment_variables]: #environment-variables +[environment_variables]: #environment-variables_1 [filtering tests by name]: test.md#filtering-tests-by-name [global setup and teardown]: test.md#global-setup-and-teardown [jitless]: https://v8.dev/blog/jitless diff --git a/doc/api/crypto.md b/doc/api/crypto.md index c17899bb4f608d..f3a68e5e704357 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -4009,8 +4009,8 @@ changes: * `publicKey` {string | Buffer | KeyObject} * `privateKey` {string | Buffer | KeyObject} -Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, -Ed25519, Ed448, X25519, X448, and DH are currently supported. +Generates a new asymmetric key pair of the given `type`. See the +supported [asymmetric key types][]. If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function behaves as if [`keyObject.export()`][] had been called on its result. Otherwise, @@ -4131,8 +4131,8 @@ changes: * `publicKey` {string | Buffer | KeyObject} * `privateKey` {string | Buffer | KeyObject} -Generates a new asymmetric key pair of the given `type`. RSA, RSA-PSS, DSA, EC, -Ed25519, Ed448, X25519, X448, DH, and ML-DSA[^openssl35] are currently supported. +Generates a new asymmetric key pair of the given `type`. See the +supported [asymmetric key types][]. If a `publicKeyEncoding` or `privateKeyEncoding` was specified, this function behaves as if [`keyObject.export()`][] had been called on its result. Otherwise, diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md index 465095d9cdbe44..610bcc4f7302a1 100644 --- a/doc/api/deprecations.md +++ b/doc/api/deprecations.md @@ -551,7 +551,7 @@ Type: End-of-Life The `os.tmpDir()` API was deprecated in Node.js 7.0.0 and has since been removed. Please use [`os.tmpdir()`][] instead. -An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/tmpDir-to-tmpdir)): +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/tmpdir-to-tmpdir)): ```bash npx codemod@latest @nodejs/tmpDir-to-tmpdir @@ -688,10 +688,10 @@ Type: End-of-Life `util.debug()` has been removed. Please use [`console.error()`][] instead. -An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/util-debug-to-console-error)): +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/util-print-to-console-log)): ```bash -npx codemod@latest @nodejs/util-debug-to-console-error +npx codemod@latest @nodejs/util-print-to-console-log ``` ### DEP0029: `util.error()` @@ -725,7 +725,7 @@ npx codemod@latest @nodejs/util-print-to-console-log A browser-compatible implementation of {ErrorEvent}. @@ -638,13 +644,23 @@ A browser-compatible implementation of {Headers}. +> Stability: 1.2 - Release candidate. Disable this API with [`--no-experimental-webstorage`][]. + A browser-compatible implementation of [`localStorage`][]. Data is stored unencrypted in the file specified by the [`--localstorage-file`][] CLI flag. The maximum amount of data that can be stored is 10 MB. Any modification of this data outside of the Web Storage API is not supported. -Disable this API with the [`--no-webstorage`][] (or its alias `--no-experimental-webstorage`) CLI flag. `localStorage` data is not stored per user or per request when used in the context of a server, it is shared across all users and requests. @@ -1067,9 +1083,13 @@ A browser-compatible implementation of {Request}. -> Stability: 1.0 - Early development. +> Stability: 1.2 - Release candidate. Disable this API with [`--no-experimental-webstorage`][]. A browser-compatible implementation of [`sessionStorage`][]. Data is stored in memory, with a storage quota of 10 MB. `sessionStorage` data persists only within @@ -1105,11 +1125,9 @@ added: v0.0.1 added: v22.4.0 --> -> Stability: 1.0 - Early development. Enable this API with the -> \[`--experimental-webstorage`]\[] CLI flag. +> Stability: 1.2 - Release candidate. Disable this API with [`--no-experimental-webstorage`][]. -A browser-compatible implementation of {Storage}. Disable this API with the -[`--no-webstorage`][] (or its alias `--no-experimental-webstorage`) CLI flag. +A browser-compatible implementation of {Storage}. ## `structuredClone(value[, options])` @@ -1323,7 +1341,7 @@ A browser-compatible implementation of [`WritableStreamDefaultWriter`][]. [`--localstorage-file`]: cli.md#--localstorage-filefile [`--no-experimental-global-navigator`]: cli.md#--no-experimental-global-navigator [`--no-experimental-websocket`]: cli.md#--no-experimental-websocket -[`--no-webstorage`]: cli.md#--no-webstorage +[`--no-experimental-webstorage`]: cli.md#--no-experimental-webstorage [`ByteLengthQueuingStrategy`]: webstreams.md#class-bytelengthqueuingstrategy [`CompressionStream`]: webstreams.md#class-compressionstream [`CountQueuingStrategy`]: webstreams.md#class-countqueuingstrategy diff --git a/doc/api/http.md b/doc/api/http.md index b11f5a974d635d..62876078bf2369 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -237,23 +237,37 @@ added: v0.11.4 --> * `options` {Object} Options containing connection details. Check - [`net.createConnection()`][] for the format of the options -* `callback` {Function} Callback function that receives the created socket -* Returns: {stream.Duplex} + [`net.createConnection()`][] for the format of the options. For custom agents, + this object is passed to the custom `createConnection` function. +* `callback` {Function} (Optional, primarily for custom agents) A function to be + called by a custom `createConnection` implementation when the socket is + created, especially for asynchronous operations. + * `err` {Error | null} An error object if socket creation failed. + * `socket` {stream.Duplex} The created socket. +* Returns: {stream.Duplex} The created socket. This is returned by the default + implementation or by a custom synchronous `createConnection` implementation. + If a custom `createConnection` uses the `callback` for asynchronous + operation, this return value might not be the primary way to obtain the socket. Produces a socket/stream to be used for HTTP requests. -By default, this function is the same as [`net.createConnection()`][]. However, -custom agents may override this method in case greater flexibility is desired. +By default, this function behaves identically to [`net.createConnection()`][], +synchronously returning the created socket. The optional `callback` parameter in the +signature is **not** used by this default implementation. -A socket/stream can be supplied in one of two ways: by returning the -socket/stream from this function, or by passing the socket/stream to `callback`. +However, custom agents may override this method to provide greater flexibility, +for example, to create sockets asynchronously. When overriding `createConnection`: -This method is guaranteed to return an instance of the {net.Socket} class, -a subclass of {stream.Duplex}, unless the user specifies a socket -type other than {net.Socket}. +1. **Synchronous socket creation**: The overriding method can return the + socket/stream directly. +2. **Asynchronous socket creation**: The overriding method can accept the `callback` + and pass the created socket/stream to it (e.g., `callback(null, newSocket)`). + If an error occurs during socket creation, it should be passed as the first + argument to the `callback` (e.g., `callback(err)`). -`callback` has a signature of `(err, stream)`. +The agent will call the provided `createConnection` function with `options` and +this internal `callback`. The `callback` provided by the agent has a signature +of `(err, stream)`. ### `agent.keepSocketAlive(socket)` @@ -637,7 +651,7 @@ added: v0.3.6 --> Emitted when the request has been sent. More specifically, this event is emitted -when the last segment of the response headers and body have been handed off to +when the last segment of the request headers and body have been handed off to the operating system for transmission over the network. It does not imply that the server has received anything yet. @@ -1172,6 +1186,7 @@ may run into a 'ECONNRESET' error. ```mjs import http from 'node:http'; +const agent = new http.Agent({ keepAlive: true }); // Server has a 5 seconds keep-alive timeout by default http @@ -1193,6 +1208,7 @@ setInterval(() => { ```cjs const http = require('node:http'); +const agent = new http.Agent({ keepAlive: true }); // Server has a 5 seconds keep-alive timeout by default http @@ -3555,6 +3571,9 @@ Found'`. @@ -608,8 +608,7 @@ changes: -> Stability: 1.2 - Release candidate (asynchronous version) -> Stability: 1.1 - Active development (synchronous version) +> Stability: 1.1 - Active development There are two types of module customization hooks that are currently supported: diff --git a/doc/api/modules.md b/doc/api/modules.md index 4ef79b855bd877..2dc2ef9a52e98b 100644 --- a/doc/api/modules.md +++ b/doc/api/modules.md @@ -255,9 +255,8 @@ This property is experimental and can change in the future. It should only be us by tools converting ES modules into CommonJS modules, following existing ecosystem conventions. Code authored directly in CommonJS should avoid depending on it. -When an ES Module contains both named exports and a default export, the result returned by `require()` -is the [module namespace object][], which places the default export in the `.default` property, similar to -the results returned by `import()`. +The result returned by `require()` is the [module namespace object][], which places +the default export in the `.default` property, similar to the results returned by `import()`. To customize what should be returned by `require(esm)` directly, the ES Module can export the desired value using the string name `"module.exports"`. @@ -415,7 +414,7 @@ NODE_MODULES_PATHS(START) 4. while I >= 0, a. if PARTS[I] = "node_modules", GOTO d. b. DIR = path join(PARTS[0 .. I] + "node_modules") - c. DIRS = DIR + DIRS + c. DIRS = DIRS + DIR d. let I = I - 1 5. return DIRS + GLOBAL_FOLDERS diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 5c68fc153a68c5..144b351b4f383b 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -2637,6 +2637,43 @@ It is the equivalent of doing `new Object()` in JavaScript. The JavaScript `Object` type is described in [Section object type][] of the ECMAScript Language Specification. +#### `napi_create_object_with_properties` + + + +> Stability: 1 - Experimental + +```cpp +napi_status napi_create_object_with_properties(napi_env env, + napi_value prototype_or_null, + const napi_value* property_names, + const napi_value* property_values, + size_t property_count, + napi_value* result) +``` + +* `[in] env`: The environment that the API is invoked under. +* `[in] prototype_or_null`: The prototype object for the new object. Can be a + `napi_value` representing a JavaScript object to use as the prototype, a + `napi_value` representing JavaScript `null`, or a `nullptr` that will be converted to `null`. +* `[in] property_names`: Array of `napi_value` representing the property names. +* `[in] property_values`: Array of `napi_value` representing the property values. +* `[in] property_count`: Number of properties in the arrays. +* `[out] result`: A `napi_value` representing a JavaScript `Object`. + +Returns `napi_ok` if the API succeeded. + +This API creates a JavaScript `Object` with the specified prototype and +properties. This is more efficient than calling `napi_create_object` followed +by multiple `napi_set_property` calls, as it can create the object with all +properties atomically, avoiding potential V8 map transitions. + +The arrays `property_names` and `property_values` must have the same length +specified by `property_count`. The properties are added to the object in the +order they appear in the arrays. + #### `napi_create_symbol` diff --git a/doc/api/net.md b/doc/api/net.md index f5226db3b656da..e258b331b383ce 100644 --- a/doc/api/net.md +++ b/doc/api/net.md @@ -1905,7 +1905,7 @@ added: --> Gets the current default value of the `autoSelectFamilyAttemptTimeout` option of [`socket.connect(options)`][]. -The initial default value is `250` or the value specified via the command line +The initial default value is `500` or the value specified via the command line option `--network-family-autoselection-attempt-timeout`. * Returns: {number} The current default value of the `autoSelectFamilyAttemptTimeout` option. diff --git a/doc/api/packages.md b/doc/api/packages.md index a676cedf4a7eb6..a980d8d7aa3e59 100644 --- a/doc/api/packages.md +++ b/doc/api/packages.md @@ -142,46 +142,56 @@ CommonJS. This includes the following: * Lexical redeclarations of the CommonJS wrapper variables (`require`, `module`, `exports`, `__dirname`, `__filename`). -### Modules loaders - -Node.js has two systems for resolving a specifier and loading modules. - -There is the CommonJS module loader: - -* It is fully synchronous. -* It is responsible for handling `require()` calls. -* It is monkey patchable. -* It supports [folders as modules][]. -* When resolving a specifier, if no exact match is found, it will try to add - extensions (`.js`, `.json`, and finally `.node`) and then attempt to resolve - [folders as modules][]. -* It treats `.json` as JSON text files. -* `.node` files are interpreted as compiled addon modules loaded with - `process.dlopen()`. -* It treats all files that lack `.json` or `.node` extensions as JavaScript - text files. -* It can only be used to [load ECMAScript modules from CommonJS modules][] if - the module graph is synchronous (that contains no top-level `await`). - When used to load a JavaScript text file that is not an ECMAScript module, - the file will be loaded as a CommonJS module. - -There is the ECMAScript module loader: - -* It is asynchronous, unless it's being used to load modules for `require()`. -* It is responsible for handling `import` statements and `import()` expressions. -* It is not monkey patchable, can be customized using [loader hooks][]. -* It does not support folders as modules, directory indexes (e.g. - `'./startup/index.js'`) must be fully specified. -* It does no extension searching. A file extension must be provided - when the specifier is a relative or absolute file URL. -* It can load JSON modules, but an import type attribute is required. -* It accepts only `.js`, `.mjs`, and `.cjs` extensions for JavaScript text - files. -* It can be used to load JavaScript CommonJS modules. Such modules - are passed through the `cjs-module-lexer` to try to identify named exports, - which are available if they can be determined through static analysis. - Imported CommonJS modules have their URLs converted to absolute - paths and are then loaded via the CommonJS module loader. +### Module resolution and loading + +Node.js has two types of module resolution and loading, chosen based on how the module is requested. + +When a module is requested via `require()` (available by default in CommonJS modules, +and can be dynamically generated using `createRequire()` in both CommonJS and ES Modules): + +* Resolution: + * The resolution initiated by `require()` supports [folders as modules][]. + * When resolving a specifier, if no exact match is found, `require()` will try to add + extensions (`.js`, `.json`, and finally `.node`) and then attempt to resolve + [folders as modules][]. + * It does not support URLs as specifiers by default. +* Loading: + * `.json` files are treated as JSON text files. + * `.node` files are interpreted as compiled addon modules loaded with `process.dlopen()`. + * `.ts`, `.mts` and `.cts` files are treated as [TypeScript][] text files. + * Files with any other extension, or without extensions, are treated as JavaScript + text files. + * `require()` can only be used to [load ECMAScript modules from CommonJS modules][] if + the [ECMAScript module][ES Module] _and its dependencies_ are synchronous + (i.e. they do not contain top-level `await`). + +When a module is requested via static `import` statements (only available in ES Modules) +or `import()` expressions (available in both CommonJS and ES Modules): + +* Resolution: + * The resolution of `import`/`import()` does not support folders as modules, + directory indexes (e.g. `'./startup/index.js'`) must be fully specified. + * It does not perform extension searching. A file extension must be provided + when the specifier is a relative or absolute file URL. + * It supports `file://` and `data:` URLs as specifiers by default. +* Loading: + * `.json` files are treated as JSON text files. When importing JSON modules, + an import type attribute is required (e.g. + `import json from './data.json' with { type: 'json' }`). + * `.node` files are interpreted as compiled addon modules loaded with + `process.dlopen()`, if [`--experimental-addon-modules`][] is enabled. + * `.ts`, `.mts` and `.cts` files are treated as [TypeScript][] text files. + * It accepts only `.js`, `.mjs`, and `.cjs` extensions for JavaScript text + files. + * `.wasm` files are treated as [WebAssembly modules][]. + * Any other file extensions will result in a [`ERR_UNKNOWN_FILE_EXTENSION`][] error. + Additional file extensions can be facilitated via [customization hooks][]. + * `import`/`import()` can be used to load JavaScript [CommonJS modules][commonjs]. + Such modules are passed through the `cjs-module-lexer` to try to identify named + exports, which are available if they can be determined through static analysis. + +Regardless of how a module is requested, the resolution and loading process can be customized +using [customization hooks][]. ### `package.json` and file extensions @@ -1151,6 +1161,8 @@ This field defines [subpath imports][] for the current package. [Node.js documentation for this section]: https://github.com/nodejs/node/blob/HEAD/doc/api/packages.md#conditions-definitions [Runtime Keys]: https://runtime-keys.proposal.wintercg.org/ [Syntax detection]: #syntax-detection +[TypeScript]: typescript.md +[WebAssembly modules]: esm.md#wasm-modules [WinterCG]: https://wintercg.org/ [`"exports"`]: #exports [`"imports"`]: #imports @@ -1158,14 +1170,16 @@ This field defines [subpath imports][] for the current package. [`"name"`]: #name [`"type"`]: #type [`--conditions` / `-C` flag]: #resolving-user-conditions +[`--experimental-addon-modules`]: cli.md#--experimental-addon-modules [`--no-addons` flag]: cli.md#--no-addons [`ERR_PACKAGE_PATH_NOT_EXPORTED`]: errors.md#err_package_path_not_exported +[`ERR_UNKNOWN_FILE_EXTENSION`]: errors.md#err_unknown_file_extension [`package.json`]: #nodejs-packagejson-field-definitions +[customization hooks]: module.md#customization-hooks [entry points]: #package-entry-points [folders as modules]: modules.md#folders-as-modules [import maps]: https://github.com/WICG/import-maps [load ECMAScript modules from CommonJS modules]: modules.md#loading-ecmascript-modules-using-require -[loader hooks]: esm.md#loaders [packages folder mapping]: https://github.com/WICG/import-maps#packages-via-trailing-slashes [self-reference]: #self-referencing-a-package-using-its-name [subpath exports]: #subpath-exports diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md index 762e5ecf8d7f48..9c450564e5f178 100644 --- a/doc/api/perf_hooks.md +++ b/doc/api/perf_hooks.md @@ -120,6 +120,10 @@ the Resource Timeline. If `name` is provided, removes only the named resource. added: - v14.10.0 - v12.19.0 +changes: + - version: v25.2.0 + pr-url: https://github.com/nodejs/node/pull/60370 + description: Added `perf_hooks.eventLoopUtilization` alias. --> * `utilization1` {Object} The result of a previous call to @@ -131,62 +135,9 @@ added: * `active` {number} * `utilization` {number} -The `eventLoopUtilization()` method returns an object that contains the -cumulative duration of time the event loop has been both idle and active as a -high resolution milliseconds timer. The `utilization` value is the calculated -Event Loop Utilization (ELU). - -If bootstrapping has not yet finished on the main thread the properties have -the value of `0`. The ELU is immediately available on [Worker threads][] since -bootstrap happens within the event loop. - -Both `utilization1` and `utilization2` are optional parameters. - -If `utilization1` is passed, then the delta between the current call's `active` -and `idle` times, as well as the corresponding `utilization` value are -calculated and returned (similar to [`process.hrtime()`][]). +This is an alias of [`perf_hooks.eventLoopUtilization()`][]. -If `utilization1` and `utilization2` are both passed, then the delta is -calculated between the two arguments. This is a convenience option because, -unlike [`process.hrtime()`][], calculating the ELU is more complex than a -single subtraction. - -ELU is similar to CPU utilization, except that it only measures event loop -statistics and not CPU usage. It represents the percentage of time the event -loop has spent outside the event loop's event provider (e.g. `epoll_wait`). -No other CPU idle time is taken into consideration. The following is an example -of how a mostly idle process will have a high ELU. - -```mjs -import { eventLoopUtilization } from 'node:perf_hooks'; -import { spawnSync } from 'node:child_process'; - -setImmediate(() => { - const elu = eventLoopUtilization(); - spawnSync('sleep', ['5']); - console.log(eventLoopUtilization(elu).utilization); -}); -``` - -```cjs -'use strict'; -const { eventLoopUtilization } = require('node:perf_hooks').performance; -const { spawnSync } = require('node:child_process'); - -setImmediate(() => { - const elu = eventLoopUtilization(); - spawnSync('sleep', ['5']); - console.log(eventLoopUtilization(elu).utilization); -}); -``` - -Although the CPU is mostly idle while running this script, the value of -`utilization` is `1`. This is because the call to -[`child_process.spawnSync()`][] blocks the event loop from proceeding. - -Passing in a user-defined object instead of the result of a previous call to -`eventLoopUtilization()` will lead to undefined behavior. The return values -are not guaranteed to reflect any correct state of the event loop. +_This property is an extension by Node.js. It is not available in Web browsers._ ### `performance.getEntries()` @@ -424,6 +375,9 @@ which the current `node` process began, measured in Unix time. + +* `utilization1` {Object} The result of a previous call to + `eventLoopUtilization()`. +* `utilization2` {Object} The result of a previous call to + `eventLoopUtilization()` prior to `utilization1`. +* Returns: {Object} + * `idle` {number} + * `active` {number} + * `utilization` {number} + +The `eventLoopUtilization()` function returns an object that contains the +cumulative duration of time the event loop has been both idle and active as a +high resolution milliseconds timer. The `utilization` value is the calculated +Event Loop Utilization (ELU). + +If bootstrapping has not yet finished on the main thread the properties have +the value of `0`. The ELU is immediately available on [Worker threads][] since +bootstrap happens within the event loop. + +Both `utilization1` and `utilization2` are optional parameters. + +If `utilization1` is passed, then the delta between the current call's `active` +and `idle` times, as well as the corresponding `utilization` value are +calculated and returned (similar to [`process.hrtime()`][]). + +If `utilization1` and `utilization2` are both passed, then the delta is +calculated between the two arguments. This is a convenience option because, +unlike [`process.hrtime()`][], calculating the ELU is more complex than a +single subtraction. + +ELU is similar to CPU utilization, except that it only measures event loop +statistics and not CPU usage. It represents the percentage of time the event +loop has spent outside the event loop's event provider (e.g. `epoll_wait`). +No other CPU idle time is taken into consideration. The following is an example +of how a mostly idle process will have a high ELU. + +```mjs +import { eventLoopUtilization } from 'node:perf_hooks'; +import { spawnSync } from 'node:child_process'; + +setImmediate(() => { + const elu = eventLoopUtilization(); + spawnSync('sleep', ['5']); + console.log(eventLoopUtilization(elu).utilization); +}); +``` + +```cjs +'use strict'; +const { eventLoopUtilization } = require('node:perf_hooks'); +const { spawnSync } = require('node:child_process'); + +setImmediate(() => { + const elu = eventLoopUtilization(); + spawnSync('sleep', ['5']); + console.log(eventLoopUtilization(elu).utilization); +}); +``` + +Although the CPU is mostly idle while running this script, the value of +`utilization` is `1`. This is because the call to +[`child_process.spawnSync()`][] blocks the event loop from proceeding. + +Passing in a user-defined object instead of the result of a previous call to +`eventLoopUtilization()` will lead to undefined behavior. The return values +are not guaranteed to reflect any correct state of the event loop. + ## `perf_hooks.monitorEventLoopDelay([options])` + +* `fn` {Function} +* `options` {Object} + * `histogram` {RecordableHistogram} A histogram object created using + `perf_hooks.createHistogram()` that will record runtime durations in + nanoseconds. + +_This property is an extension by Node.js. It is not available in Web browsers._ + +Wraps a function within a new function that measures the running time of the +wrapped function. A `PerformanceObserver` must be subscribed to the `'function'` +event type in order for the timing details to be accessed. + +```mjs +import { timerify, performance, PerformanceObserver } from 'node:perf_hooks'; + +function someFunction() { + console.log('hello world'); +} + +const wrapped = timerify(someFunction); + +const obs = new PerformanceObserver((list) => { + console.log(list.getEntries()[0].duration); + + performance.clearMarks(); + performance.clearMeasures(); + obs.disconnect(); +}); +obs.observe({ entryTypes: ['function'] }); + +// A performance timeline entry will be created +wrapped(); +``` + +```cjs +const { + timerify, + performance, + PerformanceObserver, +} = require('node:perf_hooks'); + +function someFunction() { + console.log('hello world'); +} + +const wrapped = timerify(someFunction); + +const obs = new PerformanceObserver((list) => { + console.log(list.getEntries()[0].duration); + + performance.clearMarks(); + performance.clearMeasures(); + obs.disconnect(); +}); +obs.observe({ entryTypes: ['function'] }); + +// A performance timeline entry will be created +wrapped(); +``` + +If the wrapped function returns a promise, a finally handler will be attached +to the promise and the duration will be reported once the finally handler is +invoked. + ## Class: `Histogram` > Stability: 1.2 - Release candidate @@ -2009,7 +2013,7 @@ added: A value that is `"strip"` by default, `"transform"` if Node.js is run with `--experimental-transform-types`, and `false` if -Node.js is run with `--no-experimental-strip-types`. +Node.js is run with `--no-strip-types`. ## `process.features.uv` @@ -4331,7 +4335,7 @@ added: > Stability: 1 - Experimental -* `maybeUnfefable` {any} An object that may be "unref'd". +* `maybeRefable` {any} An object that may be "unref'd". An object is "unrefable" if it implements the Node.js "Refable protocol". Specifically, this means that the object implements the `Symbol.for('nodejs.ref')` diff --git a/doc/api/single-executable-applications.md b/doc/api/single-executable-applications.md index c937e8d3a1e17b..acf2552d933b80 100644 --- a/doc/api/single-executable-applications.md +++ b/doc/api/single-executable-applications.md @@ -241,11 +241,11 @@ See documentation of the [`sea.getAsset()`][], [`sea.getAssetAsBlob()`][], ### Startup snapshot support The `useSnapshot` field can be used to enable startup snapshot support. In this -case the `main` script would not be when the final executable is launched. +case, the `main` script would not be executed when the final executable is launched. Instead, it would be run when the single executable application preparation blob is generated on the building machine. The generated preparation blob would then include a snapshot capturing the states initialized by the `main` script. -The final executable with the preparation blob injected would deserialize +The final executable, with the preparation blob injected, would deserialize the snapshot at run time. When `useSnapshot` is true, the main script must invoke the diff --git a/doc/api/sqlite.md b/doc/api/sqlite.md index bb77b77f5bdb78..db5c8e2992be4c 100644 --- a/doc/api/sqlite.md +++ b/doc/api/sqlite.md @@ -4,6 +4,12 @@ > Stability: 1.1 - Active development. @@ -98,6 +104,10 @@ exposed by this class execute synchronously. + +* `active` {boolean} Whether to set the defensive flag. + +Enables or disables the defensive flag. When the defensive flag is active, +language features that allow ordinary SQL to deliberately corrupt the database file are disabled. +See [`SQLITE_DBCONFIG_DEFENSIVE`][] in the SQLite documentation for details. + ### `database.location([dbName])` - -This class represents a single LRU (Least Recently Used) cache for storing -prepared statements. - -Instances of this class are created via the database.createTagStore() method, -not by using a constructor. The store caches prepared statements based on the -provided SQL query string. When the same query is seen again, the store -retrieves the cached statement and safely applies the new values through -parameter binding, thereby preventing attacks like SQL injection. - -The cache has a maxSize that defaults to 1000 statements, but a custom size can -be provided (e.g., database.createTagStore(100)). All APIs exposed by this -class execute synchronously. - -### `sqlTagStore.all(sqlTemplate[, ...values])` - - - -* `sqlTemplate` {Template Literal} A template literal containing the SQL query. -* `...values` {any} Values to be interpolated into the template literal. -* Returns: {Array} An array of objects representing the rows returned by the query. - -Executes the given SQL query and returns all resulting rows as an array of objects. - -### `sqlTagStore.get(sqlTemplate[, ...values])` - - - -* `sqlTemplate` {Template Literal} A template literal containing the SQL query. -* `...values` {any} Values to be interpolated into the template literal. -* Returns: {Object | undefined} An object representing the first row returned by - the query, or `undefined` if no rows are returned. - -Executes the given SQL query and returns the first resulting row as an object. - -### `sqlTagStore.iterate(sqlTemplate[, ...values])` - - - -* `sqlTemplate` {Template Literal} A template literal containing the SQL query. -* `...values` {any} Values to be interpolated into the template literal. -* Returns: {Iterator} An iterator that yields objects representing the rows returned by the query. - -Executes the given SQL query and returns an iterator over the resulting rows. - -### `sqlTagStore.run(sqlTemplate[, ...values])` - - - -* `sqlTemplate` {Template Literal} A template literal containing the SQL query. -* `...values` {any} Values to be interpolated into the template literal. -* Returns: {Object} An object containing information about the execution, including `changes` and `lastInsertRowid`. - -Executes the given SQL query, which is expected to not return any rows (e.g., INSERT, UPDATE, DELETE). - -### `sqlTagStore.size()` - - - -* Returns: {integer} The number of prepared statements currently in the cache. - -A read-only property that returns the number of prepared statements currently in the cache. - -### `sqlTagStore.capacity` - - - -* Returns: {integer} The maximum number of prepared statements the cache can hold. - -A read-only property that returns the maximum number of prepared statements the cache can hold. - -### `sqlTagStore.db` - - - -* {DatabaseSync} The `DatabaseSync` instance that created this `SQLTagStore`. - -A read-only property that returns the `DatabaseSync` object associated with this `SQLTagStore`. - -### `sqlTagStore.reset()` - - - -Resets the LRU cache, clearing all stored prepared statements. - -### `sqlTagStore.clear()` - - - -An alias for `sqlTagStore.reset()`. - ### `statement.all([namedParameters][, ...anonymousParameters])` + +This class represents a single LRU (Least Recently Used) cache for storing +prepared statements. + +Instances of this class are created via the database.createTagStore() method, +not by using a constructor. The store caches prepared statements based on the +provided SQL query string. When the same query is seen again, the store +retrieves the cached statement and safely applies the new values through +parameter binding, thereby preventing attacks like SQL injection. + +The cache has a maxSize that defaults to 1000 statements, but a custom size can +be provided (e.g., database.createTagStore(100)). All APIs exposed by this +class execute synchronously. + +### `sqlTagStore.all(sqlTemplate[, ...values])` + + + +* `sqlTemplate` {Template Literal} A template literal containing the SQL query. +* `...values` {any} Values to be interpolated into the template literal. +* Returns: {Array} An array of objects representing the rows returned by the query. + +Executes the given SQL query and returns all resulting rows as an array of objects. + +### `sqlTagStore.get(sqlTemplate[, ...values])` + + + +* `sqlTemplate` {Template Literal} A template literal containing the SQL query. +* `...values` {any} Values to be interpolated into the template literal. +* Returns: {Object | undefined} An object representing the first row returned by + the query, or `undefined` if no rows are returned. + +Executes the given SQL query and returns the first resulting row as an object. + +### `sqlTagStore.iterate(sqlTemplate[, ...values])` + + + +* `sqlTemplate` {Template Literal} A template literal containing the SQL query. +* `...values` {any} Values to be interpolated into the template literal. +* Returns: {Iterator} An iterator that yields objects representing the rows returned by the query. + +Executes the given SQL query and returns an iterator over the resulting rows. + +### `sqlTagStore.run(sqlTemplate[, ...values])` + + + +* `sqlTemplate` {Template Literal} A template literal containing the SQL query. +* `...values` {any} Values to be interpolated into the template literal. +* Returns: {Object} An object containing information about the execution, including `changes` and `lastInsertRowid`. + +Executes the given SQL query, which is expected to not return any rows (e.g., INSERT, UPDATE, DELETE). + +### `sqlTagStore.size()` + + + +* Returns: {integer} The number of prepared statements currently in the cache. + +A read-only property that returns the number of prepared statements currently in the cache. + +### `sqlTagStore.capacity` + + + +* Returns: {integer} The maximum number of prepared statements the cache can hold. + +A read-only property that returns the maximum number of prepared statements the cache can hold. + +### `sqlTagStore.db` + + + +* {DatabaseSync} The `DatabaseSync` instance that created this `SQLTagStore`. + +A read-only property that returns the `DatabaseSync` object associated with this `SQLTagStore`. + +### `sqlTagStore.reset()` + + + +Resets the LRU cache, clearing all stored prepared statements. + +### `sqlTagStore.clear()` + + + +An alias for `sqlTagStore.reset()`. + ### Type conversion between JavaScript and SQLite When Node.js writes to or reads from SQLite it is necessary to convert between @@ -1306,6 +1382,7 @@ callback function to indicate what type of operation is being authorized. [Type conversion between JavaScript and SQLite]: #type-conversion-between-javascript-and-sqlite [`ATTACH DATABASE`]: https://www.sqlite.org/lang_attach.html [`PRAGMA foreign_keys`]: https://www.sqlite.org/pragma.html#pragma_foreign_keys +[`SQLITE_DBCONFIG_DEFENSIVE`]: https://www.sqlite.org/c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive [`SQLITE_DETERMINISTIC`]: https://www.sqlite.org/c3ref/c_deterministic.html [`SQLITE_DIRECTONLY`]: https://www.sqlite.org/c3ref/c_deterministic.html [`SQLITE_MAX_FUNCTION_ARG`]: https://www.sqlite.org/limits.html#max_function_arg diff --git a/doc/api/stream.md b/doc/api/stream.md index 78ac21eb654a8b..7c4c6e9a8e4862 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -2315,6 +2315,8 @@ import { Resolver } from 'node:dns/promises'; await Readable.from([1, 2, 3, 4]).toArray(); // [1, 2, 3, 4] +const resolver = new Resolver(); + // Make dns queries concurrently using .map and collect // the results into an array using toArray const dnsResults = await Readable.from([ diff --git a/doc/api/test.md b/doc/api/test.md index d566c1ddd7cd82..21349b46b702e8 100644 --- a/doc/api/test.md +++ b/doc/api/test.md @@ -514,7 +514,7 @@ By default, Node.js will run all files matching these patterns: * `**/test.{cjs,mjs,js}` * `**/test/**/*.{cjs,mjs,js}` -Unless [`--no-experimental-strip-types`][] is supplied, the following +Unless [`--no-strip-types`][] is supplied, the following additional patterns are also matched: * `**/*.test.{cts,mts,ts}` @@ -3996,7 +3996,7 @@ Can be used to abort test subtasks when the test has been aborted. [`--experimental-test-coverage`]: cli.md#--experimental-test-coverage [`--experimental-test-module-mocks`]: cli.md#--experimental-test-module-mocks [`--import`]: cli.md#--importmodule -[`--no-experimental-strip-types`]: cli.md#--no-experimental-strip-types +[`--no-strip-types`]: cli.md#--no-strip-types [`--test-concurrency`]: cli.md#--test-concurrency [`--test-coverage-exclude`]: cli.md#--test-coverage-exclude [`--test-coverage-include`]: cli.md#--test-coverage-include diff --git a/doc/api/typescript.md b/doc/api/typescript.md index 158a55ea1216eb..136d81ded7e102 100644 --- a/doc/api/typescript.md +++ b/doc/api/typescript.md @@ -2,6 +2,9 @@ -> Stability: 1.2 - Release candidate +> Stability: 2 - Stable ## Enabling @@ -60,6 +63,10 @@ To use TypeScript with full support for all TypeScript features, including By default Node.js will execute TypeScript files that contains only @@ -68,7 +75,7 @@ Node.js will replace TypeScript syntax with whitespace, and no type checking is performed. To enable the transformation of non erasable TypeScript syntax, which requires JavaScript code generation, such as `enum` declarations, parameter properties use the flag [`--experimental-transform-types`][]. -To disable this feature, use the flag [`--no-experimental-strip-types`][]. +To disable this feature, use the flag [`--no-strip-types`][]. Node.js ignores `tsconfig.json` files and therefore features that depend on settings within `tsconfig.json`, @@ -158,10 +165,10 @@ namespace A { } ``` -Since Decorators are currently a [TC39 Stage 3 proposal](https://github.com/tc39/proposal-decorators) -and will soon be supported by the JavaScript engine, +Since Decorators are currently a [TC39 Stage 3 proposal](https://github.com/tc39/proposal-decorators), they are not transformed and will result in a parser error. -This is a temporary limitation and will be resolved in the future. +Node.js does not provide polyfills and thus will not support decorators until +they are supported natively in JavaScript. In addition, Node.js does not read `tsconfig.json` files and does not support features that depend on settings within `tsconfig.json`, such as paths or @@ -219,7 +226,7 @@ with `#`. [ES Modules]: esm.md [Full TypeScript support]: #full-typescript-support [`--experimental-transform-types`]: cli.md#--experimental-transform-types -[`--no-experimental-strip-types`]: cli.md#--no-experimental-strip-types +[`--no-strip-types`]: cli.md#--no-strip-types [`ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX`]: errors.md#err_unsupported_typescript_syntax [`tsconfig` "paths"]: https://www.typescriptlang.org/tsconfig/#paths [`tsx`]: https://tsx.is/ diff --git a/doc/api/url.md b/doc/api/url.md index bdb544a95b9bec..7148a3a33e1975 100644 --- a/doc/api/url.md +++ b/doc/api/url.md @@ -1794,6 +1794,12 @@ The formatting process operates as follows: string, an [`Error`][] is thrown. * `result` is returned. +An automated migration is available ([source](https://github.com/nodejs/userland-migrations/tree/main/recipes/node-url-to-whatwg-url)). + +```bash +npx codemod@latest @nodejs/node-url-to-whatwg-url +``` + ### `url.parse(urlString[, parseQueryString[, slashesDenoteHost]])` ```js @@ -1401,13 +1405,13 @@ setTimeout(() => { ## Class: `SyncCPUProfileHandle` ### `syncCpuProfileHandle.stop()` * Returns: {string} @@ -1417,7 +1421,7 @@ Stopping collecting the profile and return the profile data. ### `syncCpuProfileHandle[Symbol.dispose]()` Stopping collecting the profile and the profile will be discarded. @@ -1520,7 +1524,7 @@ writeString('你好'); ## `v8.startCpuProfile()` * Returns: {SyncCPUProfileHandle} diff --git a/doc/api/vm.md b/doc/api/vm.md index b8c112cf51a954..47ba00f6c1c6f0 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -485,8 +485,8 @@ function resolveAndLinkDependencies(module) { // The "secret" variable refers to the global variable we added to // "contextifiedObject" when creating the context. export default secret; - `, { context: referencingModule.context }); - moduleMap.set(specifier, linkedModule); + `, { context: module.context }); + moduleMap.set(specifier, requestedModule); // Resolve the dependencies of the new module as well. resolveAndLinkDependencies(requestedModule); } @@ -566,8 +566,8 @@ const contextifiedObject = vm.createContext({ // The "secret" variable refers to the global variable we added to // "contextifiedObject" when creating the context. export default secret; - `, { context: referencingModule.context }); - moduleMap.set(specifier, linkedModule); + `, { context: module.context }); + moduleMap.set(specifier, requestedModule); // Resolve the dependencies of the new module as well. resolveAndLinkDependencies(requestedModule); } @@ -618,19 +618,47 @@ in the ECMAScript specification. work after that. **Default:** `false`. * Returns: {Promise} Fulfills with `undefined` upon success. -Evaluate the module. +Evaluate the module and its depenendencies. Corresponds to the [Evaluate() concrete method][] field of +[Cyclic Module Record][]s in the ECMAScript specification. -This must be called after the module has been linked; otherwise it will reject. -It could be called also when the module has already been evaluated, in which -case it will either do nothing if the initial evaluation ended in success -(`module.status` is `'evaluated'`) or it will re-throw the exception that the -initial evaluation resulted in (`module.status` is `'errored'`). +If the module is a `vm.SourceTextModule`, `evaluate()` must be called after the module has been instantiated; +otherwise `evaluate()` will return a rejected promise. -This method cannot be called while the module is being evaluated -(`module.status` is `'evaluating'`). +For a `vm.SourceTextModule`, the promise returned by `evaluate()` may be fulfilled either +synchronously or asynchronously: -Corresponds to the [Evaluate() concrete method][] field of [Cyclic Module -Record][]s in the ECMAScript specification. +1. If the `vm.SourceTextModule` has no top-level `await` in itself or any of its dependencies, the promise will be + fulfilled _synchronously_ after the module and all its dependencies have been evaluated. + 1. If the evaluation succeeds, the promise will be _synchronously_ resolved to `undefined`. + 2. If the evaluation results in an exception, the promise will be _synchronously_ rejected with the exception + that causes the evaluation to fail, which is the same as `module.error`. +2. If the `vm.SourceTextModule` has top-level `await` in itself or any of its dependencies, the promise will be + fulfilled _asynchronously_ after the module and all its dependencies have been evaluated. + 1. If the evaluation succeeds, the promise will be _asynchronously_ resolved to `undefined`. + 2. If the evaluation results in an exception, the promise will be _asynchronously_ rejected with the exception + that causes the evaluation to fail. + +If the module is a `vm.SyntheticModule`, `evaluate()` always returns a promise that fulfills synchronously, see +the specification of [Evaluate() of a Synthetic Module Record][]: + +1. If the `evaluateCallback` passed to its constructor throws an exception synchronously, `evaluate()` returns + a promise that will be synchronously rejected with that exception. +2. If the `evaluateCallback` does not throw an exception, `evaluate()` returns a promise that will be + synchronously resolved to `undefined`. + +The `evaluateCallback` of a `vm.SyntheticModule` is executed synchronously within the `evaluate()` call, and its +return value is discarded. This means if `evaluateCallback` is an asynchronous function, the promise returned by +`evaluate()` will not reflect its asynchronous behavior, and any rejections from an asynchronous +`evaluateCallback` will be lost. + +`evaluate()` could also be called again after the module has already been evaluated, in which case: + +1. If the initial evaluation ended in success (`module.status` is `'evaluated'`), it will do nothing + and return a promise that resolves to `undefined`. +2. If the initial evaluation resulted in an exception (`module.status` is `'errored'`), it will re-reject + the exception that the initial evaluation resulted in. + +This method cannot be called while the module is being evaluated (`module.status` is `'evaluating'`). ### `module.identifier` @@ -2221,6 +2249,7 @@ const { Script, SyntheticModule } = require('node:vm'); [Cyclic Module Record]: https://tc39.es/ecma262/#sec-cyclic-module-records [ECMAScript Module Loader]: esm.md#modules-ecmascript-modules [Evaluate() concrete method]: https://tc39.es/ecma262/#sec-moduleevaluation +[Evaluate() of a Synthetic Module Record]: https://tc39.es/ecma262/#sec-smr-Evaluate [FinishLoadingImportedModule]: https://tc39.es/ecma262/#sec-FinishLoadingImportedModule [GetModuleNamespace]: https://tc39.es/ecma262/#sec-getmodulenamespace [HostLoadImportedModule]: https://tc39.es/ecma262/#sec-HostLoadImportedModule diff --git a/doc/api/worker_threads.md b/doc/api/worker_threads.md index 08341443afea29..b44df3da70a95f 100644 --- a/doc/api/worker_threads.md +++ b/doc/api/worker_threads.md @@ -1717,7 +1717,7 @@ changes: added: v10.5.0 --> -* `err` {Error} +* `err` {any} The `'error'` event is emitted if the worker thread throws an uncaught exception. In that case, the worker is terminated. @@ -1838,7 +1838,7 @@ added: --> An object that can be used to query performance information from a worker -instance. Similar to [`perf_hooks.performance`][]. +instance. #### `performance.eventLoopUtilization([utilization1[, utilization2]])` @@ -2240,8 +2240,7 @@ thread spawned will spawn another until the application crashes. [`fs.open()`]: fs.md#fsopenpath-flags-mode-callback [`markAsUntransferable()`]: #worker_threadsmarkasuntransferableobject [`node:cluster` module]: cluster.md -[`perf_hooks.performance`]: perf_hooks.md#perf_hooksperformance -[`perf_hooks` `eventLoopUtilization()`]: perf_hooks.md#performanceeventlooputilizationutilization1-utilization2 +[`perf_hooks` `eventLoopUtilization()`]: perf_hooks.md#perf_hookseventlooputilizationutilization1-utilization2 [`port.on('message')`]: #event-message [`port.onmessage()`]: https://developer.mozilla.org/en-US/docs/Web/API/MessagePort/onmessage [`port.postMessage()`]: #portpostmessagevalue-transferlist diff --git a/doc/changelogs/CHANGELOG_ARCHIVE.md b/doc/changelogs/CHANGELOG_ARCHIVE.md index b2c2c379a08d41..e525d97bc87464 100644 --- a/doc/changelogs/CHANGELOG_ARCHIVE.md +++ b/doc/changelogs/CHANGELOG_ARCHIVE.md @@ -156,6 +156,7 @@
* Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_IOJS.md b/doc/changelogs/CHANGELOG_IOJS.md index 48ac6810a7f5f9..3217c3b165cc28 100644 --- a/doc/changelogs/CHANGELOG_IOJS.md +++ b/doc/changelogs/CHANGELOG_IOJS.md @@ -62,6 +62,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V010.md b/doc/changelogs/CHANGELOG_V010.md index 91c8c7b02d4ec3..6e9c4654c4780d 100644 --- a/doc/changelogs/CHANGELOG_V010.md +++ b/doc/changelogs/CHANGELOG_V010.md @@ -64,6 +64,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V012.md b/doc/changelogs/CHANGELOG_V012.md index 704a1e4954933e..4c9af8c79cc1a7 100644 --- a/doc/changelogs/CHANGELOG_V012.md +++ b/doc/changelogs/CHANGELOG_V012.md @@ -32,6 +32,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V10.md b/doc/changelogs/CHANGELOG_V10.md index c68609e4ec17c3..66cc03efeaf67d 100644 --- a/doc/changelogs/CHANGELOG_V10.md +++ b/doc/changelogs/CHANGELOG_V10.md @@ -58,6 +58,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V11.md b/doc/changelogs/CHANGELOG_V11.md index 4ced73740cbb51..4106ddb17fc0ed 100644 --- a/doc/changelogs/CHANGELOG_V11.md +++ b/doc/changelogs/CHANGELOG_V11.md @@ -30,6 +30,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V12.md b/doc/changelogs/CHANGELOG_V12.md index 8e102a4ca261a1..69393555f975d5 100644 --- a/doc/changelogs/CHANGELOG_V12.md +++ b/doc/changelogs/CHANGELOG_V12.md @@ -67,6 +67,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V13.md b/doc/changelogs/CHANGELOG_V13.md index 7fe30eaf2eae00..5caec8e4cd4ee8 100644 --- a/doc/changelogs/CHANGELOG_V13.md +++ b/doc/changelogs/CHANGELOG_V13.md @@ -30,6 +30,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V14.md b/doc/changelogs/CHANGELOG_V14.md index 21522b20c55077..7294530721a051 100644 --- a/doc/changelogs/CHANGELOG_V14.md +++ b/doc/changelogs/CHANGELOG_V14.md @@ -62,6 +62,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V15.md b/doc/changelogs/CHANGELOG_V15.md index d56d04710645ed..7e1606efa03ddd 100644 --- a/doc/changelogs/CHANGELOG_V15.md +++ b/doc/changelogs/CHANGELOG_V15.md @@ -31,6 +31,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V16.md b/doc/changelogs/CHANGELOG_V16.md index 4902b50591e0e4..667ee30099ac0c 100644 --- a/doc/changelogs/CHANGELOG_V16.md +++ b/doc/changelogs/CHANGELOG_V16.md @@ -53,6 +53,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V17.md b/doc/changelogs/CHANGELOG_V17.md index cfc820359487fa..04d5da4f1e187c 100644 --- a/doc/changelogs/CHANGELOG_V17.md +++ b/doc/changelogs/CHANGELOG_V17.md @@ -28,6 +28,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V18.md b/doc/changelogs/CHANGELOG_V18.md index df91380268b9f0..b680c46f348f69 100644 --- a/doc/changelogs/CHANGELOG_V18.md +++ b/doc/changelogs/CHANGELOG_V18.md @@ -54,6 +54,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V19.md b/doc/changelogs/CHANGELOG_V19.md index 65843e02e251fc..5080e08e94c4ed 100644 --- a/doc/changelogs/CHANGELOG_V19.md +++ b/doc/changelogs/CHANGELOG_V19.md @@ -26,6 +26,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V20.md b/doc/changelogs/CHANGELOG_V20.md index 891d0b0c11455d..17156a9264cdc0 100644 --- a/doc/changelogs/CHANGELOG_V20.md +++ b/doc/changelogs/CHANGELOG_V20.md @@ -53,6 +53,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V21.md b/doc/changelogs/CHANGELOG_V21.md index 377790afc12846..1bb7c810fc5327 100644 --- a/doc/changelogs/CHANGELOG_V21.md +++ b/doc/changelogs/CHANGELOG_V21.md @@ -26,6 +26,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V22.md b/doc/changelogs/CHANGELOG_V22.md index c083e7465349bb..7143000b9e6940 100644 --- a/doc/changelogs/CHANGELOG_V22.md +++ b/doc/changelogs/CHANGELOG_V22.md @@ -42,6 +42,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [21.x](CHANGELOG_V21.md) diff --git a/doc/changelogs/CHANGELOG_V23.md b/doc/changelogs/CHANGELOG_V23.md index 815c72a7877dc7..15f05b00a2b09e 100644 --- a/doc/changelogs/CHANGELOG_V23.md +++ b/doc/changelogs/CHANGELOG_V23.md @@ -27,6 +27,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [22.x](CHANGELOG_V22.md) * [21.x](CHANGELOG_V21.md) diff --git a/doc/changelogs/CHANGELOG_V24.md b/doc/changelogs/CHANGELOG_V24.md index 1ba548b2ddb987..62409571d78574 100644 --- a/doc/changelogs/CHANGELOG_V24.md +++ b/doc/changelogs/CHANGELOG_V24.md @@ -27,6 +27,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) * [21.x](CHANGELOG_V21.md) diff --git a/doc/changelogs/CHANGELOG_V25.md b/doc/changelogs/CHANGELOG_V25.md new file mode 100644 index 00000000000000..7c235f3f7afdd1 --- /dev/null +++ b/doc/changelogs/CHANGELOG_V25.md @@ -0,0 +1,475 @@ +# Node.js 25 ChangeLog + + + + + + + + + + +
Current
+25.2.1
+25.2.0
+25.1.0
+25.0.0
+
+ +* Other Versions + * [24.x](CHANGELOG_V24.md) + * [23.x](CHANGELOG_V23.md) + * [22.x](CHANGELOG_V22.md) + * [21.x](CHANGELOG_V21.md) + * [20.x](CHANGELOG_V20.md) + * [19.x](CHANGELOG_V19.md) + * [18.x](CHANGELOG_V18.md) + * [17.x](CHANGELOG_V17.md) + * [16.x](CHANGELOG_V16.md) + * [15.x](CHANGELOG_V15.md) + * [14.x](CHANGELOG_V14.md) + * [13.x](CHANGELOG_V13.md) + * [12.x](CHANGELOG_V12.md) + * [11.x](CHANGELOG_V11.md) + * [10.x](CHANGELOG_V10.md) + * [9.x](CHANGELOG_V9.md) + * [8.x](CHANGELOG_V8.md) + * [7.x](CHANGELOG_V7.md) + * [6.x](CHANGELOG_V6.md) + * [5.x](CHANGELOG_V5.md) + * [4.x](CHANGELOG_V4.md) + * [0.12.x](CHANGELOG_V012.md) + * [0.10.x](CHANGELOG_V010.md) + * [io.js](CHANGELOG_IOJS.md) + * [Archive](CHANGELOG_ARCHIVE.md) + + + +## 2025-11-17, Version 25.2.1 (Current), @aduh95 + +### Notable Changes + +### Commits + +* \[[`ff89b7b6c7`](https://github.com/nodejs/node/commit/ff89b7b6c7)] - **crypto**: ensure documented RSA-PSS saltLength default is used (Filip Skokan) [#60662](https://github.com/nodejs/node/pull/60662) +* \[[`5316b580eb`](https://github.com/nodejs/node/commit/5316b580eb)] - **deps**: V8: backport 2e4c5cf9b112 (Michaël Zasso) [#60654](https://github.com/nodejs/node/pull/60654) +* \[[`ca878bc90e`](https://github.com/nodejs/node/commit/ca878bc90e)] - **doc,src,lib**: clarify experimental status of Web Storage support (Antoine du Hamel) [#60708](https://github.com/nodejs/node/pull/60708) +* \[[`a4dee613fd`](https://github.com/nodejs/node/commit/a4dee613fd)] - _**Revert**_ "**lib**: throw from localStorage getter on missing storage path" (Antoine du Hamel) [#60750](https://github.com/nodejs/node/pull/60750) + + + +## 2025-11-11, Version 25.2.0 (Current), @aduh95 + +### Notable Changes + +* \[[`a37c01e6a1`](https://github.com/nodejs/node/commit/a37c01e6a1)] - **(SEMVER-MINOR)** **lib**: add options to util.deprecate (Rafael Gonzaga) [#59982](https://github.com/nodejs/node/pull/59982) +* \[[`4fbb1ab101`](https://github.com/nodejs/node/commit/4fbb1ab101)] - **lib**: throw from localStorage getter on missing storage path (René) [#60351](https://github.com/nodejs/node/pull/60351) +* \[[`727560a96d`](https://github.com/nodejs/node/commit/727560a96d)] - **(SEMVER-MINOR)** **module**: mark type stripping as stable (Marco Ippolito) [#60600](https://github.com/nodejs/node/pull/60600) +* \[[`506b79e888`](https://github.com/nodejs/node/commit/506b79e888)] - **(SEMVER-MINOR)** **net**: increase network family autoselection timeout to 500ms (Rod Vagg) [#60334](https://github.com/nodejs/node/pull/60334) +* \[[`166c72ec02`](https://github.com/nodejs/node/commit/166c72ec02)] - **(SEMVER-MINOR)** **node-api**: add napi\_create\_object\_with\_properties (Miguel Marcondes Filho) [#59953](https://github.com/nodejs/node/pull/59953) +* \[[`399b340022`](https://github.com/nodejs/node/commit/399b340022)] - **(SEMVER-MINOR)** **v8**: adding total\_allocated\_bytes to HeapStatistics (Caio Lima) [#60573](https://github.com/nodejs/node/pull/60573) + +### Commits + +* \[[`d5158a0a2d`](https://github.com/nodejs/node/commit/d5158a0a2d)] - **benchmark**: focus on import.meta intialization in import-meta benchmark (Joyee Cheung) [#60603](https://github.com/nodejs/node/pull/60603) +* \[[`26a5305fa9`](https://github.com/nodejs/node/commit/26a5305fa9)] - **benchmark**: add per-suite setup option (Joyee Cheung) [#60574](https://github.com/nodejs/node/pull/60574) +* \[[`4810e4b82d`](https://github.com/nodejs/node/commit/4810e4b82d)] - **buffer**: speed up concat via TypedArray#set (Gürgün Dayıoğlu) [#60399](https://github.com/nodejs/node/pull/60399) +* \[[`94a94a6b3a`](https://github.com/nodejs/node/commit/94a94a6b3a)] - **console**: optimize single-string logging (Gürgün Dayıoğlu) [#60422](https://github.com/nodejs/node/pull/60422) +* \[[`ad376c31db`](https://github.com/nodejs/node/commit/ad376c31db)] - **crypto**: fix argument validation in crypto.timingSafeEqual fast path (Joyee Cheung) [#60538](https://github.com/nodejs/node/pull/60538) +* \[[`dc38a45a55`](https://github.com/nodejs/node/commit/dc38a45a55)] - **debugger**: fix event listener leak in the run command (Joyee Cheung) [#60464](https://github.com/nodejs/node/pull/60464) +* \[[`a61e5d8e05`](https://github.com/nodejs/node/commit/a61e5d8e05)] - **deps**: call OPENSSL\_free after ANS1\_STRING\_to\_UTF8 (Rafael Gonzaga) [#60609](https://github.com/nodejs/node/pull/60609) +* \[[`51e5030afa`](https://github.com/nodejs/node/commit/51e5030afa)] - **deps**: nghttp2: revert 7784fa979d0b (Antoine du Hamel) [#59790](https://github.com/nodejs/node/pull/59790) +* \[[`eef838f499`](https://github.com/nodejs/node/commit/eef838f499)] - **deps**: update nghttp2 to 1.67.1 (nodejs-github-bot) [#59790](https://github.com/nodejs/node/pull/59790) +* \[[`13120a43d4`](https://github.com/nodejs/node/commit/13120a43d4)] - **deps**: update simdjson to 4.1.0 (Node.js GitHub Bot) [#60542](https://github.com/nodejs/node/pull/60542) +* \[[`6e1b23dab8`](https://github.com/nodejs/node/commit/6e1b23dab8)] - **deps**: update corepack to 0.34.2 (Node.js GitHub Bot) [#60550](https://github.com/nodejs/node/pull/60550) +* \[[`a02e05c486`](https://github.com/nodejs/node/commit/a02e05c486)] - **deps**: update amaro to 1.1.5 (Node.js GitHub Bot) [#60541](https://github.com/nodejs/node/pull/60541) +* \[[`b9ba3a7947`](https://github.com/nodejs/node/commit/b9ba3a7947)] - **deps**: V8: backport fe81545e6d14 (Caio Lima) [#60429](https://github.com/nodejs/node/pull/60429) +* \[[`07bcd28494`](https://github.com/nodejs/node/commit/07bcd28494)] - **deps**: V8: cherry-pick 7ef6a001762 (Xiao-Tao) [#60259](https://github.com/nodejs/node/pull/60259) +* \[[`3e11658243`](https://github.com/nodejs/node/commit/3e11658243)] - **doc**: update Collaborators list to reflect hybrist handle change (Antoine du Hamel) [#60650](https://github.com/nodejs/node/pull/60650) +* \[[`b8e40e4d38`](https://github.com/nodejs/node/commit/b8e40e4d38)] - **doc**: fix link in `--env-file=file` section (N. Bighetti) [#60563](https://github.com/nodejs/node/pull/60563) +* \[[`9558c1c0df`](https://github.com/nodejs/node/commit/9558c1c0df)] - **doc**: fix linter issues (Antoine du Hamel) [#60636](https://github.com/nodejs/node/pull/60636) +* \[[`cdf70de563`](https://github.com/nodejs/node/commit/cdf70de563)] - **doc**: add missing history entry for `sqlite.md` (Antoine du Hamel) [#60607](https://github.com/nodejs/node/pull/60607) +* \[[`e3c5dcf1ea`](https://github.com/nodejs/node/commit/e3c5dcf1ea)] - **doc**: correct values/references for buffer.kMaxLength (René) [#60305](https://github.com/nodejs/node/pull/60305) +* \[[`a25d76c924`](https://github.com/nodejs/node/commit/a25d76c924)] - **doc**: recommend events.once to manage 'close' event (Dan Fabulich) [#60017](https://github.com/nodejs/node/pull/60017) +* \[[`795f32bf91`](https://github.com/nodejs/node/commit/795f32bf91)] - **doc**: highlight module loading difference between import and require (Ajay A) [#59815](https://github.com/nodejs/node/pull/59815) +* \[[`212775410b`](https://github.com/nodejs/node/commit/212775410b)] - **doc**: add CJS code snippets in `sqlite.md` (Allon Murienik) [#60395](https://github.com/nodejs/node/pull/60395) +* \[[`263c06096d`](https://github.com/nodejs/node/commit/263c06096d)] - **doc**: fix typo in `process.unref` documentation (우혁) [#59698](https://github.com/nodejs/node/pull/59698) +* \[[`356bdae408`](https://github.com/nodejs/node/commit/356bdae408)] - **doc**: add some entries to `glossary.md` (Mohataseem Khan) [#59277](https://github.com/nodejs/node/pull/59277) +* \[[`9632c398de`](https://github.com/nodejs/node/commit/9632c398de)] - **doc**: improve agent.createConnection docs for http and https agents (JaeHo Jang) [#58205](https://github.com/nodejs/node/pull/58205) +* \[[`f72880dbe3`](https://github.com/nodejs/node/commit/f72880dbe3)] - **doc**: fix pseudo code in modules.md (chirsz) [#57677](https://github.com/nodejs/node/pull/57677) +* \[[`a9c70cefe8`](https://github.com/nodejs/node/commit/a9c70cefe8)] - **doc**: add missing variable in code snippet (Koushil Mankali) [#55478](https://github.com/nodejs/node/pull/55478) +* \[[`2892d151d4`](https://github.com/nodejs/node/commit/2892d151d4)] - **doc**: add missing word in `single-executable-applications.md` (Konstantin Tsabolov) [#53864](https://github.com/nodejs/node/pull/53864) +* \[[`9c99ab6571`](https://github.com/nodejs/node/commit/9c99ab6571)] - **doc**: fix typo in http.md (Michael Solomon) [#59354](https://github.com/nodejs/node/pull/59354) +* \[[`3446cf375f`](https://github.com/nodejs/node/commit/3446cf375f)] - **doc**: update devcontainer.json and add documentation (Joyee Cheung) [#60472](https://github.com/nodejs/node/pull/60472) +* \[[`519c537875`](https://github.com/nodejs/node/commit/519c537875)] - **doc**: add haramj as triager (Haram Jeong) [#60348](https://github.com/nodejs/node/pull/60348) +* \[[`62889d7e99`](https://github.com/nodejs/node/commit/62889d7e99)] - **doc**: clarify require(esm) description (dynst) [#60520](https://github.com/nodejs/node/pull/60520) +* \[[`0b9ef68705`](https://github.com/nodejs/node/commit/0b9ef68705)] - **doc**: instantiate resolver object (Donghoon Nam) [#60476](https://github.com/nodejs/node/pull/60476) +* \[[`cd5c1ad29f`](https://github.com/nodejs/node/commit/cd5c1ad29f)] - **doc**: correct module loading descriptions (Joyee Cheung) [#60346](https://github.com/nodejs/node/pull/60346) +* \[[`74719dad7a`](https://github.com/nodejs/node/commit/74719dad7a)] - **doc**: clarify Linux runtime requirements for >=25 (Joyee Cheung) [#60484](https://github.com/nodejs/node/pull/60484) +* \[[`ca39540785`](https://github.com/nodejs/node/commit/ca39540785)] - **doc**: clarify --use-system-ca support status (Joyee Cheung) [#60340](https://github.com/nodejs/node/pull/60340) +* \[[`dbf204c714`](https://github.com/nodejs/node/commit/dbf204c714)] - **doc,crypto**: link keygen to supported types (Filip Skokan) [#60585](https://github.com/nodejs/node/pull/60585) +* \[[`3bcf86d56d`](https://github.com/nodejs/node/commit/3bcf86d56d)] - **esm**: use sync loading/resolving on non-loader-hook thread (Joyee Cheung) [#60380](https://github.com/nodejs/node/pull/60380) +* \[[`69b3d2c845`](https://github.com/nodejs/node/commit/69b3d2c845)] - **http**: replace startsWith with strict equality (btea) [#59394](https://github.com/nodejs/node/pull/59394) +* \[[`a38e2f5975`](https://github.com/nodejs/node/commit/a38e2f5975)] - **http2**: add diagnostics channels for client stream request body (Darshan Sen) [#60480](https://github.com/nodejs/node/pull/60480) +* \[[`c047e73a00`](https://github.com/nodejs/node/commit/c047e73a00)] - **inspector**: inspect HTTP response body (Chengzhong Wu) [#60572](https://github.com/nodejs/node/pull/60572) +* \[[`d2087bae92`](https://github.com/nodejs/node/commit/d2087bae92)] - **inspector**: support inspecting HTTP/2 request and response bodies (Darshan Sen) [#60483](https://github.com/nodejs/node/pull/60483) +* \[[`003121c475`](https://github.com/nodejs/node/commit/003121c475)] - **inspector**: fix crash when receiving non json message (Shima Ryuhei) [#60388](https://github.com/nodejs/node/pull/60388) +* \[[`a37c01e6a1`](https://github.com/nodejs/node/commit/a37c01e6a1)] - **(SEMVER-MINOR)** **lib**: add options to util.deprecate (Rafael Gonzaga) [#59982](https://github.com/nodejs/node/pull/59982) +* \[[`219d2e978d`](https://github.com/nodejs/node/commit/219d2e978d)] - **lib**: replace global SharedArrayBuffer constructor with bound method (Renegade334) [#60497](https://github.com/nodejs/node/pull/60497) +* \[[`4fbb1ab101`](https://github.com/nodejs/node/commit/4fbb1ab101)] - **lib**: throw from localStorage getter on missing storage path (René) [#60351](https://github.com/nodejs/node/pull/60351) +* \[[`ca8934f44d`](https://github.com/nodejs/node/commit/ca8934f44d)] - **meta**: bump cachix/install-nix-action from 31.6.1 to 31.8.2 (dependabot\[bot]) [#60534](https://github.com/nodejs/node/pull/60534) +* \[[`166490230a`](https://github.com/nodejs/node/commit/166490230a)] - **meta**: bump github/codeql-action from 3.30.5 to 4.31.2 (dependabot\[bot]) [#60533](https://github.com/nodejs/node/pull/60533) +* \[[`b722236a12`](https://github.com/nodejs/node/commit/b722236a12)] - **meta**: bump actions/download-artifact from 5.0.0 to 6.0.0 (dependabot\[bot]) [#60532](https://github.com/nodejs/node/pull/60532) +* \[[`3314b0bc60`](https://github.com/nodejs/node/commit/3314b0bc60)] - **meta**: bump actions/upload-artifact from 4.6.2 to 5.0.0 (dependabot\[bot]) [#60531](https://github.com/nodejs/node/pull/60531) +* \[[`d1d9891feb`](https://github.com/nodejs/node/commit/d1d9891feb)] - **meta**: bump actions/github-script from 7.0.1 to 8.0.0 (dependabot\[bot]) [#60530](https://github.com/nodejs/node/pull/60530) +* \[[`995596a34f`](https://github.com/nodejs/node/commit/995596a34f)] - **meta**: bump actions/setup-node from 5.0.0 to 6.0.0 (dependabot\[bot]) [#60529](https://github.com/nodejs/node/pull/60529) +* \[[`b60157a0fe`](https://github.com/nodejs/node/commit/b60157a0fe)] - **meta**: bump actions/stale from 10.0.0 to 10.1.0 (dependabot\[bot]) [#60528](https://github.com/nodejs/node/pull/60528) +* \[[`07fa6c9081`](https://github.com/nodejs/node/commit/07fa6c9081)] - **meta**: call `create-release-post.yml` post release (Aviv Keller) [#60366](https://github.com/nodejs/node/pull/60366) +* \[[`727560a96d`](https://github.com/nodejs/node/commit/727560a96d)] - **(SEMVER-MINOR)** **module**: mark type stripping as stable (Marco Ippolito) [#60600](https://github.com/nodejs/node/pull/60600) +* \[[`506b79e888`](https://github.com/nodejs/node/commit/506b79e888)] - **(SEMVER-MINOR)** **net**: increase network family autoselection timeout to 500ms (Rod Vagg) [#60334](https://github.com/nodejs/node/pull/60334) +* \[[`166c72ec02`](https://github.com/nodejs/node/commit/166c72ec02)] - **(SEMVER-MINOR)** **node-api**: add napi\_create\_object\_with\_properties (Miguel Marcondes Filho) [#59953](https://github.com/nodejs/node/pull/59953) +* \[[`6ab83cf979`](https://github.com/nodejs/node/commit/6ab83cf979)] - **node-api**: use local files for instanceof test (Vladimir Morozov) [#60190](https://github.com/nodejs/node/pull/60190) +* \[[`3671851879`](https://github.com/nodejs/node/commit/3671851879)] - **perf\_hooks**: move non-standard performance properties to perf\_hooks (Chengzhong Wu) [#60370](https://github.com/nodejs/node/pull/60370) +* \[[`6ddee4a7ed`](https://github.com/nodejs/node/commit/6ddee4a7ed)] - **repl**: fix pasting after moving the cursor to the left (Ruben Bridgewater) [#60470](https://github.com/nodejs/node/pull/60470) +* \[[`edc3033905`](https://github.com/nodejs/node/commit/edc3033905)] - **sqlite,doc**: fix StatementSync section (Edy Silva) [#60474](https://github.com/nodejs/node/pull/60474) +* \[[`e9b68e60d4`](https://github.com/nodejs/node/commit/e9b68e60d4)] - **src**: move import.meta initializer to native land (Joyee Cheung) [#60603](https://github.com/nodejs/node/pull/60603) +* \[[`0ebf839a4f`](https://github.com/nodejs/node/commit/0ebf839a4f)] - **src**: use CP\_UTF8 for wide file names on win32 (Fedor Indutny) [#60575](https://github.com/nodejs/node/pull/60575) +* \[[`a31ad37714`](https://github.com/nodejs/node/commit/a31ad37714)] - **src**: show original file name in FileHandle GC close errors (Anna Henningsen) [#60593](https://github.com/nodejs/node/pull/60593) +* \[[`a6c221324b`](https://github.com/nodejs/node/commit/a6c221324b)] - **src**: avoid C strings in more C++ exception throws (Anna Henningsen) [#60592](https://github.com/nodejs/node/pull/60592) +* \[[`fdff838ce3`](https://github.com/nodejs/node/commit/fdff838ce3)] - **src**: add internal binding for constructing SharedArrayBuffers (Renegade334) [#60497](https://github.com/nodejs/node/pull/60497) +* \[[`4385b0b65f`](https://github.com/nodejs/node/commit/4385b0b65f)] - **src**: move `napi_addon_register_func` to `node_api_types.h` (Anna Henningsen) [#60512](https://github.com/nodejs/node/pull/60512) +* \[[`de78da7887`](https://github.com/nodejs/node/commit/de78da7887)] - **src**: move Node-API version detection to where it is used (Anna Henningsen) [#60512](https://github.com/nodejs/node/pull/60512) +* \[[`b606d46c3f`](https://github.com/nodejs/node/commit/b606d46c3f)] - **src**: remove unconditional NAPI\_EXPERIMENTAL in node.h (Chengzhong Wu) [#60345](https://github.com/nodejs/node/pull/60345) +* \[[`5941341889`](https://github.com/nodejs/node/commit/5941341889)] - **src**: clean up generic counter implementation (Anna Henningsen) [#60447](https://github.com/nodejs/node/pull/60447) +* \[[`7015f30e62`](https://github.com/nodejs/node/commit/7015f30e62)] - **src**: add enum handle for ToStringHelper + formatting (Burkov Egor) [#56829](https://github.com/nodejs/node/pull/56829) +* \[[`39dfcbad6e`](https://github.com/nodejs/node/commit/39dfcbad6e)] - **stream**: don't try to read more if reading (Robert Nagy) [#60454](https://github.com/nodejs/node/pull/60454) +* \[[`ee333c9177`](https://github.com/nodejs/node/commit/ee333c9177)] - **test**: deflake test-perf-hooks-timerify-histogram-sync (Joyee Cheung) [#60639](https://github.com/nodejs/node/pull/60639) +* \[[`f0d81c91e7`](https://github.com/nodejs/node/commit/f0d81c91e7)] - **test**: apply a delay to `watch-mode-kill-signal` tests (Joyee Cheung) [#60610](https://github.com/nodejs/node/pull/60610) +* \[[`68791e2ccc`](https://github.com/nodejs/node/commit/68791e2ccc)] - **test**: async iife in repl (Tony Gorez) [#44878](https://github.com/nodejs/node/pull/44878) +* \[[`c4eb9c3383`](https://github.com/nodejs/node/commit/c4eb9c3383)] - **test**: parallelize sea tests when there's enough disk space (Joyee Cheung) [#60604](https://github.com/nodejs/node/pull/60604) +* \[[`be8c4172d9`](https://github.com/nodejs/node/commit/be8c4172d9)] - **test**: only show overridden env in child process failures (Joyee Cheung) [#60556](https://github.com/nodejs/node/pull/60556) +* \[[`8cae858f88`](https://github.com/nodejs/node/commit/8cae858f88)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#60498](https://github.com/nodejs/node/pull/60498) +* \[[`759d69331e`](https://github.com/nodejs/node/commit/759d69331e)] - **test**: ensure assertions are reachable in `test/es-module` (Antoine du Hamel) [#60501](https://github.com/nodejs/node/pull/60501) +* \[[`6aaf18c333`](https://github.com/nodejs/node/commit/6aaf18c333)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#60485](https://github.com/nodejs/node/pull/60485) +* \[[`bc41acf087`](https://github.com/nodejs/node/commit/bc41acf087)] - **test**: ensure assertions are reached on more tests (Antoine du Hamel) [#60500](https://github.com/nodejs/node/pull/60500) +* \[[`22fd621daf`](https://github.com/nodejs/node/commit/22fd621daf)] - **test**: split test-perf-hooks-timerify (Joyee Cheung) [#60568](https://github.com/nodejs/node/pull/60568) +* \[[`5efe4f722e`](https://github.com/nodejs/node/commit/5efe4f722e)] - **test**: add more logs to test-esm-loader-hooks-inspect-wait (Joyee Cheung) [#60466](https://github.com/nodejs/node/pull/60466) +* \[[`2a57268f34`](https://github.com/nodejs/node/commit/2a57268f34)] - **test**: mark stringbytes-external-exceed-max tests as flaky on AIX (Joyee Cheung) [#60565](https://github.com/nodejs/node/pull/60565) +* \[[`2c199f7f61`](https://github.com/nodejs/node/commit/2c199f7f61)] - **test**: split test-esm-wasm.js (Joyee Cheung) [#60491](https://github.com/nodejs/node/pull/60491) +* \[[`bc8f7db5bb`](https://github.com/nodejs/node/commit/bc8f7db5bb)] - **test**: correct conditional secure heap flags test (Shelley Vohr) [#60385](https://github.com/nodejs/node/pull/60385) +* \[[`3bf42a5dd3`](https://github.com/nodejs/node/commit/3bf42a5dd3)] - **test**: spin longer on flaky platforms for test-worker-prof (Joyee Cheung) [#60492](https://github.com/nodejs/node/pull/60492) +* \[[`eca6227e7e`](https://github.com/nodejs/node/commit/eca6227e7e)] - **test**: ensure assertions are reachable in `test/internet` (Antoine du Hamel) [#60513](https://github.com/nodejs/node/pull/60513) +* \[[`313983453b`](https://github.com/nodejs/node/commit/313983453b)] - **test**: fix flaky test-watch-mode-kill-signal-\* (Joyee Cheung) [#60443](https://github.com/nodejs/node/pull/60443) +* \[[`ccc26377b5`](https://github.com/nodejs/node/commit/ccc26377b5)] - **test**: capture stack trace in debugger timeout errors (Joyee Cheung) [#60457](https://github.com/nodejs/node/pull/60457) +* \[[`12e9213a24`](https://github.com/nodejs/node/commit/12e9213a24)] - **test**: ensure assertions are reachable in `test/sequential` (Antoine du Hamel) [#60412](https://github.com/nodejs/node/pull/60412) +* \[[`781a2661de`](https://github.com/nodejs/node/commit/781a2661de)] - **test**: ensure assertions are reachable in more folders (Antoine du Hamel) [#60411](https://github.com/nodejs/node/pull/60411) +* \[[`1e979e6eb7`](https://github.com/nodejs/node/commit/1e979e6eb7)] - **test**: split test-runner-watch-mode (Joyee Cheung) [#60391](https://github.com/nodejs/node/pull/60391) +* \[[`8c31cbb99b`](https://github.com/nodejs/node/commit/8c31cbb99b)] - **test**: move test-runner-watch-mode helper into common (Joyee Cheung) [#60391](https://github.com/nodejs/node/pull/60391) +* \[[`c94c6555cc`](https://github.com/nodejs/node/commit/c94c6555cc)] - **test,crypto**: handle a few more BoringSSL tests (Shelley Vohr) [#59030](https://github.com/nodejs/node/pull/59030) +* \[[`fd63c27444`](https://github.com/nodejs/node/commit/fd63c27444)] - **test,crypto**: update x448 and ed448 expectation when on boringssl (Shelley Vohr) [#60387](https://github.com/nodejs/node/pull/60387) +* \[[`bf0de92446`](https://github.com/nodejs/node/commit/bf0de92446)] - **tls**: fix leak on invalid protocol method (Shelley Vohr) [#60427](https://github.com/nodejs/node/pull/60427) +* \[[`7e8373b378`](https://github.com/nodejs/node/commit/7e8373b378)] - **tools**: replace invalid expression in dependabot config (Riddhi) [#60649](https://github.com/nodejs/node/pull/60649) +* \[[`ac08760547`](https://github.com/nodejs/node/commit/ac08760547)] - **tools**: extract Nix dependency lists to separate files (Antoine du Hamel) [#60495](https://github.com/nodejs/node/pull/60495) +* \[[`ae91a6cc3a`](https://github.com/nodejs/node/commit/ae91a6cc3a)] - **tools**: only add test reporter args when node:test is used (Joyee Cheung) [#60551](https://github.com/nodejs/node/pull/60551) +* \[[`97ed560222`](https://github.com/nodejs/node/commit/97ed560222)] - **tools**: skip unaffected GHA jobs for changes in `test/internet` (Antoine du Hamel) [#60517](https://github.com/nodejs/node/pull/60517) +* \[[`44ca97b404`](https://github.com/nodejs/node/commit/44ca97b404)] - **tools**: fix update-icu script (Michaël Zasso) [#60521](https://github.com/nodejs/node/pull/60521) +* \[[`07b0b5a5ba`](https://github.com/nodejs/node/commit/07b0b5a5ba)] - **tools**: fix linter for semver-major release proposals (Antoine du Hamel) [#60481](https://github.com/nodejs/node/pull/60481) +* \[[`97d74224c3`](https://github.com/nodejs/node/commit/97d74224c3)] - **tools**: fix failing release-proposal linter for LTS transitions (Antoine du Hamel) [#60465](https://github.com/nodejs/node/pull/60465) +* \[[`019af5bc27`](https://github.com/nodejs/node/commit/019af5bc27)] - **tools**: skip running test-shared on deps changes (Antoine du Hamel) [#60433](https://github.com/nodejs/node/pull/60433) +* \[[`3ec9764151`](https://github.com/nodejs/node/commit/3ec9764151)] - **tools**: pin OpenSSL to 3.5.4 on test-shared workflow (Antoine du Hamel) [#60428](https://github.com/nodejs/node/pull/60428) +* \[[`fe2d6d44d4`](https://github.com/nodejs/node/commit/fe2d6d44d4)] - **tools**: remove undici from daily wpt.fyi job (Filip Skokan) [#60444](https://github.com/nodejs/node/pull/60444) +* \[[`d09ba98398`](https://github.com/nodejs/node/commit/d09ba98398)] - **tools**: document that nixpkgs updates should not be backported (Antoine du Hamel) [#60431](https://github.com/nodejs/node/pull/60431) +* \[[`7fc99319e7`](https://github.com/nodejs/node/commit/7fc99319e7)] - **tools**: do not use short hashes for deps versioning to avoid collision (Antoine du Hamel) [#60407](https://github.com/nodejs/node/pull/60407) +* \[[`815edb0c3a`](https://github.com/nodejs/node/commit/815edb0c3a)] - **tools,doc**: update JavaScript primitive types to match MDN Web Docs (JustApple) [#60581](https://github.com/nodejs/node/pull/60581) +* \[[`6877139a2d`](https://github.com/nodejs/node/commit/6877139a2d)] - **util**: fix stylize of special properties in inspect (Ge Gao) [#60479](https://github.com/nodejs/node/pull/60479) +* \[[`399b340022`](https://github.com/nodejs/node/commit/399b340022)] - **(SEMVER-MINOR)** **v8**: adding total\_allocated\_bytes to HeapStatistics (Caio Lima) [#60573](https://github.com/nodejs/node/pull/60573) +* \[[`d64795b318`](https://github.com/nodejs/node/commit/d64795b318)] - **watch**: fix interaction with multiple env files (Marco Ippolito) [#60605](https://github.com/nodejs/node/pull/60605) + + + +## 2025-10-28, Version 25.1.0 (Current), @aduh95 + +### Notable Changes + +* \[[`4395fe14b9`](https://github.com/nodejs/node/commit/4395fe14b9)] - **(SEMVER-MINOR)** **http**: add optimizeEmptyRequests server option (Rafael Gonzaga) [#59778](https://github.com/nodejs/node/pull/59778) +* \[[`2e55c6ad04`](https://github.com/nodejs/node/commit/2e55c6ad04)] - **(SEMVER-MINOR)** **sqlite**: allow setting defensive flag (Bart Louwers) [#60217](https://github.com/nodejs/node/pull/60217) +* \[[`f437204491`](https://github.com/nodejs/node/commit/f437204491)] - **(SEMVER-MINOR)** **src**: add watch config namespace (Marco Ippolito) [#60178](https://github.com/nodejs/node/pull/60178) + +### Commits + +* \[[`bb27766bd5`](https://github.com/nodejs/node/commit/bb27766bd5)] - **benchmark**: improve cpu.sh for safety and usability (Nam Yooseong) [#60162](https://github.com/nodejs/node/pull/60162) +* \[[`e600711c20`](https://github.com/nodejs/node/commit/e600711c20)] - **benchmark**: add benchmark for leaf source text modules (Joyee Cheung) [#60205](https://github.com/nodejs/node/pull/60205) +* \[[`1bbcdf9039`](https://github.com/nodejs/node/commit/1bbcdf9039)] - **benchmark**: add vm.SourceTextModule benchmark (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`22fa6bd28b`](https://github.com/nodejs/node/commit/22fa6bd28b)] - **build**: ibmi follow aix visibility (SRAVANI GUNDEPALLI) [#60360](https://github.com/nodejs/node/pull/60360) +* \[[`931028400e`](https://github.com/nodejs/node/commit/931028400e)] - **build**: use call command when calling python configure (Jacob Nichols) [#60098](https://github.com/nodejs/node/pull/60098) +* \[[`17fde3f3d1`](https://github.com/nodejs/node/commit/17fde3f3d1)] - **build**: build v8 with -fvisibility=hidden -fvisibility-inlines-hidden (Joyee Cheung) [#56290](https://github.com/nodejs/node/pull/56290) +* \[[`04cc7aae5e`](https://github.com/nodejs/node/commit/04cc7aae5e)] - **build**: remove V8\_COMPRESS\_POINTERS\_IN\_ISOLATE\_CAGE defs (Joyee Cheung) [#60296](https://github.com/nodejs/node/pull/60296) +* \[[`8a2053060d`](https://github.com/nodejs/node/commit/8a2053060d)] - **crypto**: update root certificates to NSS 3.116 (Node.js GitHub Bot) [#59956](https://github.com/nodejs/node/pull/59956) +* \[[`fe91c0f755`](https://github.com/nodejs/node/commit/fe91c0f755)] - **deps**: update simdjson to 4.0.7 (Node.js GitHub Bot) [#59883](https://github.com/nodejs/node/pull/59883) +* \[[`aacfc0d212`](https://github.com/nodejs/node/commit/aacfc0d212)] - **deps**: update corepack to 0.34.1 (Node.js GitHub Bot) [#60314](https://github.com/nodejs/node/pull/60314) +* \[[`8596891a71`](https://github.com/nodejs/node/commit/8596891a71)] - **deps**: update inspector\_protocol to af7f5a8173fdbc29f0835ec94395932e328b (Node.js GitHub Bot) [#60312](https://github.com/nodejs/node/pull/60312) +* \[[`21bcd0eb2f`](https://github.com/nodejs/node/commit/21bcd0eb2f)] - **deps**: V8: cherry-pick 3d0f462a17ff (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`673558501c`](https://github.com/nodejs/node/commit/673558501c)] - **deps**: update googletest to 279f847 (Node.js GitHub Bot) [#60219](https://github.com/nodejs/node/pull/60219) +* \[[`425a1879b1`](https://github.com/nodejs/node/commit/425a1879b1)] - **doc**: mention more codemods in `deprecations.md` (Augustin Mauroy) [#60243](https://github.com/nodejs/node/pull/60243) +* \[[`563e1317f3`](https://github.com/nodejs/node/commit/563e1317f3)] - **doc**: remove unnecessary statement of web storage (Deokjin Kim) [#60363](https://github.com/nodejs/node/pull/60363) +* \[[`064c8c5cfd`](https://github.com/nodejs/node/commit/064c8c5cfd)] - **doc**: add missing CAA type to dns.resolveAny() & dnsPromises.resolveAny() (Jimmy Leung) [#58899](https://github.com/nodejs/node/pull/58899) +* \[[`99e357af35`](https://github.com/nodejs/node/commit/99e357af35)] - **doc**: use `any` for `worker_threads.Worker` 'error' event argument `err` (Jonas Geiler) [#60300](https://github.com/nodejs/node/pull/60300) +* \[[`8ccff0d934`](https://github.com/nodejs/node/commit/8ccff0d934)] - **doc**: update decorator documentation to reflect actual policy (Muhammad Salman Aziz) [#60288](https://github.com/nodejs/node/pull/60288) +* \[[`bac70c6ef3`](https://github.com/nodejs/node/commit/bac70c6ef3)] - **doc**: document wildcard supported by tools/test.py (Joyee Cheung) [#60265](https://github.com/nodejs/node/pull/60265) +* \[[`8492bc6a88`](https://github.com/nodejs/node/commit/8492bc6a88)] - **doc**: add --heap-snapshot-on-oom to useful v8 flag (jakecastelli) [#60260](https://github.com/nodejs/node/pull/60260) +* \[[`0f0d3c0e47`](https://github.com/nodejs/node/commit/0f0d3c0e47)] - **doc**: fix `blob.bytes()` heading level (XTY) [#60252](https://github.com/nodejs/node/pull/60252) +* \[[`8c8525cf93`](https://github.com/nodejs/node/commit/8c8525cf93)] - **doc**: fix not working code example in vm docs (Artur Gawlik) [#60224](https://github.com/nodejs/node/pull/60224) +* \[[`8a6de3866c`](https://github.com/nodejs/node/commit/8a6de3866c)] - **doc, assert**: correct order of changes entries (Gerhard Stöbich) [#60304](https://github.com/nodejs/node/pull/60304) +* \[[`6bacb6555a`](https://github.com/nodejs/node/commit/6bacb6555a)] - **doc, module**: change async customization hooks to experimental (Gerhard Stöbich) [#60302](https://github.com/nodejs/node/pull/60302) +* \[[`6f3b16df16`](https://github.com/nodejs/node/commit/6f3b16df16)] - **esm**: use index-based resolution callbacks (Joyee Cheung) [#59396](https://github.com/nodejs/node/pull/59396) +* \[[`95644a432c`](https://github.com/nodejs/node/commit/95644a432c)] - **http**: lazy allocate cookies array (Robert Nagy) [#59734](https://github.com/nodejs/node/pull/59734) +* \[[`4395fe14b9`](https://github.com/nodejs/node/commit/4395fe14b9)] - **(SEMVER-MINOR)** **http**: add optimizeEmptyRequests server option (Rafael Gonzaga) [#59778](https://github.com/nodejs/node/pull/59778) +* \[[`f1aa1eaaf5`](https://github.com/nodejs/node/commit/f1aa1eaaf5)] - **inspector**: add network payload buffer size limits (Chengzhong Wu) [#60236](https://github.com/nodejs/node/pull/60236) +* \[[`64fc625bf9`](https://github.com/nodejs/node/commit/64fc625bf9)] - **inspector**: support handshake response for websocket inspection (Shima Ryuhei) [#60225](https://github.com/nodejs/node/pull/60225) +* \[[`0ecbb806a8`](https://github.com/nodejs/node/commit/0ecbb806a8)] - **lib**: fix typo in createBlobReaderStream (SeokHun) [#60132](https://github.com/nodejs/node/pull/60132) +* \[[`ffec5927fd`](https://github.com/nodejs/node/commit/ffec5927fd)] - **meta**: fix typo in test-shared workflow name (Ronit Sabhaya) [#60321](https://github.com/nodejs/node/pull/60321) +* \[[`a02897e157`](https://github.com/nodejs/node/commit/a02897e157)] - **meta**: move one or more collaborators to emeritus (Node.js GitHub Bot) [#60325](https://github.com/nodejs/node/pull/60325) +* \[[`59223a7831`](https://github.com/nodejs/node/commit/59223a7831)] - **meta**: loop userland-migrations in deprecations (Chengzhong Wu) [#60299](https://github.com/nodejs/node/pull/60299) +* \[[`2d48d17696`](https://github.com/nodejs/node/commit/2d48d17696)] - **module**: refactor and clarify async loader hook customizations (Joyee Cheung) [#60278](https://github.com/nodejs/node/pull/60278) +* \[[`be1b84fd93`](https://github.com/nodejs/node/commit/be1b84fd93)] - **module**: handle null source from async loader hooks in sync hooks (Joyee Cheung) [#59929](https://github.com/nodejs/node/pull/59929) +* \[[`063fbd87d3`](https://github.com/nodejs/node/commit/063fbd87d3)] - **msi**: fix WiX warnings (Stefan Stojanovic) [#60251](https://github.com/nodejs/node/pull/60251) +* \[[`2e55c6ad04`](https://github.com/nodejs/node/commit/2e55c6ad04)] - **(SEMVER-MINOR)** **sqlite**: allow setting defensive flag (Bart Louwers) [#60217](https://github.com/nodejs/node/pull/60217) +* \[[`dc93d6988a`](https://github.com/nodejs/node/commit/dc93d6988a)] - **src**: fix timing of snapshot serialize callback (Joyee Cheung) [#60434](https://github.com/nodejs/node/pull/60434) +* \[[`267e1b3817`](https://github.com/nodejs/node/commit/267e1b3817)] - **src**: add COUNT\_GENERIC\_USAGE utility for tests (Joyee Cheung) [#60434](https://github.com/nodejs/node/pull/60434) +* \[[`4a5d7a4c2a`](https://github.com/nodejs/node/commit/4a5d7a4c2a)] - **src**: conditionally disable source phase imports by default (Shelley Vohr) [#60364](https://github.com/nodejs/node/pull/60364) +* \[[`f437204491`](https://github.com/nodejs/node/commit/f437204491)] - **(SEMVER-MINOR)** **src**: add watch config namespace (Marco Ippolito) [#60178](https://github.com/nodejs/node/pull/60178) +* \[[`36837fa0f9`](https://github.com/nodejs/node/commit/36837fa0f9)] - **src**: use cached primordials\_string (Sohyeon Kim) [#60255](https://github.com/nodejs/node/pull/60255) +* \[[`df8396ad37`](https://github.com/nodejs/node/commit/df8396ad37)] - **src**: replace Environment::GetCurrent with args.GetIsolate (Sohyeon Kim) [#60256](https://github.com/nodejs/node/pull/60256) +* \[[`5dd670b2b9`](https://github.com/nodejs/node/commit/5dd670b2b9)] - **src**: initial enablement of IsolateGroups (James M Snell) [#60254](https://github.com/nodejs/node/pull/60254) +* \[[`afdb362933`](https://github.com/nodejs/node/commit/afdb362933)] - **src**: use `Utf8Value` and `TwoByteValue` instead of V8 helpers (Anna Henningsen) [#60244](https://github.com/nodejs/node/pull/60244) +* \[[`a40e533e72`](https://github.com/nodejs/node/commit/a40e533e72)] - **src**: add a default branch for module phase (Chengzhong Wu) [#60261](https://github.com/nodejs/node/pull/60261) +* \[[`42729f07ee`](https://github.com/nodejs/node/commit/42729f07ee)] - **src**: stop using deprecated v8::Context::GetIsolate (Michaël Zasso) [#60223](https://github.com/nodejs/node/pull/60223) +* \[[`7a6542c205`](https://github.com/nodejs/node/commit/7a6542c205)] - **test**: skip failing test on macOS 15.7+ (Antoine du Hamel) [#60419](https://github.com/nodejs/node/pull/60419) +* \[[`29a5855a4f`](https://github.com/nodejs/node/commit/29a5855a4f)] - **test**: ensure assertions are reachable in `test/addons` (Antoine du Hamel) [#60142](https://github.com/nodejs/node/pull/60142) +* \[[`12773d19c4`](https://github.com/nodejs/node/commit/12773d19c4)] - **test**: increase debugger waitFor timeout on macOS (Chengzhong Wu) [#60367](https://github.com/nodejs/node/pull/60367) +* \[[`0b38de3e9e`](https://github.com/nodejs/node/commit/0b38de3e9e)] - **test**: put helper in test-runner-output into common (Joyee Cheung) [#60330](https://github.com/nodejs/node/pull/60330) +* \[[`6de2407c44`](https://github.com/nodejs/node/commit/6de2407c44)] - **test**: fix small compile warning in test\_network\_requests\_buffer.cc (xiaocainiao633) [#60281](https://github.com/nodejs/node/pull/60281) +* \[[`4b23ac8613`](https://github.com/nodejs/node/commit/4b23ac8613)] - **test**: fix status when compiled without inspector (Antoine du Hamel) [#60289](https://github.com/nodejs/node/pull/60289) +* \[[`a07f32e326`](https://github.com/nodejs/node/commit/a07f32e326)] - **test**: split test-runner-watch-mode-kill-signal (Joyee Cheung) [#60298](https://github.com/nodejs/node/pull/60298) +* \[[`30451d32d7`](https://github.com/nodejs/node/commit/30451d32d7)] - **test**: fix incorrect calculation in test-perf-hooks.js (Joyee Cheung) [#60271](https://github.com/nodejs/node/pull/60271) +* \[[`e3c3b48f1c`](https://github.com/nodejs/node/commit/e3c3b48f1c)] - **test**: ignore EPIPE errors in https proxy invalid URL test (Joyee Cheung) [#60269](https://github.com/nodejs/node/pull/60269) +* \[[`405a9c4c5f`](https://github.com/nodejs/node/commit/405a9c4c5f)] - **test**: parallelize test-without-async-context-frame correctly (Joyee Cheung) [#60273](https://github.com/nodejs/node/pull/60273) +* \[[`ffeebebc71`](https://github.com/nodejs/node/commit/ffeebebc71)] - **test**: make test-worker-prof more tolerant (Joyee Cheung) [#60272](https://github.com/nodejs/node/pull/60272) +* \[[`26b01bf170`](https://github.com/nodejs/node/commit/26b01bf170)] - **test**: skip sea tests on x64 macOS (Joyee Cheung) [#60250](https://github.com/nodejs/node/pull/60250) +* \[[`8caae1a05b`](https://github.com/nodejs/node/commit/8caae1a05b)] - **test**: move sea tests into test/sea (Joyee Cheung) [#60250](https://github.com/nodejs/node/pull/60250) +* \[[`3d183e3e9f`](https://github.com/nodejs/node/commit/3d183e3e9f)] - **test,crypto**: fix conditional SHA3-\* skip on BoringSSL (Filip Skokan) [#60379](https://github.com/nodejs/node/pull/60379) +* \[[`e83dbcba94`](https://github.com/nodejs/node/commit/e83dbcba94)] - **test,crypto**: sha3 algorithms aren't supported with BoringSSL (Shelley Vohr) [#60374](https://github.com/nodejs/node/pull/60374) +* \[[`3d89331496`](https://github.com/nodejs/node/commit/3d89331496)] - **test\_runner**: use module.registerHooks in module mocks (Joyee Cheung) [#60326](https://github.com/nodejs/node/pull/60326) +* \[[`377e8ce85a`](https://github.com/nodejs/node/commit/377e8ce85a)] - **tls**: avoid external memory leak on invalid protocol versions (Shelley Vohr) [#60390](https://github.com/nodejs/node/pull/60390) +* \[[`ae4858c1f6`](https://github.com/nodejs/node/commit/ae4858c1f6)] - **tools**: add an option to generate lighter archives (Antoine du Hamel) [#60294](https://github.com/nodejs/node/pull/60294) +* \[[`cb615b1a2e`](https://github.com/nodejs/node/commit/cb615b1a2e)] - **tools**: skip test-shared workflow for draft PRs (Michaël Zasso) [#60365](https://github.com/nodejs/node/pull/60365) +* \[[`03b034731e`](https://github.com/nodejs/node/commit/03b034731e)] - **tools**: disable inspector on macOS-shared to reduce flakiness (Antoine du Hamel) [#60320](https://github.com/nodejs/node/pull/60320) +* \[[`f402b4e1d1`](https://github.com/nodejs/node/commit/f402b4e1d1)] - **tools**: show diff alongside the error in Nix linter (Antoine du Hamel) [#60301](https://github.com/nodejs/node/pull/60301) +* \[[`5d5c8483fb`](https://github.com/nodejs/node/commit/5d5c8483fb)] - **tools**: run CI with shared libs on GHA (Antoine du Hamel) [#60121](https://github.com/nodejs/node/pull/60121) +* \[[`e8fdd8d2e8`](https://github.com/nodejs/node/commit/e8fdd8d2e8)] - **tools**: update gyp-next to 0.20.5 (Node.js GitHub Bot) [#60313](https://github.com/nodejs/node/pull/60313) +* \[[`6e8b029a21`](https://github.com/nodejs/node/commit/6e8b029a21)] - **tools**: limit inspector protocol PR title length (Chengzhong Wu) [#60324](https://github.com/nodejs/node/pull/60324) +* \[[`a5073086c6`](https://github.com/nodejs/node/commit/a5073086c6)] - **tools**: fix inspector\_protocol updater (Chengzhong Wu) [#60277](https://github.com/nodejs/node/pull/60277) +* \[[`47fa765bff`](https://github.com/nodejs/node/commit/47fa765bff)] - **tools**: optimize wildcard execution in tools/test.py (Joyee Cheung) [#60266](https://github.com/nodejs/node/pull/60266) +* \[[`11ebb0447d`](https://github.com/nodejs/node/commit/11ebb0447d)] - **tools**: add C++ lint rule to avoid using `String::Utf8Value` (Anna Henningsen) [#60244](https://github.com/nodejs/node/pull/60244) +* \[[`14f3189670`](https://github.com/nodejs/node/commit/14f3189670)] - **tools**: add inspector\_protocol updater (Chengzhong Wu) [#60245](https://github.com/nodejs/node/pull/60245) +* \[[`ef4c596fc6`](https://github.com/nodejs/node/commit/ef4c596fc6)] - **typings**: add missing properties and method in Worker (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`09ae6fc065`](https://github.com/nodejs/node/commit/09ae6fc065)] - **typings**: add missing properties in HTTPParser (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`9ecaf41f8e`](https://github.com/nodejs/node/commit/9ecaf41f8e)] - **typings**: delete undefined property in ConfigBinding (Woohyun Sung) [#60257](https://github.com/nodejs/node/pull/60257) +* \[[`4a86016e86`](https://github.com/nodejs/node/commit/4a86016e86)] - **util**: use more defensive code when inspecting error objects (Antoine du Hamel) [#60139](https://github.com/nodejs/node/pull/60139) +* \[[`9e6d6cec59`](https://github.com/nodejs/node/commit/9e6d6cec59)] - **util**: mark special properties when inspecting them (Ruben Bridgewater) [#60131](https://github.com/nodejs/node/pull/60131) +* \[[`79b2387fd9`](https://github.com/nodejs/node/commit/79b2387fd9)] - **vm**: make vm.Module.evaluate() conditionally synchronous (Joyee Cheung) [#60205](https://github.com/nodejs/node/pull/60205) +* \[[`e5559f3be3`](https://github.com/nodejs/node/commit/e5559f3be3)] - **win**: upgrade Visual Studio workload from 2019 to 2022 (Jiawen Geng) [#60318](https://github.com/nodejs/node/pull/60318) + + + +## 2025-10-15, Version 25.0.0 (Current), @RafaelGSS + +Node.js 25 is here! We have upgraded V8 to **14.1**, bringing major `JSON.stringify` +performance improvements, built-in `Uint8Array` base64/hex conversion, and ongoing +WebAssembly and JIT pipeline optimizations. + +This release doubles down on secure-by-default apps and web-standard APIs: the permission +model gains `--allow-net`, Web Storage is enabled by default, and `ErrorEvent` is now a global. + +We’ve also removed or finalized long-deprecated APIs such as SlowBuffer, +and added quality-of-life improvements like a portable compile cache and JSPI for WebAssembly. + +### Notable Changes + +* \[[`8bc7dfd16f`](https://github.com/nodejs/node/commit/8bc7dfd16f)] - **build**: test on Python 3.14 release candidate 3 (Christian Clauss) [#59983](https://github.com/nodejs/node/pull/59983) +* \[[`663554abdf`](https://github.com/nodejs/node/commit/663554abdf)] - **(SEMVER-MAJOR)** **lib**: expose global ErrorEvent (Richie Bendall) [#58920](https://github.com/nodejs/node/pull/58920) +* \[[`3312e4e946`](https://github.com/nodejs/node/commit/3312e4e946)] - **(SEMVER-MAJOR)** **src**: unflag --experimental-webstorage by default (Daniel M Brasil) [#57666](https://github.com/nodejs/node/pull/57666) +* \[[`462c74181d`](https://github.com/nodejs/node/commit/462c74181d)] - **(SEMVER-MAJOR)** **src,permission**: add --allow-net permission (Rafael Gonzaga) [#58517](https://github.com/nodejs/node/pull/58517) + +### Deprecations and Removals + +* \[[`d33f4b539a`](https://github.com/nodejs/node/commit/d33f4b539a)] - **(SEMVER-MAJOR)** **assert**: move assert.fail with multiple arguments to eol (James M Snell) [#58532](https://github.com/nodejs/node/pull/58532) +* \[[`b21574d63b`](https://github.com/nodejs/node/commit/b21574d63b)] - **(SEMVER-MAJOR)** **assert**: move CallTracker to EOL (James M Snell) [#58006](https://github.com/nodejs/node/pull/58006) +* \[[`308b6bc6de`](https://github.com/nodejs/node/commit/308b6bc6de)] - **(SEMVER-MAJOR)** **async\_hooks**: move `asyncResource` property on bound function to EOL (James M Snell) [#58618](https://github.com/nodejs/node/pull/58618) +* \[[`daced4ab98`](https://github.com/nodejs/node/commit/daced4ab98)] - **(SEMVER-MAJOR)** **buffer**: move SlowBuffer to EOL (Filip Skokan) [#58220](https://github.com/nodejs/node/pull/58220) +* \[[`df16f0fd8d`](https://github.com/nodejs/node/commit/df16f0fd8d)] - **(SEMVER-MAJOR)** **child\_process**: move \_channel to end-of-life (James M Snell) [#58527](https://github.com/nodejs/node/pull/58527) +* \[[`a472745958`](https://github.com/nodejs/node/commit/a472745958)] - **(SEMVER-MAJOR)** **crypto**: runtime-deprecate default shake128/256 output lengths (Filip Skokan) [#59008](https://github.com/nodejs/node/pull/59008) +* \[[`c3b986853c`](https://github.com/nodejs/node/commit/c3b986853c)] - **(SEMVER-MAJOR)** **crypto**: move deprecated hash and mgf1Hash options to EOL (James M Snell) [#58706](https://github.com/nodejs/node/pull/58706) +* \[[`66632648ba`](https://github.com/nodejs/node/commit/66632648ba)] - **(SEMVER-MAJOR)** **crypto**: runtime deprecate ECDH.setPublicKey() (James M Snell) [#58620](https://github.com/nodejs/node/pull/58620) +* \[[`a5f9ca1f77`](https://github.com/nodejs/node/commit/a5f9ca1f77)] - **(SEMVER-MAJOR)** **dns**: move falsy hostname in lookup to end-of-life (James M Snell) [#58619](https://github.com/nodejs/node/pull/58619) +* \[[`2bb7667475`](https://github.com/nodejs/node/commit/2bb7667475)] - **(SEMVER-MAJOR)** **fs**: move FileHandle close on GC to EOL (James M Snell) [#58536](https://github.com/nodejs/node/pull/58536) +* \[[`eec0302088`](https://github.com/nodejs/node/commit/eec0302088)] - **(SEMVER-MAJOR)** **fs**: move rmdir recursive option to end-of-life (James M Snell) [#58616](https://github.com/nodejs/node/pull/58616) +* \[[`25dd206c29`](https://github.com/nodejs/node/commit/25dd206c29)] - **(SEMVER-MAJOR)** **fs**: remove `fs.F_OK`, `fs.R_OK`, `fs.W_OK`, `fs.X_OK` (Livia Medeiros) [#55862](https://github.com/nodejs/node/pull/55862) +* \[[`91dadf2897`](https://github.com/nodejs/node/commit/91dadf2897)] - **(SEMVER-MAJOR)** **http**: deprecate writeHeader (Sebastian Beltran) [#59060](https://github.com/nodejs/node/pull/59060) +* \[[`4e06a648ff`](https://github.com/nodejs/node/commit/4e06a648ff)] - **(SEMVER-MAJOR)** **perf\_hooks**: move deprecated accessors to EOF (James M Snell) [#58531](https://github.com/nodejs/node/pull/58531) +* \[[`a3dfca90d1`](https://github.com/nodejs/node/commit/a3dfca90d1)] - **(SEMVER-MAJOR)** **process**: move multipleResolves event to EOL (James M Snell) [#58707](https://github.com/nodejs/node/pull/58707) +* \[[`790acc8689`](https://github.com/nodejs/node/commit/790acc8689)] - **(SEMVER-MAJOR)** **tls**: move IP-address servername deprecation to eol (James M Snell) [#58533](https://github.com/nodejs/node/pull/58533) +* \[[`3aaa2ebe19`](https://github.com/nodejs/node/commit/3aaa2ebe19)] - **(SEMVER-MAJOR)** **url**: move bad port deprecation in legacy url to end-of-life (James M Snell) [#58617](https://github.com/nodejs/node/pull/58617) + +### Semver-Major Commits + +* \[[`7c9fbc15bc`](https://github.com/nodejs/node/commit/7c9fbc15bc)] - **(SEMVER-MAJOR)** **assert,util**: fail promise comparison in deep equal checks (Ruben Bridgewater) [#59448](https://github.com/nodejs/node/pull/59448) +* \[[`11222f1a27`](https://github.com/nodejs/node/commit/11222f1a27)] - **(SEMVER-MAJOR)** **assert,util**: handle invalid dates as equal in deep comparison (Ruben Bridgewater) [#57627](https://github.com/nodejs/node/pull/57627) +* \[[`acce2e8f87`](https://github.com/nodejs/node/commit/acce2e8f87)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`8a87ba031b`](https://github.com/nodejs/node/commit/8a87ba031b)] - **(SEMVER-MAJOR)** **build**: bump minimum Clang version to 19 (Michaël Zasso) [#59048](https://github.com/nodejs/node/pull/59048) +* \[[`21b131e93a`](https://github.com/nodejs/node/commit/21b131e93a)] - **(SEMVER-MAJOR)** **build**: reset embedder string to "-node.0" (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`f31c88021b`](https://github.com/nodejs/node/commit/f31c88021b)] - **(SEMVER-MAJOR)** **build**: stop distributing Corepack (Antoine du Hamel) [#57617](https://github.com/nodejs/node/pull/57617) +* \[[`b3238442d8`](https://github.com/nodejs/node/commit/b3238442d8)] - **(SEMVER-MAJOR)** **deps**: patch V8 for illumos (Dan McDonald) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`2a1da3260d`](https://github.com/nodejs/node/commit/2a1da3260d)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#54077](https://github.com/nodejs/node/pull/54077) +* \[[`7772a2df9d`](https://github.com/nodejs/node/commit/7772a2df9d)] - **(SEMVER-MAJOR)** **deps**: update V8 to 14.1.146.11 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`6d61175db0`](https://github.com/nodejs/node/commit/6d61175db0)] - **(SEMVER-MAJOR)** **deps**: V8: backport 1d3362c55396 (Shu-yu Guo) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`974773572e`](https://github.com/nodejs/node/commit/974773572e)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 4f38995c8295 (Shu-yu Guo) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`70bfc398e9`](https://github.com/nodejs/node/commit/70bfc398e9)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick 044b9b6f589d (Rezvan Mahdavi Hezaveh) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`6bfc525cf0`](https://github.com/nodejs/node/commit/6bfc525cf0)] - **(SEMVER-MAJOR)** **deps**: V8: cherry-pick d2ad518a0b57 (Joyee Cheung) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`754d28e34f`](https://github.com/nodejs/node/commit/754d28e34f)] - **(SEMVER-MAJOR)** **deps**: V8: revert 6d6c1e680c7b (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`8c508b9399`](https://github.com/nodejs/node/commit/8c508b9399)] - **(SEMVER-MAJOR)** **deps**: V8: revert e3cddbedb205 (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`88ca8287b6`](https://github.com/nodejs/node/commit/88ca8287b6)] - **(SEMVER-MAJOR)** **deps**: use std::map in MSVC STL for EphemeronRememberedSet (Joyee Cheung) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`838e2332a5`](https://github.com/nodejs/node/commit/838e2332a5)] - **(SEMVER-MAJOR)** **deps**: patch V8 for illumos (Dan McDonald) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`3522731d9a`](https://github.com/nodejs/node/commit/3522731d9a)] - **(SEMVER-MAJOR)** **deps**: remove problematic comment from v8-internal (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`d234475a33`](https://github.com/nodejs/node/commit/d234475a33)] - **(SEMVER-MAJOR)** **deps**: define V8\_PRESERVE\_MOST as no-op on Windows (Stefan Stojanovic) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`a738eb4a7f`](https://github.com/nodejs/node/commit/a738eb4a7f)] - **(SEMVER-MAJOR)** **deps**: fix FP16 bitcasts.h (Stefan Stojanovic) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`1744c7d991`](https://github.com/nodejs/node/commit/1744c7d991)] - **(SEMVER-MAJOR)** **deps**: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`fff0d1554d`](https://github.com/nodejs/node/commit/fff0d1554d)] - **(SEMVER-MAJOR)** **deps**: update V8 to 13.7.152.9 (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`968e2f47c8`](https://github.com/nodejs/node/commit/968e2f47c8)] - **(SEMVER-MAJOR)** **dgram**: move deprecated APIs to EOL (James M Snell) [#58474](https://github.com/nodejs/node/pull/58474) +* \[[`5623194a6b`](https://github.com/nodejs/node/commit/5623194a6b)] - **(SEMVER-MAJOR)** **doc,src,test**: replace use of deprecated `GetIsolate` (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`823ca6991f`](https://github.com/nodejs/node/commit/823ca6991f)] - **(SEMVER-MAJOR)** **fs**: make `processReadResult()` and `readSyncRecursive()` private (Livia Medeiros) [#58672](https://github.com/nodejs/node/pull/58672) +* \[[`a273674dee`](https://github.com/nodejs/node/commit/a273674dee)] - **(SEMVER-MAJOR)** **fs**: move fs stream open method to eol (James M Snell) [#58529](https://github.com/nodejs/node/pull/58529) +* \[[`39d73036e7`](https://github.com/nodejs/node/commit/39d73036e7)] - **(SEMVER-MAJOR)** **lib**: use validators for argument validation (Nam Yooseong) [#59416](https://github.com/nodejs/node/pull/59416) +* \[[`cd68e35704`](https://github.com/nodejs/node/commit/cd68e35704)] - **(SEMVER-MAJOR)** **lib**: deprecate `_stream_*` modules (Dario Piotrowicz) [#58337](https://github.com/nodejs/node/pull/58337) +* \[[`a822a1cbe7`](https://github.com/nodejs/node/commit/a822a1cbe7)] - **(SEMVER-MAJOR)** **lib**: deprecate \_tls\_common and \_tls\_wrap (Dario Piotrowicz) [#57643](https://github.com/nodejs/node/pull/57643) +* \[[`705bcc2a00`](https://github.com/nodejs/node/commit/705bcc2a00)] - **(SEMVER-MAJOR)** **module**: move Module.\_debug to end-of-life (James M Snell) [#58473](https://github.com/nodejs/node/pull/58473) +* \[[`5fe7800683`](https://github.com/nodejs/node/commit/5fe7800683)] - **(SEMVER-MAJOR)** **node-api**: add warning for NAPI\_EXPERIMENTAL (Miguel Marcondes Filho) [#58280](https://github.com/nodejs/node/pull/58280) +* \[[`e1d4d6ab49`](https://github.com/nodejs/node/commit/e1d4d6ab49)] - **(SEMVER-MAJOR)** **repl**: eol deprecate instantiating without new (Aviv Keller) [#59495](https://github.com/nodejs/node/pull/59495) +* \[[`ed94bc48f3`](https://github.com/nodejs/node/commit/ed94bc48f3)] - **(SEMVER-MAJOR)** **src**: update crypto.getCipherInfo() to use DictionaryTemplate (James M Snell) [#60036](https://github.com/nodejs/node/pull/60036) +* \[[`37a3df3556`](https://github.com/nodejs/node/commit/37a3df3556)] - **(SEMVER-MAJOR)** **src**: fix calls to v8::Object::wrap (Andreas Haas) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`801ae26fa3`](https://github.com/nodejs/node/commit/801ae26fa3)] - **(SEMVER-MAJOR)** **src**: update NODE\_MODULE\_VERSION to 141 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`10df38a38b`](https://github.com/nodejs/node/commit/10df38a38b)] - **(SEMVER-MAJOR)** **src**: improve performance of dotenv ToObject (James M Snell) [#60038](https://github.com/nodejs/node/pull/60038) +* \[[`075936b413`](https://github.com/nodejs/node/commit/075936b413)] - **(SEMVER-MAJOR)** **src**: use std::string\_view from node\_report (iknoom) [#60006](https://github.com/nodejs/node/pull/60006) +* \[[`234c26cca3`](https://github.com/nodejs/node/commit/234c26cca3)] - **(SEMVER-MAJOR)** **src**: store `Local` for `CallbackScope` on stack (Anna Henningsen) [#59705](https://github.com/nodejs/node/pull/59705) +* \[[`708fd1945b`](https://github.com/nodejs/node/commit/708fd1945b)] - **(SEMVER-MAJOR)** **src**: remove node.h APIs to make callback without an async context (Chengzhong Wu) [#58471](https://github.com/nodejs/node/pull/58471) +* \[[`56989d33f5`](https://github.com/nodejs/node/commit/56989d33f5)] - **(SEMVER-MAJOR)** **src**: remove deprecated node::EmitBeforeExit and node::EmitExit (Chengzhong Wu) [#58469](https://github.com/nodejs/node/pull/58469) +* \[[`d429aa2d17`](https://github.com/nodejs/node/commit/d429aa2d17)] - **(SEMVER-MAJOR)** **src**: remove deprecated node::CreatePlatform and node::FreePlatform (Chengzhong Wu) [#58470](https://github.com/nodejs/node/pull/58470) +* \[[`e0ae14ce73`](https://github.com/nodejs/node/commit/e0ae14ce73)] - **(SEMVER-MAJOR)** **src**: remove deprecated node::InitializeNodeWithArgs (Chengzhong Wu) [#58470](https://github.com/nodejs/node/pull/58470) +* \[[`db1700e4b5`](https://github.com/nodejs/node/commit/db1700e4b5)] - **(SEMVER-MAJOR)** **src**: update NODE\_MODULE\_VERSION to 138 (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`0a87084150`](https://github.com/nodejs/node/commit/0a87084150)] - **(SEMVER-MAJOR)** **test**: update cppgc-object addon config (StefanStojanovic) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`7dd49d7da4`](https://github.com/nodejs/node/commit/7dd49d7da4)] - **(SEMVER-MAJOR)** **test**: spin longer for sequential/test-worker-prof (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`faba50df96`](https://github.com/nodejs/node/commit/faba50df96)] - **(SEMVER-MAJOR)** **test**: remove `--always-turbofan` flag (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`496f12dec6`](https://github.com/nodejs/node/commit/496f12dec6)] - **(SEMVER-MAJOR)** **test**: update snapshot for V8 14.1 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`05aa3a1c70`](https://github.com/nodejs/node/commit/05aa3a1c70)] - **(SEMVER-MAJOR)** **test,win**: split addon tests (StefanStojanovic) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`308de27255`](https://github.com/nodejs/node/commit/308de27255)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 14.0 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`b736370c07`](https://github.com/nodejs/node/commit/b736370c07)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 13.9 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`085a94ac9b`](https://github.com/nodejs/node/commit/085a94ac9b)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 13.8 (Michaël Zasso) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`a71ae18ac8`](https://github.com/nodejs/node/commit/a71ae18ac8)] - **(SEMVER-MAJOR)** **tools**: enable leaptiering for aix/ibmi (Abdirahim Musse) [#59805](https://github.com/nodejs/node/pull/59805) +* \[[`a8217a9eb8`](https://github.com/nodejs/node/commit/a8217a9eb8)] - **(SEMVER-MAJOR)** **tools**: update V8 gypfiles for 13.7 (Michaël Zasso) [#58064](https://github.com/nodejs/node/pull/58064) +* \[[`fdef0725de`](https://github.com/nodejs/node/commit/fdef0725de)] - **(SEMVER-MAJOR)** **util,console**: colorize regexp groups, character classes, etc (Ruben Bridgewater) [#59710](https://github.com/nodejs/node/pull/59710) +* \[[`411cc42d22`](https://github.com/nodejs/node/commit/411cc42d22)] - **(SEMVER-MAJOR)** **worker**: move terminate callback to end-of-life (James M Snell) [#58528](https://github.com/nodejs/node/pull/58528) + +### Semver-Minor Commits + +* \[[`94422e8a40`](https://github.com/nodejs/node/commit/94422e8a40)] - **(SEMVER-MINOR)** **src**: add an option to make compile cache portable (Aditi) [#58797](https://github.com/nodejs/node/pull/58797) +* \[[`29738c7b42`](https://github.com/nodejs/node/commit/29738c7b42)] - **(SEMVER-MINOR)** **src,permission**: add --allow-inspector ability (Rafael Gonzaga) [#59711](https://github.com/nodejs/node/pull/59711) +* \[[`f9fcc746f3`](https://github.com/nodejs/node/commit/f9fcc746f3)] - **(SEMVER-MINOR)** **v8**: add cpu profile (theanarkh) [#59807](https://github.com/nodejs/node/pull/59807) +* \[[`4396cf2d45`](https://github.com/nodejs/node/commit/4396cf2d45)] - **(SEMVER-MINOR)** **wasm**: enable JSPI (Guy Bedford) [#59941](https://github.com/nodejs/node/pull/59941) + +### Semver-Patch Commits + +* \[[`91f035e597`](https://github.com/nodejs/node/commit/91f035e597)] - **assert**: resolve TODO and rename function (Antoine du Hamel) [#59451](https://github.com/nodejs/node/pull/59451) +* \[[`2e675c4fa3`](https://github.com/nodejs/node/commit/2e675c4fa3)] - **benchmark**: use non-deprecated WriteUtf8V2 method (Michaël Zasso) [#60173](https://github.com/nodejs/node/pull/60173) +* \[[`0fb040603b`](https://github.com/nodejs/node/commit/0fb040603b)] - **build**: upgrade Python linter ruff, add rules ASYNC,PERF (Christian Clauss) [#59984](https://github.com/nodejs/node/pull/59984) +* \[[`f468b6c72b`](https://github.com/nodejs/node/commit/f468b6c72b)] - **build**: update minimum Xcode version to 16.4 (Michaël Zasso) [#60079](https://github.com/nodejs/node/pull/60079) +* \[[`0eda17ba20`](https://github.com/nodejs/node/commit/0eda17ba20)] - **build**: fix flags for ngtcp2 on IBM i (SRAVANI GUNDEPALLI) [#60073](https://github.com/nodejs/node/pull/60073) +* \[[`22a864a275`](https://github.com/nodejs/node/commit/22a864a275)] - **build**: remove corepack from release tarballs (Jordan Harband) [#59835](https://github.com/nodejs/node/pull/59835) +* \[[`7079041e0a`](https://github.com/nodejs/node/commit/7079041e0a)] - **build**: only mention Apple when on Apple (Michaël Zasso) [#59385](https://github.com/nodejs/node/pull/59385) +* \[[`954d3f44ef`](https://github.com/nodejs/node/commit/954d3f44ef)] - **build**: check Apple clang version in configure script (Michaël Zasso) [#59358](https://github.com/nodejs/node/pull/59358) +* \[[`2b4a09ef8b`](https://github.com/nodejs/node/commit/2b4a09ef8b)] - **build**: fix OpenSSL version detection (Richard Lau) [#59353](https://github.com/nodejs/node/pull/59353) +* \[[`af77e4bf2f`](https://github.com/nodejs/node/commit/af77e4bf2f)] - **build**: update macOS runner and Xcode (Michaël Zasso) [#59238](https://github.com/nodejs/node/pull/59238) +* \[[`86bfdb5528`](https://github.com/nodejs/node/commit/86bfdb5528)] - **build**: remove `nocorepack` `vcbuild` flag (Antoine du Hamel) [#57772](https://github.com/nodejs/node/pull/57772) +* \[[`b13f24c2da`](https://github.com/nodejs/node/commit/b13f24c2da)] - **build, src**: fix include paths for vtune files (Rahul) [#59999](https://github.com/nodejs/node/pull/59999) +* \[[`2216a3b1d5`](https://github.com/nodejs/node/commit/2216a3b1d5)] - **deps**: V8: cherry-pick 1e190bbb0396 (Richard Lau) [#60206](https://github.com/nodejs/node/pull/60206) +* \[[`1b22f6049a`](https://github.com/nodejs/node/commit/1b22f6049a)] - **deps**: upgrade npm to 11.6.2 (npm team) [#60168](https://github.com/nodejs/node/pull/60168) +* \[[`a1b73fe430`](https://github.com/nodejs/node/commit/a1b73fe430)] - **deps**: V8: cherry-pick 2abc61361dd4 (Richard Lau) [#60177](https://github.com/nodejs/node/pull/60177) +* \[[`4eb6e6fd79`](https://github.com/nodejs/node/commit/4eb6e6fd79)] - **deps**: V8: cherry-pick 87356585659b (Joyee Cheung) [#60069](https://github.com/nodejs/node/pull/60069) +* \[[`c0b8c80164`](https://github.com/nodejs/node/commit/c0b8c80164)] - **deps**: define V8\_PRESERVE\_MOST as no-op on Windows (Stefan Stojanovic) [#56238](https://github.com/nodejs/node/pull/56238) +* \[[`65a32bac18`](https://github.com/nodejs/node/commit/65a32bac18)] - **deps**: add ngtcp2 test binaries (James M Snell) [#59946](https://github.com/nodejs/node/pull/59946) +* \[[`ebfc28a037`](https://github.com/nodejs/node/commit/ebfc28a037)] - **deps**: update nghttp3 to 1.11.0 (James M Snell) [#59249](https://github.com/nodejs/node/pull/59249) +* \[[`dceb1fca40`](https://github.com/nodejs/node/commit/dceb1fca40)] - **deps**: update ngtcp2 to 1.14.0 (James M Snell) [#59249](https://github.com/nodejs/node/pull/59249) +* \[[`ee36b86ba3`](https://github.com/nodejs/node/commit/ee36b86ba3)] - **deps**: patch V8 to 13.7.152.19 (Node.js GitHub Bot) [#58713](https://github.com/nodejs/node/pull/58713) +* \[[`0b3fc0d7a8`](https://github.com/nodejs/node/commit/0b3fc0d7a8)] - **deps**: patch V8 to 13.7.152.14 (Node.js GitHub Bot) [#58631](https://github.com/nodejs/node/pull/58631) +* \[[`91b3bd3fe6`](https://github.com/nodejs/node/commit/91b3bd3fe6)] - **deps**: patch V8 to 13.7.152.13 (Node.js GitHub Bot) [#58539](https://github.com/nodejs/node/pull/58539) +* \[[`f77a96cd76`](https://github.com/nodejs/node/commit/f77a96cd76)] - **deps**: patch V8 to 13.7.152.10 (Node.js GitHub Bot) [#58446](https://github.com/nodejs/node/pull/58446) +* \[[`1cd16e5355`](https://github.com/nodejs/node/commit/1cd16e5355)] - **doc**: improve code snippet alternative of url.parse() using WHATWG URL (Steven) [#60209](https://github.com/nodejs/node/pull/60209) +* \[[`d54e6aec9e`](https://github.com/nodejs/node/commit/d54e6aec9e)] - **doc**: `createSQLTagStore` -> `createTagStore` (Aviv Keller) [#60182](https://github.com/nodejs/node/pull/60182) +* \[[`aef3fc37eb`](https://github.com/nodejs/node/commit/aef3fc37eb)] - **doc**: use markdown when branch-diff major release (Rafael Gonzaga) [#60179](https://github.com/nodejs/node/pull/60179) +* \[[`a2f088d516`](https://github.com/nodejs/node/commit/a2f088d516)] - **doc**: update teams in collaborator-guide.md and add links (Bart Louwers) [#60065](https://github.com/nodejs/node/pull/60065) +* \[[`75a6fff6be`](https://github.com/nodejs/node/commit/75a6fff6be)] - **doc**: disambiguate top-level `worker_threads` module exports (René) [#59890](https://github.com/nodejs/node/pull/59890) +* \[[`51df7b92bc`](https://github.com/nodejs/node/commit/51df7b92bc)] - **doc**: update macOS version used to build releases (Michaël Zasso) [#60080](https://github.com/nodejs/node/pull/60080) +* \[[`910c8796f9`](https://github.com/nodejs/node/commit/910c8796f9)] - **doc**: update BUILDING to reflect Clang 19 changes (Michaël Zasso) [#59782](https://github.com/nodejs/node/pull/59782) +* \[[`34f9b7eab9`](https://github.com/nodejs/node/commit/34f9b7eab9)] - **doc**: reserve NMV 140 for Electron 39 (David Sanders) [#59627](https://github.com/nodejs/node/pull/59627) +* \[[`3f6f6db43f`](https://github.com/nodejs/node/commit/3f6f6db43f)] - **doc**: update minimum Xcode and VS versions (Michaël Zasso) [#59358](https://github.com/nodejs/node/pull/59358) +* \[[`d9fe28bd6b`](https://github.com/nodejs/node/commit/d9fe28bd6b)] - **doc**: fix `CHANGELOG.md` version listing (Antoine du Hamel) [#59299](https://github.com/nodejs/node/pull/59299) +* \[[`0ab50c2768`](https://github.com/nodejs/node/commit/0ab50c2768)] - **doc**: reserve NMV 139 for Electron 38 (Calvin) [#58779](https://github.com/nodejs/node/pull/58779) +* \[[`516b4ebd3c`](https://github.com/nodejs/node/commit/516b4ebd3c)] - **doc**: mark Node.js 23 as End-of-Life (Antoine du Hamel) [#58563](https://github.com/nodejs/node/pull/58563) +* \[[`59b70e5fe3`](https://github.com/nodejs/node/commit/59b70e5fe3)] - **http**: fix http client leaky with double response (theanarkh) [#60062](https://github.com/nodejs/node/pull/60062) +* \[[`5cf3c3e24c`](https://github.com/nodejs/node/commit/5cf3c3e24c)] - **http2**: rename variable to additionalPseudoHeaders (Tobias Nießen) [#60208](https://github.com/nodejs/node/pull/60208) +* \[[`535efea962`](https://github.com/nodejs/node/commit/535efea962)] - **http2**: do not crash on mismatched ping buffer length (René) [#60135](https://github.com/nodejs/node/pull/60135) +* \[[`4bfa387f6d`](https://github.com/nodejs/node/commit/4bfa387f6d)] - **lib**: fix constructor in \_errnoException stack tree (SeokHun) [#60156](https://github.com/nodejs/node/pull/60156) +* \[[`4daeec11b9`](https://github.com/nodejs/node/commit/4daeec11b9)] - **lib**: fix typo in QuicSessionStats (SeokHun) [#60155](https://github.com/nodejs/node/pull/60155) +* \[[`15278252bb`](https://github.com/nodejs/node/commit/15278252bb)] - **lib**: remove redundant destroyHook checks (Gürgün Dayıoğlu) [#60120](https://github.com/nodejs/node/pull/60120) +* \[[`83052ff9ad`](https://github.com/nodejs/node/commit/83052ff9ad)] - **lib**: add `node:` prefix in sys module deprecation warning (Dario Piotrowicz) [#58442](https://github.com/nodejs/node/pull/58442) +* \[[`d5abfbf582`](https://github.com/nodejs/node/commit/d5abfbf582)] - **lib**: add module to use in module deprecation warnings (Dario Piotrowicz) [#58442](https://github.com/nodejs/node/pull/58442) +* \[[`db0121bedd`](https://github.com/nodejs/node/commit/db0121bedd)] - **module**: fix directory option in the enableCompileCache() API (Joyee Cheung) [#59931](https://github.com/nodejs/node/pull/59931) +* \[[`822a8c3244`](https://github.com/nodejs/node/commit/822a8c3244)] - **perf\_hooks**: fix stack overflow error (Antoine du Hamel) [#60084](https://github.com/nodejs/node/pull/60084) +* \[[`d52cd04591`](https://github.com/nodejs/node/commit/d52cd04591)] - **quic**: continue working on quic api bits (James M Snell) [#60123](https://github.com/nodejs/node/pull/60123) +* \[[`b4af647920`](https://github.com/nodejs/node/commit/b4af647920)] - **quic**: reduce boilerplate and other minor cleanups (James M Snell) [#59342](https://github.com/nodejs/node/pull/59342) +* \[[`cd9fd09a27`](https://github.com/nodejs/node/commit/cd9fd09a27)] - **quic**: multiple fixups and updates (James M Snell) [#59342](https://github.com/nodejs/node/pull/59342) +* \[[`a6c5d27739`](https://github.com/nodejs/node/commit/a6c5d27739)] - **quic**: update more of the quic to the new compile guard (James M Snell) [#59342](https://github.com/nodejs/node/pull/59342) +* \[[`ee7b8ab29c`](https://github.com/nodejs/node/commit/ee7b8ab29c)] - **quic**: few additional small comment edits in cid.h (James M Snell) [#59342](https://github.com/nodejs/node/pull/59342) +* \[[`c8b64bd023`](https://github.com/nodejs/node/commit/c8b64bd023)] - **quic**: fixup NO\_ERROR macro conflict on windows (James M Snell) [#59381](https://github.com/nodejs/node/pull/59381) +* \[[`e2fefd78e2`](https://github.com/nodejs/node/commit/e2fefd78e2)] - **quic**: fixup windows coverage compile error (James M Snell) [#59381](https://github.com/nodejs/node/pull/59381) +* \[[`99c80e3a45`](https://github.com/nodejs/node/commit/99c80e3a45)] - **quic**: update the guard to check openssl version (James M Snell) [#59249](https://github.com/nodejs/node/pull/59249) +* \[[`0e754fa5d1`](https://github.com/nodejs/node/commit/0e754fa5d1)] - **quic**: start re-enabling quic with openssl 3.5 (James M Snell) [#59249](https://github.com/nodejs/node/pull/59249) +* \[[`200fe9e7f4`](https://github.com/nodejs/node/commit/200fe9e7f4)] - **repl**: move completion logic to internal module (Dario Piotrowicz) [#59889](https://github.com/nodejs/node/pull/59889) +* \[[`3ac88a7a66`](https://github.com/nodejs/node/commit/3ac88a7a66)] - **src**: use string\_view in `WriteReport()` (Anna Henningsen) [#60201](https://github.com/nodejs/node/pull/60201) +* \[[`a1244f04de`](https://github.com/nodejs/node/commit/a1244f04de)] - **src**: make additional cleanups in node locks impl (James M Snell) [#60061](https://github.com/nodejs/node/pull/60061) +* \[[`fdb6e66227`](https://github.com/nodejs/node/commit/fdb6e66227)] - **src**: update locks to use DictionaryTemplate (James M Snell) [#60061](https://github.com/nodejs/node/pull/60061) +* \[[`367bcce6a6`](https://github.com/nodejs/node/commit/367bcce6a6)] - **src**: fix usage of deprecated V8 API (Michaël Zasso) [#60174](https://github.com/nodejs/node/pull/60174) +* \[[`23fa18444f`](https://github.com/nodejs/node/commit/23fa18444f)] - **src**: fix small compile warning in quic/streams.cc (James M Snell) [#60118](https://github.com/nodejs/node/pull/60118) +* \[[`0ec1d186f4`](https://github.com/nodejs/node/commit/0ec1d186f4)] - **src**: always use strong reference to `napi_async_context` resource (Anna Henningsen) [#59828](https://github.com/nodejs/node/pull/59828) +* \[[`ce748f6cae`](https://github.com/nodejs/node/commit/ce748f6cae)] - **src**: use `Global` for storing resource in Node-API callback scope (Anna Henningsen) [#59828](https://github.com/nodejs/node/pull/59828) +* \[[`36256230b4`](https://github.com/nodejs/node/commit/36256230b4)] - **src**: cleanup quic TransportParams class (James M Snell) [#59884](https://github.com/nodejs/node/pull/59884) +* \[[`985e2fb383`](https://github.com/nodejs/node/commit/985e2fb383)] - _**Revert**_ "**test**: ensure message event fires in worker message port test" (Luigi Pinca) [#60126](https://github.com/nodejs/node/pull/60126) +* \[[`da9cd745c8`](https://github.com/nodejs/node/commit/da9cd745c8)] - **test**: ensure assertions are reachable in `test/client-proxy` (Antoine du Hamel) [#60175](https://github.com/nodejs/node/pull/60175) +* \[[`e105e821e9`](https://github.com/nodejs/node/commit/e105e821e9)] - **test**: skip quic tests that IBM i does not support (SRAVANI GUNDEPALLI) [#60160](https://github.com/nodejs/node/pull/60160) +* \[[`bfc81ca228`](https://github.com/nodejs/node/commit/bfc81ca228)] - **test**: ensure assertions are reachable in `test/async-hooks` (Antoine du Hamel) [#60150](https://github.com/nodejs/node/pull/60150) +* \[[`712cee951c`](https://github.com/nodejs/node/commit/712cee951c)] - **test**: skip tests that cause timeouts on IBM i (SRAVANI GUNDEPALLI) [#60148](https://github.com/nodejs/node/pull/60148) +* \[[`f8a43f6f34`](https://github.com/nodejs/node/commit/f8a43f6f34)] - **test**: deflake test-fs-promises-watch-iterator (Luigi Pinca) [#60060](https://github.com/nodejs/node/pull/60060) +* \[[`1f95d39997`](https://github.com/nodejs/node/commit/1f95d39997)] - **test**: prepare junit file attribute normalization (sangwook) [#59432](https://github.com/nodejs/node/pull/59432) +* \[[`eb159a8cfd`](https://github.com/nodejs/node/commit/eb159a8cfd)] - **test**: remove duplicated allocUnsafeSlow test (Michaël Zasso) [#58524](https://github.com/nodejs/node/pull/58524) +* \[[`d93cff5af3`](https://github.com/nodejs/node/commit/d93cff5af3)] - _**Revert**_ "**test**: fix watch tests not including completion messages" (Joyee Cheung) [#58190](https://github.com/nodejs/node/pull/58190) +* \[[`6102159fa1`](https://github.com/nodejs/node/commit/6102159fa1)] - **test**: fix watch tests not including completion messages (Dario Piotrowicz) [#58183](https://github.com/nodejs/node/pull/58183) +* \[[`ad2c1bf62e`](https://github.com/nodejs/node/commit/ad2c1bf62e)] - **test,doc**: skip --max-old-space-size-percentage on 32-bit platforms (Asaf Federman) [#60144](https://github.com/nodejs/node/pull/60144) +* \[[`6dbf7086bb`](https://github.com/nodejs/node/commit/6dbf7086bb)] - **test\_runner**: fix suite timeout (Moshe Atlow) [#59853](https://github.com/nodejs/node/pull/59853) +* \[[`f0aa073907`](https://github.com/nodejs/node/commit/f0aa073907)] - **test\_runner**: add junit file attribute support (sangwook) [#59432](https://github.com/nodejs/node/pull/59432) +* \[[`cff138c6b1`](https://github.com/nodejs/node/commit/cff138c6b1)] - **tests**: start adding quic test server utilities (James M Snell) [#59946](https://github.com/nodejs/node/pull/59946) +* \[[`20dc4b514a`](https://github.com/nodejs/node/commit/20dc4b514a)] - **tools**: use cooldown property correctly (Rafael Gonzaga) [#60134](https://github.com/nodejs/node/pull/60134) +* \[[`ec26b1c01a`](https://github.com/nodejs/node/commit/ec26b1c01a)] - **tools**: add lint rule to ensure assertions are reached (Antoine du Hamel) [#60125](https://github.com/nodejs/node/pull/60125) +* \[[`bab752d4db`](https://github.com/nodejs/node/commit/bab752d4db)] - **typings**: add buffer internalBinding typing (방진혁) [#60163](https://github.com/nodejs/node/pull/60163) +* \[[`1986ee4b65`](https://github.com/nodejs/node/commit/1986ee4b65)] - **vm**: hint module identifier in instantiate errors (Chengzhong Wu) [#60199](https://github.com/nodejs/node/pull/60199) +* \[[`23b834058c`](https://github.com/nodejs/node/commit/23b834058c)] - **wasm**: revert enable JSPI as already enabled (Guy Bedford) [#60014](https://github.com/nodejs/node/pull/60014) +* \[[`4bfcad1ac5`](https://github.com/nodejs/node/commit/4bfcad1ac5)] - _**Revert**_ "**watch**: fix watch args not being properly filtered" (Joyee Cheung) [#58190](https://github.com/nodejs/node/pull/58190) +* \[[`4acb854039`](https://github.com/nodejs/node/commit/4acb854039)] - **watch**: fix watch args not being properly filtered (Dario Piotrowicz) [#57936](https://github.com/nodejs/node/pull/57936) diff --git a/doc/changelogs/CHANGELOG_V4.md b/doc/changelogs/CHANGELOG_V4.md index fdf3164eae71bc..352466099270ce 100644 --- a/doc/changelogs/CHANGELOG_V4.md +++ b/doc/changelogs/CHANGELOG_V4.md @@ -56,6 +56,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V5.md b/doc/changelogs/CHANGELOG_V5.md index 42b4ffa214d8c9..13246aea265a5b 100644 --- a/doc/changelogs/CHANGELOG_V5.md +++ b/doc/changelogs/CHANGELOG_V5.md @@ -32,6 +32,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V6.md b/doc/changelogs/CHANGELOG_V6.md index 647f976f3b6576..155654b659f68c 100644 --- a/doc/changelogs/CHANGELOG_V6.md +++ b/doc/changelogs/CHANGELOG_V6.md @@ -61,6 +61,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V7.md b/doc/changelogs/CHANGELOG_V7.md index 197f95ff2a5ef1..fe5768c3d4b0ac 100644 --- a/doc/changelogs/CHANGELOG_V7.md +++ b/doc/changelogs/CHANGELOG_V7.md @@ -30,6 +30,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V8.md b/doc/changelogs/CHANGELOG_V8.md index 9bd41fc9114da8..b7d8d5ac68675a 100644 --- a/doc/changelogs/CHANGELOG_V8.md +++ b/doc/changelogs/CHANGELOG_V8.md @@ -52,6 +52,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/changelogs/CHANGELOG_V9.md b/doc/changelogs/CHANGELOG_V9.md index 7c11218d523c82..30f69f96ccc687 100644 --- a/doc/changelogs/CHANGELOG_V9.md +++ b/doc/changelogs/CHANGELOG_V9.md @@ -31,6 +31,7 @@ * Other Versions + * [25.x](CHANGELOG_V25.md) * [24.x](CHANGELOG_V24.md) * [23.x](CHANGELOG_V23.md) * [22.x](CHANGELOG_V22.md) diff --git a/doc/contributing/advocacy-ambassador-program.md b/doc/contributing/advocacy-ambassador-program.md index f58e77fc4c426d..6275003c82512d 100644 --- a/doc/contributing/advocacy-ambassador-program.md +++ b/doc/contributing/advocacy-ambassador-program.md @@ -226,7 +226,7 @@ You can find their contact email in the [`README.md`](../../README.md#tsc-techni ##### Goal -The goal is to raise awareness of the Node.js TypeScript Type Stripping in the JavaScript ecosystem. +The goal is to raise awareness of the Node.js TypeScript Type stripping in the JavaScript ecosystem. Some of the things to highlight include: * The benefits and limitations of the current implementation. @@ -271,7 +271,7 @@ with projects learning from one another and their users. | [reading environment](https://nodejs.org/api/cli.html#--env-filefile) | [20.6.0](https://nodejs.org/en/blog/release/v20.6.0) | Active Development | | [styling output](https://nodejs.org/docs/latest-v22.x/api/util.html#utilstyletextformat-text-options) | [20.12.0](https://nodejs.org/en/blog/release/v20.12.0) | Stable, as of [22.13.0](https://github.com/nodejs/node/pull/56329) | | [run scripts](https://nodejs.org/docs/latest/api/cli.html#--run) | [22.0.0](https://nodejs.org/en/blog/release/v22.0.0) | Stable, as of 22.0.0 | -| [run TypeScript](https://nodejs.org/api/cli.html#--experimental-strip-types) | [22.6.0](https://nodejs.org/en/blog/release/v22.6.0) | Active Development | +| [run TypeScript](https://nodejs.org/api/cli.html#--strip-types) | [22.6.0](https://nodejs.org/en/blog/release/v22.6.0) | Stable, as of REPLACEME | ##### Related Links @@ -284,7 +284,7 @@ with projects learning from one another and their users. * * * -* +* diff --git a/doc/contributing/releases.md b/doc/contributing/releases.md index d90d2eee6e735b..05bdb40515fd9d 100644 --- a/doc/contributing/releases.md +++ b/doc/contributing/releases.md @@ -30,8 +30,8 @@ official release builds for Node.js, hosted on . * [14. Push the release tag](#14-push-the-release-tag) * [15. Promote and sign the release builds](#15-promote-and-sign-the-release-builds) * [16. Check the release](#16-check-the-release) - * [17. Create a blog post](#17-create-a-blog-post) - * [18. Create the release on GitHub](#18-create-the-release-on-github) + * [17. Create the release on GitHub](#17-create-the-release-on-github) + * [18. Create a blog post](#18-create-a-blog-post) * [19. Announce](#19-announce) * [20. Celebrate](#20-celebrate) * [LTS releases](#lts-releases) @@ -1069,21 +1069,31 @@ have the right internal version strings. Check that the API docs are available at . Check that the release catalog files are correct at and . -### 17. Create a blog post +### 17. Create the release on GitHub + +* Go to the [New release page](https://github.com/nodejs/node/releases/new). +* Select the tag version you pushed earlier. +* For release title, copy the title from the changelog. +* For the description, copy the rest of the changelog entry. +* If you are not releasing the latest "Current", uncheck + "Set as the latest release". +* Click on the "Publish release" button. + +### 18. Create a blog post There is an automatic build that is kicked off when you promote new builds, so within a few minutes nodejs.org will be listing your new version as the latest -release. However, the blog post is not yet fully automatic. +release, and a blog post draft PR will be created. -Create a new blog post by running the [nodejs.org release-post.js script][]: +In the event that a draft PR _is not created_, the [`scripts:release-post`][] script +can be used as an alternative: ```bash -node ./apps/site/scripts/release-post/index.mjs x.y.z +# In the apps/site folder of nodejs/nodejs.org +node --run scripts:release-post x.y.z ``` -This script will use the promoted builds and changelog to generate the post. Run -`npm run serve` to preview the post locally before pushing to the -[nodejs.org repository][]. +This script will use the promoted builds and changelog to generate the post. * You can add a short blurb just under the main heading if you want to say something important, otherwise the text should be publication ready. @@ -1098,33 +1108,13 @@ This script will use the promoted builds and changelog to generate the post. Run to reflect those changes. * Always use pull-requests on the [nodejs.org repository][]. Be respectful - of the website team, but you do not have to wait for PR sign-off. Please - use the following commit message format: - - ```console - Blog: vX.Y.Z release post - - Refs: - ``` - -* In order to trigger the CI Checks of the [nodejs.org repository][]; Please - attach the `github_actions:pull-request` label to the PR. + of the website team, but you do not have to wait for PR sign-off. * Changes to the base branch, `main`, on the [nodejs.org repository][] will trigger a new build of nodejs.org, so your changes should appear a few minutes after pushing. You can follow the [Deployments](https://github.com/nodejs/nodejs.org/deployments) page to see when the build finishes and gets published. -### 18. Create the release on GitHub - -* Go to the [New release page](https://github.com/nodejs/node/releases/new). -* Select the tag version you pushed earlier. -* For release title, copy the title from the changelog. -* For the description, copy the rest of the changelog entry. -* If you are not releasing the latest "Current", uncheck - "Set as the latest release". -* Click on the "Publish release" button. - ### 19. Announce The nodejs.org website will automatically rebuild and include the new version. @@ -1491,7 +1481,7 @@ Typical resolution: sign the release again. [Node.js Snap management repository]: https://github.com/nodejs/snap [Snap]: https://snapcraft.io/node [`create-release-proposal`]: https://github.com/nodejs/node/actions/workflows/create-release-proposal.yml +[`scripts:release-post`]: https://github.com/nodejs/nodejs.org/blob/HEAD/apps/site/scripts/release-post/index.mjs [build-infra team]: https://github.com/orgs/nodejs/teams/build-infra [expected assets]: https://github.com/nodejs/build/tree/HEAD/ansible/www-standalone/tools/promote/expected_assets -[nodejs.org release-post.js script]: https://github.com/nodejs/nodejs.org/blob/HEAD/apps/site/scripts/release-post/index.mjs [nodejs.org repository]: https://github.com/nodejs/nodejs.org diff --git a/doc/contributing/using-devcontainer.md b/doc/contributing/using-devcontainer.md new file mode 100644 index 00000000000000..37f4771489a114 --- /dev/null +++ b/doc/contributing/using-devcontainer.md @@ -0,0 +1,131 @@ +# Developing Node.js using Dev Containers + +Node.js publishes a [nightly image on DockerHub](https://hub.docker.com/r/nodejs/devcontainer) for +[Dev Containers](https://containers.dev/) that can be used to spin up a +development container that comes with pre-installed build dependencies and pre-genreated build cache. + +When you need to test a few changes in the main branch and do not need +to change the V8 headers (which is rare), using the nightly image will allow you to compile your +changes from a fresh checkout quickly without having to compile the entire codebase, especially V8, +from scratch. + +The Dev Container also allows you to test your changes in a different operating system, and to test +third-party code from bug reports safely with your work-in-progress Node.js branches in an isolated environment. + +There are many command line tools, IDEs and services that [support Dev Containers](https://containers.dev/supporting). +Among them, [Visual Studio Code (VS Code)](https://code.visualstudio.com/) is a very popuplar option. +This guide will walk you through the steps to set up a Dev Container for Node.js development using VS Code. +You should be able to use the same [`nodejs/devcontainer:nightly` image](https://hub.docker.com/r/nodejs/devcontainer) +in other tools and services using generally similar steps. + +## Prerequisites + +Before you begin, ensure you have the following installed on your machine: + +* [Docker](https://www.docker.com/get-started) +* [Visual Studio Code](https://code.visualstudio.com/) +* [Dev Containers extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +## Setting Up the Dev Container + +### 1. Clone the Node.js Repository + +If you haven't already, clone the Node.js repository to your local machine. + +```bash +git clone https://github.com/nodejs/node.git +``` + +Or follow [this guide](./pull-requests.md#setting-up-your-local-environment) if you are +setting up the git repository to contribute changes as pull requests. + +### 2. Open the Repository in VS Code + +Launch VS Code and open the cloned Node.js repository. + +### 3. Start the Dev Container + +* Press `Ctrl+Shift+P` or `Cmd+Shift+P` to open the command palette. +* Type `Dev Containers: Reopen in Container` and select it. +* Select the appropriate Dev Container configuration from the drop down. The base configuration in this + repository is `Node.js Dev Container` located in + [`.devcontainer/base/devcontainer.json`](../../.devcontainer/base/devcontainer.json), which should be + automatically detected by VS Code. + +### 4. Wait for the Container to Build + +VS Code will build the Dev Container based on the configuration file. This may take some time depending +on your internet connection and system performance. + +After the Dev Container is built, it will start automatically. By default it will run `git restore-mtime` to +restore the modification times of the files in the working directory, in order to keep the build cache valid, +and you will see something like this in the terminal. + +```text +Running the postCreateCommand from devcontainer.json... + +[10136 ms] Start: Run in container: /bin/sh -c git restore-mtime +``` + +This may take a few seconds. Wait until it finishes before you open a new terminal. + +### 5. Build your changes + +Once the Dev Container is running, you can open a terminal in VS Code and run the build commands. By default, +your local repository is mounted inside a checkout in the Dev Container, so any changes you make will be reflected +in the container environment. + +In the Dev Container, the necessary dependencies are already installed and Node.js has already been +compiled, so a usable cache will exist. For better developer experience, the +build tool used in the Dev Container is `ninja`, instead of `make`. See +[Building Node.js with Ninja](./building-node-with-ninja.md) for more details on using `ninja` to build Node.js. + +```bash +./configure --ninja +ninja -C out/Release +``` + +As long as your local checkout is not too different from the main branch in the nightly image, the build +should be incremental and fast. + +### 6. Leaving the Container + +When you're done working in the Dev Container, open the command palette again and select +`Dev Containers: Reopen Folder locally` to go back to your local development environment. + +## Customizing the Dev Container + +The default configuration is located in +[`.devcontainer/base/devcontainer.json`](../../.devcontainer/base/devcontainer.json) which pairs with the +official [Node.js Nightly Dev Container image](https://github.com/nodejs/devcontainer). +This is tracked in version control. You can create a personal configuration by creating a new +directory in `.devcontainer/` and adding a `devcontainer.json` file there (for example, +`.devcontainer/local/devcontainer.json`), and configure VS Code to use it. + +## Rebuilding the Dev Container + +Docker will cache the already downloaded Dev Container images. If you wish to pull a new nightly image, you can do +so by running the following command in the terminal on your host machine: + +```bash +docker pull nodejs/devcontainer:nightly +``` + +The default configuration creates a volume to cache the build outputs between Dev Container restarts. If you wish to +clear the build cache, you can do so by deleting the volume named `node-devcontainer-cache`. + +```bash +docker volume rm node-devcontainer-cache +``` + +To rebuild the Dev Container in VS Code, open the command palette and select +`Dev Containers: Rebuild and Reopen in Container`. + +## Further Reading + +* If you want to propose changes to the official Node.js Nightly Dev Container image, feedback is welcome at + [nodejs/devcontainer](https://github.com/nodejs/devcontainer). There, you can find the Dockerfile and + automated nightly workflows. +* [Visual Studio Code Dev Containers Documentation](https://code.visualstudio.com/docs/remote/containers) +* [GitHub's Introduction to Dev Containers](https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers) +* [The Dev Containers Specification](https://containers.dev/implementors/spec/) diff --git a/doc/contributing/writing-and-running-benchmarks.md b/doc/contributing/writing-and-running-benchmarks.md index a60a06b695f242..ce95fc504e78c1 100644 --- a/doc/contributing/writing-and-running-benchmarks.md +++ b/doc/contributing/writing-and-running-benchmarks.md @@ -26,6 +26,10 @@ Basic Unix tools are required for some benchmarks. [Git for Windows][git-for-windows] includes Git Bash and the necessary tools, which need to be included in the global Windows `PATH`. +If you are using Nix, all the required tools are already listed in the +`benchmarkTools` argument of the `shell.nix` file, so you can skip those +prerequesites. + ### HTTP benchmark requirements Most of the HTTP benchmarks require a benchmarker to be installed. This can be @@ -587,6 +591,32 @@ The arguments of `createBenchmark` are: containing a combination of benchmark parameters. It should return `true` or `false` to indicate whether the combination should be included or not. + * `setup` {Function} A function that will be run once in the root process + before the benchmark combinations are executed in child processes. + It can be used to setup any global state required by the benchmark. Note + that the JavaScript heap state will not be shared with the benchmark processes, + so don't try to access any variables created in the `setup` function from + the `main` function, for example. + The argument passed into it is an array of all the combinations of + configurations that will be executed. + If tear down is necessary, register a listener for the `exit` event on + `process` inside the `setup` function. In the example below, that's done + by `tmpdir.refresh()`. + + ```js + const tmpdir = require('../../test/common/tmpdir'); + const bench = common.createBenchmark(main, { + type: ['fast', 'slow'], + n: [1e4], + }, { + setup(configs) { + tmpdir.refresh(); + const maxN = configs.reduce((max, c) => Math.max(max, c.n), 0); + setupFixturesReusedForAllBenchmarks(maxN); + }, + }); + ``` + `createBenchmark` returns a `bench` object, which is used for timing the runtime of the benchmark. Run `bench.start()` after the initialization and `bench.end(n)` when the benchmark is done. `n` is the number of operations diff --git a/doc/contributing/writing-tests.md b/doc/contributing/writing-tests.md index 7830bb3847184a..eb4e91b491eb9a 100644 --- a/doc/contributing/writing-tests.md +++ b/doc/contributing/writing-tests.md @@ -485,6 +485,11 @@ To generate a test coverage report, see the Nightly coverage reports for the Node.js `main` branch are available at . +## Running tests + +See the [Building guide](../../BUILDING.md#running-tests) for details on how to +run tests. + [ASCII]: https://man7.org/linux/man-pages/man7/ascii.7.html [Google Test]: https://github.com/google/googletest [Test Coverage section of the Building guide]: https://github.com/nodejs/node/blob/HEAD/BUILDING.md#running-coverage diff --git a/doc/node-config-schema.json b/doc/node-config-schema.json index 99c031199fbc1e..893f55d9251ca4 100644 --- a/doc/node-config-schema.json +++ b/doc/node-config-schema.json @@ -177,9 +177,6 @@ "experimental-sqlite": { "type": "boolean" }, - "experimental-strip-types": { - "type": "boolean" - }, "experimental-transform-types": { "type": "boolean" }, @@ -361,6 +358,9 @@ "stack-trace-limit": { "type": "number" }, + "strip-types": { + "type": "boolean" + }, "test-coverage-branches": { "type": "number" }, @@ -734,6 +734,35 @@ "type": "boolean" } } + }, + "watch": { + "type": "object", + "additionalProperties": false, + "properties": { + "watch": { + "type": "boolean" + }, + "watch-kill-signal": { + "type": "string" + }, + "watch-path": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "minItems": 1 + }, + "type": "array" + } + ] + }, + "watch-preserve-output": { + "type": "boolean" + } + } } }, "type": "object" diff --git a/doc/node.1 b/doc/node.1 index ba9af3ac6a2f31..540ce661a0d182 100644 --- a/doc/node.1 +++ b/doc/node.1 @@ -207,8 +207,8 @@ Enable experimental support for the EventSource Web API. .It Fl -no-experimental-websocket Disable experimental support for the WebSocket API. . -.It Fl -no-webstorage -Disable webstorage. +.It Fl -no-experimental-webstorage +Disable experimental support for the Web Storage API. . .It Fl -no-experimental-repl-await Disable top-level await keyword support in REPL. @@ -216,8 +216,8 @@ Disable top-level await keyword support in REPL. .It Fl -no-experimental-sqlite Disable the experimental node:sqlite module. . -.It Fl -no-experimental-strip-types -Disable experimental type-stripping for TypeScript files. +.It Fl -no-strip-types +Disable type-stripping for TypeScript files. . .It Fl -experimental-vm-modules Enable experimental ES module support in VM module. diff --git a/glossary.md b/glossary.md index 04de044f81a10f..451fdc13ca37c2 100644 --- a/glossary.md +++ b/glossary.md @@ -8,6 +8,10 @@ This file documents various terms and definitions used throughout the Node.js co * **API**: [Application Programming Interface][] - A set of rules and protocols that allows different software applications to communicate with each other. APIs are used to enable integration between different systems. * **ASAP**: As Soon As Possible. +* **ASLR**: Address Space Layout Randomization. A security technique that randomizes memory addresses + to prevent certain attacks. +* **Backport**: The process of applying a fix or feature from a newer branch to an older supported + branch (e.g., applying a security fix to an LTS release). * **BE**: Big [Endian][] - A Byte Order where the largest bit comes first. The opposite of **LE**. * **Bootstrap**: Early phase in the Node.js process startup - sets up the execution environment and loads internal modules. @@ -73,9 +77,9 @@ This file documents various terms and definitions used throughout the Node.js co contain data and code to manipulate that data. OOP languages include features such as encapsulation, inheritance, and polymorphism. * **PPC**: [PowerPC][] - A type of microprocessor architecture. -* **PTAL**: Please Take A Look. * **Primordials**: Pristine built-ins in JavaScript that are not affected by prototype pollution. * **Prototype Pollution**: Process in which a user mutating object prototypes affects other code. +* **PTAL**: Please Take A Look. * **RAII**: [Resource Acquisition Is Initialization][] - Programming idiom used to manage resources in C++. * **REPL**: [Read Evaluate Print Loop][] - Environment for interactive programming. * **RFC**: [Request For Comments][] - A Document used in standardization processes. diff --git a/lib/_http_incoming.js b/lib/_http_incoming.js index c3e901e53e8b90..6cda3a84cee065 100644 --- a/lib/_http_incoming.js +++ b/lib/_http_incoming.js @@ -423,6 +423,15 @@ function _addHeaderLineDistinct(field, value, dest) { } } +IncomingMessage.prototype._dumpAndCloseReadable = function _dumpAndCloseReadable() { + this._dumped = true; + this._readableState.ended = true; + this._readableState.endEmitted = true; + this._readableState.destroyed = true; + this._readableState.closed = true; + this._readableState.closeEmitted = true; +}; + // Call this instead of resume() if we want to just // dump all the data to /dev/null diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index fdd0f2f77eaac3..24aae1caca69d3 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -673,20 +673,22 @@ OutgoingMessage.prototype.setHeaders = function setHeaders(headers) { // We also cannot safely split by comma. // To avoid setHeader overwriting the previous value we push // set-cookie values in array and set them all at once. - const cookies = []; + let cookies = null; for (const { 0: key, 1: value } of headers) { if (key === 'set-cookie') { if (ArrayIsArray(value)) { + cookies ??= []; cookies.push(...value); } else { + cookies ??= []; cookies.push(value); } continue; } this.setHeader(key, value); } - if (cookies.length) { + if (cookies != null) { this.setHeader('set-cookie', cookies); } diff --git a/lib/_http_server.js b/lib/_http_server.js index f2817742aead4e..7a0f6447e20751 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -107,6 +107,8 @@ const onResponseFinishChannel = dc.channel('http.server.response.finish'); const kServerResponse = Symbol('ServerResponse'); const kServerResponseStatistics = Symbol('ServerResponseStatistics'); +const kOptimizeEmptyRequests = Symbol('OptimizeEmptyRequestsOption'); + const { hasObserver, startPerf, @@ -455,6 +457,11 @@ function storeHTTPOptions(options) { validateInteger(maxHeaderSize, 'maxHeaderSize', 0); this.maxHeaderSize = maxHeaderSize; + const optimizeEmptyRequests = options.optimizeEmptyRequests; + if (optimizeEmptyRequests !== undefined) + validateBoolean(optimizeEmptyRequests, 'options.optimizeEmptyRequests'); + this[kOptimizeEmptyRequests] = optimizeEmptyRequests || false; + const insecureHTTPParser = options.insecureHTTPParser; if (insecureHTTPParser !== undefined) validateBoolean(insecureHTTPParser, 'options.insecureHTTPParser'); @@ -1069,6 +1076,10 @@ function emitCloseNT(self) { } } +function hasBodyHeaders(headers) { + return ('content-length' in headers) || ('transfer-encoding' in headers); +} + // The following callback is issued after the headers have been read on a // new message. In this callback we setup the response object and pass it // to the user. @@ -1120,6 +1131,19 @@ function parserOnIncoming(server, socket, state, req, keepAlive) { }); } + // Check if we should optimize empty requests (those without Content-Length or Transfer-Encoding headers) + const shouldOptimize = server[kOptimizeEmptyRequests] === true && !hasBodyHeaders(req.headers); + + if (shouldOptimize) { + // Fast processing where emitting 'data', 'end' and 'close' events is + // skipped and data is dumped. + // This avoids a lot of unnecessary overhead otherwise introduced by + // stream.Readable life cycle rules. The downside is that this will + // break some servers that read bodies for methods that don't have body headers. + req._dumpAndCloseReadable(); + req._read(); + } + if (socket._httpMessage) { // There are already pending outgoing res, append. state.outgoing.push(res); diff --git a/lib/buffer.js b/lib/buffer.js index c9f45d333886d3..d7d10007070e2c 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -240,7 +240,7 @@ function copyImpl(source, target, targetStart, sourceStart, sourceEnd) { return _copyActual(source, target, targetStart, sourceStart, sourceEnd); } -function _copyActual(source, target, targetStart, sourceStart, sourceEnd) { +function _copyActual(source, target, targetStart, sourceStart, sourceEnd, isUint8Copy = false) { if (sourceEnd - sourceStart > target.byteLength - targetStart) sourceEnd = sourceStart + target.byteLength - targetStart; @@ -252,7 +252,11 @@ function _copyActual(source, target, targetStart, sourceStart, sourceEnd) { if (nb <= 0) return 0; - _copy(source, target, targetStart, sourceStart, nb); + if (sourceStart === 0 && nb === sourceLen && (isUint8Copy || isUint8Array(target))) { + TypedArrayPrototypeSet(target, source, targetStart); + } else { + _copy(source, target, targetStart, sourceStart, nb); + } return nb; } @@ -600,7 +604,7 @@ Buffer.concat = function concat(list, length) { throw new ERR_INVALID_ARG_TYPE( `list[${i}]`, ['Buffer', 'Uint8Array'], list[i]); } - pos += _copyActual(buf, buffer, pos, 0, buf.length); + pos += _copyActual(buf, buffer, pos, 0, buf.length, true); } // Note: `length` is always equal to `buffer.length` at this point diff --git a/lib/eslint.config_partial.mjs b/lib/eslint.config_partial.mjs index 305b2b365a6bf6..b919708a978ed6 100644 --- a/lib/eslint.config_partial.mjs +++ b/lib/eslint.config_partial.mjs @@ -225,10 +225,10 @@ export default [ message: 'Use `const { ShadowRealm } = globalThis;` instead of the global.', }, // SharedArrayBuffer is not available in primordials because it can be - // disabled with --no-harmony-sharedarraybuffer CLI flag. + // disabled with --enable-sharedarraybuffer-per-context CLI flag. { name: 'SharedArrayBuffer', - message: 'Use `const { SharedArrayBuffer } = globalThis;` instead of the global.', + message: "Use `const { constructSharedArrayBuffer } = require('internal/util');` instead of the global.", }, { name: 'TextDecoder', diff --git a/lib/internal/blob.js b/lib/internal/blob.js index 7825ea15de1e6d..46abb4f793c465 100644 --- a/lib/internal/blob.js +++ b/lib/internal/blob.js @@ -478,7 +478,7 @@ function createBlobReaderStream(reader) { // We keep reading until we either reach EOS, some error, or we // hit the flow rate of the stream (c.desiredSize). // We use set immediate here because we have to allow the event - // loop to turn in order to proecss any pending i/o. Using + // loop to turn in order to process any pending i/o. Using // queueMicrotask won't allow the event loop to turn. setImmediate(() => { if (c.desiredSize < 0) { diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 09ec85a25c1e73..1a93a560b8790d 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -334,7 +334,7 @@ ObjectDefineProperty(process.features, 'typescript', { if (kTypeStrippingMode === null) { if (getOptionValue('--experimental-transform-types')) { kTypeStrippingMode = 'transform'; - } else if (getOptionValue('--experimental-strip-types')) { + } else if (getOptionValue('--strip-types')) { kTypeStrippingMode = 'strip'; } else { kTypeStrippingMode = false; diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js index f3ed1bb7e76282..bb79678001ec66 100644 --- a/lib/internal/console/constructor.js +++ b/lib/internal/console/constructor.js @@ -190,7 +190,7 @@ ObjectDefineProperty(Console, SymbolHasInstance, { const kColorInspectOptions = { colors: true }; const kNoColorInspectOptions = {}; -const internalIndentationMap = new SafeWeakMap(); +const kGroupIndentationString = Symbol('kGroupIndentationString'); ObjectDefineProperties(Console.prototype, { [kBindStreamsEager]: { @@ -264,6 +264,11 @@ ObjectDefineProperties(Console.prototype, { ...consolePropAttributes, value: groupIndentation, }, + [kGroupIndentationString]: { + __proto__: null, + ...consolePropAttributes, + value: '', + }, [SymbolToStringTag]: { __proto__: null, writable: false, @@ -279,7 +284,7 @@ ObjectDefineProperties(Console.prototype, { ...consolePropAttributes, value: function(streamSymbol, string) { const ignoreErrors = this._ignoreErrors; - const groupIndent = internalIndentationMap.get(this) || ''; + const groupIndent = this[kGroupIndentationString]; const useStdout = streamSymbol === kUseStdout; const stream = useStdout ? this._stdout : this._stderr; @@ -342,6 +347,14 @@ ObjectDefineProperties(Console.prototype, { __proto__: null, ...consolePropAttributes, value: function(args) { + if (args.length === 1) { + // Fast path: single string, don't call format. + // Avoids ReflectApply and validation overhead. + const a0 = args[0]; + if (typeof a0 === 'string') { + return a0; + } + } const opts = this[kGetInspectOptions](this._stdout); ArrayPrototypeUnshift(args, opts); return ReflectApply(formatWithOptions, null, args); @@ -351,6 +364,14 @@ ObjectDefineProperties(Console.prototype, { __proto__: null, ...consolePropAttributes, value: function(args) { + if (args.length === 1) { + // Fast path: single string, don't call format. + // Avoids ReflectApply and validation overhead. + const a0 = args[0]; + if (typeof a0 === 'string') { + return a0; + } + } const opts = this[kGetInspectOptions](this._stderr); ArrayPrototypeUnshift(args, opts); return ReflectApply(formatWithOptions, null, args); @@ -513,21 +534,20 @@ const consoleMethods = { ReflectApply(this.log, this, data); } - let currentIndentation = internalIndentationMap.get(this) || ''; + let currentIndentation = this[kGroupIndentationString]; currentIndentation += StringPrototypeRepeat(' ', this[kGroupIndentationWidth]); - - internalIndentationMap.set(this, currentIndentation); + this[kGroupIndentationString] = currentIndentation; }, groupEnd() { - const currentIndentation = internalIndentationMap.get(this) || ''; + const currentIndentation = this[kGroupIndentationString]; const newIndentation = StringPrototypeSlice( currentIndentation, 0, currentIndentation.length - this[kGroupIndentationWidth], ); - internalIndentationMap.set(this, newIndentation); + this[kGroupIndentationString] = newIndentation; }, // https://console.spec.whatwg.org/#table diff --git a/lib/internal/crypto/sig.js b/lib/internal/crypto/sig.js index 091a3f7bdcd6e9..a5bdaaf22b5ef0 100644 --- a/lib/internal/crypto/sig.js +++ b/lib/internal/crypto/sig.js @@ -50,6 +50,8 @@ const { isArrayBufferView, } = require('internal/util/types'); +const constants = internalBinding('constants').crypto; + function Sign(algorithm, options) { if (!(this instanceof Sign)) return new Sign(algorithm, options); @@ -85,7 +87,11 @@ function getPadding(options) { } function getSaltLength(options) { - return getIntOption('saltLength', options); + let saltLength = getIntOption('saltLength', options); + if (options.padding === constants.RSA_PKCS1_PSS_PADDING && saltLength === undefined) { + saltLength = constants.RSA_PSS_SALTLEN_MAX_SIGN; + } + return saltLength; } function getDSASignatureEncoding(options) { diff --git a/lib/internal/debugger/inspect_client.js b/lib/internal/debugger/inspect_client.js index 315617bf08a800..264e2743383972 100644 --- a/lib/internal/debugger/inspect_client.js +++ b/lib/internal/debugger/inspect_client.js @@ -13,7 +13,7 @@ const { const Buffer = require('buffer').Buffer; const crypto = require('crypto'); const { ERR_DEBUGGER_ERROR } = require('internal/errors').codes; -const { EventEmitter } = require('events'); +const { EventEmitter, once } = require('events'); const http = require('http'); const { URL } = require('internal/url'); @@ -343,13 +343,10 @@ class Client extends EventEmitter { this.emit('ready'); }; - return new Promise((resolve, reject) => { - this.once('error', reject); - this.once('ready', resolve); - - httpReq.on('upgrade', handshakeListener); - httpReq.end(); - }); + const onReady = once(this, 'ready'); + httpReq.on('upgrade', handshakeListener); + httpReq.end(); + return onReady; } } diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 23a54754e2a321..5fa4437b09e556 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -1137,6 +1137,8 @@ E('ERR_AMBIGUOUS_ARGUMENT', 'The "%s" argument is ambiguous. %s', TypeError); E('ERR_ARG_NOT_ITERABLE', '%s must be iterable', TypeError); E('ERR_ASSERTION', '%s', Error); E('ERR_ASYNC_CALLBACK', '%s must be a function', TypeError); +E('ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED', + 'Async loader request never settled', Error); E('ERR_ASYNC_TYPE', 'Invalid name for async "type": %s', TypeError); E('ERR_BROTLI_INVALID_PARAM', '%s is not a valid Brotli parameter', RangeError); E('ERR_BUFFER_OUT_OF_BOUNDS', diff --git a/lib/internal/http.js b/lib/internal/http.js index 9bf929f7f3360f..e664663348adc7 100644 --- a/lib/internal/http.js +++ b/lib/internal/http.js @@ -156,7 +156,7 @@ class ProxyConfig { if (entry === host || entry === hostWithPort) return false; // Matching host and host:port // Follow curl's behavior: strip leading dot before matching suffixes. - if (entry.startsWith('.')) { + if (entry[0] === '.') { const suffix = entry.substring(1); if (host.endsWith(suffix)) return false; } diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 32e02aa3f6c640..1f4ef57593fe4f 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -190,6 +190,8 @@ const dc = require('diagnostics_channel'); const onClientStreamCreatedChannel = dc.channel('http2.client.stream.created'); const onClientStreamStartChannel = dc.channel('http2.client.stream.start'); const onClientStreamErrorChannel = dc.channel('http2.client.stream.error'); +const onClientStreamBodyChunkSentChannel = dc.channel('http2.client.stream.bodyChunkSent'); +const onClientStreamBodySentChannel = dc.channel('http2.client.stream.bodySent'); const onClientStreamFinishChannel = dc.channel('http2.client.stream.finish'); const onClientStreamCloseChannel = dc.channel('http2.client.stream.close'); const onServerStreamCreatedChannel = dc.channel('http2.server.stream.created'); @@ -2300,6 +2302,15 @@ class Http2Stream extends Duplex { req = writeGeneric(this, data, encoding, writeCallback); trackWriteState(this, req.bytes); + + if (this.session[kType] === NGHTTP2_SESSION_CLIENT && onClientStreamBodyChunkSentChannel.hasSubscribers) { + onClientStreamBodyChunkSentChannel.publish({ + stream: this, + writev, + data, + encoding, + }); + } } _write(data, encoding, cb) { @@ -2317,6 +2328,10 @@ class Http2Stream extends Duplex { } debugStreamObj(this, 'shutting down writable on _final'); ReflectApply(shutdownWritable, this, [cb]); + + if (this.session[kType] === NGHTTP2_SESSION_CLIENT && onClientStreamBodySentChannel.hasSubscribers) { + onClientStreamBodySentChannel.publish({ stream: this }); + } } _read(nread) { diff --git a/lib/internal/inspector/network_http.js b/lib/internal/inspector/network_http.js index fcfac2e6394e37..8d324c8c544eea 100644 --- a/lib/internal/inspector/network_http.js +++ b/lib/internal/inspector/network_http.js @@ -17,6 +17,7 @@ const { sniffMimeType, } = require('internal/inspector/network'); const { Network } = require('inspector'); +const EventEmitter = require('events'); const kRequestUrl = Symbol('kRequestUrl'); @@ -120,6 +121,17 @@ function onClientResponseFinish({ request, response }) { }, }); + // Unlike response.on('data', ...), this does not put the stream into flowing mode. + EventEmitter.prototype.on.call(response, 'data', (chunk) => { + Network.dataReceived({ + requestId: request[kInspectorRequestId], + timestamp: getMonotonicTime(), + dataLength: chunk.byteLength, + encodedDataLength: chunk.byteLength, + data: chunk, + }); + }); + // Wait until the response body is consumed by user code. response.once('end', () => { Network.loadingFinished({ diff --git a/lib/internal/inspector/network_http2.js b/lib/internal/inspector/network_http2.js index 7b4f7675eede00..0f0751c44dd1f9 100644 --- a/lib/internal/inspector/network_http2.js +++ b/lib/internal/inspector/network_http2.js @@ -28,6 +28,8 @@ const { HTTP2_HEADER_STATUS, NGHTTP2_NO_ERROR, } = internalBinding('http2').constants; +const EventEmitter = require('events'); +const { Buffer } = require('buffer'); const kRequestUrl = Symbol('kRequestUrl'); @@ -99,6 +101,7 @@ function onClientStreamCreated({ stream, headers }) { url, method, headers: convertedHeaderObject, + hasPostData: !stream.writableEnded, }, }); } @@ -121,6 +124,66 @@ function onClientStreamError({ stream, error }) { }); } +/** + * When a chunk of the request body is being sent, cache it until `getRequestPostData` request. + * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#method-getRequestPostData + * @param {{ + * stream: import('http2').ClientHttp2Stream, + * writev: boolean, + * data: Buffer | string | Array, + * encoding: string, + * }} event + */ +function onClientStreamBodyChunkSent({ stream, writev, data, encoding }) { + if (typeof stream[kInspectorRequestId] !== 'string') { + return; + } + + let chunk; + + if (writev) { + if (data.allBuffers) { + chunk = Buffer.concat(data); + } else { + const buffers = []; + for (let i = 0; i < data.length; ++i) { + if (typeof data[i].chunk === 'string') { + buffers.push(Buffer.from(data[i].chunk, data[i].encoding)); + } else { + buffers.push(data[i].chunk); + } + } + chunk = Buffer.concat(buffers); + } + } else if (typeof data === 'string') { + chunk = Buffer.from(data, encoding); + } else { + chunk = data; + } + + Network.dataSent({ + requestId: stream[kInspectorRequestId], + timestamp: getMonotonicTime(), + dataLength: chunk.byteLength, + data: chunk, + }); +} + +/** + * Mark a request body as fully sent. + * @param {{ stream: import('http2').ClientHttp2Stream }} event + */ +function onClientStreamBodySent({ stream }) { + if (typeof stream[kInspectorRequestId] !== 'string') { + return; + } + + Network.dataSent({ + requestId: stream[kInspectorRequestId], + finished: true, + }); +} + /** * When response headers are received, emit Network.responseReceived event. * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-responseReceived @@ -146,6 +209,24 @@ function onClientStreamFinish({ stream, headers }) { charset, }, }); + + // Unlike stream.on('data', ...), this does not put the stream into flowing mode. + EventEmitter.prototype.on.call(stream, 'data', (chunk) => { + /** + * When a chunk of the response body has been received, cache it until `getResponseBody` request + * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#method-getResponseBody or + * stream it with `streamResourceContent` request. + * https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-streamResourceContent + */ + + Network.dataReceived({ + requestId: stream[kInspectorRequestId], + timestamp: getMonotonicTime(), + dataLength: chunk.byteLength, + encodedDataLength: chunk.byteLength, + data: chunk, + }); + }); } /** @@ -175,4 +256,6 @@ module.exports = registerDiagnosticChannels([ ['http2.client.stream.error', onClientStreamError], ['http2.client.stream.finish', onClientStreamFinish], ['http2.client.stream.close', onClientStreamClose], + ['http2.client.stream.bodyChunkSent', onClientStreamBodyChunkSent], + ['http2.client.stream.bodySent', onClientStreamBodySent], ]); diff --git a/lib/internal/inspector/network_undici.js b/lib/internal/inspector/network_undici.js index b3f4f750d0ef19..a80af196587de4 100644 --- a/lib/internal/inspector/network_undici.js +++ b/lib/internal/inspector/network_undici.js @@ -209,23 +209,17 @@ function onClientResponseFinish({ request }) { // TODO: Move Network.webSocketCreated to the actual creation time of the WebSocket. // undici:websocket:open fires when the connection is established, but this results // in an inaccurate stack trace. -function onWebSocketOpen({ websocket }) { +function onWebSocketOpen({ websocket, handshakeResponse }) { websocket[kInspectorRequestId] = getNextRequestId(); const url = websocket.url.toString(); Network.webSocketCreated({ requestId: websocket[kInspectorRequestId], url, }); - // TODO: Use handshake response data from undici diagnostics when available. - // https://github.com/nodejs/undici/pull/4396 Network.webSocketHandshakeResponseReceived({ requestId: websocket[kInspectorRequestId], timestamp: getMonotonicTime(), - response: { - status: 101, - statusText: 'Switching Protocols', - headers: {}, - }, + response: handshakeResponse, }); } diff --git a/lib/internal/main/eval_stdin.js b/lib/internal/main/eval_stdin.js index b06bfa8c2a7640..7a972aeb9b4d00 100644 --- a/lib/internal/main/eval_stdin.js +++ b/lib/internal/main/eval_stdin.js @@ -29,7 +29,7 @@ readStdin((code) => { const print = getOptionValue('--print'); const shouldLoadESM = getOptionValue('--import').length > 0; const inputType = getOptionValue('--input-type'); - const tsEnabled = getOptionValue('--experimental-strip-types'); + const tsEnabled = getOptionValue('--strip-types'); if (inputType === 'module') { evalModuleEntryPoint(code, print); } else if (inputType === 'module-typescript' && tsEnabled) { diff --git a/lib/internal/main/eval_string.js b/lib/internal/main/eval_string.js index ee402f50fbdd2b..998c3fb4ada52d 100644 --- a/lib/internal/main/eval_string.js +++ b/lib/internal/main/eval_string.js @@ -32,7 +32,7 @@ const code = getOptionValue('--eval'); const print = getOptionValue('--print'); const shouldLoadESM = getOptionValue('--import').length > 0 || getOptionValue('--experimental-loader').length > 0; const inputType = getOptionValue('--input-type'); -const tsEnabled = getOptionValue('--experimental-strip-types'); +const tsEnabled = getOptionValue('--strip-types'); if (inputType === 'module') { evalModuleEntryPoint(code, print); } else if (inputType === 'module-typescript' && tsEnabled) { diff --git a/lib/internal/main/mksnapshot.js b/lib/internal/main/mksnapshot.js index 63df8c50087aad..b06b1a70bf4939 100644 --- a/lib/internal/main/mksnapshot.js +++ b/lib/internal/main/mksnapshot.js @@ -21,7 +21,6 @@ const { emitExperimentalWarning } = require('internal/util'); const { emitWarningSync } = require('internal/process/warning'); const { - initializeCallbacks, namespace: { addDeserializeCallback, isBuildingSnapshot, @@ -139,7 +138,6 @@ function requireForUserSnapshot(id) { function main() { prepareMainThreadExecution(false, false); - initializeCallbacks(); // In a context created for building snapshots, V8 does not install Error.stackTraceLimit and as // a result, if an error is created during the snapshot building process, error.stack would be diff --git a/lib/internal/main/watch_mode.js b/lib/internal/main/watch_mode.js index 37d126f1257b3e..225436661f5e56 100644 --- a/lib/internal/main/watch_mode.js +++ b/lib/internal/main/watch_mode.js @@ -1,6 +1,7 @@ 'use strict'; const { ArrayPrototypeForEach, + ArrayPrototypeIncludes, ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypePush, @@ -17,7 +18,7 @@ const { triggerUncaughtException, exitCodes: { kNoFailure }, } = internalBinding('errors'); -const { getOptionValue } = require('internal/options'); +const { getOptionValue, getOptionsAsFlagsFromBinding } = 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'); @@ -33,21 +34,24 @@ markBootstrapComplete(); const kKillSignal = convertToValidSignal(getOptionValue('--watch-kill-signal')); const kShouldFilterModules = getOptionValue('--watch-path').length === 0; -const kEnvFile = getOptionValue('--env-file') || getOptionValue('--env-file-if-exists'); +const kEnvFiles = [ + ...getOptionValue('--env-file'), + ...getOptionValue('--env-file-if-exists'), +]; const kWatchedPaths = ArrayPrototypeMap(getOptionValue('--watch-path'), (path) => resolve(path)); const kPreserveOutput = getOptionValue('--watch-preserve-output'); const kCommand = ArrayPrototypeSlice(process.argv, 1); const kCommandStr = inspect(ArrayPrototypeJoin(kCommand, ' ')); const argsWithoutWatchOptions = []; - -for (let i = 0; i < process.execArgv.length; i++) { - const arg = process.execArgv[i]; +const argsFromBinding = getOptionsAsFlagsFromBinding(); +for (let i = 0; i < argsFromBinding.length; i++) { + const arg = argsFromBinding[i]; if (StringPrototypeStartsWith(arg, '--watch=')) { continue; } if (arg === '--watch') { - const nextArg = process.execArgv[i + 1]; + const nextArg = argsFromBinding[i + 1]; if (nextArg && nextArg[0] !== '-') { // If `--watch` doesn't include `=` and the next // argument is not a flag then it is interpreted as @@ -66,6 +70,16 @@ for (let i = 0; i < process.execArgv.length; i++) { } continue; } + if (StringPrototypeStartsWith(arg, '--experimental-config-file')) { + if (!ArrayPrototypeIncludes(arg, '=')) { + // Skip the flag and the next argument (the config file path) + i++; + } + continue; + } + if (arg === '--experimental-default-config-file') { + continue; + } ArrayPrototypePush(argsWithoutWatchOptions, arg); } @@ -89,8 +103,8 @@ function start() { }, }); watcher.watchChildProcessModules(child); - if (kEnvFile) { - watcher.filterFile(resolve(kEnvFile)); + if (kEnvFiles.length > 0) { + ArrayPrototypeForEach(kEnvFiles, (file) => watcher.filterFile(resolve(file))); } child.once('exit', (code) => { exited = true; diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index 62dc44cf34b739..8a58dc0cba0f49 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -11,15 +11,11 @@ const { ObjectDefineProperty, PromisePrototypeThen, RegExpPrototypeExec, - SafeWeakMap, - globalThis: { - SharedArrayBuffer, - }, } = primordials; const { prepareWorkerThreadExecution, - setupUserModules, + initializeModuleLoaders, markBootstrapComplete, } = require('internal/process/pre_execution'); @@ -120,30 +116,30 @@ port.on('message', (message) => { require('internal/worker').assignEnvironmentData(environmentData); setupMainThreadPort(mainThreadPort); - if (SharedArrayBuffer !== undefined) { - // The counter is only passed to the workers created by the main thread, - // not to workers created by other workers. - let cachedCwd = ''; - let lastCounter = -1; - const originalCwd = process.cwd; - - process.cwd = function() { - const currentCounter = AtomicsLoad(cwdCounter, 0); - if (currentCounter === lastCounter) - return cachedCwd; - lastCounter = currentCounter; - cachedCwd = originalCwd(); + // The counter is only passed to the workers created by the main thread, + // not to workers created by other workers. + let cachedCwd = ''; + let lastCounter = -1; + const originalCwd = process.cwd; + + process.cwd = function() { + const currentCounter = AtomicsLoad(cwdCounter, 0); + if (currentCounter === lastCounter) return cachedCwd; - }; - workerIo.sharedCwdCounter = cwdCounter; + lastCounter = currentCounter; + cachedCwd = originalCwd(); + return cachedCwd; + }; + workerIo.sharedCwdCounter = cwdCounter; + + const isLoaderHookWorker = (filename === 'internal/modules/esm/worker' && doEval === 'internal'); + if (!isLoaderHookWorker) { + // If we are in the loader hook worker, delay the module loader initializations until + // initializeAsyncLoaderHooksOnLoaderHookWorker() which needs to run preloads + // after the asynchronous loader hooks are registered. + initializeModuleLoaders({ shouldSpawnLoaderHookWorker: true, shouldPreloadModules: true }); } - const isLoaderWorker = - doEval === 'internal' && - filename === require('internal/modules/esm/utils').loaderWorkerId; - // Disable custom loaders in loader worker. - setupUserModules(isLoaderWorker); - if (!hasStdin) process.stdin.push(null); @@ -152,9 +148,10 @@ port.on('message', (message) => { port.postMessage({ type: UP_AND_RUNNING }); switch (doEval) { case 'internal': { - // Create this WeakMap in js-land because V8 has no C++ API for WeakMap. - internalBinding('module_wrap').callbackMap = new SafeWeakMap(); - require(filename)(workerData, publicPort); + // Currently the only user of internal eval is the async loader hook thread. + assert(isLoaderHookWorker, `Unexpected internal eval ${filename}`); + const setupModuleWorker = require('internal/modules/esm/worker'); + setupModuleWorker(workerData, publicPort); break; } @@ -169,7 +166,7 @@ port.on('message', (message) => { value: filename, }); ArrayPrototypeSplice(process.argv, 1, 0, name); - const tsEnabled = getOptionValue('--experimental-strip-types'); + const tsEnabled = getOptionValue('--strip-types'); const inputType = getOptionValue('--input-type'); if (inputType === 'module-typescript' && tsEnabled) { diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 57470fb90dd907..b8aac380da7974 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -177,6 +177,7 @@ const { registerHooks, resolveHooks, resolveWithHooks, + validateLoadStrict, } = require('internal/modules/customization_hooks'); const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); const packageJsonReader = require('internal/modules/package_json_reader'); @@ -1175,7 +1176,7 @@ function loadBuiltinWithHooks(id, url, format) { url ??= `node:${id}`; // TODO(joyeecheung): do we really want to invoke the load hook for the builtins? const loadResult = loadWithHooks(url, format || 'builtin', /* importAttributes */ undefined, - getCjsConditionsArray(), getDefaultLoad(url, id)); + getCjsConditionsArray(), getDefaultLoad(url, id), validateLoadStrict); if (loadResult.format && loadResult.format !== 'builtin') { return undefined; // Format has been overridden, return undefined for the caller to continue loading. } @@ -1791,10 +1792,9 @@ function loadSource(mod, filename, formatFromNode) { mod[kURL] = convertCJSFilenameToURL(filename); } + const defaultLoad = getDefaultLoad(mod[kURL], filename); const loadResult = loadWithHooks(mod[kURL], mod[kFormat], /* importAttributes */ undefined, - getCjsConditionsArray(), - getDefaultLoad(mod[kURL], filename)); - + getCjsConditionsArray(), defaultLoad, validateLoadStrict); // Reset the module properties with load hook results. if (loadResult.format !== undefined) { mod[kFormat] = loadResult.format; @@ -1856,7 +1856,7 @@ function getRequireESMError(mod, pkg, content, filename) { */ Module._extensions['.js'] = function(module, filename) { let format, pkg; - const tsEnabled = getOptionValue('--experimental-strip-types'); + const tsEnabled = getOptionValue('--strip-types'); if (StringPrototypeEndsWith(filename, '.cjs')) { format = 'commonjs'; } else if (StringPrototypeEndsWith(filename, '.mjs')) { diff --git a/lib/internal/modules/customization_hooks.js b/lib/internal/modules/customization_hooks.js index 580fc05467cd4f..c2579269ec6396 100644 --- a/lib/internal/modules/customization_hooks.js +++ b/lib/internal/modules/customization_hooks.js @@ -262,13 +262,25 @@ function validateResolve(specifier, context, result) { */ /** - * Validate the result returned by a chain of resolve hook. + * Validate the result returned by a chain of load hook. * @param {string} url URL passed into the hooks. * @param {ModuleLoadContext} context Context passed into the hooks. * @param {ModuleLoadResult} result Result produced by load hooks. * @returns {ModuleLoadResult} */ -function validateLoad(url, context, result) { +function validateLoadStrict(url, context, result) { + validateSourceStrict(url, context, result); + validateFormat(url, context, result); + return result; +} + +function validateLoadSloppy(url, context, result) { + validateSourcePermissive(url, context, result); + validateFormat(url, context, result); + return result; +} + +function validateSourceStrict(url, context, result) { const { source, format } = result; // To align with module.register(), the load hooks are still invoked for // the builtins even though the default load step only provides null as source, @@ -276,7 +288,8 @@ function validateLoad(url, context, result) { if (!StringPrototypeStartsWith(url, 'node:') && typeof result.source !== 'string' && !isAnyArrayBuffer(source) && - !isArrayBufferView(source)) { + !isArrayBufferView(source) && + format !== 'addon') { throw new ERR_INVALID_RETURN_PROPERTY_VALUE( 'a string, an ArrayBuffer, or a TypedArray', 'load', @@ -284,7 +297,21 @@ function validateLoad(url, context, result) { source, ); } +} +function validateSourcePermissive(url, context, result) { + const { source, format } = result; + if (format === 'commonjs' && source == null) { + // Accommodate the quirk in defaultLoad used by asynchronous loader hooks + // which sets source to null for commonjs. + // See: https://github.com/nodejs/node/issues/57327#issuecomment-2701382020 + return; + } + validateSourceStrict(url, context, result); +} + +function validateFormat(url, context, result) { + const { format } = result; if (typeof format !== 'string' && format !== undefined) { throw new ERR_INVALID_RETURN_PROPERTY_VALUE( 'a string', @@ -293,12 +320,6 @@ function validateLoad(url, context, result) { format, ); } - - return { - __proto__: null, - format, - source, - }; } class ModuleResolveContext { @@ -338,9 +359,10 @@ let decoder; * @param {ImportAttributes|undefined} importAttributes * @param {string[]} conditions * @param {(url: string, context: ModuleLoadContext) => ModuleLoadResult} defaultLoad + * @param {(url: string, context: ModuleLoadContext, result: ModuleLoadResult) => ModuleLoadResult} validateLoad * @returns {ModuleLoadResult} */ -function loadWithHooks(url, originalFormat, importAttributes, conditions, defaultLoad) { +function loadWithHooks(url, originalFormat, importAttributes, conditions, defaultLoad, validateLoad) { debug('loadWithHooks', url, originalFormat); const context = new ModuleLoadContext(originalFormat, importAttributes, conditions); if (loadHooks.length === 0) { @@ -403,4 +425,6 @@ module.exports = { registerHooks, resolveHooks, resolveWithHooks, + validateLoadStrict, + validateLoadSloppy, }; diff --git a/lib/internal/modules/esm/formats.js b/lib/internal/modules/esm/formats.js index 8d4af32b612d84..6a18bd992fa1d9 100644 --- a/lib/internal/modules/esm/formats.js +++ b/lib/internal/modules/esm/formats.js @@ -24,7 +24,7 @@ if (experimentalAddonModules) { extensionFormatMap['.node'] = 'addon'; } -if (getOptionValue('--experimental-strip-types')) { +if (getOptionValue('--strip-types')) { extensionFormatMap['.ts'] = 'module-typescript'; extensionFormatMap['.mts'] = 'module-typescript'; extensionFormatMap['.cts'] = 'commonjs-typescript'; diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 01584983c16a2a..48ccb97a6244ea 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -132,7 +132,7 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE } return format; } - if (ext === '.ts' && getOptionValue('--experimental-strip-types')) { + if (ext === '.ts' && getOptionValue('--strip-types')) { const { type: packageType, pjsonPath, exists: foundPackageJson } = getPackageScopeConfig(url); if (packageType !== 'none') { return `${packageType}-typescript`; @@ -140,7 +140,7 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE // The controlling `package.json` file has no `type` field. // `source` is undefined when this is called from `defaultResolve`; // but this gets called again from `defaultLoad`/`defaultLoadSync`. - // Since experimental-strip-types depends on detect-module, we always return null if source is undefined. + // Since strip-types depends on detect-module, we always return null if source is undefined. if (!source) { return null; } const { stringify } = require('internal/modules/helpers'); const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); diff --git a/lib/internal/modules/esm/hooks.js b/lib/internal/modules/esm/hooks.js index 6e16d75d586944..78ffb5f834a989 100644 --- a/lib/internal/modules/esm/hooks.js +++ b/lib/internal/modules/esm/hooks.js @@ -15,24 +15,18 @@ const { SafeSet, StringPrototypeSlice, StringPrototypeToUpperCase, - globalThis, } = primordials; const { - SharedArrayBuffer, -} = globalThis; - -const { + ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED, ERR_INTERNAL_ASSERTION, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_INVALID_RETURN_PROPERTY_VALUE, ERR_INVALID_RETURN_VALUE, ERR_LOADER_CHAIN_INCOMPLETE, - ERR_METHOD_NOT_IMPLEMENTED, ERR_WORKER_UNSERIALIZABLE_ERROR, } = require('internal/errors').codes; -const { exitCodes: { kUnsettledTopLevelAwait } } = internalBinding('errors'); const { URLParse } = require('internal/url'); const { canParse: URLCanParse } = internalBinding('url'); const { receiveMessageOnPort } = require('worker_threads'); @@ -45,6 +39,7 @@ const { validateString, } = require('internal/validators'); const { + constructSharedArrayBuffer, kEmptyObject, } = require('internal/util'); @@ -54,17 +49,15 @@ const { } = require('internal/modules/esm/resolve'); const { getDefaultConditions, - loaderWorkerId, } = require('internal/modules/esm/utils'); const { deserializeError } = require('internal/error_serdes'); const { SHARED_MEMORY_BYTE_LENGTH, WORKER_TO_MAIN_THREAD_NOTIFICATION, } = require('internal/modules/esm/shared_constants'); -let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { +let debug = require('internal/util/debuglog').debuglog('async_loader_worker', (fn) => { debug = fn; }); -let importMetaInitializer; let importAssertionAlreadyWarned = false; @@ -105,7 +98,39 @@ function defineImportAssertionAlias(context) { // [2] `validate...()`s throw the wrong error -class Hooks { +/** + * @typedef {{ format: ModuleFormat, source: ModuleSource }} LoadResult + */ + +/** + * @typedef {{ format: ModuleFormat, url: string, importAttributes: Record }} ResolveResult + */ + +/** + * Interface for classes that implement asynchronous loader hooks that can be attached to the ModuleLoader + * via `ModuleLoader.#setAsyncLoaderHooks()`. + * @typedef {object} AsyncLoaderHooks + * @property {boolean} isForAsyncLoaderHookWorker Whether the instance is running on the loader hook worker thread. + * @property {(url: string, context: object, defaultLoad: Function) => Promise} load + * Calling the asynchronous `load` hook asynchronously. + * @property {(url: string, context: object, defaultLoad: Function) => LoadResult} [loadSync] + * Calling the asynchronous `load` hook synchronously. + * @property {(originalSpecifier: string, parentURL: string, + * importAttributes: Record) => Promise} resolve + * Calling the asynchronous `resolve` hook asynchronously. + * @property {(originalSpecifier: string, parentURL: string, + * importAttributes: Record) => ResolveResult} [resolveSync] + * Calling the asynchronous `resolve` hook synchronously. + * @property {(specifier: string, parentURL: string) => any} register Register asynchronous loader hooks + * @property {() => void} waitForLoaderHookInitialization Force loading of hooks. + */ + +/** + * @implements {AsyncLoaderHooks} + * Instances of this class run directly on the loader hook worker thread and customize the module + * loading of the hooks worker itself. + */ +class AsyncLoaderHooksOnLoaderHookWorker { #chains = { /** * Phase 1 of 2 in ESM loading. @@ -136,7 +161,7 @@ class Hooks { // Cache URLs we've already validated to avoid repeated validation #validatedUrls = new SafeSet(); - allowImportMetaResolve = false; + isForAsyncLoaderHookWorker = true; /** * Import and register custom/user-defined module loader hook(s). @@ -319,10 +344,6 @@ class Hooks { }; } - resolveSync(_originalSpecifier, _parentURL, _importAttributes) { - throw new ERR_METHOD_NOT_IMPLEMENTED('resolveSync()'); - } - /** * Provide source that is understood by one of Node's translators. * @@ -452,24 +473,24 @@ class Hooks { }; } - forceLoadHooks() { + waitForLoaderHookInitialization() { // No-op } - - importMetaInitialize(meta, context, loader) { - importMetaInitializer ??= require('internal/modules/esm/initialize_import_meta').initializeImportMeta; - meta = importMetaInitializer(meta, context, loader); - return meta; - } } -ObjectSetPrototypeOf(Hooks.prototype, null); +ObjectSetPrototypeOf(AsyncLoaderHooksOnLoaderHookWorker.prototype, null); /** - * There may be multiple instances of Hooks/HooksProxy, but there is only 1 Internal worker, so - * there is only 1 MessageChannel. + * There is only one loader hook thread for each non-loader-hook worker thread + * (i.e. the non-loader-hook thread and any worker threads that are not loader hook workers themselves), + * so there is only 1 MessageChannel. */ let MessageChannel; -class HooksProxy { + +/** + * Abstraction over a worker thread that runs the asynchronous module loader hooks. + * Instances of this class run on the non-loader-hook thread and communicate with the loader hooks worker thread. + */ +class AsyncLoaderHookWorker { /** * Shared memory. Always use Atomics method to read or write to it. * @type {Int32Array} @@ -500,10 +521,10 @@ class HooksProxy { const { InternalWorker } = require('internal/worker'); MessageChannel ??= require('internal/worker/io').MessageChannel; - const lock = new SharedArrayBuffer(SHARED_MEMORY_BYTE_LENGTH); + const lock = constructSharedArrayBuffer(SHARED_MEMORY_BYTE_LENGTH); this.#lock = new Int32Array(lock); - this.#worker = new InternalWorker(loaderWorkerId, { + this.#worker = new InternalWorker('internal/modules/esm/worker', { stderr: false, stdin: false, stdout: false, @@ -523,7 +544,10 @@ class HooksProxy { debug('wait for signal from worker'); AtomicsWait(this.#lock, WORKER_TO_MAIN_THREAD_NOTIFICATION, 0); const response = this.#worker.receiveMessageSync(); - if (response == null || response.message.status === 'exit') { return; } + if (response == null) { return; } + if (response.message.status === 'exit') { + process.exit(response.message.body); + } // ! This line catches initialization errors in the worker thread. this.#unwrapMessage(response); @@ -610,10 +634,13 @@ class HooksProxy { this.#workerNotificationLastId = AtomicsLoad(this.#lock, WORKER_TO_MAIN_THREAD_NOTIFICATION); response = this.#worker.receiveMessageSync(); + debug('got sync message from worker', { method, args, response }); } while (response == null); - debug('got sync response from worker', { method, args }); + if (response.message.status === 'never-settle') { - process.exit(kUnsettledTopLevelAwait); + const error = new ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED(); + error.details = { method, args }; + throw error; } else if (response.message.status === 'exit') { process.exit(response.message.body); } @@ -637,14 +664,8 @@ class HooksProxy { return body; } } - - #importMetaInitializer = require('internal/modules/esm/initialize_import_meta').initializeImportMeta; - - importMetaInitialize(meta, context, loader) { - this.#importMetaInitializer(meta, context, loader); - } } -ObjectSetPrototypeOf(HooksProxy.prototype, null); +ObjectSetPrototypeOf(AsyncLoaderHookWorker.prototype, null); // TODO(JakobJingleheimer): Remove this when loaders go "stable". let globalPreloadWarningWasEmitted = false; @@ -757,6 +778,91 @@ function nextHookFactory(current, meta, { validateArgs, validateOutput }) { ); } +/** + * @type {AsyncLoaderHookWorker} + * Worker instance used to run async loader hooks in a separate thread. This is a singleton for each + * non-loader-hook worker thread (i.e. the main thread and any worker threads that are not + * loader hook workers themselves). + */ +let asyncLoaderHookWorker; +/** + * Get the AsyncLoaderHookWorker instance. If it is not defined, then create a new one. + * @returns {AsyncLoaderHookWorker} + */ +function getAsyncLoaderHookWorker() { + asyncLoaderHookWorker ??= new AsyncLoaderHookWorker(); + return asyncLoaderHookWorker; +} + +/** + * @implements {AsyncLoaderHooks} + * Instances of this class are created in the non-loader-hook thread and communicate with the worker thread + * spawned to run the async loader hooks. + */ +class AsyncLoaderHooksProxiedToLoaderHookWorker { + + isForAsyncLoaderHookWorker = false; + + /** + * Instantiate a module loader that uses user-provided custom loader hooks. + */ + constructor() { + getAsyncLoaderHookWorker(); + } + + /** + * Register some loader specifier. + * @param {string} originalSpecifier The specified URL path of the loader to + * be registered. + * @param {string} parentURL The parent URL from where the loader will be + * registered if using it package name as specifier + * @param {any} [data] Arbitrary data to be passed from the custom loader + * (user-land) to the worker. + * @param {any[]} [transferList] Objects in `data` that are changing ownership + * @param {boolean} [isInternal] For internal loaders that should not be publicly exposed. + * @returns {{ format: string, url: URL['href'] }} + */ + register(originalSpecifier, parentURL, data, transferList, isInternal) { + return asyncLoaderHookWorker.makeSyncRequest('register', transferList, originalSpecifier, parentURL, + data, isInternal); + } + + /** + * Resolve the location of the module. + * @param {string} originalSpecifier The specified URL path of the module to + * be resolved. + * @param {string} [parentURL] The URL path of the module's parent. + * @param {ImportAttributes} importAttributes Attributes from the import + * statement or expression. + * @returns {{ format: string, url: URL['href'] }} + */ + resolve(originalSpecifier, parentURL, importAttributes) { + return asyncLoaderHookWorker.makeAsyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); + } + + resolveSync(originalSpecifier, parentURL, importAttributes) { + // This happens only as a result of `import.meta.resolve` calls, which must be sync per spec. + return asyncLoaderHookWorker.makeSyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); + } + + /** + * Provide source that is understood by one of Node's translators. + * @param {URL['href']} url The URL/path of the module to be loaded + * @param {object} [context] Metadata about the module + * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }>} + */ + load(url, context) { + return asyncLoaderHookWorker.makeAsyncRequest('load', undefined, url, context); + } + loadSync(url, context) { + return asyncLoaderHookWorker.makeSyncRequest('load', undefined, url, context); + } + + waitForLoaderHookInitialization() { + asyncLoaderHookWorker.waitForWorker(); + } +} -exports.Hooks = Hooks; -exports.HooksProxy = HooksProxy; +exports.AsyncLoaderHooksProxiedToLoaderHookWorker = AsyncLoaderHooksProxiedToLoaderHookWorker; +exports.AsyncLoaderHooksOnLoaderHookWorker = AsyncLoaderHooksOnLoaderHookWorker; +exports.AsyncLoaderHookWorker = AsyncLoaderHookWorker; diff --git a/lib/internal/modules/esm/initialize_import_meta.js b/lib/internal/modules/esm/initialize_import_meta.js deleted file mode 100644 index 82edb59c4114cb..00000000000000 --- a/lib/internal/modules/esm/initialize_import_meta.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -const { - StringPrototypeStartsWith, -} = primordials; - -const { getOptionValue } = require('internal/options'); -const { - setLazyPathHelpers, -} = internalBinding('modules'); - -const experimentalImportMetaResolve = getOptionValue('--experimental-import-meta-resolve'); - -/** - * Generate a function to be used as import.meta.resolve for a particular module. - * @param {string} defaultParentURL The default base to use for resolution - * @param {typeof import('./loader.js').ModuleLoader} loader Reference to the current module loader - * @param {bool} allowParentURL Whether to permit parentURL second argument for contextual resolution - * @returns {(specifier: string) => string} Function to assign to import.meta.resolve - */ -function createImportMetaResolve(defaultParentURL, loader, allowParentURL) { - /** - * @param {string} specifier - * @param {URL['href']} [parentURL] When `--experimental-import-meta-resolve` is specified, a - * second argument can be provided. - * @returns {string} - */ - return function resolve(specifier, parentURL = defaultParentURL) { - let url; - - if (!allowParentURL) { - parentURL = defaultParentURL; - } - - try { - ({ url } = loader.resolveSync(specifier, parentURL)); - return url; - } catch (error) { - switch (error?.code) { - case 'ERR_UNSUPPORTED_DIR_IMPORT': - case 'ERR_MODULE_NOT_FOUND': - ({ url } = error); - if (url) { - return url; - } - } - throw error; - } - }; -} - -/** - * Create the `import.meta` object for a module. - * @param {object} meta - * @param {{url: string, isMain?: boolean}} context - * @param {typeof import('./loader.js').ModuleLoader} loader Reference to the current module loader - * @returns {{dirname?: string, filename?: string, url: string, resolve?: Function}} - */ -function initializeImportMeta(meta, context, loader) { - const { url, isMain } = context; - - // Alphabetical - if (StringPrototypeStartsWith(url, 'file:') === true) { - // dirname - // filename - setLazyPathHelpers(meta, url); - } - - meta.main = !!isMain; - - if (!loader || loader.allowImportMetaResolve) { - meta.resolve = createImportMetaResolve(url, loader, experimentalImportMetaResolve); - } - - meta.url = url; - - return meta; -} - -module.exports = { - initializeImportMeta, -}; diff --git a/lib/internal/modules/esm/load.js b/lib/internal/modules/esm/load.js index 8414d303c078d5..c284163fba86ec 100644 --- a/lib/internal/modules/esm/load.js +++ b/lib/internal/modules/esm/load.js @@ -141,15 +141,26 @@ function defaultLoadSync(url, context = kEmptyObject) { throwIfUnsupportedURLScheme(urlInstance, false); + let shouldBeReloadedByCJSLoader = false; if (urlInstance.protocol === 'node:') { source = null; - } else if (source == null) { - ({ responseURL, source } = getSourceSync(urlInstance, context)); - context.source = source; - } + format ??= 'builtin'; + } else if (format === 'addon') { + // Skip loading addon file content. It must be loaded with dlopen from file system. + source = null; + } else { + if (source == null) { + ({ responseURL, source } = getSourceSync(urlInstance, context)); + context = { __proto__: context, source }; + } - format ??= defaultGetFormat(urlInstance, context); + // Now that we have the source for the module, run `defaultGetFormat` to detect its format. + format ??= defaultGetFormat(urlInstance, context); + // For backward compatibility reasons, we need to let go through Module._load + // again. + shouldBeReloadedByCJSLoader = (format === 'commonjs'); + } validateAttributes(url, format, importAttributes); return { @@ -157,6 +168,7 @@ function defaultLoadSync(url, context = kEmptyObject) { format, responseURL, source, + shouldBeReloadedByCJSLoader, }; } diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 300da51afe6185..d30c824ce387a7 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -7,6 +7,8 @@ const { FunctionPrototypeCall, JSONStringify, ObjectSetPrototypeOf, + Promise, + PromisePrototypeThen, RegExpPrototypeSymbolReplace, encodeURIComponent, hardenRegExp, @@ -25,17 +27,20 @@ const { ERR_REQUIRE_ASYNC_MODULE, ERR_REQUIRE_CYCLE_MODULE, ERR_REQUIRE_ESM, - ERR_NETWORK_IMPORT_DISALLOWED, ERR_UNKNOWN_MODULE_FORMAT, } = require('internal/errors').codes; const { getOptionValue } = require('internal/options'); -const { isURL, pathToFileURL, URLParse } = require('internal/url'); +const { isURL, pathToFileURL } = require('internal/url'); const { kEmptyObject } = require('internal/util'); const { compileSourceTextModule, getDefaultConditions, - forceDefaultLoader, + shouldSpawnLoaderHookWorker, + requestTypes: { kImportInRequiredESM, kRequireInImportedCJS, kImportInImportedESM }, } = require('internal/modules/esm/utils'); +/** + * @typedef {import('./utils.js').ModuleRequestType} ModuleRequestType + */ const { kImplicitTypeAttribute } = require('internal/modules/esm/assert'); const { ModuleWrap, @@ -46,17 +51,20 @@ const { kErrored, kSourcePhase, throwIfPromiseRejected, + setImportMetaResolveInitializer, } = internalBinding('module_wrap'); const { urlToFilename, } = require('internal/modules/helpers'); const { - resolveHooks, - resolveWithHooks, - loadHooks, - loadWithHooks, + resolveHooks: syncResolveHooks, + resolveWithHooks: resolveWithSyncHooks, + loadHooks: syncLoadHooks, + loadWithHooks: loadWithSyncHooks, + validateLoadSloppy, } = require('internal/modules/customization_hooks'); -let defaultResolve, defaultLoad, defaultLoadSync, importMetaInitializer; + +let defaultResolve, defaultLoadSync; const { tracingChannel } = require('diagnostics_channel'); const onImport = tracingChannel('module.import'); @@ -68,7 +76,7 @@ let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { const { isPromise } = require('internal/util/types'); /** - * @typedef {import('./hooks.js').HooksProxy} HooksProxy + * @typedef {import('./hooks.js').AsyncLoaderHookWorker} AsyncLoaderHookWorker * @typedef {import('./module_job.js').ModuleJobBase} ModuleJobBase * @typedef {import('url').URL} URL */ @@ -110,26 +118,19 @@ function getTranslators() { * async linking. * @param {string} filename Filename of the module being required. * @param {string|undefined} parentFilename Filename of the module calling require(). + * @param {boolean} isForAsyncLoaderHookWorker Whether this is for the async loader hook worker. * @returns {string} Error message. */ -function getRaceMessage(filename, parentFilename) { - let raceMessage = `Cannot require() ES Module ${filename} because it is not yet fully loaded. `; +function getRaceMessage(filename, parentFilename, isForAsyncLoaderHookWorker) { + let raceMessage = `Cannot require() ES Module ${filename} because it is not yet fully loaded.\n`; raceMessage += 'This may be caused by a race condition if the module is simultaneously dynamically '; - raceMessage += 'import()-ed via Promise.all(). Try await-ing the import() sequentially in a loop instead.'; - if (parentFilename) { - raceMessage += ` (from ${parentFilename})`; - } + raceMessage += 'import()-ed via Promise.all().\n'; + raceMessage += 'Try await-ing the import() sequentially in a loop instead.\n'; + raceMessage += ` (From ${parentFilename ? `${parentFilename} in ` : ' '}`; + raceMessage += `${isForAsyncLoaderHookWorker ? 'loader hook worker thread' : 'non-loader-hook thread'})`; return raceMessage; } -/** - * @type {HooksProxy} - * Multiple loader instances exist for various, specific reasons (see code comments at site). - * In order to maintain consistency, we use a single worker (sandbox), which must sit apart of an - * individual loader instance. - */ -let hooksProxy; - /** * @typedef {import('../cjs/loader.js').Module} CJSModule */ @@ -147,9 +148,21 @@ let hooksProxy; */ /** - * This class covers the base machinery of module loading. To add custom - * behavior you can pass a customizations object and this object will be - * used to do the loading/resolving/registration process. + * @typedef {{ format: ModuleFormat, source: ModuleSource, translatorKey: string }} TranslateContext + */ + +/** + * @typedef {import('./hooks.js').AsyncLoaderHooks} AsyncLoaderHooks + * @typedef {import('./hooks.js').AsyncLoaderHooksOnLoaderHookWorker} AsyncLoaderHooksOnLoaderHookWorker + * @typedef {import('./hooks.js').AsyncLoaderHooksProxiedToLoaderHookWorker} AsyncLoaderHooksProxiedToLoaderHookWorker + */ + +/** + * This class covers the base machinery of module loading. There are two types of loader hooks: + * 1. Asynchronous loader hooks, which are run in a separate loader hook worker thread. + * This is configured in #asyncLoaderHooks. + * 2. Synchronous loader hooks, which are run in-thread. This is shared with the CJS loader and is + * stored in the cross-module syncResolveHooks and syncLoadHooks arrays. */ class ModuleLoader { /** @@ -173,82 +186,53 @@ class ModuleLoader { 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. + * @see {AsyncLoaderHooks.isForAsyncLoaderHookWorker} + * Shortcut to this.#asyncLoaderHooks.isForAsyncLoaderHookWorker. */ - allowImportMetaResolve; + isForAsyncLoaderHookWorker = false; /** - * Customizations to pass requests to. - * @type {import('./hooks.js').Hooks} - * Note that this value _MUST_ be set with `setCustomizations` - * because it needs to copy `customizations.allowImportMetaResolve` - * to this property and failure to do so will cause undefined - * behavior when invoking `import.meta.resolve`. - * @see {ModuleLoader.setCustomizations} - * @type {CustomizedModuleLoader} + * Asynchronous loader hooks to pass requests to. + * + * Note that this value _MUST_ be set with `#setAsyncLoaderHooks` + * because it needs to copy `#asyncLoaderHooks.isForAsyncLoaderHookWorker` + * to this property. + * TODO(joyeecheung): this was a legacy of the previous setup of import.meta.resolve + * configuration; put this information in the environment directly instead. + * + * When the ModuleLoader is created on a loader hook thread, this is + * {@link AsyncLoaderHooksOnLoaderHookWorker}, and its methods directly call out + * to loader methods. Otherwise, this is {@link AsyncLoaderHooksProxiedToLoaderHookWorker}, + * and its methods post messages to the loader thread and possibly block on it. + * @see {ModuleLoader.#setAsyncLoaderHooks} + * @type {AsyncLoaderHooks} */ - #customizations; + #asyncLoaderHooks; - constructor(customizations) { - this.setCustomizations(customizations); + constructor(asyncLoaderHooks) { + this.#setAsyncLoaderHooks(asyncLoaderHooks); } /** - * Change the currently activate customizations for this module - * loader to be the provided `customizations`. + * Change the currently activate async loader hooks for this module + * loader to be the provided `AsyncLoaderHooks`. * * If present, this class customizes its core functionality to the - * `customizations` object, including registration, loading, and resolving. + * `AsyncLoaderHooks` object, including registration, loading, and resolving. * There are some responsibilities that this class _always_ takes - * care of, like validating outputs, so that the customizations object + * care of, like validating outputs, so that the AsyncLoaderHooks object * does not have to do so. * - * The customizations object has the shape: - * - * ```ts - * interface LoadResult { - * format: ModuleFormat; - * source: ModuleSource; - * } - * - * interface ResolveResult { - * format: string; - * url: URL['href']; - * } - * - * interface Customizations { - * allowImportMetaResolve: boolean; - * load(url: string, context: object): Promise - * resolve( - * originalSpecifier: - * string, parentURL: string, - * importAttributes: Record - * ): Promise - * resolveSync( - * originalSpecifier: - * string, parentURL: string, - * importAttributes: Record - * ) ResolveResult; - * register(specifier: string, parentURL: string): any; - * forceLoadHooks(): void; - * } - * ``` - * - * Note that this class _also_ implements the `Customizations` - * interface, as does `CustomizedModuleLoader` and `Hooks`. - * * Calling this function alters how modules are loaded and should be * invoked with care. - * @param {CustomizedModuleLoader} customizations + * @param {AsyncLoaderHooks} asyncLoaderHooks */ - setCustomizations(customizations) { - this.#customizations = customizations; - if (customizations) { - this.allowImportMetaResolve = customizations.allowImportMetaResolve; + #setAsyncLoaderHooks(asyncLoaderHooks) { + this.#asyncLoaderHooks = asyncLoaderHooks; + if (asyncLoaderHooks) { + this.isForAsyncLoaderHookWorker = asyncLoaderHooks.isForAsyncLoaderHookWorker; } else { - this.allowImportMetaResolve = true; + this.isForAsyncLoaderHookWorker = false; } } @@ -273,7 +257,7 @@ class ModuleLoader { async executeModuleJob(url, wrap, isEntryPoint = false) { const { ModuleJob } = require('internal/modules/esm/module_job'); const module = await onImport.tracePromise(async () => { - const job = new ModuleJob(this, url, undefined, wrap, kEvaluationPhase, false, false); + const job = new ModuleJob(this, url, undefined, wrap, kEvaluationPhase, false, false, kImportInImportedESM); this.loadCache.set(url, undefined, job); const { module } = await job.run(isEntryPoint); return module; @@ -303,62 +287,6 @@ class ModuleLoader { return this.executeModuleJob(url, wrap, isEntryPoint); } - /** - * Get a (possibly not yet fully linked) module job from the cache, or create one and return its Promise. - * @param {string} specifier The module request of the module to be resolved. Typically, what's - * requested by `import ''` or `import('')`. - * @param {string} [parentURL] The URL of the module where the module request is initiated. - * It's undefined if it's from the root module. - * @param {ImportAttributes} importAttributes Attributes from the import statement or expression. - * @param {number} phase Import phase. - * @returns {Promise} - */ - async getModuleJobForImport(specifier, parentURL, importAttributes, phase) { - const resolveResult = await this.resolve(specifier, parentURL, importAttributes); - return this.#getJobFromResolveResult(resolveResult, parentURL, importAttributes, phase, false); - } - - /** - * Similar to {@link getModuleJobForImport} but it's used for `require()` resolved by the ESM loader - * in imported CJS modules. This runs synchronously and when it returns, the module job's module - * requests are all linked. - * @param {string} specifier See {@link getModuleJobForImport} - * @param {string} [parentURL] See {@link getModuleJobForImport} - * @param {ImportAttributes} importAttributes See {@link getModuleJobForImport} - * @param {number} phase Import phase. - * @returns {Promise} - */ - getModuleJobForRequireInImportedCJS(specifier, parentURL, importAttributes, phase) { - const resolveResult = this.resolveSync(specifier, parentURL, importAttributes); - return this.#getJobFromResolveResult(resolveResult, parentURL, importAttributes, phase, true); - } - - /** - * Given a resolved module request, obtain a ModuleJobBase from it - if it's already cached, - * return the cached ModuleJobBase. Otherwise, load its source and translate it into a ModuleWrap first. - * @param {{ format: string, url: string }} resolveResult Resolved module request. - * @param {string} [parentURL] See {@link getModuleJobForImport} - * @param {ImportAttributes} importAttributes See {@link getModuleJobForImport} - * @param {number} phase Import phase. - * @param {boolean} isForRequireInImportedCJS Whether this is done for require() in imported CJS. - * @returns {ModuleJobBase} - */ - #getJobFromResolveResult(resolveResult, parentURL, importAttributes, phase, - isForRequireInImportedCJS = false) { - const { url, format } = resolveResult; - const resolvedImportAttributes = resolveResult.importAttributes ?? importAttributes; - let job = this.loadCache.get(url, resolvedImportAttributes.type); - - if (job === undefined) { - job = this.#createModuleJob(url, resolvedImportAttributes, phase, parentURL, format, - isForRequireInImportedCJS); - } else { - job.ensurePhase(phase); - } - - return job; - } - /** * This constructs (creates, instantiates and evaluates) a module graph that * is require()'d. @@ -371,6 +299,10 @@ class ModuleLoader { */ importSyncForRequire(mod, filename, source, isMain, parent) { const url = pathToFileURL(filename).href; + if (!getOptionValue('--experimental-require-module')) { + throw new ERR_REQUIRE_ESM(url, true); + } + let job = this.loadCache.get(url, kImplicitTypeAttribute); // This module job is already created: // 1. If it was loaded by `require()` before, at this point the instantiation @@ -388,9 +320,9 @@ class ModuleLoader { if (job !== undefined) { mod[kRequiredModuleSymbol] = job.module; const parentFilename = urlToFilename(parent?.filename); - // TODO(node:55782): this race may stop to happen when the ESM resolution and loading become synchronous. + // This race should only be possible on the loader hook thread. See https://github.com/nodejs/node/issues/59666 if (!job.module) { - assert.fail(getRaceMessage(filename, parentFilename)); + assert.fail(getRaceMessage(filename, parentFilename), this.isForAsyncLoaderHookWorker); } const status = job.module.getStatus(); debug('Module status', job, status); @@ -443,91 +375,67 @@ class ModuleLoader { const inspectBrk = (isMain && getOptionValue('--inspect-brk')); const { ModuleJobSync } = require('internal/modules/esm/module_job'); - job = new ModuleJobSync(this, url, kEmptyObject, wrap, kEvaluationPhase, isMain, inspectBrk); + job = new ModuleJobSync(this, url, kEmptyObject, wrap, kEvaluationPhase, isMain, inspectBrk, + kImportInRequiredESM); this.loadCache.set(url, kImplicitTypeAttribute, job); mod[kRequiredModuleSymbol] = job.module; return { wrap: job.module, namespace: job.runSync(parent).namespace }; } /** - * Resolve individual module requests and create or get the cached ModuleWraps for - * each of them. This is only used to create a module graph being require()'d. - * @param {string} specifier Specifier of the the imported module. - * @param {string} parentURL Where the import comes from. - * @param {object} importAttributes import attributes from the import statement. - * @param {number} phase The import phase. - * @returns {ModuleJobBase} + * Check invariants on a cached module job when require()'d from ESM. + * @param {string} specifier The first parameter of require(). + * @param {string} url URL of the module being required. + * @param {string|undefined} parentURL URL of the module calling require(). + * @param {ModuleJobBase} job The cached module job. */ - getModuleJobForRequire(specifier, parentURL, importAttributes, phase) { - const parsed = URLParse(specifier); - if (parsed != null) { - const protocol = parsed.protocol; - if (protocol === 'https:' || protocol === 'http:') { - throw new ERR_NETWORK_IMPORT_DISALLOWED(specifier, parentURL, - 'ES modules cannot be loaded by require() from the network'); - } - assert(protocol === 'file:' || protocol === 'node:' || protocol === 'data:'); + #checkCachedJobForRequireESM(specifier, url, parentURL, job) { + // This race should only be possible on the loader hook thread. See https://github.com/nodejs/node/issues/59666 + if (!job.module) { + assert.fail(getRaceMessage(url, parentURL, this.isForAsyncLoaderHookWorker)); } - - // TODO(joyeecheung): consolidate cache behavior and use resolveSync() and - // loadSync() here. - const resolveResult = this.#cachedResolveSync(specifier, parentURL, importAttributes); - const { url, format } = resolveResult; - if (!getOptionValue('--experimental-require-module')) { - throw new ERR_REQUIRE_ESM(url, true); - } - const resolvedImportAttributes = resolveResult.importAttributes ?? importAttributes; - let job = this.loadCache.get(url, resolvedImportAttributes.type); - if (job !== undefined) { - // TODO(node:55782): this race may stop happening when the ESM resolution and loading become synchronous. - if (!job.module) { - assert.fail(getRaceMessage(url, parentURL)); - } - // This module is being evaluated, which means it's imported in a previous link - // in a cycle. - if (job.module.getStatus() === kEvaluating) { - const parentFilename = urlToFilename(parentURL); - let message = `Cannot import Module ${specifier} in a cycle.`; - if (parentFilename) { - message += ` (from ${parentFilename})`; - } - throw new ERR_REQUIRE_CYCLE_MODULE(message); + // This module is being evaluated, which means it's imported in a previous link + // in a cycle. + if (job.module.getStatus() === kEvaluating) { + const parentFilename = urlToFilename(parentURL); + let message = `Cannot import Module ${specifier} in a cycle.`; + if (parentFilename) { + message += ` (from ${parentFilename})`; } - job.ensurePhase(phase); - // Otherwise the module could be imported before but the evaluation may be already - // completed (e.g. the require call is lazy) so it's okay. We will return the - // module now and check asynchronicity of the entire graph later, after the - // graph is instantiated. - return job; + throw new ERR_REQUIRE_CYCLE_MODULE(message); } - const loadResult = this.#loadSync(url, { format, importAttributes }); + // Otherwise the module could be imported before but the evaluation may be already + // completed (e.g. the require call is lazy) so it's okay. We will return the + // job and check asynchronicity of the entire graph later, after the + // graph is instantiated. + } + /** + * Load a module and translate it into a ModuleWrap for require(esm). + * This is run synchronously, and the translator always return a ModuleWrap synchronously. + * @param {string} url URL of the module to be translated. + * @param {object} loadContext See {@link load} + * @param {string|undefined} parentURL URL of the parent module. Undefined if it's the entry point. + * @param {ModuleRequest} request Module request. + * @returns {ModuleWrap} + */ + loadAndTranslateForImportInRequiredESM(url, loadContext, parentURL, request) { + const loadResult = this.#loadSync(url, loadContext); // Use the synchronous commonjs translator which can deal with cycles. - const finalFormat = - loadResult.format === 'commonjs' || - loadResult.format === 'commonjs-typescript' ? 'commonjs-sync' : loadResult.format; - - if (finalFormat === 'wasm') { - assert.fail('WASM is currently unsupported by require(esm)'); - } - - const { source } = loadResult; - const isMain = (parentURL === undefined); - const wrap = this.#translate(url, finalFormat, source, parentURL); + const formatFromLoad = loadResult.format; + const translatorKey = (formatFromLoad === 'commonjs' || formatFromLoad === 'commonjs-typescript') ? + 'commonjs-sync' : formatFromLoad; + const translateContext = { ...loadResult, translatorKey, __proto__: null }; + const wrap = this.#translate(url, translateContext, parentURL); assert(wrap instanceof ModuleWrap, `Translator used for require(${url}) should not be async`); - if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { - process.send({ 'watch:import': [url] }); - } - const cjsModule = wrap[imported_cjs_symbol]; if (cjsModule) { - assert(finalFormat === 'commonjs-sync'); // Check if the ESM initiating import CJS is being required by the same CJS module. if (cjsModule?.[kIsExecuting]) { const parentFilename = urlToFilename(parentURL); - let message = `Cannot import CommonJS Module ${specifier} in a cycle.`; + let message = `Cannot import CommonJS Module ${request.specifier} in a cycle.`; if (parentFilename) { message += ` (from ${parentFilename})`; } @@ -535,34 +443,32 @@ class ModuleLoader { } } - const inspectBrk = (isMain && getOptionValue('--inspect-brk')); - const { ModuleJobSync } = require('internal/modules/esm/module_job'); - job = new ModuleJobSync(this, url, importAttributes, wrap, phase, isMain, inspectBrk); - - this.loadCache.set(url, importAttributes.type, job); - return job; + return wrap; } /** * Translate a loaded module source into a ModuleWrap. This is run synchronously, * but the translator may return the ModuleWrap in a Promise. * @param {string} url URL of the module to be translated. - * @param {string} format Format of the module to be translated. This is used to find - * matching translators. - * @param {ModuleSource} source Source of the module to be translated. - * @param {string|undefined} parentURL URL of the parent module. Undefined if it's the entry point. + * @param {TranslateContext} translateContext Context for the translator + * @param {string|undefined} parentURL URL of the module initiating the module loading for the first time. + * Undefined if it's the entry point. * @returns {ModuleWrap} */ - #translate(url, format, source, parentURL) { + #translate(url, translateContext, parentURL) { + const { translatorKey, format } = translateContext; this.validateLoadResult(url, format); - const translator = getTranslators().get(format); + const translator = getTranslators().get(translatorKey); if (!translator) { - throw new ERR_UNKNOWN_MODULE_FORMAT(format, url); + throw new ERR_UNKNOWN_MODULE_FORMAT(translatorKey, url); } - const result = FunctionPrototypeCall(translator, this, url, source, parentURL === undefined); - assert(result instanceof ModuleWrap); + const result = FunctionPrototypeCall(translator, this, url, translateContext, parentURL); + assert(result instanceof ModuleWrap, `The ${format} module returned is not a ModuleWrap`); + if (format === 'commonjs' || format === 'commonjs-sync' || format === 'require-commonjs') { + result.isCommonJS = true; + } return result; } @@ -575,7 +481,8 @@ class ModuleLoader { * @returns {ModuleWrap} */ loadAndTranslateForRequireInImportedCJS(url, loadContext, parentURL) { - const { format: formatFromLoad, source } = this.#loadSync(url, loadContext); + const loadResult = this.#loadSync(url, loadContext); + const formatFromLoad = loadResult.format; if (formatFromLoad === 'wasm') { // require(wasm) is not supported. throw new ERR_UNKNOWN_MODULE_FORMAT(formatFromLoad, url); @@ -587,15 +494,16 @@ class ModuleLoader { } } - let finalFormat = formatFromLoad; + let translatorKey = formatFromLoad; if (formatFromLoad === 'commonjs') { - finalFormat = 'require-commonjs'; + translatorKey = 'require-commonjs'; } if (formatFromLoad === 'commonjs-typescript') { - finalFormat = 'require-commonjs-typescript'; + translatorKey = 'require-commonjs-typescript'; } - const wrap = this.#translate(url, finalFormat, source, parentURL); + const translateContext = { ...loadResult, translatorKey, __proto__: null }; + const wrap = this.#translate(url, translateContext, parentURL); assert(wrap instanceof ModuleWrap, `Translator used for require(${url}) should not be async`); return wrap; } @@ -610,58 +518,77 @@ class ModuleLoader { */ loadAndTranslate(url, loadContext, parentURL) { const maybePromise = this.load(url, loadContext); - const afterLoad = ({ format, source }) => { - return this.#translate(url, format, source, parentURL); + const afterLoad = (loadResult) => { + const translateContext = { ...loadResult, translatorKey: loadResult.format, __proto__: null }; + return this.#translate(url, translateContext, parentURL); }; if (isPromise(maybePromise)) { - return maybePromise.then(afterLoad); + return PromisePrototypeThen(maybePromise, afterLoad); } return afterLoad(maybePromise); } /** - * Load a module and translate it into a ModuleWrap, and create a ModuleJob from it. - * This runs synchronously. If isForRequireInImportedCJS is true, the module should be linked - * by the time this returns. Otherwise it may still have pending module requests. - * @param {string} url The URL that was resolved for this module. - * @param {ImportAttributes} importAttributes See {@link getModuleJobForImport} - * @param {number} phase Import phase. - * @param {string} [parentURL] See {@link getModuleJobForImport} - * @param {string} [format] The format hint possibly returned by the `resolve` hook - * @param {boolean} isForRequireInImportedCJS Whether this module job is created for require() - * in imported CJS. + * Given a resolved module request, obtain a ModuleJobBase from it - if it's already cached, + * return the cached ModuleJobBase. Otherwise, load its source and translate it into a ModuleWrap first. + * This runs synchronously. On any thread that is not an async loader hook worker thread, + * the module should be linked by the time this returns. Otherwise it may still have + * pending module requests. + * @param {string} parentURL See {@link getOrCreateModuleJob} + * @param {{format: string, url: string}} resolveResult + * @param {ModuleRequest} request Module request. + * @param {ModuleRequestType} requestType Type of the module request. * @returns {ModuleJobBase} The (possibly pending) module job */ - #createModuleJob(url, importAttributes, phase, parentURL, format, isForRequireInImportedCJS) { - const context = { format, importAttributes }; + #getOrCreateModuleJobAfterResolve(parentURL, resolveResult, request, requestType) { + const { url, format } = resolveResult; + // TODO(joyeecheung): update the module requests to use importAttributes as property names. + const importAttributes = resolveResult.importAttributes ?? request.attributes; + let job = this.loadCache.get(url, importAttributes.type); + + if (job !== undefined) { + if (requestType === kImportInRequiredESM) { + this.#checkCachedJobForRequireESM(request.specifier, url, parentURL, job); + } + job.ensurePhase(request.phase, requestType); + return job; + } + + const context = { format, importAttributes, __proto__: null }; - const isMain = parentURL === undefined; let moduleOrModulePromise; - if (isForRequireInImportedCJS) { + if (requestType === kRequireInImportedCJS) { moduleOrModulePromise = this.loadAndTranslateForRequireInImportedCJS(url, context, parentURL); + } else if (requestType === kImportInRequiredESM) { + moduleOrModulePromise = this.loadAndTranslateForImportInRequiredESM(url, context, parentURL, request); } else { moduleOrModulePromise = this.loadAndTranslate(url, context, parentURL); } - const inspectBrk = ( - isMain && - getOptionValue('--inspect-brk') - ); + if (requestType === kImportInRequiredESM || requestType === kRequireInImportedCJS || + !this.isForAsyncLoaderHookWorker) { + assert(moduleOrModulePromise instanceof ModuleWrap, `Expected ModuleWrap for loading ${url}`); + } if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { - process.send({ 'watch:import': [url] }); + const type = requestType === kRequireInImportedCJS ? 'require' : 'import'; + process.send({ [`watch:${type}`]: [url] }); } - const { ModuleJob } = require('internal/modules/esm/module_job'); - const job = new ModuleJob( + const { ModuleJob, ModuleJobSync } = require('internal/modules/esm/module_job'); + // TODO(joyeecheung): use ModuleJobSync for kRequireInImportedCJS too. + const ModuleJobCtor = (requestType === kImportInRequiredESM ? ModuleJobSync : ModuleJob); + const isMain = (parentURL === undefined); + const inspectBrk = (isMain && getOptionValue('--inspect-brk')); + job = new ModuleJobCtor( this, url, importAttributes, moduleOrModulePromise, - phase, + request.phase, isMain, inspectBrk, - isForRequireInImportedCJS, + requestType, ); this.loadCache.set(url, importAttributes.type, job); @@ -669,6 +596,34 @@ class ModuleLoader { return job; } + /** + * Get a (possibly not yet fully linked) module job from the cache, or create one and return its Promise. + * @param {string} [parentURL] The URL of the module where the module request is initiated. + * It's undefined if it's from the root module. + * @param {ModuleRequest} request Module request. + * @param {ModuleRequestType} requestType Type of the module request. + * @returns {Promise|ModuleJobBase} + */ + getOrCreateModuleJob(parentURL, request, requestType) { + let maybePromise; + if (requestType === kRequireInImportedCJS || requestType === kImportInRequiredESM) { + // In these two cases, resolution must be synchronous. + maybePromise = this.resolveSync(parentURL, request); + assert(!isPromise(maybePromise)); + } else { + maybePromise = this.#resolve(parentURL, request); + } + + const afterResolve = (resolveResult) => { + return this.#getOrCreateModuleJobAfterResolve(parentURL, resolveResult, request, requestType); + }; + + if (isPromise(maybePromise)) { + return PromisePrototypeThen(maybePromise, afterResolve); + } + return afterResolve(maybePromise); + } + /** * This method is usually called indirectly as part of the loading processes. * Use directly with caution. @@ -682,8 +637,16 @@ class ModuleLoader { */ async import(specifier, parentURL, importAttributes, phase = kEvaluationPhase, isEntryPoint = false) { return onImport.tracePromise(async () => { - const moduleJob = await this.getModuleJobForImport(specifier, parentURL, importAttributes, - phase); + const request = { specifier, phase, attributes: importAttributes, __proto__: null }; + let moduleJob; + try { + moduleJob = await this.getOrCreateModuleJob(parentURL, request); + } catch (e) { + if (e?.code === 'ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED') { + return new Promise(() => {}); + } + throw e; + } if (phase === kSourcePhase) { const module = await moduleJob.modulePromise; return module.getModuleSourceObject(); @@ -698,45 +661,37 @@ class ModuleLoader { } /** - * @see {@link CustomizedModuleLoader.register} + * @see {@link AsyncLoaderHooks.register} * @returns {any} */ register(specifier, parentURL, data, transferList, isInternal) { - if (!this.#customizations) { - // `CustomizedModuleLoader` is defined at the bottom of this file and - // available well before this line is ever invoked. This is here in - // order to preserve the git diff instead of moving the class. - // eslint-disable-next-line no-use-before-define - this.setCustomizations(new CustomizedModuleLoader()); + if (!this.#asyncLoaderHooks) { + // On the loader hook worker thread, the #asyncLoaderHooks must already have been initialized + // to be an instance of AsyncLoaderHooksOnLoaderHookWorker, so this branch can only ever + // be hit on a non-loader-hook thread that will talk to the loader hook worker thread. + const { AsyncLoaderHooksProxiedToLoaderHookWorker } = require('internal/modules/esm/hooks'); + this.#setAsyncLoaderHooks(new AsyncLoaderHooksProxiedToLoaderHookWorker()); } - return this.#customizations.register(`${specifier}`, `${parentURL}`, data, transferList, isInternal); + return this.#asyncLoaderHooks.register(`${specifier}`, `${parentURL}`, data, transferList, isInternal); } /** * Resolve a module request to a URL identifying the location of the module. Handles customization hooks, * if any. - * @param {string|URL} specifier The module request of the module to be resolved. Typically, what's - * requested by `import specifier`, `import(specifier)` or `import.meta.resolve(specifier)`. * @param {string} [parentURL] The URL of the module where the module request is initiated. * It's undefined if it's from the root module. - * @param {ImportAttributes} importAttributes Attributes from the import statement or expression. - * @returns {Promise<{format: string, url: string}>} - */ - resolve(specifier, parentURL, importAttributes) { - specifier = `${specifier}`; - if (resolveHooks.length) { - // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. - return this.resolveSync(specifier, parentURL, importAttributes); - } - if (this.#customizations) { // Only has module.register hooks. - return this.#customizations.resolve(specifier, parentURL, importAttributes); + * @param {ModuleRequest} request Module request. + * @returns {Promise<{format: string, url: string}>|{format: string, url: string}} + */ + #resolve(parentURL, request) { + if (this.isForAsyncLoaderHookWorker) { + const specifier = `${request.specifier}`; + const importAttributes = request.attributes ?? kEmptyObject; + // TODO(joyeecheung): invoke the synchronous hooks in the default step on loader thread. + return this.#asyncLoaderHooks.resolve(specifier, parentURL, importAttributes); } - return this.#cachedDefaultResolve(specifier, { - __proto__: null, - conditions: this.#defaultConditions, - parentURL, - importAttributes, - }); + + return this.resolveSync(parentURL, request); } /** @@ -759,25 +714,6 @@ class ModuleLoader { return result; } - /** - * Either return a cached resolution, or perform the synchronous resolution, and - * cache the result. - * @param {string} specifier See {@link resolve}. - * @param {string} [parentURL] See {@link resolve}. - * @param {ImportAttributes} importAttributes See {@link resolve}. - * @returns {{ format: string, url: string }} - */ - #cachedResolveSync(specifier, parentURL, importAttributes) { - const requestKey = this.#resolveCache.serializeKey(specifier, importAttributes); - const cachedResult = this.#resolveCache.get(requestKey, parentURL); - if (cachedResult != null) { - return cachedResult; - } - const result = this.resolveSync(specifier, parentURL, importAttributes); - this.#resolveCache.set(requestKey, parentURL, result); - return result; - } - /** * This is the default resolve step for module.registerHooks(), which incorporates asynchronous hooks * from module.register() which are run in a blocking fashion for it to be synchronous. @@ -787,8 +723,8 @@ class ModuleLoader { * @returns {{ format: string, url: string }} */ #resolveAndMaybeBlockOnLoaderThread(specifier, context) { - if (this.#customizations) { - return this.#customizations.resolveSync(specifier, context.parentURL, context.importAttributes); + if (this.#asyncLoaderHooks?.resolveSync) { + return this.#asyncLoaderHooks.resolveSync(specifier, context.parentURL, context.importAttributes); } return this.#cachedDefaultResolve(specifier, context); } @@ -799,46 +735,43 @@ class ModuleLoader { * from the loader thread for this to be synchronous. * This is here to support `import.meta.resolve()`, `require()` in imported CJS, and * `module.registerHooks()` hooks. - * - * TODO(joyeecheung): consolidate the cache behavior and use this in require(esm). - * @param {string|URL} specifier See {@link resolve}. * @param {string} [parentURL] See {@link resolve}. - * @param {ImportAttributes} [importAttributes] See {@link resolve}. + * @param {ModuleRequest} request See {@link resolve}. * @returns {{ format: string, url: string }} */ - resolveSync(specifier, parentURL, importAttributes = { __proto__: null }) { - specifier = `${specifier}`; - if (resolveHooks.length) { + resolveSync(parentURL, request) { + const specifier = `${request.specifier}`; + const importAttributes = request.attributes ?? kEmptyObject; + + if (syncResolveHooks.length) { // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. - return resolveWithHooks(specifier, parentURL, importAttributes, this.#defaultConditions, - this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); + return resolveWithSyncHooks(specifier, parentURL, importAttributes, this.#defaultConditions, + this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); } - return this.#resolveAndMaybeBlockOnLoaderThread(specifier, { - __proto__: null, + const context = { + ...request, conditions: this.#defaultConditions, parentURL, importAttributes, - }); + __proto__: null, + }; + return this.#resolveAndMaybeBlockOnLoaderThread(specifier, context); } /** * Provide source that is understood by one of Node's translators. Handles customization hooks, * if any. + * @typedef { {format: ModuleFormat, source: ModuleSource }} LoadResult * @param {string} url The URL of the module to be loaded. * @param {object} context Metadata about the module - * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }> | { format: ModuleFormat, source: ModuleSource }} + * @returns {Promise | LoadResult}} */ load(url, context) { - if (loadHooks.length) { - // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. - return this.#loadSync(url, context); + if (this.isForAsyncLoaderHookWorker) { + // TODO(joyeecheung): invoke the synchronous hooks in the default step on loader thread. + return this.#asyncLoaderHooks.load(url, context); } - if (this.#customizations) { - return this.#customizations.load(url, context); - } - - defaultLoad ??= require('internal/modules/esm/load').defaultLoad; - return defaultLoad(url, context); + return this.#loadSync(url, context); } /** @@ -849,8 +782,8 @@ class ModuleLoader { * @returns {{ format: ModuleFormat, source: ModuleSource }} */ #loadAndMaybeBlockOnLoaderThread(url, context) { - if (this.#customizations) { - return this.#customizations.loadSync(url, context); + if (this.#asyncLoaderHooks?.loadSync) { + return this.#asyncLoaderHooks.loadSync(url, context); } defaultLoadSync ??= require('internal/modules/esm/load').defaultLoadSync; return defaultLoadSync(url, context); @@ -861,19 +794,17 @@ class ModuleLoader { * from module.register(), this blocks on the loader thread for it to return synchronously. * * This is here to support `require()` in imported CJS and `module.registerHooks()` hooks. - * - * TODO(joyeecheung): consolidate the cache behavior and use this in require(esm). * @param {string} url See {@link load} * @param {object} [context] See {@link load} * @returns {{ format: ModuleFormat, source: ModuleSource }} */ #loadSync(url, context) { - if (loadHooks.length) { + if (syncLoadHooks.length) { // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. // TODO(joyeecheung): construct the ModuleLoadContext in the loaders directly instead // of converting them from plain objects in the hooks. - return loadWithHooks(url, context.format, context.importAttributes, this.#defaultConditions, - this.#loadAndMaybeBlockOnLoaderThread.bind(this)); + return loadWithSyncHooks(url, context.format, context.importAttributes, this.#defaultConditions, + this.#loadAndMaybeBlockOnLoaderThread.bind(this), validateLoadSloppy); } return this.#loadAndMaybeBlockOnLoaderThread(url, context); } @@ -884,104 +815,30 @@ class ModuleLoader { } } - importMetaInitialize(meta, context) { - if (this.#customizations) { - return this.#customizations.importMetaInitialize(meta, context, this); - } - importMetaInitializer ??= require('internal/modules/esm/initialize_import_meta').initializeImportMeta; - meta = importMetaInitializer(meta, context, this); - return meta; - } - /** + * Block until the async loader hooks have been initialized. + * * No-op when no hooks have been supplied. */ - forceLoadHooks() { - this.#customizations?.forceLoadHooks(); + waitForAsyncLoaderHookInitialization() { + this.#asyncLoaderHooks?.waitForLoaderHookInitialization(); } } ObjectSetPrototypeOf(ModuleLoader.prototype, null); -class CustomizedModuleLoader { - - allowImportMetaResolve = true; - - /** - * Instantiate a module loader that uses user-provided custom loader hooks. - */ - constructor() { - getHooksProxy(); - } - - /** - * Register some loader specifier. - * @param {string} originalSpecifier The specified URL path of the loader to - * be registered. - * @param {string} parentURL The parent URL from where the loader will be - * registered if using it package name as specifier - * @param {any} [data] Arbitrary data to be passed from the custom loader - * (user-land) to the worker. - * @param {any[]} [transferList] Objects in `data` that are changing ownership - * @param {boolean} [isInternal] For internal loaders that should not be publicly exposed. - * @returns {{ format: string, url: URL['href'] }} - */ - register(originalSpecifier, parentURL, data, transferList, isInternal) { - return hooksProxy.makeSyncRequest('register', transferList, originalSpecifier, parentURL, data, isInternal); - } - - /** - * Resolve the location of the module. - * @param {string} originalSpecifier The specified URL path of the module to - * be resolved. - * @param {string} [parentURL] The URL path of the module's parent. - * @param {ImportAttributes} importAttributes Attributes from the import - * statement or expression. - * @returns {{ format: string, url: URL['href'] }} - */ - resolve(originalSpecifier, parentURL, importAttributes) { - return hooksProxy.makeAsyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); - } - - resolveSync(originalSpecifier, parentURL, importAttributes) { - // This happens only as a result of `import.meta.resolve` calls, which must be sync per spec. - return hooksProxy.makeSyncRequest('resolve', undefined, originalSpecifier, parentURL, importAttributes); - } - - /** - * Provide source that is understood by one of Node's translators. - * @param {URL['href']} url The URL/path of the module to be loaded - * @param {object} [context] Metadata about the module - * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }>} - */ - load(url, context) { - return hooksProxy.makeAsyncRequest('load', undefined, url, context); - } - loadSync(url, context) { - return hooksProxy.makeSyncRequest('load', undefined, url, context); - } - - importMetaInitialize(meta, context, loader) { - hooksProxy.importMetaInitialize(meta, context, loader); - } - - forceLoadHooks() { - hooksProxy.waitForWorker(); - } -} - let emittedLoaderFlagWarning = false; /** * A loader instance is used as the main entry point for loading ES modules. Currently, this is a singleton; there is * only one used for loading the main module and everything in its dependency graph, though separate instances of this * class might be instantiated as part of bootstrap for other purposes. + * @param {AsyncLoaderHooksOnLoaderHookWorker|undefined} [asyncLoaderHooks] + * Only provided when run on the loader hook thread. * @returns {ModuleLoader} */ -function createModuleLoader() { - let customizations = null; - // Don't spawn a new worker if custom loaders are disabled. For instance, if - // we're already in a worker thread created by instantiating - // CustomizedModuleLoader; doing so would cause an infinite loop. - if (!forceDefaultLoader()) { +function createModuleLoader(asyncLoaderHooks) { + // Don't spawn a new loader hook worker if we are already in a loader hook worker to avoid infinite recursion. + if (shouldSpawnLoaderHookWorker()) { + assert(asyncLoaderHooks === undefined, 'asyncLoaderHooks should only be provided on the loader hook thread itself'); const userLoaderPaths = getOptionValue('--experimental-loader'); if (userLoaderPaths.length > 0) { if (!emittedLoaderFlagWarning) { @@ -1003,44 +860,85 @@ function createModuleLoader() { ); emittedLoaderFlagWarning = true; } - customizations = new CustomizedModuleLoader(); + const { AsyncLoaderHooksProxiedToLoaderHookWorker } = require('internal/modules/esm/hooks'); + asyncLoaderHooks = new AsyncLoaderHooksProxiedToLoaderHookWorker(); } } - return new ModuleLoader(customizations); + return new ModuleLoader(asyncLoaderHooks); } - +let allowImportMetaResolveParentURL; /** - * Get the HooksProxy instance. If it is not defined, then create a new one. - * @returns {HooksProxy} + * This is only called from the native ImportMetaObjectInitialize function to set up import.meta.resolve + * when import.meta.resolve is accessed for the first time in a module. + * @param {ModuleLoader} loader The cascaded loader to use. Bound when this function gets passed to native land. + * @param {string} moduleURL URL of the module accessing import.meta + * @returns {function(string, URL['href']=): string} The import.meta.resolve function */ -function getHooksProxy() { - if (!hooksProxy) { - const { HooksProxy } = require('internal/modules/esm/hooks'); - hooksProxy = new HooksProxy(); - } - - return hooksProxy; +function createImportMetaResolve(loader, moduleURL) { + /** + * @param {string} specifier The module specifier to resolve. + * @param {URL['href']} [parentURL] Optional parent URL to resolve against. Ignored unless + * `--experimental-import-meta-resolve` is enabled. + * @returns {string} + */ + return function resolve(specifier, parentURL) { + // The second argument is ignored unless --experimental-import-meta-resolve is enabled. + // Even then, if it's not provided, parentURL defaults to the url of the module accessing + // import.meta.resolve. + allowImportMetaResolveParentURL ??= getOptionValue('--experimental-import-meta-resolve'); + parentURL = allowImportMetaResolveParentURL ? (parentURL ?? moduleURL) : moduleURL; + + let url; + try { + ({ url } = loader.resolveSync(parentURL, { specifier, __proto__: null })); + return url; + } catch (error) { + switch (error?.code) { + case 'ERR_UNSUPPORTED_DIR_IMPORT': + case 'ERR_MODULE_NOT_FOUND': + ({ url } = error); + if (url) { + return url; + } + } + throw error; + } + }; } let cascadedLoader; - /** * This is a singleton ESM loader that integrates the loader hooks, if any. - * It it used by other internal built-ins when they need to load ESM code + * It it used by other internal built-ins when they need to load user-land ESM code * while also respecting hooks. * When built-ins need access to this loader, they should do * require('internal/module/esm/loader').getOrInitializeCascadedLoader() * lazily only right before the loader is actually needed, and don't do it * in the top-level, to avoid circular dependencies. + * @param {AsyncLoaderHooksOnLoaderHookWorker|undefined} [asyncLoaderHooks] + * Only provided when run on the loader hook thread. * @returns {ModuleLoader} */ -function getOrInitializeCascadedLoader() { - cascadedLoader ??= createModuleLoader(); +function getOrInitializeCascadedLoader(asyncLoaderHooks) { + if (!cascadedLoader) { + cascadedLoader = createModuleLoader(asyncLoaderHooks); + // import.meta.resolve is not allowed in the async loader hook worker thread. + // So only set up the import.meta.resolve initializer when we are initializing + // the non-loader-hook-thread cascaded loader. When the native land doesn't see it, + // it knows the loader is running on the loader hook thread. + if (!(asyncLoaderHooks?.isForAsyncLoaderHookWorker)) { + setImportMetaResolveInitializer(createImportMetaResolve.bind(null, cascadedLoader)); + } + } return cascadedLoader; } +function isCascadedLoaderInitialized() { + return cascadedLoader !== undefined; +} + /** * Register a single loader programmatically. * @param {string|URL} specifier @@ -1085,7 +983,7 @@ function register(specifier, parentURL = undefined, options) { module.exports = { createModuleLoader, - getHooksProxy, getOrInitializeCascadedLoader, + isCascadedLoaderInitialized, register, }; diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index f032b2eeb14b0b..8459ab5f4721dc 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -3,6 +3,7 @@ const { Array, ArrayPrototypeJoin, + ArrayPrototypePush, ArrayPrototypeSome, FunctionPrototype, ObjectSetPrototypeOf, @@ -36,7 +37,10 @@ const { entry_point_module_private_symbol, }, } = internalBinding('util'); -const { decorateErrorStack, kEmptyObject } = require('internal/util'); +/** + * @typedef {import('./utils.js').ModuleRequestType} ModuleRequestType + */ +const { decorateErrorStack } = require('internal/util'); const { isPromise } = require('internal/util/types'); const { getSourceMapsSupport, @@ -106,8 +110,9 @@ const explainCommonJSGlobalLikeNotDefinedError = (e, url, hasTopLevelAwait) => { }; class ModuleJobBase { - constructor(url, importAttributes, phase, isMain, inspectBrk) { + constructor(loader, url, importAttributes, phase, isMain, inspectBrk) { assert(typeof phase === 'number'); + this.loader = loader; this.importAttributes = importAttributes; this.phase = phase; this.isMain = isMain; @@ -115,13 +120,65 @@ class ModuleJobBase { this.url = url; } + + /** + * Synchronously link the module and its dependencies. + * @param {ModuleRequestType} requestType Type of the module request. + * @returns {ModuleJobBase[]} + */ + syncLink(requestType) { + // Store itself into the cache first before linking in case there are circular + // references in the linking. + this.loader.loadCache.set(this.url, this.type, this); + const moduleRequests = this.module.getModuleRequests(); + // Modules should be aligned with the moduleRequests array in order. + const modules = Array(moduleRequests.length); + const evaluationDepJobs = []; + this.commonJsDeps = Array(moduleRequests.length); + try { + for (let idx = 0; idx < moduleRequests.length; idx++) { + const request = moduleRequests[idx]; + // TODO(joyeecheung): split this into two iterators, one for resolving and one for loading so + // that hooks can pre-fetch sources off-thread. + const job = this.loader.getOrCreateModuleJob(this.url, request, requestType); + debug(`ModuleJobBase.syncLink() ${this.url} -> ${request.specifier}`, job); + assert(!isPromise(job)); + assert(job.module instanceof ModuleWrap); + if (request.phase === kEvaluationPhase) { + ArrayPrototypePush(evaluationDepJobs, job); + } + modules[idx] = job.module; + this.commonJsDeps[idx] = job.module.isCommonJS; + } + 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); + } + + return evaluationDepJobs; + } + + /** + * Ensure that this ModuleJob is moving towards the required phase + * (does not necessarily mean it is ready at that phase - run does that) + * @param {number} phase + */ + ensurePhase(phase, requestType) { + if (this.phase < phase) { + this.phase = phase; + this.linked = this.link(requestType); + if (isPromise(this.linked)) { + PromisePrototypeThen(this.linked, undefined, noop); + } + } + } } /* A ModuleJob tracks the loading of a single Module, and the ModuleJobs of * its dependencies, over time. */ class ModuleJob extends ModuleJobBase { - #loader = null; - /** * @param {ModuleLoader} loader The ESM loader. * @param {string} url URL of the module to be wrapped in ModuleJob. @@ -131,12 +188,11 @@ class ModuleJob extends ModuleJobBase { * @param {boolean} isMain Whether the module is the entry point. * @param {boolean} inspectBrk Whether this module should be evaluated with the * first line paused in the debugger (because --inspect-brk is passed). - * @param {boolean} isForRequireInImportedCJS Whether this is created for require() in imported CJS. + * @param {ModuleRequestType} requestType Type of the module request. */ constructor(loader, url, importAttributes = { __proto__: null }, moduleOrModulePromise, - phase = kEvaluationPhase, isMain, inspectBrk, isForRequireInImportedCJS = false) { - super(url, importAttributes, phase, isMain, inspectBrk); - this.#loader = loader; + phase = kEvaluationPhase, isMain, inspectBrk, requestType) { + super(loader, url, importAttributes, phase, isMain, inspectBrk); // Expose the promise to the ModuleWrap directly for linking below. if (isPromise(moduleOrModulePromise)) { @@ -148,10 +204,12 @@ class ModuleJob extends ModuleJobBase { if (this.phase === kEvaluationPhase) { // Promise for the list of all dependencyJobs. - this.linked = this.#link(); + this.linked = this.link(requestType); // This promise is awaited later anyway, so silence // 'unhandled rejection' warnings. - PromisePrototypeThen(this.linked, undefined, noop); + if (isPromise(this.linked)) { + PromisePrototypeThen(this.linked, undefined, noop); + } } // instantiated == deep dependency jobs wrappers are instantiated, @@ -160,79 +218,69 @@ class ModuleJob extends ModuleJobBase { } /** - * Ensure that this ModuleJob is moving towards the required phase - * (does not necessarily mean it is ready at that phase - run does that) - * @param {number} phase + * @param {ModuleRequestType} requestType Type of the module request. + * @returns {ModuleJobBase[]|Promise} */ - ensurePhase(phase) { - if (this.phase < phase) { - this.phase = phase; - this.linked = this.#link(); - PromisePrototypeThen(this.linked, undefined, noop); + link(requestType) { + if (this.loader.isForAsyncLoaderHookWorker) { + return this.#asyncLink(requestType); } + return this.syncLink(requestType); } /** - * Iterates the module requests and links with the loader. - * @returns {Promise} Dependency module jobs. + * @param {ModuleRequestType} requestType Type of the module request. + * @returns {Promise} */ - async #link() { + async #asyncLink(requestType) { + assert(this.loader.isForAsyncLoaderHookWorker); this.module = await this.modulePromise; assert(this.module instanceof ModuleWrap); - const moduleRequests = this.module.getModuleRequests(); - // Explicitly keeping track of dependency jobs is needed in order - // to flatten out the dependency graph below in `_instantiate()`, - // so that circular dependencies can't cause a deadlock by two of - // these `link` callbacks depending on each other. // Create an ArrayLike to avoid calling into userspace with `.then` // when returned from the async function. - const evaluationDepJobs = Array(moduleRequests.length); - ObjectSetPrototypeOf(evaluationDepJobs, null); - // Modules should be aligned with the moduleRequests array in order. const modulePromises = Array(moduleRequests.length); - // Track each loop for whether it is an evaluation phase or source phase request. - let isEvaluation; - // Iterate with index to avoid calling into userspace with `Symbol.iterator`. - for ( - let idx = 0, eidx = 0; - // Use the let-scoped eidx value to update the executionDepJobs length at the end of the loop. - idx < moduleRequests.length || (evaluationDepJobs.length = eidx, false); - idx++, eidx += isEvaluation - ) { - const { specifier, phase, attributes } = moduleRequests[idx]; - isEvaluation = phase === kEvaluationPhase; - // TODO(joyeecheung): resolve all requests first, then load them in another - // loop so that hooks can pre-fetch sources off-thread. - const dependencyJobPromise = this.#loader.getModuleJobForImport( - specifier, this.url, attributes, phase, - ); + const evaluationDepJobs = []; + this.commonJsDeps = Array(moduleRequests.length); + for (let idx = 0; idx < moduleRequests.length; idx++) { + const request = moduleRequests[idx]; + // Explicitly keeping track of dependency jobs is needed in order + // to flatten out the dependency graph below in `asyncInstantiate()`, + // so that circular dependencies can't cause a deadlock by two of + // these `link` callbacks depending on each other. + // TODO(joyeecheung): split this into two iterators, one for resolving and one for loading so + // that hooks can pre-fetch sources off-thread. + const dependencyJobPromise = this.loader.getOrCreateModuleJob(this.url, request, requestType); const modulePromise = PromisePrototypeThen(dependencyJobPromise, (job) => { - debug(`async link() ${this.url} -> ${specifier}`, job); - if (phase === kEvaluationPhase) { - evaluationDepJobs[eidx] = job; + debug(`ModuleJob.asyncLink() ${this.url} -> ${request.specifier}`, job); + if (request.phase === kEvaluationPhase) { + ArrayPrototypePush(evaluationDepJobs, job); } return job.modulePromise; }); modulePromises[idx] = modulePromise; } - const modules = await SafePromiseAllReturnArrayLike(modulePromises); - this.module.link(modules); + for (let idx = 0; idx < moduleRequests.length; idx++) { + this.commonJsDeps[idx] = modules[idx].isCommonJS; + } + this.module.link(modules); return evaluationDepJobs; } #instantiate() { if (this.instantiated === undefined) { - this.instantiated = this.#_instantiate(); + this.instantiated = this.#asyncInstantiate(); } return this.instantiated; } - async #_instantiate() { + async #asyncInstantiate() { const jobsInGraph = new SafeSet(); + // TODO(joyeecheung): if it's not on the async loader thread, consider this already + // linked. const addJobsToDependencyGraph = async (moduleJob) => { debug(`async addJobsToDependencyGraph() ${this.url}`, moduleJob); @@ -240,7 +288,7 @@ class ModuleJob extends ModuleJobBase { return; } jobsInGraph.add(moduleJob); - const dependencyJobs = await moduleJob.linked; + const dependencyJobs = isPromise(moduleJob.linked) ? await moduleJob.linked : moduleJob.linked; return SafePromiseAllReturnVoid(dependencyJobs, addJobsToDependencyGraph); }; await addJobsToDependencyGraph(this); @@ -263,31 +311,19 @@ class ModuleJob extends ModuleJobBase { StringPrototypeIncludes(e.message, ' does not provide an export named')) { const splitStack = StringPrototypeSplit(e.stack, '\n', 2); - const parentFileUrl = RegExpPrototypeSymbolReplace( - /:\d+$/, - splitStack[0], - '', - ); const { 1: childSpecifier, 2: name } = RegExpPrototypeExec( /module '(.*)' does not provide an export named '(.+)'/, e.message); - const { url: childFileURL } = await this.#loader.resolve( - childSpecifier, - parentFileUrl, - kEmptyObject, - ); - let format; - try { - // This might throw for non-CommonJS modules because we aren't passing - // in the import attributes and some formats require them; but we only - // care about CommonJS for the purposes of this error message. - ({ format } = - await this.#loader.load(childFileURL)); - } catch { - // Continue regardless of error. + const moduleRequests = this.module.getModuleRequests(); + let isCommonJS = false; + for (let i = 0; i < moduleRequests.length; ++i) { + if (moduleRequests[i].specifier === childSpecifier) { + isCommonJS = this.commonJsDeps[i]; + break; + } } - if (format === 'commonjs') { + if (isCommonJS) { const importStatement = splitStack[1]; // TODO(@ctavan): The original error stack only provides the single // line which causes the error. For multi-line import statements we @@ -394,8 +430,6 @@ class ModuleJob extends ModuleJobBase { * TODO(joyeecheung): consolidate this with the isForRequireInImportedCJS variant of ModuleJob. */ class ModuleJobSync extends ModuleJobBase { - #loader = null; - /** * @param {ModuleLoader} loader The ESM loader. * @param {string} url URL of the module to be wrapped in ModuleJob. @@ -407,57 +441,26 @@ class ModuleJobSync extends ModuleJobBase { * first line paused in the debugger (because --inspect-brk is passed). */ constructor(loader, url, importAttributes, moduleWrap, phase = kEvaluationPhase, isMain, - inspectBrk) { - super(url, importAttributes, phase, isMain, inspectBrk, true); + inspectBrk, requestType) { + super(loader, url, importAttributes, phase, isMain, inspectBrk); - this.#loader = loader; this.module = moduleWrap; assert(this.module instanceof ModuleWrap); this.linked = undefined; this.type = importAttributes.type; if (phase === kEvaluationPhase) { - this.#link(); + this.linked = this.link(requestType); } } /** - * Ensure that this ModuleJob is at the required phase - * @param {number} phase + * @param {ModuleRequestType} requestType Type of the module request. + * @returns {ModuleJobBase[]} */ - ensurePhase(phase) { - if (this.phase < phase) { - this.phase = phase; - this.#link(); - } - } - - #link() { - // Store itself into the cache first before linking in case there are circular - // references in the linking. - this.#loader.loadCache.set(this.url, this.type, this); - try { - const moduleRequests = this.module.getModuleRequests(); - // Modules should be aligned with the moduleRequests array in order. - const modules = Array(moduleRequests.length); - const evaluationDepJobs = Array(moduleRequests.length); - let j = 0; - for (let i = 0; i < moduleRequests.length; ++i) { - const { specifier, attributes, phase } = moduleRequests[i]; - const job = this.#loader.getModuleJobForRequire(specifier, this.url, attributes, phase); - modules[i] = job.module; - if (phase === kEvaluationPhase) { - evaluationDepJobs[j++] = job; - } - } - evaluationDepJobs.length = j; - this.module.link(modules); - this.linked = evaluationDepJobs; - } 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); - } + link(requestType) { + // Synchronous linking is always used for ModuleJobSync. + return this.syncLink(requestType); } get modulePromise() { diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 147d96bda8098f..1716328c7a9899 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -57,7 +57,7 @@ const { } = require('internal/errors').codes; const { maybeCacheSourceMap } = require('internal/source_map/source_map_cache'); const moduleWrap = internalBinding('module_wrap'); -const { ModuleWrap } = moduleWrap; +const { ModuleWrap, kEvaluationPhase } = moduleWrap; // Lazy-loading to avoid circular dependencies. let getSourceSync; @@ -100,16 +100,19 @@ function errPath(url) { } // Strategy for loading a standard JavaScript module. -translators.set('module', function moduleStrategy(url, source, isMain) { +translators.set('module', function moduleStrategy(url, translateContext, parentURL) { + let { source } = translateContext; + const isMain = (parentURL === undefined); assertBufferSource(source, true, 'load'); source = stringify(source); - debug(`Translating StandardModule ${url}`); + debug(`Translating StandardModule ${url}`, translateContext); const { compileSourceTextModule } = require('internal/modules/esm/utils'); const context = isMain ? { isMain } : undefined; const module = compileSourceTextModule(url, source, this, context); return module; }); +const { requestTypes: { kRequireInImportedCJS } } = require('internal/modules/esm/utils'); /** * 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. @@ -129,7 +132,6 @@ function loadCJSModule(module, source, url, filename, isMain) { if (sourceMapURL) { maybeCacheSourceMap(url, source, module, false, sourceURL, sourceMapURL); } - const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); const __dirname = dirname(filename); // eslint-disable-next-line func-name-matching,func-style @@ -152,7 +154,8 @@ function loadCJSModule(module, source, url, filename, isMain) { // FIXME(node:59666) Currently, the ESM loader re-invents require() here for imported CJS and this // requires a separate cache to be populated as well as introducing several quirks. This is not ideal. - const job = cascadedLoader.getModuleJobForRequireInImportedCJS(specifier, url, importAttributes); + const request = { specifier, attributes: importAttributes, phase: kEvaluationPhase, __proto__: null }; + const job = cascadedLoader.getOrCreateModuleJob(url, request, kRequireInImportedCJS); job.runSync(); let mod = cjsCache.get(job.url); assert(job.module, `Imported CJS module ${url} failed to load module ${job.url} using require() due to race condition`); @@ -183,7 +186,9 @@ function loadCJSModule(module, source, url, filename, isMain) { specifier = `${pathToFileURL(path)}`; } } - const { url: resolvedURL } = cascadedLoader.resolveSync(specifier, url, kEmptyObject); + + const request = { specifier, __proto__: null, attributes: kEmptyObject }; + const { url: resolvedURL } = cascadedLoader.resolveSync(url, request); return urlToFilename(resolvedURL); }); setOwnProperty(requireFn, 'main', process.mainModule); @@ -199,20 +204,23 @@ const cjsCache = new SafeMap(); /** * Creates a ModuleWrap object for a CommonJS module. * @param {string} url - The URL of the module. - * @param {string} source - The source code of the module. - * @param {boolean} isMain - Whether the module is the main module. - * @param {string} format - Format of the module. + * @param {{ format: ModuleFormat, source: ModuleSource }} translateContext Context for the translator + * @param {string|undefined} parentURL URL of the module initiating the module loading for the first time. + * Undefined if it's the entry point. * @param {typeof loadCJSModule} [loadCJS] - The function to load the CommonJS module. * @returns {ModuleWrap} The ModuleWrap object for the CommonJS module. */ -function createCJSModuleWrap(url, source, isMain, format, loadCJS = loadCJSModule) { - debug(`Translating CJSModule ${url}`); +function createCJSModuleWrap(url, translateContext, parentURL, loadCJS = loadCJSModule) { + debug(`Translating CJSModule ${url}`, translateContext); + const { format: sourceFormat } = translateContext; + let { source } = translateContext; + 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); - const { exportNames, module } = cjsPreparseModuleExports(filename, source, format); + const { exportNames, module } = cjsPreparseModuleExports(filename, source, sourceFormat); cjsCache.set(url, module); const wrapperNames = [...exportNames]; @@ -263,11 +271,12 @@ function createCJSModuleWrap(url, source, isMain, format, loadCJS = loadCJSModul /** * Creates a ModuleWrap object for a CommonJS module without source texts. * @param {string} url - The URL of the module. - * @param {boolean} isMain - Whether the module is the main module. + * @param {string|undefined} parentURL - URL of the parent module, if any. * @returns {ModuleWrap} The ModuleWrap object for the CommonJS module. */ -function createCJSNoSourceModuleWrap(url, isMain) { +function createCJSNoSourceModuleWrap(url, parentURL) { debug(`Translating CJSModule without source ${url}`); + const isMain = (parentURL === undefined); const filename = urlToFilename(url); @@ -301,54 +310,60 @@ function createCJSNoSourceModuleWrap(url, isMain) { }, module); } -translators.set('commonjs-sync', function requireCommonJS(url, source, isMain) { +translators.set('commonjs-sync', function requireCommonJS(url, translateContext, parentURL) { initCJSParseSync(); - return createCJSModuleWrap(url, source, isMain, 'commonjs', (module, source, url, filename, isMain) => { - assert(module === CJSModule._cache[filename]); - wrapModuleLoad(filename, null, isMain); - }); + return createCJSModuleWrap(url, translateContext, parentURL, loadCJSModuleWithModuleLoad); }); // Handle CommonJS modules referenced by `require` calls. // This translator function must be sync, as `require` is sync. -translators.set('require-commonjs', (url, source, isMain) => { +translators.set('require-commonjs', (url, translateContext, parentURL) => { initCJSParseSync(); assert(cjsParse); - return createCJSModuleWrap(url, source, isMain, 'commonjs'); + return createCJSModuleWrap(url, translateContext, parentURL); }); // Handle CommonJS modules referenced by `require` calls. // This translator function must be sync, as `require` is sync. -translators.set('require-commonjs-typescript', (url, source, isMain) => { +translators.set('require-commonjs-typescript', (url, translateContext, parentURL) => { assert(cjsParse); - const code = stripTypeScriptModuleTypes(stringify(source), url); - return createCJSModuleWrap(url, code, isMain, 'commonjs-typescript'); + translateContext.source = stripTypeScriptModuleTypes(stringify(translateContext.source), url); + return createCJSModuleWrap(url, translateContext, parentURL); }); +// This goes through Module._load to accommodate monkey-patchers. +function loadCJSModuleWithModuleLoad(module, source, url, filename, isMain) { + assert(module === CJSModule._cache[filename]); + wrapModuleLoad(filename, undefined, isMain); +} + // Handle CommonJS modules referenced by `import` statements or expressions, // or as the initial entry point when the ESM loader handles a CommonJS entry. -translators.set('commonjs', function commonjsStrategy(url, source, isMain) { +translators.set('commonjs', function commonjsStrategy(url, translateContext, parentURL) { if (!cjsParse) { initCJSParseSync(); } // For backward-compatibility, it's possible to return a nullish value for - // CJS source associated with a file: URL. In this case, the source is - // obtained by calling the monkey-patchable CJS loader. - const cjsLoader = source == null ? (module, source, url, filename, isMain) => { - assert(module === CJSModule._cache[filename]); - wrapModuleLoad(filename, undefined, isMain); - } : loadCJSModule; + // CJS source associated with a `file:` URL - that usually means the source is not + // customized (is loaded by default load) or the hook author wants it to be reloaded + // through CJS routine. In this case, the source is obtained by calling the + // monkey-patchable CJS loader. + // TODO(joyeecheung): just use wrapModuleLoad and let the CJS loader + // invoke the off-thread hooks. Use a special parent to avoid invoking in-thread + // hooks twice. + const shouldReloadByCJSLoader = (translateContext.shouldBeReloadedByCJSLoader || translateContext.source == null); + const cjsLoader = shouldReloadByCJSLoader ? loadCJSModuleWithModuleLoad : loadCJSModule; try { // We still need to read the FS to detect the exports. - source ??= readFileSync(new URL(url), 'utf8'); + translateContext.source ??= readFileSync(new URL(url), 'utf8'); } catch { // Continue regardless of error. } - return createCJSModuleWrap(url, source, isMain, 'commonjs', cjsLoader); + return createCJSModuleWrap(url, translateContext, parentURL, cjsLoader); }); /** @@ -373,22 +388,6 @@ function cjsEmplaceModuleCacheEntry(filename, parent) { return cjsMod; } -/** - * Emplace a CJS module cache entry for the given URL. - * @param {string} url The module URL - * @param {CJSModule} parent The parent CJS module - * @returns {CJSModule|undefined} the cached CJS module entry, undefined if url cannot be used to identify a CJS entry. - */ -exports.cjsEmplaceModuleCacheEntryForURL = function cjsEmplaceModuleCacheEntryForURL(url, parent) { - const filename = urlToFilename(url); - if (!filename) { - return; - } - const cjsModule = cjsEmplaceModuleCacheEntry(filename, parent); - cjsCache.set(url, cjsModule); - return cjsModule; -}; - /** * Pre-parses a CommonJS module's exports and re-exports. * @param {string} filename - The filename of the module. @@ -454,8 +453,8 @@ function cjsPreparseModuleExports(filename, source, format) { // Strategy for loading a node builtin CommonJS module that isn't // through normal resolution -translators.set('builtin', function builtinStrategy(url) { - debug(`Translating BuiltinModule ${url}`); +translators.set('builtin', function builtinStrategy(url, translateContext) { + debug(`Translating BuiltinModule ${url}`, translateContext); // Slice 'node:' scheme const id = StringPrototypeSlice(url, 5); const module = loadBuiltinModule(id, url); @@ -468,7 +467,8 @@ translators.set('builtin', function builtinStrategy(url) { }); // Strategy for loading a JSON file -translators.set('json', function jsonStrategy(url, source) { +translators.set('json', function jsonStrategy(url, translateContext) { + let { source } = translateContext; assertBufferSource(source, true, 'load'); debug(`Loading JSONModule ${url}`); const pathname = StringPrototypeStartsWith(url, 'file:') ? @@ -536,10 +536,11 @@ translators.set('json', function jsonStrategy(url, source) { * >} [[Instance]] slot proxy for WebAssembly Module Record */ const wasmInstances = new SafeWeakMap(); -translators.set('wasm', function(url, source) { +translators.set('wasm', function(url, translateContext) { + const { source } = translateContext; assertBufferSource(source, false, 'load'); - debug(`Translating WASMModule ${url}`); + debug(`Translating WASMModule ${url}`, translateContext); let compiled; try { @@ -626,9 +627,10 @@ translators.set('wasm', function(url, source) { }); // Strategy for loading a addon -translators.set('addon', function translateAddon(url, source, isMain) { +translators.set('addon', function translateAddon(url, translateContext, parentURL) { emitExperimentalWarning('Importing addons'); + const { source } = translateContext; // The addon must be loaded from file system with dlopen. Assert // the source is null. if (source !== null) { @@ -639,23 +641,25 @@ translators.set('addon', function translateAddon(url, source, isMain) { source); } - debug(`Translating addon ${url}`); + debug(`Translating addon ${url}`, translateContext); - return createCJSNoSourceModuleWrap(url, isMain); + return createCJSNoSourceModuleWrap(url, parentURL); }); // Strategy for loading a commonjs TypeScript module -translators.set('commonjs-typescript', function(url, source, isMain) { +translators.set('commonjs-typescript', function(url, translateContext, parentURL) { + const { source } = translateContext; assertBufferSource(source, true, 'load'); - const code = stripTypeScriptModuleTypes(stringify(source), url); - debug(`Translating TypeScript ${url}`); - return FunctionPrototypeCall(translators.get('commonjs'), this, url, code, isMain); + debug(`Translating TypeScript ${url}`, translateContext); + translateContext.source = stripTypeScriptModuleTypes(stringify(source), url); + return FunctionPrototypeCall(translators.get('commonjs'), this, url, translateContext, parentURL); }); // Strategy for loading an esm TypeScript module -translators.set('module-typescript', function(url, source, isMain) { +translators.set('module-typescript', function(url, translateContext, parentURL) { + const { source } = translateContext; assertBufferSource(source, true, 'load'); - const code = stripTypeScriptModuleTypes(stringify(source), url); - debug(`Translating TypeScript ${url}`); - return FunctionPrototypeCall(translators.get('module'), this, url, code, isMain); + debug(`Translating TypeScript ${url}`, translateContext); + translateContext.source = stripTypeScriptModuleTypes(stringify(source), url); + return FunctionPrototypeCall(translators.get('module'), this, url, translateContext, parentURL); }); diff --git a/lib/internal/modules/esm/utils.js b/lib/internal/modules/esm/utils.js index 4a4279459341e8..27d96fae86d935 100644 --- a/lib/internal/modules/esm/utils.js +++ b/lib/internal/modules/esm/utils.js @@ -5,6 +5,7 @@ const { ObjectFreeze, SafeSet, SafeWeakMap, + Symbol, } = primordials; const { @@ -35,13 +36,8 @@ const { ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; const { getOptionValue } = require('internal/options'); -const { - loadPreloadModules, - initializeFrozenIntrinsics, -} = require('internal/process/pre_execution'); const { emitExperimentalWarning, - getCWDURL, kEmptyObject, } = require('internal/util'); const assert = require('internal/assert'); @@ -187,27 +183,14 @@ function registerModule(referrer, registry) { } /** - * Proxy the import meta handling to the default loader for source text modules. - * @param {Record} meta - The import.meta object to initialize. - * @param {ModuleWrap} wrap - The ModuleWrap of the SourceTextModule where `import.meta` is referenced. - * @returns {object} - */ -function defaultInitializeImportMetaForModule(meta, wrap) { - const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); - return cascadedLoader.importMetaInitialize(meta, { url: wrap.url, isMain: wrap.isMain }); -} - -/** - * Defines the `import.meta` object for a given module. + * Initializes the `import.meta` object for a given module. This is only called when the module + * is compiled with custom callbacks. Ordinary user-land source text modules are + * initialized by the native DefaultImportMetaObjectInitializer directly. * @param {symbol} symbol - Reference to the module. * @param {Record} meta - The import.meta object to initialize. * @param {ModuleWrap} wrap - The ModuleWrap of the SourceTextModule where `import.meta` is referenced. */ function initializeImportMetaObject(symbol, meta, wrap) { - if (symbol === source_text_module_default_hdo) { - defaultInitializeImportMetaForModule(meta, wrap); - return; - } const data = moduleRegistries.get(symbol); assert(data, `import.meta registry not found for ${wrap.url}`); const { initializeImportMeta, callbackReferrer } = data; @@ -283,15 +266,14 @@ async function importModuleDynamicallyCallback(referrerSymbol, specifier, phase, throw new ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING(); } -let _forceDefaultLoader = false; +let _shouldSpawnLoaderHookWorker = true; /** * Initializes handling of ES modules. - * This is configured during pre-execution. Specifically it's set to true for - * the loader worker in internal/main/worker_thread.js. - * @param {boolean} [forceDefaultLoader] - A boolean indicating disabling custom loaders. + * @param {boolean} [shouldSpawnLoaderHookWorker] Whether the custom loader worker + * should be spawned later. */ -function initializeESM(forceDefaultLoader = false) { - _forceDefaultLoader = forceDefaultLoader; +function initializeESM(shouldSpawnLoaderHookWorker = true) { + _shouldSpawnLoaderHookWorker = shouldSpawnLoaderHookWorker; initializeDefaultConditions(); // Setup per-realm callbacks that locate data or callbacks that we keep // track of for different ESM modules. @@ -300,46 +282,12 @@ function initializeESM(forceDefaultLoader = false) { } /** - * Determine whether custom loaders are disabled and it is forced to use the - * default loader. + * Determine whether the custom loader worker should be spawned when initializing + * the singleton ESM loader. * @returns {boolean} */ -function forceDefaultLoader() { - return _forceDefaultLoader; -} - -/** - * Register module customization hooks. - * @returns {Promise} - */ -async function initializeHooks() { - const customLoaderURLs = getOptionValue('--experimental-loader'); - - const { Hooks } = require('internal/modules/esm/hooks'); - const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); - - const hooks = new Hooks(); - cascadedLoader.setCustomizations(hooks); - - // We need the loader customizations to be set _before_ we start invoking - // `--require`, otherwise loops can happen because a `--require` script - // might call `register(...)` before we've installed ourselves. These - // global values are magically set in `setupUserModules` just for us and - // we call them in the correct order. - // N.B. This block appears here specifically in order to ensure that - // `--require` calls occur before `--loader` ones do. - loadPreloadModules(); - initializeFrozenIntrinsics(); - - const parentURL = getCWDURL().href; - for (let i = 0; i < customLoaderURLs.length; i++) { - await hooks.register( - customLoaderURLs[i], - parentURL, - ); - } - - return hooks; +function shouldSpawnLoaderHookWorker() { + return _shouldSpawnLoaderHookWorker; } /** @@ -372,13 +320,22 @@ function compileSourceTextModule(url, source, cascadedLoader, context = kEmptyOb return wrap; } + +const kImportInImportedESM = Symbol('kImportInImportedESM'); +const kImportInRequiredESM = Symbol('kImportInRequiredESM'); +const kRequireInImportedCJS = Symbol('kRequireInImportedCJS'); + +/** + * @typedef {kImportInImportedESM | kImportInRequiredESM | kRequireInImportedCJS} ModuleRequestType + */ +const requestTypes = { kImportInImportedESM, kImportInRequiredESM, kRequireInImportedCJS }; + module.exports = { registerModule, initializeESM, - initializeHooks, getDefaultConditions, getConditionsSet, - loaderWorkerId: 'internal/modules/esm/worker', - forceDefaultLoader, + shouldSpawnLoaderHookWorker, compileSourceTextModule, + requestTypes, }; diff --git a/lib/internal/modules/esm/worker.js b/lib/internal/modules/esm/worker.js index 6624b740d0a98b..fa5fa87d20efb1 100644 --- a/lib/internal/modules/esm/worker.js +++ b/lib/internal/modules/esm/worker.js @@ -21,12 +21,63 @@ const { isTypedArray, } = require('util/types'); +const { getOptionValue } = require('internal/options'); +const { + loadPreloadModules, + initializeModuleLoaders, + initializeFrozenIntrinsics, +} = require('internal/process/pre_execution'); const { receiveMessageOnPort } = require('internal/worker/io'); const { WORKER_TO_MAIN_THREAD_NOTIFICATION, } = require('internal/modules/esm/shared_constants'); -const { initializeHooks } = require('internal/modules/esm/utils'); const { isMarkedAsUntransferable } = require('internal/buffer'); +const { getCWDURL } = require('internal/util'); +const { isCascadedLoaderInitialized, getOrInitializeCascadedLoader } = require('internal/modules/esm/loader'); +const { AsyncLoaderHooksOnLoaderHookWorker } = require('internal/modules/esm/hooks'); + +/** + * Register asynchronus 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. + * When no asynchronous loader hook is registered, the loader hook worker is not spawned and module + * loading is entiredly done in-thread. + * @returns {Promise} + */ +async function initializeAsyncLoaderHooksOnLoaderHookWorker() { + const customLoaderURLs = getOptionValue('--experimental-loader'); + + // The worker thread spawned for handling asynchronous loader hooks should not + // further spawn other hook threads or there will be an infinite recursion. + const shouldSpawnLoaderHookWorker = false; + // The worker thread for async loader hooks will preload user modules itself in + // initializeAsyncLoaderHooksOnLoaderHookWorker(). + const shouldPreloadModules = false; + initializeModuleLoaders({ shouldSpawnLoaderHookWorker, shouldPreloadModules }); + + assert(!isCascadedLoaderInitialized(), + 'ModuleLoader should be initialized in initializeAsyncLoaderHooksOnLoaderHookWorker()'); + const asyncLoaderHooks = new AsyncLoaderHooksOnLoaderHookWorker(); + getOrInitializeCascadedLoader(asyncLoaderHooks); + + // We need the async loader hooks to be set _before_ we start invoking + // `--require`, otherwise loops can happen because a `--require` script + // might call `register(...)` before we've installed ourselves. These + // global values are magically set in `initializeModuleLoaders` just for us and + // we call them in the correct order. + // N.B. This block appears here specifically in order to ensure that + // `--require` calls occur before `--loader` ones do. + loadPreloadModules(); + initializeFrozenIntrinsics(); + + const parentURL = getCWDURL().href; + for (let i = 0; i < customLoaderURLs.length; i++) { + await asyncLoaderHooks.register(customLoaderURLs[i], parentURL); + } + + return asyncLoaderHooks; +} /** * Transfers an ArrayBuffer, TypedArray, or DataView to a worker thread. @@ -82,7 +133,7 @@ function wrapMessage(status, body) { } /** - * Initializes a worker thread for a customized module loader. + * Initializes the loader hooks worker thread with customized asynchronous module loading hooks. * @param {SharedArrayBuffer} lock - The lock used to synchronize communication between the worker and the main thread. * @param {MessagePort} syncCommPort - The message port used for synchronous communication between the worker and the * main thread. @@ -90,7 +141,7 @@ function wrapMessage(status, body) { * @returns {Promise} A promise that resolves when the worker thread has been initialized. */ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { - let hooks; + let asyncLoaderHooks; let initializationError; let hasInitializationError = false; @@ -106,9 +157,8 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { }; } - try { - hooks = await initializeHooks(); + asyncLoaderHooks = await initializeAsyncLoaderHooksOnLoaderHookWorker(); } catch (exception) { // If there was an error while parsing and executing a user loader, for example if because a // loader contained a syntax error, then we need to send the error to the main thread so it can @@ -178,7 +228,7 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { // the main thread. let hasError = false; let shouldRemoveGlobalErrorHandler = false; - assert(typeof hooks[method] === 'function'); + assert(typeof asyncLoaderHooks[method] === 'function', `${method} is not implemented in the loader worker`); if (port == null && !hasUncaughtExceptionCaptureCallback()) { // When receiving sync messages, we want to unlock the main thread when there's an exception. process.on('uncaughtException', errorHandler); @@ -198,7 +248,7 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { let response; try { - response = await ReflectApply(hooks[method], hooks, args); + response = await ReflectApply(asyncLoaderHooks[method], asyncLoaderHooks, args); } catch (exception) { hasError = true; response = exception; diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js index 43a131f57cb187..af8fcd28c5259e 100644 --- a/lib/internal/modules/package_json_reader.js +++ b/lib/internal/modules/package_json_reader.js @@ -350,7 +350,7 @@ function findPackageJSON(specifier, base = 'data:') { try { // TODO(@JakobJingleheimer): Detect whether findPackageJSON is being used within a loader - // (possibly piggyback on `allowImportMetaResolve`) + // (possibly piggyback on `isForAsyncLoaderHookWorker` from the loader?) and if so: // - When inside, use the default resolve // - (I think it's impossible to use the chain because of re-entry & a deadlock from atomics). // - When outside, use cascadedLoader.resolveSync (not implemented yet, but the pieces exist). diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js index 2a9ef56d156808..2974459755ec25 100644 --- a/lib/internal/modules/run_main.js +++ b/lib/internal/modules/run_main.js @@ -67,7 +67,7 @@ function shouldUseESMLoader(mainPath) { if (mainPath && StringPrototypeEndsWith(mainPath, '.wasm')) { return true; } if (!mainPath || StringPrototypeEndsWith(mainPath, '.cjs')) { return false; } - if (getOptionValue('--experimental-strip-types')) { + if (getOptionValue('--strip-types')) { if (!mainPath || StringPrototypeEndsWith(mainPath, '.cts')) { return false; } // This will likely change in the future to start with commonjs loader by default if (mainPath && StringPrototypeEndsWith(mainPath, '.mts')) { return true; } @@ -96,7 +96,7 @@ async function asyncRunEntryPointWithESMLoader(callback) { await cascadedLoader.import(userImports[i], parentURL, kEmptyObject); } } else { - cascadedLoader.forceLoadHooks(); + cascadedLoader.waitForAsyncLoaderHookInitialization(); } await callback(cascadedLoader); } catch (err) { diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index fc5f7d09ac33a1..f2407949c2a1b6 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -84,7 +84,7 @@ function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { const baseUrl = pathToFileURL(module.filename).href; if (shouldUseModuleEntryPoint(name, body)) { - return getOptionValue('--experimental-strip-types') ? + return getOptionValue('--strip-types') ? evalTypeScriptModuleEntryPoint(body, print) : evalModuleEntryPoint(body, print); } diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js index f93b7dae1bca9b..283ec72d388572 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -47,6 +47,8 @@ function prepareMainThreadExecution(expandArgv1 = false, initializeModules = tru expandArgv1, initializeModules, isMainThread: true, + shouldSpawnLoaderHookWorker: initializeModules, + shouldPreloadModules: initializeModules, }); } @@ -55,15 +57,20 @@ function prepareTestRunnerMainExecution(loadUserModules = true) { expandArgv1: false, initializeModules: true, isMainThread: true, - forceDefaultLoader: !loadUserModules, + shouldSpawnLoaderHookWorker: loadUserModules, + shouldPreloadModules: loadUserModules, }); } function prepareWorkerThreadExecution() { prepareExecution({ expandArgv1: false, - initializeModules: false, isMainThread: false, + // Module loader initialization in workers are delayed until the worker thread + // is ready for execution. + initializeModules: false, + shouldSpawnLoaderHookWorker: false, + shouldPreloadModules: false, }); } @@ -74,7 +81,7 @@ function prepareShadowRealmExecution() { setupDebugEnv(); // Disable custom loaders in ShadowRealm. - setupUserModules(true); + initializeModuleLoaders({ shouldSpawnLoaderHookWorker: false, shouldPreloadModules: false }); const { privateSymbols: { host_defined_option_symbol, @@ -96,7 +103,7 @@ function prepareShadowRealmExecution() { } function prepareExecution(options) { - const { expandArgv1, initializeModules, isMainThread, forceDefaultLoader } = options; + const { expandArgv1, initializeModules, isMainThread, shouldSpawnLoaderHookWorker, shouldPreloadModules } = options; refreshRuntimeOptions(); @@ -154,8 +161,9 @@ function prepareExecution(options) { assert(!initializeModules); } + setupVmModules(); if (initializeModules) { - setupUserModules(forceDefaultLoader); + initializeModuleLoaders({ shouldSpawnLoaderHookWorker, shouldPreloadModules }); } // This has to be done after the user module loader is initialized, @@ -165,6 +173,21 @@ function prepareExecution(options) { return mainEntry; } +function setupVmModules() { + // Patch the vm module when --experimental-vm-modules is on. + // Please update the comments in vm.js when this block changes. + // TODO(joyeecheung): move this to vm.js? + if (getOptionValue('--experimental-vm-modules')) { + const { + Module, SourceTextModule, SyntheticModule, + } = require('internal/vm/module'); + const vm = require('vm'); + vm.Module = Module; + vm.SourceTextModule = SourceTextModule; + vm.SyntheticModule = SyntheticModule; + } +} + function setupHttpProxy() { // This normalized from both --use-env-proxy and NODE_USE_ENV_PROXY settings. if (!getOptionValue('--use-env-proxy')) { @@ -186,22 +209,32 @@ function setupHttpProxy() { // existing libraries that sets the global dispatcher or monkey patches the global agent. } -function setupUserModules(forceDefaultLoader = false) { - initializeCJSLoader(); - initializeESMLoader(forceDefaultLoader); +function initializeModuleLoaders(options) { + const { shouldSpawnLoaderHookWorker, shouldPreloadModules } = options; + // Initialize certain special module.Module properties and the CJS conditions. + const { initializeCJS } = require('internal/modules/cjs/loader'); + initializeCJS(); + // Initialize the ESM loader and a few module callbacks. + // If shouldSpawnLoaderHookWorker is true, later when the ESM loader is instantiated on-demand, + // it will spawn a loader worker thread to handle async custom loader hooks. + const { initializeESM } = require('internal/modules/esm/utils'); + initializeESM(shouldSpawnLoaderHookWorker); + const { hasStartedUserCJSExecution, hasStartedUserESMExecution, } = require('internal/modules/helpers'); + // At this point, no user module has been executed yet. assert(!hasStartedUserCJSExecution()); assert(!hasStartedUserESMExecution()); + if (getEmbedderOptions().hasEmbedderPreload) { runEmbedderPreload(); } // Do not enable preload modules if custom loaders are disabled. // For example, loader workers are responsible for doing this themselves. // And preload modules are not supported in ShadowRealm as well. - if (!forceDefaultLoader) { + if (shouldPreloadModules) { loadPreloadModules(); } // Need to be done after --require setup. @@ -365,7 +398,7 @@ function setupQuic() { function setupWebStorage() { if (getEmbedderOptions().noBrowserGlobals || - !getOptionValue('--webstorage')) { + !getOptionValue('--experimental-webstorage')) { return; } @@ -638,28 +671,6 @@ function initializePermission() { } } -function initializeCJSLoader() { - const { initializeCJS } = require('internal/modules/cjs/loader'); - initializeCJS(); -} - -function initializeESMLoader(forceDefaultLoader) { - const { initializeESM } = require('internal/modules/esm/utils'); - initializeESM(forceDefaultLoader); - - // Patch the vm module when --experimental-vm-modules is on. - // Please update the comments in vm.js when this block changes. - if (getOptionValue('--experimental-vm-modules')) { - const { - Module, SourceTextModule, SyntheticModule, - } = require('internal/vm/module'); - const vm = require('vm'); - vm.Module = Module; - vm.SourceTextModule = SourceTextModule; - vm.SyntheticModule = SyntheticModule; - } -} - function initializeSourceMapsHandlers() { const { setSourceMapsSupport, @@ -729,7 +740,7 @@ function getHeapSnapshotFilename(diagnosticDir) { } module.exports = { - setupUserModules, + initializeModuleLoaders, prepareMainThreadExecution, prepareWorkerThreadExecution, prepareShadowRealmExecution, diff --git a/lib/internal/readline/interface.js b/lib/internal/readline/interface.js index 46674883381392..08f7aaa9e3e7e8 100644 --- a/lib/internal/readline/interface.js +++ b/lib/internal/readline/interface.js @@ -659,7 +659,17 @@ class Interface extends InterfaceConstructor { [kInsertString](c) { this[kBeforeEdit](this.line, this.cursor); if (!this.isCompletionEnabled) { - this.line += c; + if (this.cursor < this.line.length) { + const beg = StringPrototypeSlice(this.line, 0, this.cursor); + const end = StringPrototypeSlice( + this.line, + this.cursor, + this.line.length, + ); + this.line = beg + c + end; + } else { + this.line += c; + } this.cursor += c.length; this[kWriteToOutput](c); return; diff --git a/lib/internal/streams/fast-utf8-stream.js b/lib/internal/streams/fast-utf8-stream.js index 3bfcc494d17b5c..25f4771d052a2a 100644 --- a/lib/internal/streams/fast-utf8-stream.js +++ b/lib/internal/streams/fast-utf8-stream.js @@ -9,13 +9,14 @@ const { AtomicsWait, Int32Array, MathMax, + Number, SymbolDispose, - globalThis: { - Number, - SharedArrayBuffer, - }, } = primordials; +const { + constructSharedArrayBuffer, +} = require('internal/util'); + const { Buffer, } = require('buffer'); @@ -49,7 +50,7 @@ const { const BUSY_WRITE_TIMEOUT = 100; const kEmptyBuffer = Buffer.allocUnsafe(0); -const kNil = new Int32Array(new SharedArrayBuffer(4)); +const kNil = new Int32Array(constructSharedArrayBuffer(4)); function sleep(ms) { // Also filters out NaN, non-number types, including empty strings, but allows bigints diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index d4096a30994f44..aab3be8a9e3560 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -853,7 +853,7 @@ function emitReadable_(stream) { // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. function maybeReadMore(stream, state) { - if ((state[kState] & (kReadingMore | kConstructed)) === kConstructed) { + if ((state[kState] & (kReadingMore | kReading | kConstructed)) === kConstructed) { state[kState] |= kReadingMore; process.nextTick(maybeReadMore_, stream, state); } diff --git a/lib/internal/test_runner/coverage.js b/lib/internal/test_runner/coverage.js index 80811dffb1e1d0..8fa9c872568d1e 100644 --- a/lib/internal/test_runner/coverage.js +++ b/lib/internal/test_runner/coverage.js @@ -37,7 +37,7 @@ const { }, } = require('internal/errors'); const { matchGlobPattern } = require('internal/fs/glob'); -const { kMockSearchParam } = require('internal/test_runner/mock/mock'); +const { constants: { kMockSearchParam } } = require('internal/test_runner/mock/loader'); const kCoverageFileRegex = /^coverage-(\d+)-(\d{13})-(\d+)\.json$/; const kIgnoreRegex = /\/\* node:coverage ignore next (?\d+ )?\*\//; diff --git a/lib/internal/test_runner/mock/loader.js b/lib/internal/test_runner/mock/loader.js index ddde5599df509a..a7a22539be3093 100644 --- a/lib/internal/test_runner/mock/loader.js +++ b/lib/internal/test_runner/mock/loader.js @@ -1,77 +1,24 @@ 'use strict'; const { - AtomicsNotify, - AtomicsStore, JSONStringify, SafeMap, } = primordials; -const { - kBadExportsMessage, - kMockSearchParam, - kMockSuccess, - kMockExists, - kMockUnknownMessage, -} = require('internal/test_runner/mock/mock'); + +const kMockSearchParam = 'node-test-mock'; +const kBadExportsMessage = 'Cannot create mock because named exports ' + + 'cannot be applied to the provided default export.'; + const { URL, URLParse } = require('internal/url'); let debug = require('internal/util/debuglog').debuglog('test_runner', (fn) => { debug = fn; }); -// TODO(cjihrig): The mocks need to be thread aware because the exports are -// evaluated on the thread that creates the mock. Before marking this API as -// stable, one of the following issues needs to be implemented: -// https://github.com/nodejs/node/issues/49472 -// or https://github.com/nodejs/node/issues/52219 - const mocks = new SafeMap(); -async function initialize(data) { - data?.port.on('message', ({ type, payload }) => { - debug('mock loader received message type "%s" with payload %o', type, payload); - - if (type === 'node:test:register') { - const { baseURL } = payload; - const mock = mocks.get(baseURL); - - if (mock?.active) { - debug('already mocking "%s"', baseURL); - sendAck(payload.ack, kMockExists); - return; - } - - const localVersion = mock?.localVersion ?? 0; - - debug('new mock version %d for "%s"', localVersion, baseURL); - mocks.set(baseURL, { - __proto__: null, - active: true, - cache: payload.cache, - exportNames: payload.exportNames, - format: payload.format, - hasDefaultExport: payload.hasDefaultExport, - localVersion, - url: baseURL, - }); - sendAck(payload.ack); - } else if (type === 'node:test:unregister') { - const mock = mocks.get(payload.baseURL); - - if (mock !== undefined) { - mock.active = false; - mock.localVersion++; - } - - sendAck(payload.ack); - } else { - sendAck(payload.ack, kMockUnknownMessage); - } - }); -} - -async function resolve(specifier, context, nextResolve) { +function resolve(specifier, context, nextResolve) { debug('resolve hook entry, specifier = "%s", context = %o', specifier, context); - const nextResolveResult = await nextResolve(specifier, context); + const nextResolveResult = nextResolve(specifier, context); const mockSpecifier = nextResolveResult.url; const mock = mocks.get(mockSpecifier); @@ -95,7 +42,7 @@ async function resolve(specifier, context, nextResolve) { return { __proto__: null, url: href, format: nextResolveResult.format }; } -async function load(url, context, nextLoad) { +function load(url, context, nextLoad) { debug('load hook entry, url = "%s", context = %o', url, context); const parsedURL = URLParse(url); if (parsedURL) { @@ -105,7 +52,7 @@ async function load(url, context, nextLoad) { const baseURL = parsedURL ? parsedURL.href : url; const mock = mocks.get(baseURL); - const original = await nextLoad(url, context); + const original = nextLoad(url, context); debug('load hook, mock = %o', mock); if (mock?.active !== true) { return original; @@ -130,14 +77,14 @@ async function load(url, context, nextLoad) { __proto__: null, format, shortCircuit: true, - source: await createSourceFromMock(mock, format), + source: createSourceFromMock(mock, format), }; debug('load hook finished, result = %o', result); return result; } -async function createSourceFromMock(mock, format) { +function createSourceFromMock(mock, format) { // Create mock implementation from provided exports. const { exportNames, hasDefaultExport, url } = mock; const useESM = format === 'module' || format === 'module-typescript'; @@ -196,9 +143,12 @@ if (module.exports === null || typeof module.exports !== 'object') { return source; } -function sendAck(buf, status = kMockSuccess) { - AtomicsStore(buf, 0, status); - AtomicsNotify(buf, 0); -} - -module.exports = { initialize, load, resolve }; +module.exports = { + hooks: { __proto__: null, load, resolve }, + mocks, + constants: { + __proto__: null, + kBadExportsMessage, + kMockSearchParam, + }, +}; diff --git a/lib/internal/test_runner/mock/mock.js b/lib/internal/test_runner/mock/mock.js index 8a63c7757d1752..c018d1690fc9fb 100644 --- a/lib/internal/test_runner/mock/mock.js +++ b/lib/internal/test_runner/mock/mock.js @@ -2,12 +2,9 @@ const { ArrayPrototypePush, ArrayPrototypeSlice, - AtomicsStore, - AtomicsWait, Error, FunctionPrototypeBind, FunctionPrototypeCall, - Int32Array, ObjectDefineProperty, ObjectGetOwnPropertyDescriptor, ObjectGetPrototypeOf, @@ -19,9 +16,6 @@ const { SafeMap, StringPrototypeSlice, StringPrototypeStartsWith, - globalThis: { - SharedArrayBuffer, - }, } = primordials; const { codes: { @@ -54,19 +48,10 @@ const { validateOneOf, } = require('internal/validators'); const { MockTimers } = require('internal/test_runner/mock/mock_timers'); -const { strictEqual, notStrictEqual } = require('assert'); const { Module } = require('internal/modules/cjs/loader'); -const { MessageChannel } = require('worker_threads'); const { _load, _nodeModulePaths, _resolveFilename, isBuiltin } = Module; function kDefaultFunction() {} const enableModuleMocking = getOptionValue('--experimental-test-module-mocks'); -const kMockSearchParam = 'node-test-mock'; -const kMockSuccess = 1; -const kMockExists = 2; -const kMockUnknownMessage = 3; -const kWaitTimeout = 5_000; -const kBadExportsMessage = 'Cannot create mock because named exports ' + - 'cannot be applied to the provided default export.'; const kSupportedFormats = [ 'builtin', 'commonjs-typescript', @@ -76,6 +61,11 @@ const kSupportedFormats = [ 'module', ]; let sharedModuleState; +const { + hooks: mockHooks, + mocks, + constants: { kBadExportsMessage, kMockSearchParam }, +} = require('internal/test_runner/mock/loader'); class MockFunctionContext { #calls; @@ -201,8 +191,8 @@ class MockModuleContext { hasDefaultExport, namedExports, sharedState, + specifier, }) { - const ack = new Int32Array(new SharedArrayBuffer(4)); const config = { __proto__: null, cache, @@ -218,7 +208,6 @@ class MockModuleContext { this.#sharedState = sharedState; this.#restore = { __proto__: null, - ack, baseURL, cached: fullPath in Module._cache, format, @@ -226,20 +215,29 @@ class MockModuleContext { value: Module._cache[fullPath], }; - sharedState.loaderPort.postMessage({ - __proto__: null, - type: 'node:test:register', - payload: { + const mock = mocks.get(baseURL); + + if (mock?.active) { + debug('already mocking "%s"', baseURL); + throw new ERR_INVALID_STATE( + `Cannot mock '${specifier}'. The module is already mocked.`, + ); + } else { + const localVersion = mock?.localVersion ?? 0; + + debug('new mock version %d for "%s"', localVersion, baseURL); + mocks.set(baseURL, { __proto__: null, - ack, - baseURL, + url: baseURL, cache, exportNames: ObjectKeys(namedExports), hasDefaultExport, format, - }, - }); - waitForAck(ack); + localVersion, + active: true, + }); + } + delete Module._cache[fullPath]; sharedState.mockExports.set(baseURL, { __proto__: null, @@ -261,17 +259,12 @@ class MockModuleContext { Module._cache[this.#restore.fullPath] = this.#restore.value; } - AtomicsStore(this.#restore.ack, 0, 0); - this.#sharedState.loaderPort.postMessage({ - __proto__: null, - type: 'node:test:unregister', - payload: { - __proto__: null, - ack: this.#restore.ack, - baseURL: this.#restore.baseURL, - }, - }); - waitForAck(this.#restore.ack); + const mock = mocks.get(this.#restore.baseURL); + + if (mock !== undefined) { + mock.active = false; + mock.localVersion++; + } this.#sharedState.mockMap.delete(this.#restore.baseURL); this.#sharedState.mockMap.delete(this.#restore.fullPath); @@ -653,9 +646,8 @@ class MockTracker { // If the caller is already a file URL, use it as is. Otherwise, convert it. const hasFileProtocol = StringPrototypeStartsWith(filename, 'file://'); const caller = hasFileProtocol ? filename : pathToFileURL(filename).href; - const { format, url } = sharedState.moduleLoader.resolveSync( - mockSpecifier, caller, null, - ); + const request = { __proto__: null, specifier: mockSpecifier, attributes: kEmptyObject }; + const { format, url } = sharedState.moduleLoader.resolveSync(caller, request); debug('module mock, url = "%s", format = "%s", caller = "%s"', url, format, caller); if (format) { // Format is not yet known for ambiguous files when detection is enabled. validateOneOf(format, 'format', kSupportedFormats); @@ -828,20 +820,13 @@ function setupSharedModuleState() { if (sharedModuleState === undefined) { const { mock } = require('test'); const mockExports = new SafeMap(); - const { port1, port2 } = new MessageChannel(); + const { registerHooks } = require('internal/modules/customization_hooks'); const moduleLoader = esmLoader.getOrInitializeCascadedLoader(); - moduleLoader.register( - 'internal/test_runner/mock/loader', - 'node:', - { __proto__: null, port: port2 }, - [port2], - true, - ); + registerHooks(mockHooks); sharedModuleState = { __proto__: null, - loaderPort: port1, mockExports, mockMap: new SafeMap(), moduleLoader, @@ -941,13 +926,6 @@ function findMethodOnPrototypeChain(instance, methodName) { return descriptor; } -function waitForAck(buf) { - const result = AtomicsWait(buf, 0, 0, kWaitTimeout); - - notStrictEqual(result, 'timed-out', 'test mocking synchronization failed'); - strictEqual(buf[0], kMockSuccess); -} - function ensureNodeScheme(specifier) { if (!StringPrototypeStartsWith(specifier, 'node:')) { return `node:${specifier}`; @@ -962,10 +940,5 @@ if (!enableModuleMocking) { module.exports = { ensureNodeScheme, - kBadExportsMessage, - kMockSearchParam, - kMockSuccess, - kMockExists, - kMockUnknownMessage, MockTracker, }; diff --git a/lib/internal/test_runner/utils.js b/lib/internal/test_runner/utils.js index dabfccf6c4f4a4..937c52b08493ea 100644 --- a/lib/internal/test_runner/utils.js +++ b/lib/internal/test_runner/utils.js @@ -61,7 +61,7 @@ const kRegExpPattern = /^\/(.*)\/([a-z]*)$/; const kPatterns = ['test', 'test/**/*', 'test-*', '*[._-]test']; const kFileExtensions = ['js', 'mjs', 'cjs']; -if (getOptionValue('--experimental-strip-types')) { +if (getOptionValue('--strip-types')) { ArrayPrototypePush(kFileExtensions, 'ts', 'mts', 'cts'); } const kDefaultPattern = `**/{${ArrayPrototypeJoin(kPatterns, ',')}}.{${ArrayPrototypeJoin(kFileExtensions, ',')}}`; diff --git a/lib/internal/tls/common.js b/lib/internal/tls/common.js index 66331d2d9999e9..0f7fd0747ea779 100644 --- a/lib/internal/tls/common.js +++ b/lib/internal/tls/common.js @@ -82,10 +82,11 @@ function SecureContext(secureProtocol, secureOptions, minVersion, maxVersion) { throw new ERR_TLS_PROTOCOL_VERSION_CONFLICT(maxVersion, secureProtocol); } + const minV = toV('minimum', minVersion, tls.DEFAULT_MIN_VERSION); + const maxV = toV('maximum', maxVersion, tls.DEFAULT_MAX_VERSION); + this.context = new NativeSecureContext(); - this.context.init(secureProtocol, - toV('minimum', minVersion, tls.DEFAULT_MIN_VERSION), - toV('maximum', maxVersion, tls.DEFAULT_MAX_VERSION)); + this.context.init(secureProtocol, minV, maxV); if (secureOptions) { validateInteger(secureOptions, 'secureOptions'); diff --git a/lib/internal/util.js b/lib/internal/util.js index 6f9c43c26f0dc9..1018cded979b24 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -8,6 +8,7 @@ const { Error, ErrorCaptureStackTrace, FunctionPrototypeCall, + FunctionPrototypeSymbolHasInstance, NumberParseInt, ObjectDefineProperties, ObjectDefineProperty, @@ -58,6 +59,7 @@ const { } = require('internal/errors'); const { signals } = internalBinding('constants').os; const { + constructSharedArrayBuffer, guessHandleType: _guessHandleType, defineLazyProperties, privateSymbols: { @@ -96,7 +98,7 @@ function isError(e) { // An error could be an instance of Error while not being a native error // or could be from a different realm and not be instance of Error but still // be a native error. - return isNativeError(e) || e instanceof Error; + return isNativeError(e) || FunctionPrototypeSymbolHasInstance(Error, e); } // Keep a list of deprecation codes that have been warned on so we only warn on @@ -953,6 +955,7 @@ module.exports = { assertTypeScript, assignFunctionName, cachedResult, + constructSharedArrayBuffer, convertToValidSignal, createClassWrapper, decorateErrorStack, diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index d27b7df778f100..83c254c3d6c464 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -72,6 +72,7 @@ const { ObjectPrototype, ObjectPrototypeHasOwnProperty, ObjectPrototypePropertyIsEnumerable, + ObjectPrototypeToString, ObjectSeal, ObjectSetPrototypeOf, Promise, @@ -111,7 +112,6 @@ const { StringPrototypeSplit, StringPrototypeStartsWith, StringPrototypeToLowerCase, - StringPrototypeTrim, StringPrototypeValueOf, SymbolIterator, SymbolPrototypeToString, @@ -1223,6 +1223,7 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { const filter = ctx.showHidden ? ALL_PROPERTIES : ONLY_ENUMERABLE; let extrasType = kObjectType; + let extraKeys; // Iterators and the rest are split to reduce checks. // We have to check all values in case the constructor is set to null. @@ -1278,6 +1279,11 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { // bound function is required to reconstruct missing information. formatter = FunctionPrototypeBind(formatTypedArray, null, bound, size); extrasType = kArrayExtrasType; + + if (ctx.showHidden) { + extraKeys = ['BYTES_PER_ELEMENT', 'length', 'byteLength', 'byteOffset', 'buffer']; + typedArray = true; + } } else if (isMapIterator(value)) { keys = getKeys(value, ctx.showHidden); braces = getIteratorBraces('Map', tag); @@ -1347,14 +1353,14 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { formatter = formatArrayBuffer; } else if (keys.length === 0 && protoProps === undefined) { return prefix + - `{ byteLength: ${formatNumber(ctx.stylize, value.byteLength, false)} }`; + `{ [byteLength]: ${formatNumber(ctx.stylize, value.byteLength, false)} }`; } braces[0] = `${prefix}{`; - ArrayPrototypeUnshift(keys, 'byteLength'); + extraKeys = ['byteLength']; } else if (isDataView(value)) { braces[0] = `${getPrefix(constructor, tag, 'DataView')}{`; // .buffer goes last, it's not a primitive like the others. - ArrayPrototypeUnshift(keys, 'byteLength', 'byteOffset', 'buffer'); + extraKeys = ['byteLength', 'byteOffset', 'buffer']; } else if (isPromise(value)) { braces[0] = `${getPrefix(constructor, tag, 'Promise')}{`; formatter = formatPromise; @@ -1404,6 +1410,18 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { const indentationLvl = ctx.indentationLvl; try { output = formatter(ctx, value, recurseTimes); + if (extraKeys !== undefined) { + for (i = 0; i < extraKeys.length; i++) { + let formatted; + try { + formatted = formatExtraProperties(ctx, value, recurseTimes, extraKeys[i], typedArray); + } catch { + const tempValue = { [extraKeys[i]]: value.buffer[extraKeys[i]] }; + formatted = formatExtraProperties(ctx, tempValue, recurseTimes, extraKeys[i], typedArray); + } + ArrayPrototypePush(output, formatted); + } + } for (i = 0; i < keys.length; i++) { ArrayPrototypePush( output, @@ -1703,13 +1721,19 @@ function getDuplicateErrorFrameRanges(frames) { } function getStackString(ctx, error) { - if (error.stack) { - if (typeof error.stack === 'string') { - return error.stack; + let stack; + try { + stack = error.stack; + } catch { + // If stack is getter that throws, we ignore the error. + } + if (stack) { + if (typeof stack === 'string') { + return stack; } ctx.seen.push(error); ctx.indentationLvl += 4; - const result = formatValue(ctx, error.stack); + const result = formatValue(ctx, stack); ctx.indentationLvl -= 4; ctx.seen.pop(); return `${ErrorPrototypeToString(error)}\n ${result}`; @@ -1805,18 +1829,6 @@ function improveStack(stack, constructor, name, tag) { return stack; } -function removeDuplicateErrorKeys(ctx, keys, err, stack) { - if (!ctx.showHidden && keys.length !== 0) { - for (const name of ['name', 'message', 'stack']) { - const index = ArrayPrototypeIndexOf(keys, name); - // Only hide the property if it's a string and if it's part of the original stack - if (index !== -1 && (typeof err[name] !== 'string' || StringPrototypeIncludes(stack, err[name]))) { - ArrayPrototypeSplice(keys, index, 1); - } - } - } -} - function markNodeModules(ctx, line) { let tempLine = ''; let lastPos = 0; @@ -1899,10 +1911,49 @@ function safeGetCWD() { } function formatError(err, constructor, tag, ctx, keys) { - const name = err.name != null ? err.name : 'Error'; - let stack = getStackString(ctx, err); + let message, name, stack; + try { + stack = getStackString(ctx, err); + } catch { + return ObjectPrototypeToString(err); + } + + let messageIsGetterThatThrows = false; + try { + message = err.message; + } catch { + messageIsGetterThatThrows = true; + } + let nameIsGetterThatThrows = false; + try { + name = err.name; + } catch { + nameIsGetterThatThrows = true; + } - removeDuplicateErrorKeys(ctx, keys, err, stack); + if (!ctx.showHidden && keys.length !== 0) { + const index = ArrayPrototypeIndexOf(keys, 'stack'); + if (index !== -1) { + ArrayPrototypeSplice(keys, index, 1); + } + + if (!messageIsGetterThatThrows) { + const index = ArrayPrototypeIndexOf(keys, 'message'); + // Only hide the property if it's a string and if it's part of the original stack + if (index !== -1 && (typeof message !== 'string' || StringPrototypeIncludes(stack, message))) { + ArrayPrototypeSplice(keys, index, 1); + } + } + + if (!nameIsGetterThatThrows) { + const index = ArrayPrototypeIndexOf(keys, 'name'); + // Only hide the property if it's a string and if it's part of the original stack + if (index !== -1 && (typeof name !== 'string' || StringPrototypeIncludes(stack, name))) { + ArrayPrototypeSplice(keys, index, 1); + } + } + } + name ??= 'Error'; if ('cause' in err && (keys.length === 0 || !ArrayPrototypeIncludes(keys, 'cause'))) { @@ -1910,17 +1961,22 @@ function formatError(err, constructor, tag, ctx, keys) { } // Print errors aggregated into AggregateError - if (ArrayIsArray(err.errors) && + try { + const errors = err.errors; + if (ArrayIsArray(errors) && (keys.length === 0 || !ArrayPrototypeIncludes(keys, 'errors'))) { - ArrayPrototypePush(keys, 'errors'); + ArrayPrototypePush(keys, 'errors'); + } + } catch { + // If errors is a getter that throws, we ignore the error. } stack = improveStack(stack, constructor, name, tag); // Ignore the error message if it's contained in the stack. - let pos = (err.message && StringPrototypeIndexOf(stack, err.message)) || -1; + let pos = (message && StringPrototypeIndexOf(stack, message)) || -1; if (pos !== -1) - pos += err.message.length; + pos += message.length; // Wrap the error in brackets in case it has no stack trace. const stackStart = StringPrototypeIndexOf(stack, '\n at', pos); if (stackStart === -1) { @@ -2263,11 +2319,15 @@ function formatArrayBuffer(ctx, value) { } if (hexSlice === undefined) hexSlice = uncurryThis(require('buffer').Buffer.prototype.hexSlice); - let str = StringPrototypeTrim(RegExpPrototypeSymbolReplace( - /(.{2})/g, - hexSlice(buffer, 0, MathMin(ctx.maxArrayLength, buffer.length)), - '$1 ', - )); + const rawString = hexSlice(buffer, 0, MathMin(ctx.maxArrayLength, buffer.length)); + let str = ''; + let i = 0; + for (; i < rawString.length - 2; i += 2) { + str += `${rawString[i]}${rawString[i + 1]} `; + } + if (rawString.length > 0) { + str += `${rawString[i]}${rawString[i + 1]}`; + } const remaining = buffer.length - ctx.maxArrayLength; if (remaining > 0) str += ` ... ${remaining} more byte${remaining > 1 ? 's' : ''}`; @@ -2294,7 +2354,7 @@ function formatArray(ctx, value, recurseTimes) { return output; } -function formatTypedArray(value, length, ctx, ignored, recurseTimes) { +function formatTypedArray(value, length, ctx) { const maxLength = MathMin(MathMax(0, ctx.maxArrayLength), length); const remaining = value.length - maxLength; const output = new Array(maxLength); @@ -2307,22 +2367,6 @@ function formatTypedArray(value, length, ctx, ignored, recurseTimes) { if (remaining > 0) { output[maxLength] = remainingText(remaining); } - if (ctx.showHidden) { - // .buffer goes last, it's not a primitive like the others. - // All besides `BYTES_PER_ELEMENT` are actually getters. - ctx.indentationLvl += 2; - for (const key of [ - 'BYTES_PER_ELEMENT', - 'length', - 'byteLength', - 'byteOffset', - 'buffer', - ]) { - const str = formatValue(ctx, value[key], recurseTimes, true); - ArrayPrototypePush(output, `[${key}]: ${str}`); - } - ctx.indentationLvl -= 2; - } return output; } @@ -2470,12 +2514,21 @@ function formatPromise(ctx, value, recurseTimes) { return output; } +function formatExtraProperties(ctx, value, recurseTimes, key, typedArray) { + ctx.indentationLvl += 2; + const str = formatValue(ctx, value[key], recurseTimes, typedArray); + ctx.indentationLvl -= 2; + + // These entries are mainly getters. Should they be formatted like getters? + const name = ctx.stylize(`[${key}]`, 'string'); + return `${name}: ${str}`; +} + function formatProperty(ctx, value, recurseTimes, key, type, desc, original = value) { let name, str; let extra = ' '; - desc ||= ObjectGetOwnPropertyDescriptor(value, key) || - { value: value[key], enumerable: true }; + desc ??= ObjectGetOwnPropertyDescriptor(value, key); if (desc.value !== undefined) { const diff = (ctx.compact !== true || type !== kObjectType) ? 2 : 3; ctx.indentationLvl += diff; diff --git a/lib/internal/v8/startup_snapshot.js b/lib/internal/v8/startup_snapshot.js index 01204b96239406..af5fb07925dc15 100644 --- a/lib/internal/v8/startup_snapshot.js +++ b/lib/internal/v8/startup_snapshot.js @@ -115,8 +115,8 @@ function setDeserializeMainFunction(callback, data) { }); } +initializeCallbacks(); module.exports = { - initializeCallbacks, runDeserializeCallbacks, throwIfBuildingSnapshot, // Exposed to require('v8').startupSnapshot diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js index 457d26d27692a9..6403a1f76710f9 100644 --- a/lib/internal/vm/module.js +++ b/lib/internal/vm/module.js @@ -13,6 +13,7 @@ const { ObjectPrototypeHasOwnProperty, ObjectSetPrototypeOf, PromisePrototypeThen, + PromiseReject, PromiseResolve, ReflectApply, SafePromiseAllReturnArrayLike, @@ -208,27 +209,31 @@ class Module { this[kWrap].instantiate(); } - async evaluate(options = kEmptyObject) { - validateThisInternalField(this, kWrap, 'Module'); - validateObject(options, 'options'); - - let timeout = options.timeout; - if (timeout === undefined) { - timeout = -1; - } else { - validateUint32(timeout, 'options.timeout', true); - } - const { breakOnSigint = false } = options; - validateBoolean(breakOnSigint, 'options.breakOnSigint'); - const status = this[kWrap].getStatus(); - if (status !== kInstantiated && - status !== kEvaluated && - status !== kErrored) { - throw new ERR_VM_MODULE_STATUS( - 'must be one of linked, evaluated, or errored', - ); + evaluate(options = kEmptyObject) { + try { + validateThisInternalField(this, kWrap, 'Module'); + validateObject(options, 'options'); + + let timeout = options.timeout; + if (timeout === undefined) { + timeout = -1; + } else { + validateUint32(timeout, 'options.timeout', true); + } + const { breakOnSigint = false } = options; + validateBoolean(breakOnSigint, 'options.breakOnSigint'); + const status = this[kWrap].getStatus(); + if (status !== kInstantiated && + status !== kEvaluated && + status !== kErrored) { + throw new ERR_VM_MODULE_STATUS( + 'must be one of linked, evaluated, or errored', + ); + } + return this[kWrap].evaluate(timeout, breakOnSigint); + } catch (e) { + return PromiseReject(e); } - await this[kWrap].evaluate(timeout, breakOnSigint); } [customInspectSymbol](depth, options) { diff --git a/lib/internal/worker.js b/lib/internal/worker.js index ed940b5e2c4208..08e87d07e7eb80 100644 --- a/lib/internal/worker.js +++ b/lib/internal/worker.js @@ -24,7 +24,6 @@ const { SymbolFor, TypedArrayPrototypeFill, Uint32Array, - globalThis: { SharedArrayBuffer }, } = primordials; const EventEmitter = require('events'); @@ -62,7 +61,10 @@ const { const { createMainThreadPort, destroyMainThreadPort } = require('internal/worker/messaging'); const { deserializeError } = require('internal/error_serdes'); const { fileURLToPath, isURL, pathToFileURL } = require('internal/url'); -const { kEmptyObject } = require('internal/util'); +const { + constructSharedArrayBuffer, + kEmptyObject, +} = require('internal/util'); const { validateArray, validateString, validateObject, validateNumber } = require('internal/validators'); const { throwIfBuildingSnapshot, @@ -106,9 +108,8 @@ let cwdCounter; const environmentData = new SafeMap(); -// SharedArrayBuffers can be disabled with --enable-sharedarraybuffer-per-context. -if (isMainThread && SharedArrayBuffer !== undefined) { - cwdCounter = new Uint32Array(new SharedArrayBuffer(4)); +if (isMainThread) { + cwdCounter = new Uint32Array(constructSharedArrayBuffer(4)); const originalChdir = process.chdir; process.chdir = function(path) { AtomicsAdd(cwdCounter, 0, 1); diff --git a/lib/internal/worker/messaging.js b/lib/internal/worker/messaging.js index c4fcde5a3d4b58..d1573b870ef113 100644 --- a/lib/internal/worker/messaging.js +++ b/lib/internal/worker/messaging.js @@ -6,18 +6,17 @@ const { AtomicsWaitAsync, Int32Array, SafeMap, - globalThis, } = primordials; -const { - SharedArrayBuffer, -} = globalThis; - const { isMainThread, threadId: currentThreadId, } = internalBinding('worker'); +const { + constructSharedArrayBuffer, +} = require('internal/util'); + const { codes: { ERR_WORKER_MESSAGING_ERRORED, @@ -203,7 +202,7 @@ async function postMessageToThread(threadId, value, transferList, timeout) { throw new ERR_WORKER_MESSAGING_SAME_THREAD(); } - const memory = new SharedArrayBuffer(WORKER_MESSAGING_SHARED_DATA); + const memory = constructSharedArrayBuffer(WORKER_MESSAGING_SHARED_DATA); const status = new Int32Array(memory); const promise = AtomicsWaitAsync(status, WORKER_MESSAGING_STATUS_INDEX, 0, timeout).value; diff --git a/lib/perf_hooks.js b/lib/perf_hooks.js index 2b9bd92c82ee21..18e979630e0e19 100644 --- a/lib/perf_hooks.js +++ b/lib/perf_hooks.js @@ -28,6 +28,8 @@ const { } = require('internal/histogram'); const monitorEventLoopDelay = require('internal/perf/event_loop_delay'); +const { eventLoopUtilization } = require('internal/perf/event_loop_utilization'); +const timerify = require('internal/perf/timerify'); module.exports = { Performance, @@ -38,6 +40,8 @@ module.exports = { PerformanceObserverEntryList, PerformanceResourceTiming, monitorEventLoopDelay, + eventLoopUtilization, + timerify, createHistogram, performance, }; diff --git a/lib/util.js b/lib/util.js index 67e22c7d391d29..7c75615e5c70da 100644 --- a/lib/util.js +++ b/lib/util.js @@ -84,7 +84,7 @@ const { getOptionValue } = require('internal/options'); const binding = internalBinding('util'); const { - deprecate, + deprecate: internalDeprecate, getLazy, getSystemErrorMap, getSystemErrorName: internalErrorName, @@ -459,13 +459,18 @@ function getCallSites(frameCount = 10, options) { return binding.getCallSites(frameCount); }; +// Public util.deprecate API +function deprecate(fn, msg, code, { modifyPrototype } = {}) { + return internalDeprecate(fn, msg, code, undefined, modifyPrototype); +} + // Keep the `exports =` so that various functions can still be monkeypatched module.exports = { _errnoException, _exceptionWithHostPort, - _extend: deprecate(_extend, - 'The `util._extend` API is deprecated. Please use Object.assign() instead.', - 'DEP0060'), + _extend: internalDeprecate(_extend, + 'The `util._extend` API is deprecated. Please use Object.assign() instead.', + 'DEP0060'), callbackify, debug: debuglog, debuglog, @@ -479,9 +484,9 @@ module.exports = { getSystemErrorMessage, inherits, inspect, - isArray: deprecate(ArrayIsArray, - 'The `util.isArray` API is deprecated. Please use `Array.isArray()` instead.', - 'DEP0044'), + isArray: internalDeprecate(ArrayIsArray, + 'The `util.isArray` API is deprecated. Please use `Array.isArray()` instead.', + 'DEP0044'), isDeepStrictEqual(a, b, skipPrototype) { if (internalDeepEqual === undefined) { internalDeepEqual = require('internal/util/comparisons').isDeepStrictEqual; diff --git a/lib/v8.js b/lib/v8.js index 47f694103719aa..54395945aa1787 100644 --- a/lib/v8.js +++ b/lib/v8.js @@ -136,6 +136,7 @@ const { kTotalGlobalHandlesSizeIndex, kUsedGlobalHandlesSizeIndex, kExternalMemoryIndex, + kTotalAllocatedBytes, // Properties for heap spaces statistics buffer extraction. kHeapSpaces, @@ -246,6 +247,7 @@ function getHeapStatistics() { total_global_handles_size: buffer[kTotalGlobalHandlesSizeIndex], used_global_handles_size: buffer[kUsedGlobalHandlesSizeIndex], external_memory: buffer[kExternalMemoryIndex], + total_allocated_bytes: buffer[kTotalAllocatedBytes], }; } diff --git a/node.gyp b/node.gyp index e22dce67ebf6c7..1ded5514a56576 100644 --- a/node.gyp +++ b/node.gyp @@ -425,6 +425,7 @@ 'test/cctest/test_quic_tokens.cc', ], 'node_cctest_inspector_sources': [ + 'test/cctest/inspector/test_network_requests_buffer.cc', 'test/cctest/inspector/test_node_protocol.cc', 'test/cctest/test_inspector_socket.cc', 'test/cctest/test_inspector_socket_server.cc', @@ -490,6 +491,19 @@ ['clang==0 and OS!="win"', { 'cflags': [ '-Wno-restrict', ], }], + # TODO(joyeecheung): investigate if it breaks addons. + # ['OS=="mac"', { + # 'xcode_settings': { + # 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden + # 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES' # -fvisibility-inlines-hidden + # }, + # }], + # ['OS!="win" or clang==1', { + # 'cflags': [ + # '-fvisibility=hidden', + # '-fvisibility-inlines-hidden' + # ], + # }], # Pointer authentication for ARM64. ['target_arch=="arm64"', { 'target_conditions': [ @@ -739,10 +753,6 @@ ], }], ], - }, { - 'sources': [ - 'src/node_snapshot_stub.cc' - ], }], [ 'OS in "linux freebsd openharmony" and ' 'target_arch=="x64"', { @@ -876,6 +886,9 @@ 'NODE_ARCH="<(target_arch)"', 'NODE_PLATFORM="<(OS)"', 'NODE_WANT_INTERNALS=1', + # Define NAPI_EXPERIMENTAL to enable Node-API experimental function symbols being exposed. + 'NAPI_EXPERIMENTAL=1', + 'NODE_API_EXPERIMENTAL_NO_WARNING=1', # Warn when using deprecated V8 APIs. 'V8_DEPRECATION_WARNINGS=1', 'NODE_OPENSSL_SYSTEM_CERT_PATH="<(openssl_system_ca_path)"', @@ -904,7 +917,7 @@ [ 'node_builtin_modules_path!=""', { 'defines': [ 'NODE_BUILTIN_MODULES_PATH="<(node_builtin_modules_path)"' ] }], - [ 'node_shared=="true"', { + [ 'node_shared=="true" or node_use_node_snapshot!="true"', { 'sources': [ 'src/node_snapshot_stub.cc', ] diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000000000..143955fa33ee44 --- /dev/null +++ b/shell.nix @@ -0,0 +1,81 @@ +{ + pkgs ? import ./tools/nix/pkgs.nix { }, + loadJSBuiltinsDynamically ? true, # Load `lib/**.js` from disk instead of embedding + ncu-path ? null, # Provide this if you want to use a local version of NCU + icu ? pkgs.icu, + sharedLibDeps ? import ./tools/nix/sharedLibDeps.nix { inherit pkgs; }, + ccache ? pkgs.ccache, + ninja ? pkgs.ninja, + devTools ? import ./tools/nix/devTools.nix { inherit pkgs ncu-path; }, + benchmarkTools ? import ./tools/nix/benchmarkTools.nix { inherit pkgs; }, + extraConfigFlags ? [ + "--without-npm" + "--debug-node" + ], +}: + +let + useSharedICU = if builtins.isString icu then icu == "system" else icu != null; + useSharedAda = builtins.hasAttr "ada" sharedLibDeps; + useSharedOpenSSL = builtins.hasAttr "openssl" sharedLibDeps; +in +pkgs.mkShell { + inherit (pkgs.nodejs_latest) nativeBuildInputs; + + buildInputs = builtins.attrValues sharedLibDeps ++ pkgs.lib.optionals useSharedICU [ icu ]; + + packages = [ + ccache + ] + ++ devTools + ++ benchmarkTools; + + shellHook = + if (ccache != null) then + '' + export CC="${pkgs.lib.getExe ccache} $CC" + export CXX="${pkgs.lib.getExe ccache} $CXX" + '' + else + ""; + + BUILD_WITH = if (ninja != null) then "ninja" else "make"; + NINJA = if (ninja != null) then "${pkgs.lib.getExe ninja}" else ""; + CI_SKIP_TESTS = pkgs.lib.concatStringsSep "," ( + [ ] + ++ pkgs.lib.optionals useSharedAda [ + # Different versions of Ada affect the WPT tests + "test-url" + ] + ++ pkgs.lib.optionals useSharedOpenSSL [ + # Path to the openssl.cnf is different from the expected one + "test-strace-openat-openssl" + ] + ); + CONFIG_FLAGS = builtins.toString ( + [ + ( + if icu == null then + "--without-intl" + else + "--with-intl=${if useSharedICU then "system" else icu}-icu" + ) + ] + ++ extraConfigFlags + ++ pkgs.lib.optionals (ninja != null) [ + "--ninja" + ] + ++ pkgs.lib.optionals loadJSBuiltinsDynamically [ + "--node-builtin-modules-path=${builtins.toString ./.}" + ] + ++ pkgs.lib.concatMap (name: [ + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}" + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}-libpath=${ + pkgs.lib.getLib sharedLibDeps.${name} + }/lib" + "--shared-${builtins.replaceStrings [ "c-ares" ] [ "cares" ] name}-include=${ + pkgs.lib.getInclude sharedLibDeps.${name} + }/include" + ]) (builtins.attrNames sharedLibDeps) + ); +} diff --git a/src/amaro_version.h b/src/amaro_version.h index 1b70f6041b2c79..949b05f6500efa 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.4" +#define AMARO_VERSION "1.1.5" #endif // SRC_AMARO_VERSION_H_ diff --git a/src/api/async_resource.cc b/src/api/async_resource.cc index 38d53a9aec0e58..621fca4ba4d1da 100644 --- a/src/api/async_resource.cc +++ b/src/api/async_resource.cc @@ -16,6 +16,13 @@ AsyncResource::AsyncResource(Isolate* isolate, Local resource, const char* name, async_id trigger_async_id) + : AsyncResource( + isolate, resource, std::string_view(name), trigger_async_id) {} + +AsyncResource::AsyncResource(Isolate* isolate, + Local resource, + std::string_view name, + async_id trigger_async_id) : env_(Environment::GetCurrent(isolate)), resource_(isolate, resource), context_frame_(isolate, async_context_frame::current(isolate)) { diff --git a/src/api/embed_helpers.cc b/src/api/embed_helpers.cc index f6ad46dae3db9a..c1bcb3948c4cf6 100644 --- a/src/api/embed_helpers.cc +++ b/src/api/embed_helpers.cc @@ -1,6 +1,7 @@ #include "debug_utils-inl.h" #include "env-inl.h" #include "node.h" +#include "node_internals.h" #include "node_snapshot_builder.h" using v8::Context; @@ -127,7 +128,7 @@ CommonEnvironmentSetup::CommonEnvironmentSetup( if (flags & Flags::kIsForSnapshotting) { // The isolate must be registered before the SnapshotCreator initializes the // isolate, so that the memory reducer can be initialized. - isolate = impl_->isolate = Isolate::Allocate(); + isolate = impl_->isolate = Isolate::Allocate(GetOrCreateIsolateGroup()); platform->RegisterIsolate(isolate, loop); impl_->snapshot_creator.emplace(isolate, params); diff --git a/src/api/environment.cc b/src/api/environment.cc index b806e0e4af70d0..8126749cc2034b 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -6,6 +6,7 @@ #include "node.h" #include "node_builtins.h" #include "node_context_data.h" +#include "node_debug.h" #include "node_errors.h" #include "node_exit_code.h" #include "node_internals.h" @@ -37,6 +38,7 @@ using v8::Function; using v8::FunctionCallbackInfo; using v8::HandleScope; using v8::Isolate; +using v8::IsolateGroup; using v8::Just; using v8::JustVoid; using v8::Local; @@ -111,10 +113,13 @@ MaybeLocal PrepareStackTraceCallback(Local context, void* NodeArrayBufferAllocator::Allocate(size_t size) { void* ret; - if (zero_fill_field_ || per_process::cli_options->zero_fill_all_buffers) + if (zero_fill_field_ || per_process::cli_options->zero_fill_all_buffers) { + COUNT_GENERIC_USAGE("NodeArrayBufferAllocator.Allocate.ZeroFilled"); ret = allocator_->Allocate(size); - else + } else { + COUNT_GENERIC_USAGE("NodeArrayBufferAllocator.Allocate.Uninitialized"); ret = allocator_->AllocateUninitialized(size); + } if (ret != nullptr) [[likely]] { total_mem_usage_.fetch_add(size, std::memory_order_relaxed); } @@ -122,6 +127,7 @@ void* NodeArrayBufferAllocator::Allocate(size_t size) { } void* NodeArrayBufferAllocator::AllocateUninitialized(size_t size) { + COUNT_GENERIC_USAGE("NodeArrayBufferAllocator.Allocate.Uninitialized"); void* ret = allocator_->AllocateUninitialized(size); if (ret != nullptr) [[likely]] { total_mem_usage_.fetch_add(size, std::memory_order_relaxed); @@ -304,6 +310,17 @@ void SetIsolateUpForNode(v8::Isolate* isolate) { SetIsolateUpForNode(isolate, settings); } +// +IsolateGroup GetOrCreateIsolateGroup() { + // When pointer compression is disabled, we cannot create new groups, + // in which case we'll always return the default. + if (IsolateGroup::CanCreateNewGroups()) { + return IsolateGroup::Create(); + } + + return IsolateGroup::GetDefault(); +} + // TODO(joyeecheung): we may want to expose this, but then we need to be // careful about what we override in the params. Isolate* NewIsolate(Isolate::CreateParams* params, @@ -311,7 +328,8 @@ Isolate* NewIsolate(Isolate::CreateParams* params, MultiIsolatePlatform* platform, const SnapshotData* snapshot_data, const IsolateSettings& settings) { - Isolate* isolate = Isolate::Allocate(); + IsolateGroup group = GetOrCreateIsolateGroup(); + Isolate* isolate = Isolate::Allocate(group); if (isolate == nullptr) return nullptr; if (snapshot_data != nullptr) { @@ -853,8 +871,7 @@ Maybe InitializePrimordials(Local context, if (!GetPerContextExports(context).ToLocal(&exports)) { return Nothing(); } - Local primordials_string = - FIXED_ONE_BYTE_STRING(isolate, "primordials"); + Local primordials_string = isolate_data->primordials_string(); // Ensure that `InitializePrimordials` is called exactly once on a given // context. CHECK(!exports->Has(context, primordials_string).FromJust()); diff --git a/src/api/hooks.cc b/src/api/hooks.cc index 7b73f7db2427d9..0594dca02cd60a 100644 --- a/src/api/hooks.cc +++ b/src/api/hooks.cc @@ -201,9 +201,18 @@ async_context EmitAsyncInit(Isolate* isolate, Local resource, const char* name, async_id trigger_async_id) { + return EmitAsyncInit( + isolate, resource, std::string_view(name), trigger_async_id); +} + +async_context EmitAsyncInit(Isolate* isolate, + Local resource, + std::string_view name, + async_id trigger_async_id) { HandleScope handle_scope(isolate); Local type = - String::NewFromUtf8(isolate, name, NewStringType::kInternalized) + String::NewFromUtf8( + isolate, name.data(), NewStringType::kInternalized, name.size()) .ToLocalChecked(); return EmitAsyncInit(isolate, resource, type, trigger_async_id); } diff --git a/src/compile_cache.cc b/src/compile_cache.cc index 5e2c56cb925cc8..0920747012f072 100644 --- a/src/compile_cache.cc +++ b/src/compile_cache.cc @@ -232,10 +232,8 @@ static std::string GetRelativePath(std::string_view path, // the paths to wide strings before using std::filesystem::path. // On other platforms, std::filesystem::path can handle UTF-8 directly. #ifdef _WIN32 - std::filesystem::path module_path( - ConvertToWideString(std::string(path), CP_UTF8)); - std::filesystem::path base_path( - ConvertToWideString(std::string(base), CP_UTF8)); + std::filesystem::path module_path(ConvertUTF8ToWideString(std::string(path))); + std::filesystem::path base_path(ConvertUTF8ToWideString(std::string(base))); #else std::filesystem::path module_path(path); std::filesystem::path base_path(base); diff --git a/src/crypto/crypto_context.cc b/src/crypto/crypto_context.cc index db3f44907a723b..0e0546c313fe94 100644 --- a/src/crypto/crypto_context.cc +++ b/src/crypto/crypto_context.cc @@ -1351,7 +1351,6 @@ SecureContext* SecureContext::Create(Environment* env) { SecureContext::SecureContext(Environment* env, Local wrap) : BaseObject(env, wrap) { MakeWeak(); - env->external_memory_accounter()->Increase(env->isolate(), kExternalSize); } inline void SecureContext::Reset() { @@ -1469,6 +1468,8 @@ void SecureContext::Init(const FunctionCallbackInfo& args) { if (!sc->ctx_) { return ThrowCryptoError(env, ERR_get_error(), "SSL_CTX_new"); } + + env->external_memory_accounter()->Increase(env->isolate(), kExternalSize); SSL_CTX_set_app_data(sc->ctx_.get(), sc); // Disable SSLv2 in the case when method == TLS_method() and the diff --git a/src/crypto/crypto_timing.cc b/src/crypto/crypto_timing.cc index a0194f22cfd51e..0601f70926b245 100644 --- a/src/crypto/crypto_timing.cc +++ b/src/crypto/crypto_timing.cc @@ -56,6 +56,20 @@ bool FastTimingSafeEqual(Local receiver, // NOLINTNEXTLINE(runtime/references) FastApiCallbackOptions& options) { HandleScope scope(options.isolate); + if (!IsAnyBufferSource(a_obj)) { + TRACK_V8_FAST_API_CALL("crypto.timingSafeEqual.error"); + THROW_ERR_INVALID_ARG_TYPE(options.isolate, + "The \"buf1\" argument must be an instance of " + "ArrayBuffer, Buffer, TypedArray, or DataView."); + return false; + } + if (!IsAnyBufferSource(b_obj)) { + TRACK_V8_FAST_API_CALL("crypto.timingSafeEqual.error"); + THROW_ERR_INVALID_ARG_TYPE(options.isolate, + "The \"buf2\" argument must be an instance of " + "ArrayBuffer, Buffer, TypedArray, or DataView."); + return false; + } ArrayBufferViewContents a(a_obj); ArrayBufferViewContents b(b_obj); if (a.length() != b.length()) { diff --git a/src/dataqueue/queue.cc b/src/dataqueue/queue.cc index 64643680903a78..537844806d3087 100644 --- a/src/dataqueue/queue.cc +++ b/src/dataqueue/queue.cc @@ -916,6 +916,7 @@ class FdEntry final : public EntryImpl { fs::FileHandle::New(realm->GetBindingData(), file, Local(), + {}, entry->start_, entry->end_ - entry->start_)), entry); diff --git a/src/debug_utils-inl.h b/src/debug_utils-inl.h index c10af8b1b618bc..e3db1ef15b96f2 100644 --- a/src/debug_utils-inl.h +++ b/src/debug_utils-inl.h @@ -23,6 +23,13 @@ concept StringConvertible = requires(T a) { a.ToString() } -> std::convertible_to; }; +// For std::filesystem::path and similar types +template +concept StringConvertibleFSPathLike = requires(T a) { + { + a.string() + } -> std::convertible_to; + }; struct ToStringHelper { template @@ -30,6 +37,12 @@ struct ToStringHelper { static std::string Convert(const T& value) { return value.ToString(); } + template + requires(StringConvertibleFSPathLike) && (!StringViewConvertible) && + (!StringConvertible) + static std::string Convert(const T& value) { + return value.string(); + } template requires StringViewConvertible static std::string_view Convert(const T& value) { @@ -38,9 +51,11 @@ struct ToStringHelper { template ::value, bool>::type, + enable_if_t || std::is_enum_v, bool>, typename dummy = bool> - static std::string Convert(const T& value) { return std::to_string(value); } + static std::string Convert(const T& value) { + return std::to_string(value); + } static std::string_view Convert(const char* value) { return value != nullptr ? value : "(null)"; } @@ -58,8 +73,7 @@ struct ToStringHelper { const char* digits = "0123456789abcdef"; do { unsigned digit = v & ((1 << BASE_BITS) - 1); - *--ptr = - (BASE_BITS < 4 ? static_cast('0' + digit) : digits[digit]); + *--ptr = (BASE_BITS < 4 ? static_cast('0' + digit) : digits[digit]); } while ((v >>= BASE_BITS) != 0); return ptr; } @@ -139,12 +153,10 @@ std::string COLD_NOINLINE SPrintFImpl( // NOLINT(runtime/string) ret += node::ToUpper(ToBaseString<4>(arg)); break; case 'p': { - CHECK(std::is_pointer::type>::value); + CHECK(std::is_pointer_v>); char out[20]; - int n = snprintf(out, - sizeof(out), - "%p", - *reinterpret_cast(&arg)); + int n = snprintf( + out, sizeof(out), "%p", *reinterpret_cast(&arg)); CHECK_GE(n, 0); ret += out; break; diff --git a/src/env_properties.h b/src/env_properties.h index 5c5271e344da2b..5a83392120d096 100644 --- a/src/env_properties.h +++ b/src/env_properties.h @@ -130,6 +130,7 @@ V(cwd_string, "cwd") \ V(data_string, "data") \ V(default_is_true_string, "defaultIsTrue") \ + V(defensive_string, "defensive") \ V(deserialize_info_string, "deserializeInfo") \ V(dest_string, "dest") \ V(destroyed_string, "destroyed") \ @@ -469,6 +470,7 @@ V(enhance_fatal_stack_before_inspector, v8::Function) \ V(get_source_map_error_source, v8::Function) \ V(host_import_module_dynamically_callback, v8::Function) \ + V(host_import_meta_resolve_initializer, v8::Function) \ V(host_initialize_import_meta_object_callback, v8::Function) \ V(http2session_on_altsvc_function, v8::Function) \ V(http2session_on_error_function, v8::Function) \ diff --git a/src/inspector/network_agent.cc b/src/inspector/network_agent.cc index f8fcf7be2256fe..45b9cc2af591c6 100644 --- a/src/inspector/network_agent.cc +++ b/src/inspector/network_agent.cc @@ -26,6 +26,8 @@ using v8::Object; using v8::Uint8Array; using v8::Value; +constexpr size_t kDefaultMaxTotalBufferSize = 100 * 1024 * 1024; // 100MB + // Get a protocol string property from the object. Maybe ObjectGetProtocolString(v8::Local context, Local object, @@ -246,7 +248,8 @@ NetworkAgent::NetworkAgent( : inspector_(inspector), v8_inspector_(v8_inspector), env_(env), - network_resource_manager_(std::move(network_resource_manager)) { + network_resource_manager_(std::move(network_resource_manager)), + requests_(kDefaultMaxTotalBufferSize) { event_notifier_map_["requestWillBeSent"] = &NetworkAgent::requestWillBeSent; event_notifier_map_["responseReceived"] = &NetworkAgent::responseReceived; event_notifier_map_["loadingFailed"] = &NetworkAgent::loadingFailed; @@ -329,8 +332,15 @@ void NetworkAgent::Wire(protocol::UberDispatcher* dispatcher) { protocol::Network::Dispatcher::wire(dispatcher, this); } -protocol::DispatchResponse NetworkAgent::enable() { +protocol::DispatchResponse NetworkAgent::enable( + std::optional in_maxTotalBufferSize, + std::optional in_maxResourceBufferSize) { inspector_->Enable(); + requests_ = RequestsBuffer( + in_maxTotalBufferSize.value_or(kDefaultMaxTotalBufferSize)); + if (in_maxResourceBufferSize) { + max_resource_buffer_size_ = *in_maxResourceBufferSize; + } return protocol::DispatchResponse::Success(); } @@ -341,7 +351,7 @@ protocol::DispatchResponse NetworkAgent::disable() { protocol::DispatchResponse NetworkAgent::getRequestPostData( const protocol::String& in_requestId, protocol::String* out_postData) { - auto request_entry = requests_.find(in_requestId); + auto request_entry = requests_.cfind(in_requestId); if (request_entry == requests_.end()) { // Request not found, ignore it. return protocol::DispatchResponse::InvalidParams("Request not found"); @@ -362,7 +372,7 @@ protocol::DispatchResponse NetworkAgent::getRequestPostData( // Concat response bodies. protocol::Binary buf = - protocol::Binary::concat(request_entry->second.request_data_blobs); + protocol::Binary::concat(request_entry->second.request_data_blobs()); *out_postData = protocol::StringUtil::fromUTF8(buf.data(), buf.size()); return protocol::DispatchResponse::Success(); } @@ -371,7 +381,7 @@ protocol::DispatchResponse NetworkAgent::getResponseBody( const protocol::String& in_requestId, protocol::String* out_body, bool* out_base64Encoded) { - auto request_entry = requests_.find(in_requestId); + auto request_entry = requests_.cfind(in_requestId); if (request_entry == requests_.end()) { // Request not found, ignore it. return protocol::DispatchResponse::InvalidParams("Request not found"); @@ -391,7 +401,7 @@ protocol::DispatchResponse NetworkAgent::getResponseBody( // Concat response bodies. protocol::Binary buf = - protocol::Binary::concat(request_entry->second.response_data_blobs); + protocol::Binary::concat(request_entry->second.response_data_blobs()); if (request_entry->second.response_charset == Charset::kBinary) { // If the response is binary, we return base64 encoded data. *out_body = buf.toBase64(); @@ -410,22 +420,26 @@ protocol::DispatchResponse NetworkAgent::getResponseBody( protocol::DispatchResponse NetworkAgent::streamResourceContent( const protocol::String& in_requestId, protocol::Binary* out_bufferedData) { - auto it = requests_.find(in_requestId); - if (it == requests_.end()) { - // Request not found, ignore it. - return protocol::DispatchResponse::InvalidParams("Request not found"); - } - auto& request_entry = it->second; + bool is_response_finished = false; + { + auto it = requests_.find(in_requestId); + if (it == requests_.end()) { + // Request not found, ignore it. + return protocol::DispatchResponse::InvalidParams("Request not found"); + } + auto& request_entry = it->second; - request_entry.is_streaming = true; + request_entry.is_streaming = true; - // Concat response bodies. - *out_bufferedData = - protocol::Binary::concat(request_entry.response_data_blobs); - // Clear buffered data. - request_entry.response_data_blobs.clear(); + // Concat response bodies. + *out_bufferedData = + protocol::Binary::concat(request_entry.response_data_blobs()); + // Clear buffered data. + request_entry.clear_response_data_blobs(); + is_response_finished = request_entry.is_response_finished; + } - if (request_entry.is_response_finished) { + if (is_response_finished) { // If the request is finished, remove the entry. requests_.erase(in_requestId); } @@ -500,9 +514,11 @@ void NetworkAgent::requestWillBeSent(v8::Local context, } auto request_charset = charset == "utf-8" ? Charset::kUTF8 : Charset::kBinary; - requests_.emplace( - request_id, - RequestEntry(timestamp, request_charset, request->getHasPostData())); + requests_.emplace(request_id, + RequestEntry(timestamp, + request_charset, + request->getHasPostData(), + max_resource_buffer_size_)); frontend_->requestWillBeSent(request_id, std::move(request), std::move(initiator), @@ -580,7 +596,7 @@ void NetworkAgent::loadingFinished(v8::Local context, frontend_->loadingFinished(request_id, timestamp); - auto request_entry = requests_.find(request_id); + auto request_entry = requests_.cfind(request_id); if (request_entry == requests_.end()) { // No entry found. Ignore it. return; @@ -590,7 +606,7 @@ void NetworkAgent::loadingFinished(v8::Local context, // Streaming finished, remove the entry. requests_.erase(request_id); } else { - request_entry->second.is_response_finished = true; + requests_.find(request_id)->second.is_response_finished = true; } } @@ -631,7 +647,7 @@ void NetworkAgent::dataSent(v8::Local context, } Local data = data_obj.As(); auto data_bin = protocol::Binary::fromUint8Array(data); - request_entry->second.request_data_blobs.push_back(data_bin); + request_entry->second.push_request_data_blob(data_bin); } void NetworkAgent::dataReceived(v8::Local context, @@ -673,7 +689,7 @@ void NetworkAgent::dataReceived(v8::Local context, frontend_->dataReceived( request_id, timestamp, data_length, encoded_data_length, data_bin); } else { - request_entry.response_data_blobs.push_back(data_bin); + request_entry.push_response_data_blob(data_bin); } } diff --git a/src/inspector/network_agent.h b/src/inspector/network_agent.h index 487c7d02680d3d..7a5d545cb8d499 100644 --- a/src/inspector/network_agent.h +++ b/src/inspector/network_agent.h @@ -3,6 +3,7 @@ #include "env.h" #include "io_agent.h" +#include "network_requests_buffer.h" #include "network_resource_manager.h" #include "node/inspector/protocol/Network.h" @@ -15,31 +16,6 @@ namespace inspector { class NetworkInspector; -// Supported charsets for devtools frontend on request/response data. -// If the charset is kUTF8, the data is expected to be text and can be -// formatted on the frontend. -enum class Charset { - kUTF8, - kBinary, -}; - -struct RequestEntry { - double timestamp; - bool is_request_finished = false; - bool is_response_finished = false; - bool is_streaming = false; - Charset request_charset; - std::vector request_data_blobs; - Charset response_charset; - std::vector response_data_blobs; - - RequestEntry(double timestamp, Charset request_charset, bool has_request_body) - : timestamp(timestamp), - is_request_finished(!has_request_body), - request_charset(request_charset), - response_charset(Charset::kBinary) {} -}; - class NetworkAgent : public protocol::Network::Backend { public: explicit NetworkAgent( @@ -50,7 +26,9 @@ class NetworkAgent : public protocol::Network::Backend { void Wire(protocol::UberDispatcher* dispatcher); - protocol::DispatchResponse enable() override; + protocol::DispatchResponse enable( + std::optional in_maxTotalBufferSize, + std::optional in_maxResourceBufferSize) override; protocol::DispatchResponse disable() override; @@ -104,12 +82,17 @@ class NetworkAgent : public protocol::Network::Backend { NetworkInspector* inspector_; v8_inspector::V8Inspector* v8_inspector_; std::shared_ptr frontend_; + using EventNotifier = void (NetworkAgent::*)(v8::Local context, v8::Local); std::unordered_map event_notifier_map_; - std::map requests_; Environment* env_; std::shared_ptr network_resource_manager_; + + // Per-resource buffer size in bytes to use when preserving network payloads + // (XHRs, etc). + size_t max_resource_buffer_size_ = 5 * 1024 * 1024; // 5MB + RequestsBuffer requests_; }; } // namespace inspector diff --git a/src/inspector/network_requests_buffer.h b/src/inspector/network_requests_buffer.h new file mode 100644 index 00000000000000..9f759a0c19381f --- /dev/null +++ b/src/inspector/network_requests_buffer.h @@ -0,0 +1,195 @@ +#ifndef SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_ +#define SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_ + +#include +#include +#include + +#include "inspector/node_string.h" + +namespace node { +namespace inspector { + +// Supported charsets for devtools frontend on request/response data. +// If the charset is kUTF8, the data is expected to be text and can be +// formatted on the frontend. +enum class Charset { + kUTF8, + kBinary, +}; + +struct RequestEntry { + double timestamp; + bool is_request_finished = false; + bool is_response_finished = false; + bool is_streaming = false; + Charset request_charset; + Charset response_charset = Charset::kBinary; + + size_t max_resource_buffer_size; + size_t buffer_size() const { + return request_data_size_ + response_data_size_; + } + + const std::vector request_data_blobs() const { + return request_data_blobs_; + } + const std::vector response_data_blobs() const { + return response_data_blobs_; + } + + void push_request_data_blob(const protocol::Binary& blob) { + if (buffer_size() + blob.size() > max_resource_buffer_size) { + // Exceed the per-resource buffer size limit, ignore the blob. + return; + } + request_data_blobs_.push_back(blob); + request_data_size_ += blob.size(); + } + void push_response_data_blob(const protocol::Binary& blob) { + if (buffer_size() + blob.size() > max_resource_buffer_size) { + // Exceed the per-resource buffer size limit, ignore the blob. + return; + } + response_data_blobs_.push_back(blob); + response_data_size_ += blob.size(); + } + + void clear_response_data_blobs() { + response_data_blobs_.clear(); + response_data_size_ = 0; + } + + RequestEntry(double timestamp, + Charset request_charset, + bool has_request_body, + size_t max_resource_buffer_size) + : timestamp(timestamp), + is_request_finished(!has_request_body), + request_charset(request_charset), + max_resource_buffer_size(max_resource_buffer_size) {} + + private: + size_t request_data_size_ = 0; + std::vector request_data_blobs_; + size_t response_data_size_ = 0; + std::vector response_data_blobs_; +}; + +class RequestsBuffer { + using key_value_pair_t = typename std::pair; + using list_iterator = typename std::list::iterator; + using const_list_iterator = + typename std::list::const_iterator; + + public: + struct mutable_iterator { + list_iterator it; + size_t buffer_size; + RequestsBuffer* parent; + + key_value_pair_t& operator*() { return *it; } + key_value_pair_t* operator->() { return &(*it); } + bool operator==(const const_list_iterator& other) const { + return it == other; + } + bool operator!=(const const_list_iterator& other) const { + return it != other; + } + + mutable_iterator(std::nullptr_t, RequestsBuffer* parent) + : it(parent->list_.end()), buffer_size(0), parent(parent) {} + + mutable_iterator(list_iterator it, RequestsBuffer* parent) + : it(it), buffer_size(it->second.buffer_size()), parent(parent) {} + ~mutable_iterator() { + if (it == parent->list_.end()) return; + // The entry must not have been erased. + DCHECK(parent->lookup_map_.contains(it->first)); + // Update the total buffer size if the buffer size has changed. + if (buffer_size == it->second.buffer_size()) { + return; + } + parent->total_buffer_size_ += it->second.buffer_size(); + DCHECK_GE(parent->total_buffer_size_, buffer_size); + parent->total_buffer_size_ -= buffer_size; + parent->enforceBufferLimits(); + } + }; + + explicit RequestsBuffer(size_t max_total_buffer_size) + : max_total_buffer_size_(max_total_buffer_size) {} + + size_t max_total_buffer_size() const { return max_total_buffer_size_; } + size_t total_buffer_size() const { return total_buffer_size_; } + + const_list_iterator begin() const { return list_.begin(); } + const_list_iterator end() const { return list_.end(); } + + // Get a mutable iterator to the entry with the given key. + // The iterator will update the total buffer size when it is destroyed. + mutable_iterator find(const protocol::String& key) { + auto it = lookup_map_.find(key); + if (it == lookup_map_.end()) { + return mutable_iterator(nullptr, this); + } + return mutable_iterator(it->second, this); + } + const_list_iterator cfind(const protocol::String& key) const { + auto it = lookup_map_.find(key); + if (it == lookup_map_.end()) { + return list_.end(); + } + return it->second; + } + + bool contains(const protocol::String& key) const { + return lookup_map_.contains(key); + } + + bool emplace(const protocol::String& key, RequestEntry&& value) { + if (lookup_map_.contains(key)) { + return false; + } + list_.emplace_front(key, std::move(value)); + lookup_map_[key] = list_.begin(); + // No buffer yet. + DCHECK_EQ(begin()->second.buffer_size(), 0u); + return true; + } + + void erase(const protocol::String& key) { + auto it = lookup_map_.find(key); + if (it == lookup_map_.end()) { + return; + } + erase(it->second); + } + + void erase(const_list_iterator it) { + DCHECK(it != list_.end()); + DCHECK_GE(total_buffer_size_, it->second.buffer_size()); + total_buffer_size_ -= it->second.buffer_size(); + lookup_map_.erase(it->first); + list_.erase(it); + } + + private: + void enforceBufferLimits() { + while (total_buffer_size_ > max_total_buffer_size_ && !list_.empty()) { + auto last_it = --list_.end(); + erase(last_it); + } + } + + size_t max_total_buffer_size_; + size_t total_buffer_size_ = 0; + + std::list list_; + std::map lookup_map_; +}; + +} // namespace inspector +} // namespace node + +#endif // SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_ diff --git a/src/inspector/node_protocol.pdl b/src/inspector/node_protocol.pdl index a79dd3595ce493..24cff73585aeb7 100644 --- a/src/inspector/node_protocol.pdl +++ b/src/inspector/node_protocol.pdl @@ -200,6 +200,11 @@ experimental domain Network # Enables network tracking, network events will now be delivered to the client. command enable + parameters + # Buffer size in bytes to use when preserving network payloads (XHRs, etc). + experimental optional integer maxTotalBufferSize + # Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc). + experimental optional integer maxResourceBufferSize # Returns post data sent with the request. Returns an error when no data was sent with the request. command getRequestPostData diff --git a/src/inspector_io.cc b/src/inspector_io.cc index ebf3ae4764fa21..361d19349261e5 100644 --- a/src/inspector_io.cc +++ b/src/inspector_io.cc @@ -353,6 +353,9 @@ std::optional InspectorIoDelegate::GetTargetSessionId( std::string_view view(message.data(), message.size()); std::unique_ptr value = protocol::DictionaryValue::cast(JsonUtil::parseJSON(view)); + if (!value) { + return std::nullopt; + } protocol::String target_session_id; protocol::Value* target_session_id_value = value->get("sessionId"); if (target_session_id_value) { diff --git a/src/inspector_js_api.cc b/src/inspector_js_api.cc index cbad4651f1db21..54a91765ac6b1f 100644 --- a/src/inspector_js_api.cc +++ b/src/inspector_js_api.cc @@ -240,8 +240,8 @@ static void AsyncTaskScheduledWrapper(const FunctionCallbackInfo& args) { CHECK(args[0]->IsString()); Local task_name = args[0].As(); - String::Value task_name_value(args.GetIsolate(), task_name); - StringView task_name_view(*task_name_value, task_name_value.length()); + TwoByteValue task_name_value(args.GetIsolate(), task_name); + StringView task_name_view(task_name_value.out(), task_name_value.length()); CHECK(args[1]->IsNumber()); int64_t task_id; diff --git a/src/js_native_api.h b/src/js_native_api.h index df2380ad31f3a2..f979720b0caeab 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -5,34 +5,6 @@ #include // NOLINT(modernize-deprecated-headers) #include // NOLINT(modernize-deprecated-headers) -// Use INT_MAX, this should only be consumed by the pre-processor anyway. -#define NAPI_VERSION_EXPERIMENTAL 2147483647 -#ifndef NAPI_VERSION -#ifdef NAPI_EXPERIMENTAL -#define NAPI_VERSION NAPI_VERSION_EXPERIMENTAL -#else -// The baseline version for N-API. -// The NAPI_VERSION controls which version will be used by default when -// compilling a native addon. If the addon developer specifically wants to use -// functions available in a new version of N-API that is not yet ported in all -// LTS versions, they can set NAPI_VERSION knowing that they have specifically -// depended on that version. -#define NAPI_VERSION 8 -#endif -#endif - -#if defined(NAPI_EXPERIMENTAL) && \ - !defined(NODE_API_EXPERIMENTAL_NO_WARNING) && \ - !defined(NODE_WANT_INTERNALS) -#ifdef _MSC_VER -#pragma message("NAPI_EXPERIMENTAL is enabled. " \ - "Experimental features may be unstable.") -#else -#warning "NAPI_EXPERIMENTAL is enabled. " \ - "Experimental features may be unstable." -#endif -#endif - #include "js_native_api_types.h" // If you need __declspec(dllimport), either include instead, or @@ -78,6 +50,17 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_get_boolean(napi_env env, // Methods to create Primitive types/Objects NAPI_EXTERN napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result); +#ifdef NAPI_EXPERIMENTAL +#define NODE_API_EXPERIMENTAL_HAS_CREATE_OBJECT_WITH_PROPERTIES +NAPI_EXTERN napi_status NAPI_CDECL +napi_create_object_with_properties(napi_env env, + napi_value prototype_or_null, + napi_value* property_names, + napi_value* property_values, + size_t property_count, + napi_value* result); +#endif // NAPI_EXPERIMENTAL + NAPI_EXTERN napi_status NAPI_CDECL napi_create_array(napi_env env, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL diff --git a/src/js_native_api_types.h b/src/js_native_api_types.h index 43e7bb77ff94e7..eaae231b4dd4db 100644 --- a/src/js_native_api_types.h +++ b/src/js_native_api_types.h @@ -1,6 +1,34 @@ #ifndef SRC_JS_NATIVE_API_TYPES_H_ #define SRC_JS_NATIVE_API_TYPES_H_ +// Use INT_MAX, this should only be consumed by the pre-processor anyway. +#define NAPI_VERSION_EXPERIMENTAL 2147483647 +#ifndef NAPI_VERSION +#ifdef NAPI_EXPERIMENTAL +#define NAPI_VERSION NAPI_VERSION_EXPERIMENTAL +#else +// The baseline version for N-API. +// The NAPI_VERSION controls which version will be used by default when +// compilling a native addon. If the addon developer specifically wants to use +// functions available in a new version of N-API that is not yet ported in all +// LTS versions, they can set NAPI_VERSION knowing that they have specifically +// depended on that version. +#define NAPI_VERSION 8 +#endif +#endif + +#if defined(NAPI_EXPERIMENTAL) && \ + !defined(NODE_API_EXPERIMENTAL_NO_WARNING) && \ + !defined(NODE_WANT_INTERNALS) +#ifdef _MSC_VER +#pragma message("NAPI_EXPERIMENTAL is enabled. " \ + "Experimental features may be unstable.") +#else +#warning "NAPI_EXPERIMENTAL is enabled. " \ + "Experimental features may be unstable." +#endif +#endif + // This file needs to be compatible with C compilers. // This is a public include file, and these includes have essentially // became part of it's API. diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 153f49339f702e..1c9259a382985c 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -1,8 +1,6 @@ #include #include // INT_MAX #include -#define NAPI_EXPERIMENTAL -#include "env-inl.h" #include "js_native_api.h" #include "js_native_api_v8.h" #include "util-inl.h" @@ -332,6 +330,42 @@ inline napi_status ConcludeDeferred(napi_env env, return GET_RETURN_STATUS(env); } +#if 1 +class ArrayBufferReference final : public ReferenceWithFinalizer { + public: + // Same signatures for ctor and New() as Reference, except this only works + // with ArrayBuffers: + template + explicit ArrayBufferReference(napi_env env, + v8::Local value, + Args&&... args) + : ReferenceWithFinalizer(env, value, std::forward(args)...), + _env(env) {} + + template + static ArrayBufferReference* New(napi_env env, + v8::Local value, + Args&&... args) { + return new ArrayBufferReference(env, value, std::forward(args)...); + } + + private: + napi_env _env; + + inline void CallUserFinalizer() override { + v8::HandleScope handle_scope(_env->isolate); + v8::Local obj = Get(_env); + CHECK(!obj.IsEmpty()); + CHECK(obj->IsArrayBuffer()); + v8::Local ab = obj.As(); + if (ab->IsDetachable()) + ab->Detach(); + + ReferenceWithFinalizer::CallUserFinalizer(); + } +}; +#endif + enum UnwrapAction { KeepWrap, RemoveWrap }; inline napi_status Unwrap(napi_env env, @@ -344,14 +378,20 @@ inline napi_status Unwrap(napi_env env, CHECK_ARG(env, result); } +#if 0 v8::Local context = env->context(); +#endif v8::Local value = v8impl::V8LocalValueFromJsValue(js_object); RETURN_STATUS_IF_FALSE(env, value->IsObject(), napi_invalid_arg); v8::Local obj = value.As(); - auto val = obj->GetPrivate(context, NAPI_PRIVATE_KEY(context, wrapper)) +#if 1 + v8::Local val = obj->GetInternalField(0).As(); +#else + v8::Local val = obj->GetPrivate(context, NAPI_PRIVATE_KEY(context, wrapper)) .ToLocalChecked(); +#endif RETURN_STATUS_IF_FALSE(env, val->IsExternal(), napi_invalid_arg); Reference* reference = static_cast(val.As()->Value()); @@ -361,8 +401,12 @@ inline napi_status Unwrap(napi_env env, } if (action == RemoveWrap) { +#if 1 + obj->SetInternalField(0, v8::Undefined(env->isolate)); +#else CHECK(obj->DeletePrivate(context, NAPI_PRIVATE_KEY(context, wrapper)) .FromJust()); +#endif if (reference->ownership() == ReferenceOwnership::kUserland) { // When the wrap is been removed, the finalizer should be reset. reference->ResetFinalizer(); @@ -528,17 +572,24 @@ inline napi_status Wrap(napi_env env, NAPI_PREAMBLE(env); CHECK_ARG(env, js_object); +#if 0 v8::Local context = env->context(); +#endif v8::Local value = v8impl::V8LocalValueFromJsValue(js_object); RETURN_STATUS_IF_FALSE(env, value->IsObject(), napi_invalid_arg); v8::Local obj = value.As(); // If we've already wrapped this object, we error out. +#if 1 + RETURN_STATUS_IF_FALSE( + env, obj->GetInternalField(0).As()->IsUndefined(), napi_invalid_arg); +#else RETURN_STATUS_IF_FALSE( env, !obj->HasPrivate(context, NAPI_PRIVATE_KEY(context, wrapper)).FromJust(), napi_invalid_arg); +#endif v8impl::Reference* reference = nullptr; if (result != nullptr) { @@ -572,10 +623,14 @@ inline napi_status Wrap(napi_env env, env, obj, 0, v8impl::ReferenceOwnership::kRuntime, native_object); } +#if 1 + obj->SetInternalField(0, v8::External::New(env->isolate, reference)); +#else CHECK(obj->SetPrivate(context, NAPI_PRIVATE_KEY(context, wrapper), v8::External::New(env->isolate, reference)) .FromJust()); +#endif return GET_RETURN_STATUS(env); } @@ -984,6 +1039,10 @@ napi_define_class(napi_env env, STATUS_CALL(v8impl::FunctionCallbackWrapper::NewTemplate( env, constructor, callback_data, &tpl)); +#if 1 + tpl->InstanceTemplate()->SetInternalFieldCount(2); +#endif + v8::Local name_string; CHECK_NEW_FROM_UTF8_LEN(env, name_string, utf8name, length); tpl->SetClassName(name_string); @@ -1591,6 +1650,50 @@ napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) { return napi_clear_last_error(env); } +napi_status NAPI_CDECL +napi_create_object_with_properties(napi_env env, + napi_value prototype_or_null, + napi_value* property_names, + napi_value* property_values, + size_t property_count, + napi_value* result) { + CHECK_ENV_NOT_IN_GC(env); + CHECK_ARG(env, result); + + if (property_count > 0) { + CHECK_ARG(env, property_names); + CHECK_ARG(env, property_values); + } + + v8::Local v8_prototype_or_null; + if (prototype_or_null == nullptr) { + v8_prototype_or_null = v8::Null(env->isolate); + } else { + v8_prototype_or_null = v8impl::V8LocalValueFromJsValue(prototype_or_null); + } + + v8::LocalVector v8_names(env->isolate, property_count); + v8::LocalVector v8_values(env->isolate, property_count); + + for (size_t i = 0; i < property_count; i++) { + v8::Local name_value = + v8impl::V8LocalValueFromJsValue(property_names[i]); + RETURN_STATUS_IF_FALSE(env, name_value->IsName(), napi_name_expected); + v8_names[i] = name_value.As(); + v8_values[i] = v8impl::V8LocalValueFromJsValue(property_values[i]); + } + + v8::Local obj = v8::Object::New(env->isolate, + v8_prototype_or_null, + v8_names.data(), + v8_values.data(), + property_count); + + RETURN_STATUS_IF_FALSE(env, !obj.IsEmpty(), napi_generic_failure); + *result = v8impl::JsValueFromV8LocalValue(obj); + return napi_clear_last_error(env); +} + napi_status NAPI_CDECL napi_create_array(napi_env env, napi_value* result) { CHECK_ENV_NOT_IN_GC(env); CHECK_ARG(env, result); @@ -2657,20 +2760,26 @@ napi_status NAPI_CDECL napi_type_tag_object(napi_env env, CHECK_TO_OBJECT_WITH_PREAMBLE(env, context, obj, object_or_external); CHECK_ARG_WITH_PREAMBLE(env, type_tag); +#if 0 auto key = NAPI_PRIVATE_KEY(context, type_tag); auto maybe_has = obj->HasPrivate(context, key); CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, maybe_has, napi_generic_failure); RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( env, !maybe_has.FromJust(), napi_invalid_arg); +#endif auto tag = v8::BigInt::NewFromWords( context, 0, 2, reinterpret_cast(type_tag)); CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, tag, napi_generic_failure); +#if 1 + obj->SetInternalField(1, tag.ToLocalChecked()); +#else auto maybe_set = obj->SetPrivate(context, key, tag.ToLocalChecked()); CHECK_MAYBE_NOTHING_WITH_PREAMBLE(env, maybe_set, napi_generic_failure); RETURN_STATUS_IF_FALSE_WITH_PREAMBLE( env, maybe_set.FromJust(), napi_generic_failure); +#endif return GET_RETURN_STATUS(env); } @@ -2697,10 +2806,14 @@ napi_status NAPI_CDECL napi_check_object_type_tag(napi_env env, CHECK_ARG_WITH_PREAMBLE(env, type_tag); CHECK_ARG_WITH_PREAMBLE(env, result); +#if 1 + v8::Local val = obj->GetInternalField(1).As(); +#else auto maybe_value = obj->GetPrivate(context, NAPI_PRIVATE_KEY(context, type_tag)); CHECK_MAYBE_EMPTY_WITH_PREAMBLE(env, maybe_value, napi_generic_failure); v8::Local val = maybe_value.ToLocalChecked(); +#endif // We consider the type check to have failed unless we reach the line below // where we set whether the type check succeeded or not based on the @@ -3059,6 +3172,41 @@ napi_create_external_arraybuffer(napi_env env, node_api_basic_finalize finalize_cb, void* finalize_hint, napi_value* result) { +#if 1 + NAPI_PREAMBLE(env); + CHECK_ARG(env, result); + + v8::Isolate* isolate = env->isolate; + // The buffer will be freed with v8impl::ArrayBufferReference::New() + // below, hence this BackingStore does not need to free the buffer. + std::unique_ptr backing = + v8::ArrayBuffer::NewBackingStore(external_data, + byte_length, + [](void*, size_t, void*){}, + nullptr); + v8::Local buffer = + v8::ArrayBuffer::New(isolate, std::move(backing)); + + // https://github.com/nodejs/node/pull/47557 removed the mark_arraybuffer_as_untransferable API + // v8::Maybe marked = env->mark_arraybuffer_as_untransferable(buffer); + // CHECK_MAYBE_NOTHING(env, marked, napi_generic_failure); + + if (finalize_cb != nullptr) { + // Create a self-deleting weak reference that invokes the finalizer + // callback and detaches the ArrayBuffer if it still exists on Environment + // teardown. + v8impl::ArrayBufferReference::New(env, + buffer, + 0, + v8impl::ReferenceOwnership::kRuntime, + reinterpret_cast(finalize_cb), + external_data, + finalize_hint); + } + + *result = v8impl::JsValueFromV8LocalValue(buffer); + return GET_RETURN_STATUS(env); +#else // The API contract here is that the cleanup function runs on the JS thread, // and is able to use napi_env. Implementing that properly is hard, so use the // `Buffer` variant for easier implementation. @@ -3067,6 +3215,7 @@ napi_create_external_arraybuffer(napi_env env, env, byte_length, external_data, finalize_cb, finalize_hint, &buffer)); return napi_get_typedarray_info( env, buffer, nullptr, nullptr, nullptr, result, nullptr); +#endif } napi_status NAPI_CDECL napi_get_arraybuffer_info(napi_env env, diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index 262916c09b5b78..f2fd4ce58b95ea 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -4,6 +4,8 @@ #include "js_native_api_types.h" #include "js_native_api_v8_internals.h" +#include + inline napi_status napi_clear_last_error(node_api_basic_env env); namespace v8impl { @@ -451,7 +453,7 @@ class ReferenceWithData final : public Reference { }; // Reference that has a user finalizer callback. -class ReferenceWithFinalizer final : public Reference { +class ReferenceWithFinalizer : public Reference { public: static ReferenceWithFinalizer* New(napi_env env, v8::Local value, @@ -465,7 +467,7 @@ class ReferenceWithFinalizer final : public Reference { void ResetFinalizer() override { finalizer_.ResetFinalizer(); } void* Data() override { return finalizer_.data(); } - private: + protected: ReferenceWithFinalizer(napi_env env, v8::Local value, uint32_t initial_refcount, diff --git a/src/js_native_api_v8_internals.h b/src/js_native_api_v8_internals.h index 7bf3bf0fa7e1a2..f13e0ee5de349a 100644 --- a/src/js_native_api_v8_internals.h +++ b/src/js_native_api_v8_internals.h @@ -13,12 +13,11 @@ // are bridged to remove references to the `node` namespace. `node_version.h`, // included below, defines `NAPI_VERSION`. -#include "node_version.h" +#include "util.h" -#include "env.h" #include "gtest/gtest_prod.h" -#include "node_errors.h" -#include "node_internals.h" + +#include #define NAPI_ARRAYSIZE(array) node::arraysize((array)) @@ -37,7 +36,10 @@ using PersistentToLocal = node::PersistentToLocal; [[noreturn]] inline void OnFatalError(const char* location, const char* message) { +#ifdef NAPI_EXPERIMENTAL +// https://github.com/nodejs/node/pull/42651 node::OnFatalError(location, message); +#endif // NAPI_EXPERIMENTAL } } // end of namespace v8impl diff --git a/src/module_wrap.cc b/src/module_wrap.cc index 729b71e905d75e..d9711500f178c7 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -7,6 +7,7 @@ #include "node_external_reference.h" #include "node_internals.h" #include "node_process-inl.h" +#include "node_url.h" #include "node_watchdog.h" #include "util-inl.h" @@ -165,15 +166,6 @@ ModuleWrap::ModuleWrap(Realm* realm, } MakeWeak(); module_.SetWeak(); - - HandleScope scope(realm->isolate()); - Local context = realm->context(); - Local requests = module->GetModuleRequests(); - for (int i = 0; i < requests->Length(); i++) { - ModuleCacheKey module_cache_key = ModuleCacheKey::From( - context, requests->Get(context, i).As()); - resolve_cache_[module_cache_key] = i; - } } ModuleWrap::~ModuleWrap() { @@ -194,30 +186,6 @@ Local ModuleWrap::context() const { return obj.As()->GetCreationContextChecked(); } -ModuleWrap* ModuleWrap::GetLinkedRequest(uint32_t index) { - DCHECK(IsLinked()); - Isolate* isolate = env()->isolate(); - EscapableHandleScope scope(isolate); - Local linked_requests_data = - object()->GetInternalField(kLinkedRequestsSlot); - DCHECK(linked_requests_data->IsValue() && - linked_requests_data.As()->IsArray()); - Local requests = linked_requests_data.As(); - - CHECK_LT(index, requests->Length()); - - Local module_value; - if (!requests->Get(context(), index).ToLocal(&module_value)) { - return nullptr; - } - CHECK(module_value->IsObject()); - Local module_object = module_value.As(); - - ModuleWrap* module_wrap; - ASSIGN_OR_RETURN_UNWRAP(&module_wrap, module_object, nullptr); - return module_wrap; -} - ModuleWrap* ModuleWrap::GetFromModule(Environment* env, Local module) { auto range = env->hash_to_module_map.equal_range(module->GetIdentityHash()); @@ -563,8 +531,9 @@ ModulePhase to_phase_constant(ModuleImportPhase phase) { return kEvaluationPhase; case ModuleImportPhase::kSource: return kSourcePhase; + default: + UNREACHABLE(); } - UNREACHABLE(); } static Local createImportAttributesContainer( @@ -653,6 +622,7 @@ void ModuleWrap::GetModuleRequests(const FunctionCallbackInfo& args) { // moduleWrap.link(moduleWraps) void ModuleWrap::Link(const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); + HandleScope handle_scope(isolate); Realm* realm = Realm::GetCurrent(args); Local context = realm->context(); @@ -664,33 +634,70 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { Local requests = dependent->module_.Get(isolate)->GetModuleRequests(); Local modules = args[0].As(); - CHECK_EQ(modules->Length(), static_cast(requests->Length())); - - for (int i = 0; i < requests->Length(); i++) { + std::vector> modules_vector; + if (FromV8Array(context, modules, &modules_vector).IsEmpty()) { + return; + } + size_t request_count = static_cast(requests->Length()); + CHECK_EQ(modules_vector.size(), request_count); + std::vector linked_module_wraps(request_count); + + // Track the duplicated module requests. For example if a modulelooks like + // this: + // + // import { foo } from 'mod' with { type: 'json' }; + // import source ModSource from 'mod' with { type: 'json' }; + // import { baz } from 'mod2'; + // + // The first two module requests are identical. The map would look like + // { mod_key: 0, mod2_key: 2 } in this case, so that module request 0 and + // module request 1 would be mapped to mod_key and both should resolve to the + // module identified by module request 0 (the first one with this identity), + // and module request 2 should resolve the module identified by index 2. + std::unordered_map + module_request_map; + + for (size_t i = 0; i < request_count; i++) { + // TODO(joyeecheung): merge this with the serializeKey() in module_map.js. + // This currently doesn't sort the import attributes. + Local module_value = modules_vector[i].Get(isolate); ModuleCacheKey module_cache_key = ModuleCacheKey::From( context, requests->Get(context, i).As()); - DCHECK(dependent->resolve_cache_.contains(module_cache_key)); - - Local module_i; - Local module_cache_i; - uint32_t coalesced_index = dependent->resolve_cache_[module_cache_key]; - if (!modules->Get(context, i).ToLocal(&module_i) || - !modules->Get(context, coalesced_index).ToLocal(&module_cache_i) || - !module_i->StrictEquals(module_cache_i)) { - // If the module is different from the one of the same request, throw an - // error. - THROW_ERR_MODULE_LINK_MISMATCH( - realm->env(), - "Module request '%s' at index %d must be linked " - "to the same module requested at index %d", - module_cache_key.ToString(), - i, - coalesced_index); - return; + auto it = module_request_map.find(module_cache_key); + if (it == module_request_map.end()) { + // This is the first request with this identity, record it - any mismatch + // for this would only be found in subsequent requests, so no need to + // check here. + module_request_map[module_cache_key] = i; + } else { // This identity has been seen before, check for mismatch. + size_t first_seen_index = it->second; + // Check that the module is the same as the one resolved by the first + // request with this identity. + Local first_seen_value = + modules_vector[first_seen_index].Get(isolate); + if (!module_value->StrictEquals(first_seen_value)) { + // If the module is different from the one of the same request, throw an + // error. + THROW_ERR_MODULE_LINK_MISMATCH( + realm->env(), + "Module request '%s' at index %d must be linked " + "to the same module requested at index %d", + module_cache_key.ToString(), + i, + first_seen_index); + return; + } } + + CHECK(module_value->IsObject()); // Guaranteed by link methods in JS land. + ModuleWrap* resolved = + BaseObject::Unwrap(module_value.As()); + CHECK_NOT_NULL(resolved); // Guaranteed by link methods in JS land. + linked_module_wraps[i] = resolved; } args.This()->SetInternalField(kLinkedRequestsSlot, modules); + std::swap(dependent->linked_module_wraps_, linked_module_wraps); dependent->linked_ = true; } @@ -1012,11 +1019,10 @@ void ModuleWrap::HasAsyncGraph(Local property, // static MaybeLocal ModuleWrap::ResolveModuleCallback( Local context, - Local specifier, - Local import_attributes, + size_t module_request_index, Local referrer) { ModuleWrap* resolved_module; - if (!ResolveModule(context, specifier, import_attributes, referrer) + if (!ResolveModule(context, module_request_index, referrer) .To(&resolved_module)) { return {}; } @@ -1027,11 +1033,10 @@ MaybeLocal ModuleWrap::ResolveModuleCallback( // static MaybeLocal ModuleWrap::ResolveSourceCallback( Local context, - Local specifier, - Local import_attributes, + size_t module_request_index, Local referrer) { ModuleWrap* resolved_module; - if (!ResolveModule(context, specifier, import_attributes, referrer) + if (!ResolveModule(context, module_request_index, referrer) .To(&resolved_module)) { return {}; } @@ -1050,12 +1055,22 @@ MaybeLocal ModuleWrap::ResolveSourceCallback( return module_source_object.As(); } +static std::string GetSpecifierFromModuleRequest(Local context, + Local referrer, + size_t module_request_index) { + Local raw_request = + referrer->GetModuleRequests() + ->Get(context, static_cast(module_request_index)) + .As(); + Local specifier = raw_request->GetSpecifier(); + Utf8Value specifier_utf8(Isolate::GetCurrent(), specifier); + return specifier_utf8.ToString(); +} + // static -Maybe ModuleWrap::ResolveModule( - Local context, - Local specifier, - Local import_attributes, - Local referrer) { +Maybe ModuleWrap::ResolveModule(Local context, + size_t module_request_index, + Local referrer) { Isolate* isolate = Isolate::GetCurrent(); Environment* env = Environment::GetCurrent(context); if (env == nullptr) { @@ -1065,37 +1080,34 @@ Maybe ModuleWrap::ResolveModule( // Check that the referrer is not yet been instantiated. DCHECK(referrer->GetStatus() <= Module::kInstantiated); - ModuleCacheKey cache_key = - ModuleCacheKey::From(context, specifier, import_attributes); - ModuleWrap* dependent = ModuleWrap::GetFromModule(env, referrer); if (dependent == nullptr) { + std::string specifier = + GetSpecifierFromModuleRequest(context, referrer, module_request_index); THROW_ERR_VM_MODULE_LINK_FAILURE( - env, "request for '%s' is from invalid module", cache_key.specifier); + env, "request for '%s' is from invalid module", specifier); return Nothing(); } if (!dependent->IsLinked()) { + std::string specifier = + GetSpecifierFromModuleRequest(context, referrer, module_request_index); THROW_ERR_VM_MODULE_LINK_FAILURE(env, "request for '%s' can not be resolved on " "module '%s' that is not linked", - cache_key.specifier, + specifier, dependent->url_); return Nothing(); } - auto it = dependent->resolve_cache_.find(cache_key); - if (it == dependent->resolve_cache_.end()) { - THROW_ERR_VM_MODULE_LINK_FAILURE( - env, - "request for '%s' is not cached on module '%s'", - cache_key.specifier, - dependent->url_); - return Nothing(); + size_t linked_module_count = dependent->linked_module_wraps_.size(); + if (linked_module_count > 0) { + CHECK_LT(module_request_index, linked_module_count); + } else { + UNREACHABLE("Module resolution callback invoked for a module" + " without linked requests"); } - ModuleWrap* module_wrap = dependent->GetLinkedRequest(it->second); - CHECK_NOT_NULL(module_wrap); - return Just(module_wrap); + return Just(dependent->linked_module_wraps_[module_request_index]); } static MaybeLocal ImportModuleDynamicallyWithPhase( @@ -1196,6 +1208,167 @@ void ModuleWrap::SetImportModuleDynamicallyCallback( ImportModuleDynamicallyWithPhase); } +void ModuleWrap::SetImportMetaResolveInitializer( + const v8::FunctionCallbackInfo& args) { + Isolate* isolate = args.GetIsolate(); + Realm* realm = Realm::GetCurrent(args); + HandleScope handle_scope(isolate); + + CHECK_EQ(args.Length(), 1); + CHECK(args[0]->IsFunction()); + Local initializer = args[0].As(); + realm->set_host_import_meta_resolve_initializer(initializer); +} + +static void ImportMetaResolveLazyGetter( + Local name, const PropertyCallbackInfo& info) { + Isolate* isolate = info.GetIsolate(); + Local receiver_val = info.This(); + if (!receiver_val->IsObject()) { + THROW_ERR_INVALID_INVOCATION(isolate); + return; + } + Local receiver = receiver_val.As(); + Local context; + if (!receiver->GetCreationContext().ToLocal(&context)) { + THROW_ERR_INVALID_INVOCATION(isolate); + return; + } + Realm* realm = Realm::GetCurrent(context); + if (realm == nullptr) { + THROW_ERR_INVALID_INVOCATION(isolate); + } + Local initializer = realm->host_import_meta_resolve_initializer(); + if (initializer.IsEmpty()) { + THROW_ERR_INVALID_INVOCATION(isolate); + return; + } + + // This should be createImportMetaResolve(). The loader argument is already + // bound at initialization time. + Local args[] = {info.Data()}; + Local ret; + if (!initializer + ->Call(context, Undefined(realm->isolate()), arraysize(args), args) + .ToLocal(&ret)) { + return; + } + info.GetReturnValue().Set(ret); +} + +static void PathHelpersLazyGetter(Local name, + const PropertyCallbackInfo& info) { + Isolate* isolate = info.GetIsolate(); + // This getter has no JavaScript function representation and is not + // invoked in the creation context. + // When this getter is invoked in a vm context, the `Realm::GetCurrent(info)` + // returns a nullptr and retrieve the creation context via `this` object and + // get the creation Realm. + Local receiver_val = info.This(); + if (!receiver_val->IsObject()) { + THROW_ERR_INVALID_INVOCATION(isolate); + return; + } + Local receiver = receiver_val.As(); + Local context; + if (!receiver->GetCreationContext().ToLocal(&context)) { + THROW_ERR_INVALID_INVOCATION(isolate); + return; + } + Environment* env = Environment::GetCurrent(context); + + node::Utf8Value url(isolate, info.Data()); + auto file_url = ada::parse(url.ToStringView()); + CHECK(file_url); + auto file_path = url::FileURLToPath(env, *file_url); + CHECK(file_path.has_value()); + std::string_view ret_view = file_path.value(); + + node::Utf8Value utf8name(isolate, name); + auto plain_name = utf8name.ToStringView(); + if (plain_name == "dirname") { +#ifdef _WIN32 +#define PATH_SEPARATOR '\\' +#else +#define PATH_SEPARATOR '/' +#endif + auto index = ret_view.rfind(PATH_SEPARATOR); + CHECK(index != std::string_view::npos); + ret_view.remove_suffix(ret_view.size() - index); +#undef PATH_SEPARATOR + } + Local ret; + if (!ToV8Value(context, ret_view, isolate).ToLocal(&ret)) { + return; + } + info.GetReturnValue().Set(ret); +} + +static Maybe DefaultImportMetaObjectInitializer(Realm* realm, + Local wrap, + Local meta) { + Local context = realm->context(); + Isolate* isolate = realm->isolate(); + Environment* env = realm->env(); + + Local url; + if (!wrap->Get(context, env->url_string()).ToLocal(&url)) { + return Nothing(); + } + + // N.B.: Order is important to keep keys in alphabetical order. + + Utf8Value url_utf8(isolate, url); + if (url_utf8.ToStringView().starts_with("file:")) { + // Set a lazy getter of import.meta.dirname + if (meta->SetLazyDataProperty( + context, env->dirname_string(), PathHelpersLazyGetter, url) + .IsNothing()) { + return Nothing(); + } + + // Set a lazy getter of import.meta.filename + if (meta->SetLazyDataProperty( + context, env->filename_string(), PathHelpersLazyGetter, url) + .IsNothing()) { + return Nothing(); + } + } + + // Set import.meta.main = moduleWrap.isMain + Local is_main; + if (!wrap->Get(context, FIXED_ONE_BYTE_STRING(isolate, "isMain")) + .ToLocal(&is_main)) { + return Nothing(); + } + if (meta->Set(context, + FIXED_ONE_BYTE_STRING(isolate, "main"), + Boolean::New(isolate, is_main->IsTrue())) + .IsEmpty()) { + return Nothing(); + } + + // Set a lazy getter of import.meta.resolve - only if the initializer is set, + // which is only the case when run on a non-loader-hook thread. + Local import_meta_resolve_initializer = + realm->host_import_meta_resolve_initializer(); + if (!import_meta_resolve_initializer.IsEmpty() && + meta->SetLazyDataProperty(context, + FIXED_ONE_BYTE_STRING(isolate, "resolve"), + ImportMetaResolveLazyGetter, + url) + .IsNothing()) { + return Nothing(); + } + + // Set import.meta.url = moduleWrap.url + if (meta->Set(context, env->url_string(), url).IsEmpty()) { + return Nothing(); + } + + return JustVoid(); +} + void ModuleWrap::HostInitializeImportMetaObjectCallback( Local context, Local module, Local meta) { Environment* env = Environment::GetCurrent(context); @@ -1221,8 +1394,19 @@ void ModuleWrap::HostInitializeImportMetaObjectCallback( return; } DCHECK(id->IsSymbol()); + + // Use the default initializer for source text modules without custom + // callbacks. + if (id == env->source_text_module_default_hdo()) { + USE(DefaultImportMetaObjectInitializer(realm, wrap, meta)); + return; + } + + // For modules that have custom callbacks, call into JS land + // to look up the callback from the registry. Local args[] = {id, meta, wrap}; TryCatchScope try_catch(env); + USE(callback->Call( context, Undefined(realm->isolate()), arraysize(args), args)); if (try_catch.HasCaught() && !try_catch.HasTerminated()) { @@ -1441,6 +1625,10 @@ void ModuleWrap::CreatePerIsolateProperties(IsolateData* isolate_data, target, "setInitializeImportMetaObjectCallback", SetInitializeImportMetaObjectCallback); + SetMethod(isolate, + target, + "setImportMetaResolveInitializer", + SetImportMetaResolveInitializer); SetMethod(isolate, target, "createRequiredModuleFacade", @@ -1494,6 +1682,7 @@ void ModuleWrap::RegisterExternalReferences( registry->Register(SetImportModuleDynamicallyCallback); registry->Register(SetInitializeImportMetaObjectCallback); + registry->Register(SetImportMetaResolveInitializer); registry->Register(ThrowIfPromiseRejected); } } // namespace loader diff --git a/src/module_wrap.h b/src/module_wrap.h index d81facabf8d80e..4c18eef502b070 100644 --- a/src/module_wrap.h +++ b/src/module_wrap.h @@ -93,16 +93,14 @@ struct ModuleCacheKey : public MemoryRetainer { }; class ModuleWrap : public BaseObject { - using ResolveCache = - std::unordered_map; - public: enum InternalFields { kModuleSlot = BaseObject::kInternalFieldCount, kModuleSourceObjectSlot, kSyntheticEvaluationStepsSlot, kContextObjectSlot, // Object whose creation context is the target Context - kLinkedRequestsSlot, // Array of linked requests + kLinkedRequestsSlot, // Array of linked requests, each is a ModuleWrap JS + // wrapper object. kInternalFieldCount }; @@ -134,8 +132,6 @@ class ModuleWrap : public BaseObject { bool IsLinked() const { return linked_; } - ModuleWrap* GetLinkedRequest(uint32_t index); - static v8::Local GetHostDefinedOptions( v8::Isolate* isolate, v8::Local symbol); @@ -186,6 +182,8 @@ class ModuleWrap : public BaseObject { static void SetImportModuleDynamicallyCallback( const v8::FunctionCallbackInfo& args); + static void SetImportMetaResolveInitializer( + const v8::FunctionCallbackInfo& args); static void SetInitializeImportMetaObjectCallback( const v8::FunctionCallbackInfo& args); static v8::MaybeLocal SyntheticModuleEvaluationStepsCallback( @@ -196,27 +194,22 @@ class ModuleWrap : public BaseObject { static v8::MaybeLocal ResolveModuleCallback( v8::Local context, - v8::Local specifier, - v8::Local import_attributes, + size_t module_request_index, v8::Local referrer); static v8::MaybeLocal ResolveSourceCallback( v8::Local context, - v8::Local specifier, - v8::Local import_attributes, + size_t module_request_index, v8::Local referrer); static ModuleWrap* GetFromModule(node::Environment*, v8::Local); // This method may throw a JavaScript exception, so the return type is // wrapped in a Maybe. - static v8::Maybe ResolveModule( - v8::Local context, - v8::Local specifier, - v8::Local import_attributes, - v8::Local referrer); + static v8::Maybe ResolveModule(v8::Local context, + size_t module_request_index, + v8::Local referrer); std::string url_; v8::Global module_; - ResolveCache resolve_cache_; contextify::ContextifyContext* contextify_context_ = nullptr; bool synthetic_ = false; bool linked_ = false; @@ -224,6 +217,11 @@ class ModuleWrap : public BaseObject { // nullopt value. std::optional has_async_graph_ = std::nullopt; int module_hash_; + // Corresponds to the ModuleWrap* of the wrappers in kLinkedRequestsSlot. + // These are populated during Link(), and are only valid after that as + // convenient shortcuts, but do not hold the ModuleWraps alive. The actual + // strong references come from the array in kLinkedRequestsSlot. + std::vector linked_module_wraps_; }; } // namespace loader diff --git a/src/node.cc b/src/node.cc index 72d6973723a637..a18660d388be9d 100644 --- a/src/node.cc +++ b/src/node.cc @@ -780,7 +780,10 @@ static ExitCode ProcessGlobalArgsInternal(std::vector* args, env_opts->abort_on_uncaught_exception = true; } - v8_args.emplace_back("--js-source-phase-imports"); + if (std::ranges::find(v8_args, "--no-js-source-phase-imports") == + v8_args.end()) { + v8_args.emplace_back("--js-source-phase-imports"); + } #ifdef __POSIX__ // Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the diff --git a/src/node.h b/src/node.h index 94c307e3f84923..75553fb119fae4 100644 --- a/src/node.h +++ b/src/node.h @@ -76,7 +76,6 @@ #include "v8-platform.h" // NOLINT(build/include_order) #include "node_version.h" // NODE_MODULE_VERSION -#define NAPI_EXPERIMENTAL #include "node_api.h" #include @@ -1402,6 +1401,10 @@ NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate, v8::Local resource, const char* name, async_id trigger_async_id = -1); +NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate, + v8::Local resource, + std::string_view name, + async_id trigger_async_id = -1); NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate, v8::Local resource, @@ -1508,6 +1511,10 @@ class NODE_EXTERN AsyncResource { v8::Local resource, const char* name, async_id trigger_async_id = -1); + AsyncResource(v8::Isolate* isolate, + v8::Local resource, + std::string_view name, + async_id trigger_async_id = -1); virtual ~AsyncResource(); diff --git a/src/node_api.cc b/src/node_api.cc index 7274030f9491ef..11b9e44233d94c 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -1,7 +1,9 @@ #include "async_context_frame.h" #include "async_wrap-inl.h" #include "env-inl.h" +#ifndef NAPI_EXPERIMENTAL #define NAPI_EXPERIMENTAL +#endif #include "js_native_api_v8.h" #include "memory_tracker-inl.h" #include "node_api.h" @@ -212,7 +214,7 @@ class ThreadSafeFunction : public node::AsyncResource { napi_threadsafe_function_call_js call_js_cb_) : AsyncResource(env_->isolate, resource, - *v8::String::Utf8Value(env_->isolate, name)), + node::Utf8Value(env_->isolate, name).ToStringView()), thread_count(thread_count_), is_closing(false), dispatch_state(kDispatchIdle), @@ -1150,7 +1152,7 @@ class Work : public node::AsyncResource, public node::ThreadPoolWork { : AsyncResource( env->isolate, async_resource, - *v8::String::Utf8Value(env->isolate, async_resource_name)), + node::Utf8Value(env->isolate, async_resource_name).ToStringView()), ThreadPoolWork(env->node_env(), "node_api"), _env(env), _data(data), diff --git a/src/node_api.h b/src/node_api.h index 35e5c3e49dd426..46dbb02b47d24b 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -33,10 +33,6 @@ struct uv_loop_s; // Forward declaration. #define NAPI_NO_RETURN #endif -typedef napi_value(NAPI_CDECL* napi_addon_register_func)(napi_env env, - napi_value exports); -typedef int32_t(NAPI_CDECL* node_api_addon_get_api_version_func)(void); - // Used by deprecated registration method napi_module_register. typedef struct napi_module { int nm_version; diff --git a/src/node_api_internals.h b/src/node_api_internals.h index 21d0a1d25e83e9..43d28211ddb3d4 100644 --- a/src/node_api_internals.h +++ b/src/node_api_internals.h @@ -2,7 +2,9 @@ #define SRC_NODE_API_INTERNALS_H_ #include "v8.h" +#ifndef NAPI_EXPERIMENTAL #define NAPI_EXPERIMENTAL +#endif #include "env-inl.h" #include "js_native_api_v8.h" #include "node_api.h" diff --git a/src/node_api_types.h b/src/node_api_types.h index 9c2f03f4d09c08..2580f15c030d22 100644 --- a/src/node_api_types.h +++ b/src/node_api_types.h @@ -3,6 +3,10 @@ #include "js_native_api_types.h" +typedef napi_value(NAPI_CDECL* napi_addon_register_func)(napi_env env, + napi_value exports); +typedef int32_t(NAPI_CDECL* node_api_addon_get_api_version_func)(void); + typedef struct napi_callback_scope__* napi_callback_scope; typedef struct napi_async_context__* napi_async_context; typedef struct napi_async_work__* napi_async_work; diff --git a/src/node_binding.h b/src/node_binding.h index e3255e8e8e7e2e..dbb4c137afc776 100644 --- a/src/node_binding.h +++ b/src/node_binding.h @@ -8,7 +8,6 @@ #endif #include "node.h" -#define NAPI_EXPERIMENTAL #include "node_api.h" #include "quic/guard.h" #include "uv.h" diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 0e4d437c1ea501..cc418017f76803 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -986,11 +986,7 @@ void IndexOfString(const FunctionCallbackInfo& args) { size_t result = haystack_length; if (enc == UCS2) { - String::Value needle_value(isolate, needle); - if (*needle_value == nullptr) { - return args.GetReturnValue().Set(-1); - } - + TwoByteValue needle_value(isolate, needle); if (haystack_length < 2 || needle_value.length() < 1) { return args.GetReturnValue().Set(-1); } @@ -1011,27 +1007,27 @@ void IndexOfString(const FunctionCallbackInfo& args) { offset / 2, is_forward); } else { - result = - nbytes::SearchString(reinterpret_cast(haystack), - haystack_length / 2, - reinterpret_cast(*needle_value), - needle_value.length(), - offset / 2, - is_forward); + result = nbytes::SearchString(reinterpret_cast(haystack), + haystack_length / 2, + needle_value.out(), + needle_value.length(), + offset / 2, + is_forward); } result *= 2; } else if (enc == UTF8) { - String::Utf8Value needle_value(isolate, needle); + Utf8Value needle_value(isolate, needle); if (*needle_value == nullptr) return args.GetReturnValue().Set(-1); - - result = - nbytes::SearchString(reinterpret_cast(haystack), - haystack_length, - reinterpret_cast(*needle_value), - needle_length, - offset, - is_forward); + CHECK_GE(needle_length, needle_value.length()); + + result = nbytes::SearchString( + reinterpret_cast(haystack), + haystack_length, + reinterpret_cast(needle_value.out()), + needle_length, + offset, + is_forward); } else if (enc == LATIN1) { uint8_t* needle_data = node::UncheckedMalloc(needle_length); if (needle_data == nullptr) { @@ -1316,10 +1312,10 @@ static void Btoa(const FunctionCallbackInfo& args) { input->Length(), buffer.out()); } else { - String::Value value(env->isolate(), input); + TwoByteValue value(env->isolate(), input); MaybeStackBuffer stack_buf(value.length()); size_t out_len = simdutf::convert_utf16_to_latin1( - reinterpret_cast(*value), + reinterpret_cast(value.out()), value.length(), stack_buf.out()); if (out_len == 0) { // error @@ -1370,8 +1366,8 @@ static void Atob(const FunctionCallbackInfo& args) { buffer.SetLength(expected_length); result = simdutf::base64_to_binary(data, input->Length(), buffer.out()); } else { // 16-bit case - String::Value value(env->isolate(), input); - auto data = reinterpret_cast(*value); + TwoByteValue value(env->isolate(), input); + auto data = reinterpret_cast(value.out()); size_t expected_length = simdutf::maximal_binary_length_from_base64(data, value.length()); buffer.AllocateSufficientStorage(expected_length); diff --git a/src/node_debug.cc b/src/node_debug.cc index bb0e11747e418c..c995e791f252b2 100644 --- a/src/node_debug.cc +++ b/src/node_debug.cc @@ -8,6 +8,7 @@ #include "v8-fast-api-calls.h" #include "v8.h" +#include #include #include #endif // DEBUG @@ -23,9 +24,19 @@ using v8::Number; using v8::Object; using v8::Value; +thread_local std::unordered_map + generic_usage_counters; thread_local std::unordered_map v8_fast_api_call_counts; +void CountGenericUsage(FastStringKey counter_name) { + generic_usage_counters[counter_name]++; +} + +int GetGenericUsageCount(FastStringKey counter_name) { + return generic_usage_counters[counter_name]; +} + void TrackV8FastApiCall(FastStringKey key) { v8_fast_api_call_counts[key]++; } @@ -34,6 +45,17 @@ int GetV8FastApiCallCount(FastStringKey key) { return v8_fast_api_call_counts[key]; } +void GetGenericUsageCount(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + if (!args[0]->IsString()) { + env->ThrowError("getGenericUsageCount must be called with a string"); + return; + } + Utf8Value utf8_key(env->isolate(), args[0]); + args.GetReturnValue().Set(GetGenericUsageCount( + FastStringKey::AllowDynamic(utf8_key.ToStringView()))); +} + void GetV8FastApiCallCount(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); if (!args[0]->IsString()) { @@ -89,6 +111,7 @@ void Initialize(Local target, Local context, void* priv) { SetMethod(context, target, "getV8FastApiCallCount", GetV8FastApiCallCount); + SetMethod(context, target, "getGenericUsageCount", GetGenericUsageCount); SetFastMethod(context, target, "isEven", SlowIsEven, &fast_is_even); SetFastMethod(context, target, "isOdd", SlowIsOdd, &fast_is_odd); } diff --git a/src/node_debug.h b/src/node_debug.h index 32fbf21c813366..14dc033fe3caf3 100644 --- a/src/node_debug.h +++ b/src/node_debug.h @@ -13,10 +13,15 @@ namespace debug { void TrackV8FastApiCall(FastStringKey key); int GetV8FastApiCallCount(FastStringKey key); +void CountGenericUsage(FastStringKey counter_name); +#define COUNT_GENERIC_USAGE(name) \ + node::debug::CountGenericUsage(FastStringKey(name)) + #define TRACK_V8_FAST_API_CALL(key) \ node::debug::TrackV8FastApiCall(FastStringKey(key)) #else // !DEBUG #define TRACK_V8_FAST_API_CALL(key) +#define COUNT_GENERIC_USAGE(name) #endif // DEBUG } // namespace debug diff --git a/src/node_errors.cc b/src/node_errors.cc index 7ad099a11b98aa..ec84aaafbdc99a 100644 --- a/src/node_errors.cc +++ b/src/node_errors.cc @@ -1024,15 +1024,14 @@ void PerIsolateMessageListener(Local message, Local error) { break; } Utf8Value filename(isolate, message->GetScriptOrigin().ResourceName()); + Utf8Value msg(isolate, message->Get()); // (filename):(line) (message) - std::stringstream warning; - warning << *filename; - warning << ":"; - warning << message->GetLineNumber(env->context()).FromMaybe(-1); - warning << " "; - v8::String::Utf8Value msg(isolate, message->Get()); - warning << *msg; - USE(ProcessEmitWarningGeneric(env, warning.str().c_str(), "V8")); + std::string warning = + SPrintF("%s:%s %s", + filename, + message->GetLineNumber(env->context()).FromMaybe(-1), + msg); + USE(ProcessEmitWarningGeneric(env, warning, "V8")); break; } case Isolate::MessageErrorLevel::kMessageError: diff --git a/src/node_file.cc b/src/node_file.cc index f0d512069c6dc6..d925605feba8a6 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -222,9 +222,12 @@ void FSReqBase::MemoryInfo(MemoryTracker* tracker) const { // collection if necessary. If that happens, a process warning will be // emitted (or a fatal exception will occur if the fd cannot be closed.) FileHandle::FileHandle(BindingData* binding_data, - Local obj, int fd) + Local obj, + int fd, + std::string original_name) : AsyncWrap(binding_data->env(), obj, AsyncWrap::PROVIDER_FILEHANDLE), StreamBase(env()), + original_name_(std::move(original_name)), fd_(fd), binding_data_(binding_data) { MakeWeak(); @@ -234,6 +237,7 @@ FileHandle::FileHandle(BindingData* binding_data, FileHandle* FileHandle::New(BindingData* binding_data, int fd, Local obj, + std::string original_name, std::optional maybeOffset, std::optional maybeLength) { Environment* env = binding_data->env(); @@ -242,7 +246,7 @@ FileHandle* FileHandle::New(BindingData* binding_data, .ToLocal(&obj)) { return nullptr; } - auto handle = new FileHandle(binding_data, obj, fd); + auto handle = new FileHandle(binding_data, obj, fd, original_name); if (maybeOffset.has_value()) handle->read_offset_ = maybeOffset.value(); if (maybeLength.has_value()) handle->read_length_ = maybeLength.value(); return handle; @@ -274,6 +278,7 @@ void FileHandle::New(const FunctionCallbackInfo& args) { FileHandle::New(binding_data, args[0].As()->Value(), args.This(), + {}, maybeOffset, maybeLength); } @@ -293,6 +298,7 @@ int FileHandle::DoWrite(WriteWrap* w, void FileHandle::MemoryInfo(MemoryTracker* tracker) const { tracker->TrackField("current_read", current_read_); + tracker->TrackField("original_name", original_name_); } BaseObject::TransferMode FileHandle::GetTransferMode() const { @@ -344,9 +350,13 @@ inline void FileHandle::Close() { FS_SYNC_TRACE_END(close); uv_fs_req_cleanup(&req); - struct err_detail { int ret; int fd; }; + struct err_detail { + int ret; + int fd; + std::string name; + }; - err_detail detail { ret, fd_ }; + err_detail detail{ret, fd_, original_name_}; AfterClose(); @@ -362,17 +372,19 @@ inline void FileHandle::Close() { // down the process is the only reasonable thing we can do here. env()->SetImmediate([detail](Environment* env) { HandleScope handle_scope(env->isolate()); + static constexpr std::string_view unknown_path = ""; + std::string_view filename = + detail.name.empty() ? unknown_path : detail.name; // If there was an error while trying to close the file descriptor, // we will throw that instead. if (detail.ret < 0) { - char msg[70]; - snprintf(msg, - arraysize(msg), - "Closing file descriptor %d on garbage collection failed", - detail.fd); + auto formatted = SPrintF( + "Closing file descriptor %d on garbage collection failed (%s)", + detail.fd, + filename); HandleScope handle_scope(env->isolate()); - env->ThrowUVException(detail.ret, "close", msg); + env->ThrowUVException(detail.ret, "close", formatted.c_str()); return; } @@ -380,7 +392,10 @@ inline void FileHandle::Close() { env, "A FileHandle object was closed during garbage collection. " "This used to be allowed with a deprecation warning but is now " - "considered an error. Please close FileHandle objects explicitly."); + "considered an error. Please close FileHandle objects explicitly. " + "File descriptor: %d (%s)", + detail.fd, + filename); }); } @@ -824,8 +839,8 @@ void AfterOpenFileHandle(uv_fs_t* req) { FS_ASYNC_TRACE_END1( req->fs_type, req_wrap, "result", static_cast(req->result)) if (after.Proceed()) { - FileHandle* fd = FileHandle::New(req_wrap->binding_data(), - static_cast(req->result)); + FileHandle* fd = FileHandle::New( + req_wrap->binding_data(), static_cast(req->result), {}, req->path); if (fd == nullptr) return; req_wrap->Resolve(fd->object()); } @@ -2222,7 +2237,7 @@ static void OpenFileHandle(const FunctionCallbackInfo& args) { if (result < 0) { return; // syscall failed, no need to continue, error info is in ctx } - FileHandle* fd = FileHandle::New(binding_data, result); + FileHandle* fd = FileHandle::New(binding_data, result, {}, path.ToString()); if (fd == nullptr) return; args.GetReturnValue().Set(fd->object()); } @@ -3169,42 +3184,6 @@ static void GetFormatOfExtensionlessFile( return args.GetReturnValue().Set(EXTENSIONLESS_FORMAT_JAVASCRIPT); } -#ifdef _WIN32 -#define BufferValueToPath(str) \ - std::filesystem::path(ConvertToWideString(str.ToString(), CP_UTF8)) - -std::string ConvertWideToUTF8(const std::wstring& wstr) { - if (wstr.empty()) return std::string(); - - int size_needed = WideCharToMultiByte(CP_UTF8, - 0, - &wstr[0], - static_cast(wstr.size()), - nullptr, - 0, - nullptr, - nullptr); - std::string strTo(size_needed, 0); - WideCharToMultiByte(CP_UTF8, - 0, - &wstr[0], - static_cast(wstr.size()), - &strTo[0], - size_needed, - nullptr, - nullptr); - return strTo; -} - -#define PathToString(path) ConvertWideToUTF8(path.wstring()); - -#else // _WIN32 - -#define BufferValueToPath(str) std::filesystem::path(str.ToStringView()); -#define PathToString(path) path.native(); - -#endif // _WIN32 - static void CpSyncCheckPaths(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); Isolate* isolate = env->isolate(); @@ -3217,7 +3196,7 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo& args) { THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemRead, src.ToStringView()); - auto src_path = BufferValueToPath(src); + auto src_path = src.ToPath(); BufferValue dest(isolate, args[1]); CHECK_NOT_NULL(*dest); @@ -3225,7 +3204,7 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo& args) { THROW_IF_INSUFFICIENT_PERMISSIONS( env, permission::PermissionScope::kFileSystemWrite, dest.ToStringView()); - auto dest_path = BufferValueToPath(dest); + auto dest_path = dest.ToPath(); bool dereference = args[2]->IsTrue(); bool recursive = args[3]->IsTrue(); @@ -3254,8 +3233,8 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo& args) { (src_status.type() == std::filesystem::file_type::directory) || (dereference && src_status.type() == std::filesystem::file_type::symlink); - auto src_path_str = PathToString(src_path); - auto dest_path_str = PathToString(dest_path); + auto src_path_str = ConvertPathToUTF8(src_path); + auto dest_path_str = ConvertPathToUTF8(dest_path); if (!error_code) { // Check if src and dest are identical. @@ -3350,7 +3329,7 @@ static bool CopyUtimes(const std::filesystem::path& src, uv_fs_t req; auto cleanup = OnScopeLeave([&req]() { uv_fs_req_cleanup(&req); }); - auto src_path_str = PathToString(src); + auto src_path_str = ConvertPathToUTF8(src); int result = uv_fs_stat(nullptr, &req, src_path_str.c_str(), nullptr); if (is_uv_error(result)) { env->ThrowUVException(result, "stat", nullptr, src_path_str.c_str()); @@ -3361,7 +3340,7 @@ static bool CopyUtimes(const std::filesystem::path& src, const double source_atime = s->st_atim.tv_sec + s->st_atim.tv_nsec / 1e9; const double source_mtime = s->st_mtim.tv_sec + s->st_mtim.tv_nsec / 1e9; - auto dest_file_path_str = PathToString(dest); + auto dest_file_path_str = ConvertPathToUTF8(dest); int utime_result = uv_fs_utime(nullptr, &req, dest_file_path_str.c_str(), @@ -3496,7 +3475,7 @@ static void CpSyncCopyDir(const FunctionCallbackInfo& args) { std::error_code error; for (auto dir_entry : std::filesystem::directory_iterator(src)) { auto dest_file_path = dest / dir_entry.path().filename(); - auto dest_str = PathToString(dest); + auto dest_str = ConvertPathToUTF8(dest); if (dir_entry.is_symlink()) { if (verbatim_symlinks) { @@ -3526,12 +3505,10 @@ static void CpSyncCopyDir(const FunctionCallbackInfo& args) { if (!dereference && std::filesystem::is_directory(symlink_target) && isInsideDir(symlink_target, current_dest_symlink_target)) { - std::string message = + static constexpr const char* message = "Cannot copy %s to a subdirectory of self %s"; - THROW_ERR_FS_CP_EINVAL(env, - message.c_str(), - symlink_target.c_str(), - current_dest_symlink_target.c_str()); + THROW_ERR_FS_CP_EINVAL( + env, message, symlink_target, current_dest_symlink_target); return false; } @@ -3540,12 +3517,10 @@ static void CpSyncCopyDir(const FunctionCallbackInfo& args) { // and therefore a broken symlink would be created. if (std::filesystem::is_directory(dest_file_path) && isInsideDir(current_dest_symlink_target, symlink_target)) { - std::string message = "cannot overwrite %s with %s"; + static constexpr const char* message = + "cannot overwrite %s with %s"; THROW_ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY( - env, - message.c_str(), - current_dest_symlink_target.c_str(), - symlink_target.c_str()); + env, message, current_dest_symlink_target, symlink_target); return false; } @@ -3559,7 +3534,7 @@ static void CpSyncCopyDir(const FunctionCallbackInfo& args) { } } else if (std::filesystem::is_regular_file(dest_file_path)) { if (!dereference || (!force && error_on_exist)) { - auto dest_file_path_str = PathToString(dest_file_path); + auto dest_file_path_str = ConvertPathToUTF8(dest_file_path); env->ThrowStdErrException( std::make_error_code(std::errc::file_exists), "cp", @@ -3597,7 +3572,7 @@ static void CpSyncCopyDir(const FunctionCallbackInfo& args) { THROW_ERR_FS_CP_EEXIST(isolate, "[ERR_FS_CP_EEXIST]: Target already exists: " "cp returned EEXIST (%s already exists)", - dest_file_path.c_str()); + dest_file_path); return false; } env->ThrowStdErrException(error, "cp", dest_str.c_str()); diff --git a/src/node_file.h b/src/node_file.h index 224fa6f7ade375..e028562fef0412 100644 --- a/src/node_file.h +++ b/src/node_file.h @@ -329,6 +329,7 @@ class FileHandle final : public AsyncWrap, public StreamBase { static FileHandle* New(BindingData* binding_data, int fd, v8::Local obj = v8::Local(), + std::string original_name = {}, std::optional maybeOffset = std::nullopt, std::optional maybeLength = std::nullopt); ~FileHandle() override; @@ -395,7 +396,10 @@ class FileHandle final : public AsyncWrap, public StreamBase { int fd_; }; - FileHandle(BindingData* binding_data, v8::Local obj, int fd); + FileHandle(BindingData* binding_data, + v8::Local obj, + int fd, + std::string original_name); // Synchronous close that emits a warning void Close(); @@ -437,6 +441,7 @@ class FileHandle final : public AsyncWrap, public StreamBase { // Asynchronous close v8::MaybeLocal ClosePromise(); + std::string original_name_; int fd_; bool closing_ = false; bool closed_ = false; diff --git a/src/node_internals.h b/src/node_internals.h index 978994ee1c9c3a..6ec17b35cae6c6 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -56,6 +56,9 @@ extern uint64_t node_start_time; // Forward declaration class Environment; +static constexpr uint64_t kMaxPointerCompressionHeap = uint64_t{1} + << 32; // 4 GiB + // Convert a struct sockaddr to a { address: '1.2.3.4', port: 1234 } JS object. // Sets address and port properties on the info object and returns it. // If |info| is omitted, a new object is returned. @@ -342,6 +345,20 @@ void TraceEnvVar(Environment* env, v8::Local key); void DefineZlibConstants(v8::Local target); + +// If creating new v8::IsolateGroup instance is supported, this returns a +// new instance. Otherwise, it returns the default instance. +// +// An IsolateGroup is a collection of Isolates that share the same underlying +// pointer cage when pointer compression is enabled. When pointer compression is +// disabled, there is a default IsolateGroup that is used for all isolates, and +// when pointer compression is enabled, all isolates in the app share the +// same pointer cage by default that is limited a maximum of 4GB, not counting +// array buffers and off-heap storage. Multiple IsolateGroups can be used to +// work around the 4GB limit, but each group reserves a range of virtual memory +// addresses, so this should be used with care. +v8::IsolateGroup GetOrCreateIsolateGroup(); + v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params, uv_loop_t* event_loop, MultiIsolatePlatform* platform, diff --git a/src/node_modules.cc b/src/node_modules.cc index 7e615a691a5a14..9131c4f27e7d83 100644 --- a/src/node_modules.cc +++ b/src/node_modules.cc @@ -35,7 +35,6 @@ using v8::Null; using v8::Object; using v8::ObjectTemplate; using v8::Primitive; -using v8::PropertyCallbackInfo; using v8::String; using v8::Undefined; using v8::Value; @@ -296,22 +295,24 @@ const BindingData::PackageConfig* BindingData::TraverseParent( // Stop the search when the process doesn't have permissions // to walk upwards - if (is_permissions_enabled && - !env->permission()->is_granted( - env, - permission::PermissionScope::kFileSystemRead, - current_path.generic_string())) [[unlikely]] { - return nullptr; + if (is_permissions_enabled) { + if (!env->permission()->is_granted( + env, + permission::PermissionScope::kFileSystemRead, + ConvertGenericPathToUTF8(current_path))) [[unlikely]] { + return nullptr; + } } // Check if the path ends with `/node_modules` - if (current_path.generic_string().ends_with("/node_modules")) { + if (current_path.filename() == "node_modules") { return nullptr; } auto package_json_path = current_path / "package.json"; + auto package_json = - GetPackageJSON(realm, package_json_path.string(), nullptr); + GetPackageJSON(realm, ConvertPathToUTF8(package_json_path), nullptr); if (package_json != nullptr) { return package_json; } @@ -333,20 +334,12 @@ void BindingData::GetNearestParentPackageJSONType( ToNamespacedPath(realm->env(), &path_value); - std::string path_value_str = path_value.ToString(); + auto path = path_value.ToPath(); + if (slashCheck) { - path_value_str.push_back(kPathSeparator); + path /= ""; } - std::filesystem::path path; - -#ifdef _WIN32 - std::wstring wide_path = ConvertToWideString(path_value_str, GetACP()); - path = std::filesystem::path(wide_path); -#else - path = std::filesystem::path(path_value_str); -#endif - auto package_json = TraverseParent(realm, path); if (package_json == nullptr) { @@ -555,76 +548,6 @@ void GetCompileCacheEntry(const FunctionCallbackInfo& args) { isolate, v8::Null(isolate), names.data(), values.data(), names.size())); } -static void PathHelpersLazyGetter(Local name, - const PropertyCallbackInfo& info) { - Isolate* isolate = info.GetIsolate(); - // This getter has no JavaScript function representation and is not - // invoked in the creation context. - // When this getter is invoked in a vm context, the `Realm::GetCurrent(info)` - // returns a nullptr and retrieve the creation context via `this` object and - // get the creation Realm. - Local receiver_val = info.This(); - if (!receiver_val->IsObject()) { - THROW_ERR_INVALID_INVOCATION(isolate); - return; - } - Local receiver = receiver_val.As(); - Local context; - if (!receiver->GetCreationContext().ToLocal(&context)) { - THROW_ERR_INVALID_INVOCATION(isolate); - return; - } - Environment* env = Environment::GetCurrent(context); - - node::Utf8Value url(isolate, info.Data()); - auto file_url = ada::parse(url.ToStringView()); - CHECK(file_url); - auto file_path = url::FileURLToPath(env, *file_url); - CHECK(file_path.has_value()); - std::string_view ret_view = file_path.value(); - - node::Utf8Value utf8name(isolate, name); - auto plain_name = utf8name.ToStringView(); - if (plain_name == "dirname") { -#ifdef _WIN32 -#define PATH_SEPARATOR '\\' -#else -#define PATH_SEPARATOR '/' -#endif - auto index = ret_view.rfind(PATH_SEPARATOR); - CHECK(index != std::string_view::npos); - ret_view.remove_suffix(ret_view.size() - index); -#undef PATH_SEPARATOR - } - Local ret; - if (!ToV8Value(context, ret_view, isolate).ToLocal(&ret)) { - return; - } - info.GetReturnValue().Set(ret); -} -void InitImportMetaPathHelpers(const FunctionCallbackInfo& args) { - // target, url, shouldSetDirnameAndFilename, resolve - CHECK_GE(args.Length(), 2); - CHECK(args[0]->IsObject()); - CHECK(args[1]->IsString()); - - Isolate* isolate = args.GetIsolate(); - Local context = isolate->GetCurrentContext(); - Environment* env = Environment::GetCurrent(context); - - auto target = args[0].As(); - - // N.B.: Order is important to keep keys in alphabetical order. - if (target - ->SetLazyDataProperty( - context, env->dirname_string(), PathHelpersLazyGetter, args[1]) - .IsNothing() || - target - ->SetLazyDataProperty( - context, env->filename_string(), PathHelpersLazyGetter, args[1]) - .IsNothing()) - return; -} void SaveCompileCacheEntry(const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); Local context = isolate->GetCurrentContext(); @@ -654,7 +577,6 @@ void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, SetMethod(isolate, target, "flushCompileCache", FlushCompileCache); SetMethod(isolate, target, "getCompileCacheEntry", GetCompileCacheEntry); SetMethod(isolate, target, "saveCompileCacheEntry", SaveCompileCacheEntry); - SetMethod(isolate, target, "setLazyPathHelpers", InitImportMetaPathHelpers); } void BindingData::CreatePerContextProperties(Local target, @@ -709,7 +631,6 @@ void BindingData::RegisterExternalReferences( registry->Register(FlushCompileCache); registry->Register(GetCompileCacheEntry); registry->Register(SaveCompileCacheEntry); - registry->Register(InitImportMetaPathHelpers); } } // namespace modules diff --git a/src/node_options.cc b/src/node_options.cc index 2d9ccba7fe4feb..8dd186477c8875 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -128,7 +128,15 @@ void PerIsolateOptions::HandleMaxOldSpaceSizePercentage( } // Get available memory in bytes +#ifdef V8_COMPRESS_POINTERS + // When pointer compression is enabled, V8 uses a 4 GiB heap limit. + // We'll use the smaller of that or the total system memory as + // reported by uv. + uint64_t total_memory = + std::min(uv_get_total_memory(), kMaxPointerCompressionHeap); // 4 GiB +#else uint64_t total_memory = uv_get_total_memory(); +#endif uint64_t constrained_memory = uv_get_constrained_memory(); // Use constrained memory if available, otherwise use total memory @@ -242,7 +250,7 @@ void EnvironmentOptions::CheckOptions(std::vector* errors, } else if (test_runner_force_exit) { errors->push_back("either --watch or --test-force-exit " "can be used, not both"); - } else if (!test_runner && (argv->size() < 1 || (*argv)[1].empty())) { + } else if (!test_runner && watch_mode_paths.empty() && argv->size() < 1) { errors->push_back("--watch requires specifying a file"); } @@ -559,12 +567,12 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { NoOp{}, #endif kAllowedInEnvvar); - AddOption("--webstorage", - "Web Storage API", + AddOption("--experimental-webstorage", + "experimental Web Storage API", &EnvironmentOptions::webstorage, kAllowedInEnvvar, true); - AddAlias("--experimental-webstorage", "--webstorage"); + AddAlias("--webstorage", "--experimental-webstorage"); AddOption("--localstorage-file", "file used to persist localStorage data", &EnvironmentOptions::localstorage_file, @@ -1013,20 +1021,26 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--watch", "run in watch mode", &EnvironmentOptions::watch_mode, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kWatchNamespace); AddOption("--watch-path", "path to watch", &EnvironmentOptions::watch_mode_paths, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kWatchNamespace); AddOption("--watch-kill-signal", "kill signal to send to the process on watch mode restarts" "(default: SIGTERM)", &EnvironmentOptions::watch_mode_kill_signal, - kAllowedInEnvvar); + kAllowedInEnvvar, + OptionNamespaces::kWatchNamespace); AddOption("--watch-preserve-output", "preserve outputs on watch mode restart", &EnvironmentOptions::watch_mode_preserve_output, - kAllowedInEnvvar); + kAllowedInEnvvar, + false, + OptionNamespaces::kWatchNamespace); Implies("--watch-path", "--watch"); AddOption("--check", "syntax check script without executing", @@ -1057,17 +1071,18 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "ES module to preload (option can be repeated)", &EnvironmentOptions::preload_esm_modules, kAllowedInEnvvar); - AddOption("--experimental-strip-types", - "Experimental type-stripping for TypeScript files.", - &EnvironmentOptions::experimental_strip_types, + AddOption("--strip-types", + "Type-stripping for TypeScript files.", + &EnvironmentOptions::strip_types, kAllowedInEnvvar, true); + AddAlias("--experimental-strip-types", "--strip-types"); AddOption("--experimental-transform-types", "enable transformation of TypeScript-only" "syntax into JavaScript code", &EnvironmentOptions::experimental_transform_types, kAllowedInEnvvar); - Implies("--experimental-transform-types", "--experimental-strip-types"); + Implies("--experimental-transform-types", "--strip-types"); Implies("--experimental-transform-types", "--enable-source-maps"); AddOption("--interactive", "always enter the REPL even if stdin does not appear " diff --git a/src/node_options.h b/src/node_options.h index e1b633a067fb09..620ba0fc035a5b 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -155,7 +155,7 @@ class EnvironmentOptions : public Options { int64_t heap_snapshot_near_heap_limit = 0; std::string heap_snapshot_signal; bool network_family_autoselection = true; - uint64_t network_family_autoselection_attempt_timeout = 250; + uint64_t network_family_autoselection_attempt_timeout = 500; uint64_t max_http_header_size = 16 * 1024; bool deprecation = true; bool force_async_hooks_checks = true; @@ -185,8 +185,8 @@ class EnvironmentOptions : public Options { #endif // HAVE_INSPECTOR std::string redirect_warnings; std::string diagnostic_dir; - std::string env_file; - std::string optional_env_file; + std::vector env_file; + std::vector optional_env_file; bool has_env_file_string = false; bool test_runner = false; uint64_t test_runner_concurrency = 0; @@ -259,7 +259,7 @@ class EnvironmentOptions : public Options { std::vector preload_esm_modules; - bool experimental_strip_types = true; + bool strip_types = true; bool experimental_transform_types = false; std::vector user_argv; @@ -415,7 +415,8 @@ std::vector MapAvailableNamespaces(); // Define all namespace entries #define OPTION_NAMESPACE_LIST(V) \ V(kNoNamespace, "") \ - V(kTestRunnerNamespace, "testRunner") + V(kTestRunnerNamespace, "testRunner") \ + V(kWatchNamespace, "watch") enum class OptionNamespaces { #define V(name, _) name, diff --git a/src/node_report.cc b/src/node_report.cc index 0bbf829b45fb61..e4cb681fd76890 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -455,8 +455,7 @@ static Maybe ErrorToString(Isolate* isolate, if (!maybe_str.ToLocal(&js_str)) { return Nothing(); } - String::Utf8Value sv(isolate, js_str); - return Just<>(std::string(*sv, sv.length())); + return Just(Utf8Value(isolate, js_str).ToString()); } static void PrintEmptyJavaScriptStack(JSONWriter* writer) { diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index cf9ce6686cffca..0b111ce1fb1d59 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -753,6 +753,14 @@ bool DatabaseSync::Open() { CHECK_ERROR_OR_THROW(env()->isolate(), this, r, SQLITE_OK, false); CHECK_EQ(foreign_keys_enabled, open_config_.get_enable_foreign_keys()); + int defensive_enabled; + r = sqlite3_db_config(connection_, + SQLITE_DBCONFIG_DEFENSIVE, + static_cast(open_config_.get_enable_defensive()), + &defensive_enabled); + CHECK_ERROR_OR_THROW(env()->isolate(), this, r, SQLITE_OK, false); + CHECK_EQ(defensive_enabled, open_config_.get_enable_defensive()); + sqlite3_busy_timeout(connection_, open_config_.get_timeout()); if (allow_load_extension_) { @@ -1065,6 +1073,21 @@ void DatabaseSync::New(const FunctionCallbackInfo& args) { allow_unknown_named_params_v.As()->Value()); } } + + Local defensive_v; + if (!options->Get(env->context(), env->defensive_string()) + .ToLocal(&defensive_v)) { + return; + } + if (!defensive_v->IsUndefined()) { + if (!defensive_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.defensive\" argument must be a boolean."); + return; + } + open_config.set_enable_defensive(defensive_v.As()->Value()); + } } new DatabaseSync( @@ -1508,8 +1531,7 @@ void DatabaseSync::CreateSession(const FunctionCallbackInfo& args) { } if (table_value->IsString()) { - String::Utf8Value str(env->isolate(), table_value); - table = *str; + table = Utf8Value(env->isolate(), table_value).ToString(); } else { THROW_ERR_INVALID_ARG_TYPE( env->isolate(), "The \"options.table\" argument must be a string."); @@ -1529,8 +1551,7 @@ void DatabaseSync::CreateSession(const FunctionCallbackInfo& args) { return; } if (db_value->IsString()) { - String::Utf8Value str(env->isolate(), db_value); - db_name = std::string(*str); + db_name = Utf8Value(env->isolate(), db_value).ToString(); } else { THROW_ERR_INVALID_ARG_TYPE( env->isolate(), "The \"options.db\" argument must be a string."); @@ -1837,6 +1858,26 @@ void DatabaseSync::EnableLoadExtension( CHECK_ERROR_OR_THROW(isolate, db, load_extension_ret, SQLITE_OK, void()); } +void DatabaseSync::EnableDefensive(const FunctionCallbackInfo& args) { + DatabaseSync* db; + ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); + Environment* env = Environment::GetCurrent(args); + THROW_AND_RETURN_ON_BAD_STATE(env, !db->IsOpen(), "database is not open"); + + auto isolate = args.GetIsolate(); + if (!args[0]->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE(isolate, + "The \"active\" argument must be a boolean."); + return; + } + + const int enable = args[0].As()->Value(); + int defensive_enabled; + const int defensive_ret = sqlite3_db_config( + db->connection_, SQLITE_DBCONFIG_DEFENSIVE, enable, &defensive_enabled); + CHECK_ERROR_OR_THROW(isolate, db, defensive_ret, SQLITE_OK, void()); +} + void DatabaseSync::LoadExtension(const FunctionCallbackInfo& args) { DatabaseSync* db; ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); @@ -3318,6 +3359,8 @@ static void Initialize(Local target, db_tmpl, "enableLoadExtension", DatabaseSync::EnableLoadExtension); + SetProtoMethod( + isolate, db_tmpl, "enableDefensive", DatabaseSync::EnableDefensive); SetProtoMethod( isolate, db_tmpl, "loadExtension", DatabaseSync::LoadExtension); SetProtoMethod( diff --git a/src/node_sqlite.h b/src/node_sqlite.h index 862c73bf1cdb46..8f0f9f15d621d5 100644 --- a/src/node_sqlite.h +++ b/src/node_sqlite.h @@ -65,6 +65,10 @@ class DatabaseOpenConfiguration { return allow_unknown_named_params_; } + inline void set_enable_defensive(bool flag) { defensive_ = flag; } + + inline bool get_enable_defensive() const { return defensive_; } + private: std::string location_; bool read_only_ = false; @@ -75,6 +79,7 @@ class DatabaseOpenConfiguration { bool return_arrays_ = false; bool allow_bare_named_params_ = true; bool allow_unknown_named_params_ = false; + bool defensive_ = false; }; class DatabaseSync; @@ -140,6 +145,7 @@ class DatabaseSync : public BaseObject { static void ApplyChangeset(const v8::FunctionCallbackInfo& args); static void EnableLoadExtension( const v8::FunctionCallbackInfo& args); + static void EnableDefensive(const v8::FunctionCallbackInfo& args); static void LoadExtension(const v8::FunctionCallbackInfo& args); static void SetAuthorizer(const v8::FunctionCallbackInfo& args); static int AuthorizerCallback(void* user_data, diff --git a/src/node_util.cc b/src/node_util.cc index 601180905d87c9..2e4d98a8a66a18 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -10,6 +10,7 @@ namespace util { using v8::ALL_PROPERTIES; using v8::Array; +using v8::ArrayBuffer; using v8::ArrayBufferView; using v8::BigInt; using v8::Boolean; @@ -34,6 +35,7 @@ using v8::ONLY_WRITABLE; using v8::Promise; using v8::PropertyFilter; using v8::Proxy; +using v8::SharedArrayBuffer; using v8::SKIP_STRINGS; using v8::SKIP_SYMBOLS; using v8::StackFrame; @@ -53,8 +55,8 @@ CHAR_TEST(16, IsUnicodeSurrogateTrail, (ch & 0x400) != 0) static void GetOwnNonIndexProperties( const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Local context = env->context(); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); CHECK(args[0]->IsObject()); CHECK(args[1]->IsUint32()); @@ -168,7 +170,7 @@ static void PreviewEntries(const FunctionCallbackInfo& args) { if (!args[0]->IsObject()) return; - Environment* env = Environment::GetCurrent(args); + Isolate* isolate = args.GetIsolate(); bool is_key_value; Local entries; if (!args[0].As()->PreviewEntries(&is_key_value).ToLocal(&entries)) @@ -177,12 +179,8 @@ static void PreviewEntries(const FunctionCallbackInfo& args) { if (args.Length() == 1) return args.GetReturnValue().Set(entries); - Local ret[] = { - entries, - Boolean::New(env->isolate(), is_key_value) - }; - return args.GetReturnValue().Set( - Array::New(env->isolate(), ret, arraysize(ret))); + Local ret[] = {entries, Boolean::New(isolate, is_key_value)}; + return args.GetReturnValue().Set(Array::New(isolate, ret, arraysize(ret))); } static void Sleep(const FunctionCallbackInfo& args) { @@ -222,9 +220,10 @@ static uint32_t GetUVHandleTypeCode(const uv_handle_type type) { } static void GuessHandleType(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); int fd; - if (!args[0]->Int32Value(env->context()).To(&fd)) return; + if (!args[0]->Int32Value(context).To(&fd)) return; CHECK_GE(fd, 0); uv_handle_type t = uv_guess_handle(fd); @@ -239,10 +238,12 @@ static uint32_t FastGuessHandleType(Local receiver, const uint32_t fd) { CFunction fast_guess_handle_type_(CFunction::Make(FastGuessHandleType)); static void ParseEnv(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + Environment* env = Environment::GetCurrent(context); CHECK_EQ(args.Length(), 1); // content CHECK(args[0]->IsString()); - Utf8Value content(env->isolate(), args[0]); + Utf8Value content(isolate, args[0]); Dotenv dotenv{}; dotenv.ParseContent(content.ToStringView()); Local obj; @@ -252,8 +253,9 @@ static void ParseEnv(const FunctionCallbackInfo& args) { } static void GetCallSites(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + Environment* env = Environment::GetCurrent(context); CHECK_EQ(args.Length(), 1); CHECK(args[0]->IsNumber()); @@ -306,8 +308,7 @@ static void GetCallSites(const FunctionCallbackInfo& args) { }; Local callsite; - if (!NewDictionaryInstanceNullProto( - env->context(), callsite_template, values) + if (!NewDictionaryInstanceNullProto(context, callsite_template, values) .ToLocal(&callsite)) { return; } @@ -439,6 +440,30 @@ static void DefineLazyProperties(const FunctionCallbackInfo& args) { } } +void ConstructSharedArrayBuffer(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + int64_t length; + // Note: IntegerValue() clamps its output, so excessively large input values + // will not overflow + if (!args[0]->IntegerValue(env->context()).To(&length)) { + return; + } + if (length < 0 || + static_cast(length) > ArrayBuffer::kMaxByteLength) { + env->ThrowRangeError("Invalid array buffer length"); + return; + } + Local sab; + if (!SharedArrayBuffer::MaybeNew(env->isolate(), static_cast(length)) + .ToLocal(&sab)) { + // Note: SharedArrayBuffer::MaybeNew doesn't schedule an exception if it + // fails + env->ThrowRangeError("Array buffer allocation failed"); + return; + } + args.GetReturnValue().Set(sab); +} + void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetPromiseDetails); registry->Register(GetProxyDetails); @@ -456,6 +481,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(IsInsideNodeModules); registry->Register(DefineLazyProperties); registry->Register(DefineLazyPropertiesGetter); + registry->Register(ConstructSharedArrayBuffer); } void Initialize(Local target, @@ -555,9 +581,12 @@ void Initialize(Local target, SetMethodNoSideEffect(context, target, "getCallSites", GetCallSites); SetMethod(context, target, "sleep", Sleep); SetMethod(context, target, "parseEnv", ParseEnv); - SetMethod( context, target, "arrayBufferViewHasBuffer", ArrayBufferViewHasBuffer); + SetMethod(context, + target, + "constructSharedArrayBuffer", + ConstructSharedArrayBuffer); Local should_abort_on_uncaught_toggle = FIXED_ONE_BYTE_STRING(env->isolate(), "shouldAbortOnUncaughtToggle"); diff --git a/src/node_v8.cc b/src/node_v8.cc index ce253d7fa0a8b1..0a0554d01f79af 100644 --- a/src/node_v8.cc +++ b/src/node_v8.cc @@ -73,7 +73,8 @@ using v8::Value; V(10, number_of_detached_contexts, kNumberOfDetachedContextsIndex) \ V(11, total_global_handles_size, kTotalGlobalHandlesSizeIndex) \ V(12, used_global_handles_size, kUsedGlobalHandlesSizeIndex) \ - V(13, external_memory, kExternalMemoryIndex) + V(13, external_memory, kExternalMemoryIndex) \ + V(14, total_allocated_bytes, kTotalAllocatedBytes) #define V(a, b, c) +1 static constexpr size_t kHeapStatisticsPropertiesCount = @@ -242,8 +243,8 @@ void UpdateHeapCodeStatisticsBuffer(const FunctionCallbackInfo& args) { void SetFlagsFromString(const FunctionCallbackInfo& args) { CHECK(args[0]->IsString()); - String::Utf8Value flags(args.GetIsolate(), args[0]); - V8::SetFlagsFromString(*flags, static_cast(flags.length())); + Utf8Value flags(args.GetIsolate(), args[0]); + V8::SetFlagsFromString(flags.out(), flags.length()); } void StartCpuProfile(const FunctionCallbackInfo& args) { diff --git a/src/node_version.h b/src/node_version.h index 5f95624f622be9..2eb3ac4b17d0c6 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -23,13 +23,13 @@ #define SRC_NODE_VERSION_H_ #define NODE_MAJOR_VERSION 25 -#define NODE_MINOR_VERSION 0 -#define NODE_PATCH_VERSION 0 +#define NODE_MINOR_VERSION 2 +#define NODE_PATCH_VERSION 1 #define NODE_VERSION_IS_LTS 0 #define NODE_VERSION_LTS_CODENAME "" -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_STRINGIFY #define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n) diff --git a/src/node_worker.cc b/src/node_worker.cc index 8d878855706ac1..d8cad06cd0655f 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -1263,6 +1263,7 @@ void Worker::GetHeapStatistics(const FunctionCallbackInfo& args) { "total_global_handles_size", "used_global_handles_size", "external_memory", + "total_allocated_bytes", }; tmpl = DictionaryTemplate::New(isolate, heap_stats_names); env->set_heap_statistics_template(tmpl); @@ -1283,7 +1284,8 @@ void Worker::GetHeapStatistics(const FunctionCallbackInfo& args) { Number::New(isolate, heap_stats->number_of_detached_contexts()), Number::New(isolate, heap_stats->total_global_handles_size()), Number::New(isolate, heap_stats->used_global_handles_size()), - Number::New(isolate, heap_stats->external_memory())}; + Number::New(isolate, heap_stats->external_memory()), + Number::New(isolate, heap_stats->total_allocated_bytes())}; Local obj; if (!NewDictionaryInstanceNullProto( diff --git a/src/permission/permission.cc b/src/permission/permission.cc index 199b36ee76b34c..2d0e1723050e30 100644 --- a/src/permission/permission.cc +++ b/src/permission/permission.cc @@ -21,7 +21,6 @@ using v8::IntegrityLevel; using v8::Local; using v8::MaybeLocal; using v8::Object; -using v8::String; using v8::Value; namespace permission { @@ -34,24 +33,20 @@ static void Has(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); CHECK(args[0]->IsString()); - String::Utf8Value utf8_deny_scope(env->isolate(), args[0]); - if (*utf8_deny_scope == nullptr) { - return; - } - - const std::string deny_scope = *utf8_deny_scope; + const std::string deny_scope = Utf8Value(env->isolate(), args[0]).ToString(); PermissionScope scope = Permission::StringToPermission(deny_scope); if (scope == PermissionScope::kPermissionsRoot) { return args.GetReturnValue().Set(false); } if (args.Length() > 1 && !args[1]->IsUndefined()) { - String::Utf8Value utf8_arg(env->isolate(), args[1]); - if (*utf8_arg == nullptr) { + Utf8Value utf8_arg(env->isolate(), args[1]); + if (utf8_arg.length() == 0) { + args.GetReturnValue().Set(false); return; } return args.GetReturnValue().Set( - env->permission()->is_granted(env, scope, *utf8_arg)); + env->permission()->is_granted(env, scope, utf8_arg.ToStringView())); } return args.GetReturnValue().Set(env->permission()->is_granted(env, scope)); diff --git a/src/string_bytes.cc b/src/string_bytes.cc index d78bbb237325d2..03b5fd7ebe3816 100644 --- a/src/string_bytes.cc +++ b/src/string_bytes.cc @@ -304,10 +304,10 @@ size_t StringBytes::Write(Isolate* isolate, input_view.length()); } } else { - String::Value value(isolate, str); + TwoByteValue value(isolate, str); size_t written_len = buflen; auto result = simdutf::base64_to_binary_safe( - reinterpret_cast(*value), + reinterpret_cast(value.out()), value.length(), buf, written_len, @@ -343,10 +343,10 @@ size_t StringBytes::Write(Isolate* isolate, input_view.length()); } } else { - String::Value value(isolate, str); + TwoByteValue value(isolate, str); size_t written_len = buflen; auto result = simdutf::base64_to_binary_safe( - reinterpret_cast(*value), + reinterpret_cast(value.out()), value.length(), buf, written_len); @@ -368,8 +368,8 @@ size_t StringBytes::Write(Isolate* isolate, reinterpret_cast(input_view.data8()), input_view.length()); } else { - String::Value value(isolate, str); - nbytes = nbytes::HexDecode(buf, buflen, *value, value.length()); + TwoByteValue value(isolate, str); + nbytes = nbytes::HexDecode(buf, buflen, value.out(), value.length()); } break; diff --git a/src/util-inl.h b/src/util-inl.h index 4e9c4fea85d12e..6898e8ea794675 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -359,7 +359,7 @@ v8::MaybeLocal ToV8Value(v8::Local context, v8::MaybeLocal ToV8Value(v8::Local context, std::u16string_view str, v8::Isolate* isolate) { - if (isolate == nullptr) isolate = context->GetIsolate(); + if (isolate == nullptr) isolate = v8::Isolate::GetCurrent(); if (str.length() >= static_cast(v8::String::kMaxLength)) [[unlikely]] { // V8 only has a TODO comment about adding an exception when the maximum @@ -718,12 +718,11 @@ inline bool IsWindowsBatchFile(const char* filename) { return !extension.empty() && (extension == "cmd" || extension == "bat"); } -inline std::wstring ConvertToWideString(const std::string& str, - UINT code_page) { +inline std::wstring ConvertUTF8ToWideString(const std::string& str) { int size_needed = MultiByteToWideChar( - code_page, 0, &str[0], static_cast(str.size()), nullptr, 0); + CP_UTF8, 0, &str[0], static_cast(str.size()), nullptr, 0); std::wstring wstrTo(size_needed, 0); - MultiByteToWideChar(code_page, + MultiByteToWideChar(CP_UTF8, 0, &str[0], static_cast(str.size()), @@ -731,6 +730,59 @@ inline std::wstring ConvertToWideString(const std::string& str, size_needed); return wstrTo; } + +std::string ConvertWideStringToUTF8(const std::wstring& wstr) { + if (wstr.empty()) return std::string(); + + int size_needed = WideCharToMultiByte(CP_UTF8, + 0, + &wstr[0], + static_cast(wstr.size()), + nullptr, + 0, + nullptr, + nullptr); + std::string strTo(size_needed, 0); + WideCharToMultiByte(CP_UTF8, + 0, + &wstr[0], + static_cast(wstr.size()), + &strTo[0], + size_needed, + nullptr, + nullptr); + return strTo; +} + +template +std::filesystem::path MaybeStackBuffer::ToPath() const { + std::wstring wide_path = ConvertUTF8ToWideString(ToString()); + return std::filesystem::path(wide_path); +} + +std::string ConvertPathToUTF8(const std::filesystem::path& path) { + return ConvertWideStringToUTF8(path.wstring()); +} + +std::string ConvertGenericPathToUTF8(const std::filesystem::path& path) { + return ConvertWideStringToUTF8(path.generic_wstring()); +} + +#else // _WIN32 + +template +std::filesystem::path MaybeStackBuffer::ToPath() const { + return std::filesystem::path(ToStringView()); +} + +std::string ConvertPathToUTF8(const std::filesystem::path& path) { + return path.native(); +} + +std::string ConvertGenericPathToUTF8(const std::filesystem::path& path) { + return path.generic_string(); +} + #endif // _WIN32 inline v8::MaybeLocal NewDictionaryInstance( diff --git a/src/util.h b/src/util.h index 6dfccf3a342da3..aa2a47ce0f1ca9 100644 --- a/src/util.h +++ b/src/util.h @@ -507,6 +507,8 @@ class MaybeStackBuffer { inline std::basic_string_view ToStringView() const { return {out(), length()}; } + // This can only be used if the buffer contains path data in UTF8 + inline std::filesystem::path ToPath() const; private: size_t length_; @@ -1038,9 +1040,15 @@ class JSONOutputStream final : public v8::OutputStream { // Returns true if OS==Windows and filename ends in .bat or .cmd, // case insensitive. inline bool IsWindowsBatchFile(const char* filename); -inline std::wstring ConvertToWideString(const std::string& str, UINT code_page); +inline std::wstring ConvertUTF8ToWideString(const std::string& str); +inline std::string ConvertWideStringToUTF8(const std::wstring& wstr); + #endif // _WIN32 +inline std::filesystem::path ConvertUTF8ToPath(const std::string& str); +inline std::string ConvertPathToUTF8(const std::filesystem::path& path); +inline std::string ConvertGenericPathToUTF8(const std::filesystem::path& path); + // A helper to create a new instance of the dictionary template. // Unlike v8::DictionaryTemplate::NewInstance, this method will // check that all properties have been set (are not empty MaybeLocals) diff --git a/src/uv.cc b/src/uv.cc index d4fadfc24e9a17..a005fd05c8f49c 100644 --- a/src/uv.cc +++ b/src/uv.cc @@ -68,7 +68,9 @@ void GetErrMessage(const FunctionCallbackInfo& args) { } void ErrName(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + Environment* env = Environment::GetCurrent(context); if (env->options()->pending_deprecation && env->EmitErrNameWarning()) { if (ProcessEmitDeprecationWarning( env, @@ -82,13 +84,12 @@ void ErrName(const FunctionCallbackInfo& args) { CHECK_LT(err, 0); char name[50]; uv_err_name_r(err, name, sizeof(name)); - args.GetReturnValue().Set(OneByteString(env->isolate(), name)); + args.GetReturnValue().Set(OneByteString(isolate, name)); } void GetErrMap(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - Isolate* isolate = env->isolate(); - Local context = env->context(); + Isolate* isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); // This can't return a SafeMap, because the uv binding can be referenced // by user code by using `process.binding('uv').getErrorMap()`: diff --git a/test/addons/addons.status b/test/addons/addons.status index 88c7920f72e04c..0552d0d642d825 100644 --- a/test/addons/addons.status +++ b/test/addons/addons.status @@ -20,3 +20,13 @@ openssl-providers/test-no-legacy-provider-option: SKIP zlib-binding/test: SKIP # https://github.com/nodejs/node/issues/34410 register-signal-handler/test: PASS,FLAKY + +[$system==aix] +# https://github.com/nodejs/node/issues/60494 +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-2: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii: PASS,FLAKY +stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary: PASS,FLAKY diff --git a/test/addons/async-resource/test.js b/test/addons/async-resource/test.js index 86cbb38e1cf2df..d7bc44a92be827 100644 --- a/test/addons/async-resource/test.js +++ b/test/addons/async-resource/test.js @@ -17,7 +17,7 @@ let after = 0; let destroy = 0; async_hooks.createHook({ - init(id, type, triggerAsyncId, resource) { + init: common.mustCall((id, type, triggerAsyncId, resource) => { assert.strictEqual(typeof id, 'number'); assert.strictEqual(typeof resource, 'object'); assert(id > 1); @@ -26,7 +26,7 @@ async_hooks.createHook({ assert.strictEqual(triggerAsyncId, expectedTriggerId); bindingUids.push(id); } - }, + }, 7), before(id) { if (bindingUids.includes(id)) before++; @@ -48,8 +48,11 @@ for (const call of [binding.callViaFunction, let uid; const object = { methöd(arg) { + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(this, object); + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(arg, 42); + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(async_hooks.executionAsyncId(), uid); return 'baz'; }, diff --git a/test/addons/cppgc-object/test.js b/test/addons/cppgc-object/test.js index e18b6e17b88df9..acdb145ae721c4 100644 --- a/test/addons/cppgc-object/test.js +++ b/test/addons/cppgc-object/test.js @@ -23,7 +23,7 @@ for (let i = 0; i < count; ++i) { globalThis.gc(); -setTimeout(async function() { +setTimeout(common.mustCall(() => (async function() { // GC should have invoked Trace() on at least some of the CppGCed objects, // but they should all be alive at this point. assert.strictEqual(states[kDestructCount], 0); @@ -48,4 +48,4 @@ setTimeout(async function() { 'All old CppGCed are destroyed', () => states[kDestructCount] === count * 2, ); -}, 1); +})().then(common.mustCall())), 1); diff --git a/test/addons/make-callback-recurse/test.js b/test/addons/make-callback-recurse/test.js index 4a540003acd8d1..6b927ffbfdba48 100644 --- a/test/addons/make-callback-recurse/test.js +++ b/test/addons/make-callback-recurse/test.js @@ -71,11 +71,11 @@ assert.throws(() => { if (arg === 1) { // The tests are first run on bootstrap during LoadEnvironment() in // src/node.cc. Now run the tests through node::MakeCallback(). - setImmediate(() => { + setImmediate(common.mustCall(() => { makeCallback({}, common.mustCall(() => { verifyExecutionOrder(2); })); - }); + })); } else if (arg === 2) { // Make sure there are no conflicts using node::MakeCallback() // within timers. diff --git a/test/addons/no-addons/permission.js b/test/addons/no-addons/permission.js index 1d1bbf6e95468e..a487c8a6c9b2af 100644 --- a/test/addons/no-addons/permission.js +++ b/test/addons/no-addons/permission.js @@ -7,37 +7,11 @@ const assert = require('assert'); const bindingPath = require.resolve(`./build/${common.buildType}/binding`); -const assertError = (error) => { - assert(error instanceof Error); - assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); - assert.strictEqual( - error.message, - 'Cannot load native addon because loading addons is disabled.', - ); -}; - -{ - let threw = false; - - try { - require(bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} - -{ - let threw = false; - - try { - process.dlopen({ exports: {} }, bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} +assert.throws(() => require(bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); +assert.throws(() => process.dlopen({ exports: {} }, bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); diff --git a/test/addons/no-addons/test-worker.js b/test/addons/no-addons/test-worker.js index 25e893ca33aea7..fd932d64f440aa 100644 --- a/test/addons/no-addons/test-worker.js +++ b/test/addons/no-addons/test-worker.js @@ -9,13 +9,13 @@ const { Worker } = require('worker_threads'); const binding = path.resolve(__dirname, `./build/${common.buildType}/binding`); -const assertError = (error) => { +const assertError = common.mustCall((error) => { assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); assert.strictEqual( error.message, 'Cannot load native addon because loading addons is disabled.', ); -}; +}, 4); { // Flags should be inherited @@ -23,7 +23,7 @@ const assertError = (error) => { eval: true, }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -35,7 +35,7 @@ const assertError = (error) => { }, ); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -45,7 +45,7 @@ const assertError = (error) => { execArgv: ['--no-addons'], }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } { @@ -55,5 +55,5 @@ const assertError = (error) => { execArgv: [], }); - worker.on('error', common.mustCall(assertError)); + worker.on('error', assertError); } diff --git a/test/addons/no-addons/test.js b/test/addons/no-addons/test.js index 485fad4a8bc643..7b93806d6db046 100644 --- a/test/addons/no-addons/test.js +++ b/test/addons/no-addons/test.js @@ -7,37 +7,11 @@ const assert = require('assert'); const bindingPath = require.resolve(`./build/${common.buildType}/binding`); -const assertError = (error) => { - assert(error instanceof Error); - assert.strictEqual(error.code, 'ERR_DLOPEN_DISABLED'); - assert.strictEqual( - error.message, - 'Cannot load native addon because loading addons is disabled.', - ); -}; - -{ - let threw = false; - - try { - require(bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} - -{ - let threw = false; - - try { - process.dlopen({ exports: {} }, bindingPath); - } catch (error) { - assertError(error); - threw = true; - } - - assert(threw); -} +assert.throws(() => require(bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); +assert.throws(() => process.dlopen({ exports: {} }, bindingPath), { + code: 'ERR_DLOPEN_DISABLED', + message: 'Cannot load native addon because loading addons is disabled.', +}); diff --git a/test/addons/null-buffer-neuter/test.js b/test/addons/null-buffer-neuter/test.js index d99690542a4d84..7a3ba1535ec9da 100644 --- a/test/addons/null-buffer-neuter/test.js +++ b/test/addons/null-buffer-neuter/test.js @@ -6,6 +6,6 @@ const binding = require(`./build/${common.buildType}/binding`); binding.run(); global.gc(); -setImmediate(() => { +setImmediate(common.mustCall(() => { assert.strictEqual(binding.isAlive(), 0); -}); +})); diff --git a/test/addons/symlinked-module/submodule.js b/test/addons/symlinked-module/submodule.js index d4b59e9efa4f5e..79400ecf4c10c8 100644 --- a/test/addons/symlinked-module/submodule.js +++ b/test/addons/symlinked-module/submodule.js @@ -1,13 +1,13 @@ 'use strict'; -require('../../common'); +const common = require('../../common'); const path = require('path'); const assert = require('assert'); // This is a subtest of symlinked-module/test.js. This is not // intended to be run directly. -module.exports.test = function test(bindingDir) { +module.exports.test = common.mustCall(function test(bindingDir) { const mod = require(path.join(bindingDir, 'binding.node')); assert.notStrictEqual(mod, null); assert.strictEqual(mod.hello(), 'world'); -}; +}, require.main === module ? 0 : 2); diff --git a/test/cctest/inspector/test_network_requests_buffer.cc b/test/cctest/inspector/test_network_requests_buffer.cc new file mode 100644 index 00000000000000..40461e95ff490e --- /dev/null +++ b/test/cctest/inspector/test_network_requests_buffer.cc @@ -0,0 +1,181 @@ +#include "gtest/gtest.h" +#include "inspector/network_requests_buffer.h" + +namespace node { +namespace inspector { + +static uint8_t kDummyData[] = "long enough dummy data suitable for tests."; + +TEST(RequestEntry, BufferSize) { + auto entry = RequestEntry(0, Charset::kBinary, false, 10); + EXPECT_EQ(entry.buffer_size(), 0u); + entry.push_request_data_blob(protocol::Binary::fromSpan(kDummyData, 5)); + EXPECT_EQ(entry.buffer_size(), 5u); + entry.push_response_data_blob(protocol::Binary::fromSpan(kDummyData, 3)); + EXPECT_EQ(entry.buffer_size(), 8u); + + // Exceeds the per-resource buffer size limit, ignore it. + entry.push_request_data_blob(protocol::Binary::fromSpan(kDummyData, 3)); + EXPECT_EQ(entry.buffer_size(), 8u); + entry.push_response_data_blob(protocol::Binary::fromSpan(kDummyData, 3)); + EXPECT_EQ(entry.buffer_size(), 8u); + + entry.clear_response_data_blobs(); + EXPECT_EQ(entry.buffer_size(), 5u); +} + +TEST(RequestsBuffer, Basic) { + RequestsBuffer buffer(10); + EXPECT_FALSE(buffer.contains("1")); + EXPECT_TRUE( + buffer.emplace("1", RequestEntry(0, Charset::kBinary, false, 10))); + EXPECT_TRUE(buffer.contains("1")); + + // Duplicate entry, ignore it. + EXPECT_FALSE( + buffer.emplace("1", RequestEntry(0, Charset::kBinary, false, 10))); + EXPECT_TRUE(buffer.contains("1")); + + EXPECT_TRUE( + buffer.emplace("2", RequestEntry(0, Charset::kBinary, false, 10))); + EXPECT_TRUE(buffer.contains("2")); + + buffer.erase("1"); + EXPECT_FALSE(buffer.contains("1")); + EXPECT_TRUE(buffer.contains("2")); +} + +TEST(RequestsBuffer, Find) { + RequestsBuffer buffer(10); + EXPECT_FALSE(buffer.contains("1")); + EXPECT_TRUE( + buffer.emplace("1", RequestEntry(0, Charset::kBinary, false, 10))); + EXPECT_TRUE(buffer.contains("1")); + + { + auto it = buffer.find("1"); + EXPECT_NE(it, buffer.end()); + EXPECT_EQ(it->first, "1"); + EXPECT_EQ(it->second.buffer_size(), 0u); + it->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + it->second.push_response_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + EXPECT_EQ(it->second.buffer_size(), 10u); + + EXPECT_EQ(buffer.total_buffer_size(), 0u); + // Update the total buffer size when the iterator is destroyed. + } + EXPECT_EQ(buffer.total_buffer_size(), 10u); + + // Shrink + { + auto it = buffer.find("1"); + EXPECT_NE(it, buffer.end()); + EXPECT_EQ(it->first, "1"); + EXPECT_EQ(it->second.buffer_size(), 10u); + it->second.clear_response_data_blobs(); + EXPECT_EQ(it->second.buffer_size(), 5u); + } + EXPECT_EQ(buffer.total_buffer_size(), 5u); + + // const find + { + auto it = buffer.cfind("1"); + EXPECT_NE(it, buffer.end()); + EXPECT_EQ(it->first, "1"); + EXPECT_EQ(it->second.buffer_size(), 5u); + } + + // Non-existing entry. + { + auto it = buffer.find("2"); + EXPECT_EQ(it, buffer.end()); + } + { + auto it = buffer.cfind("2"); + EXPECT_EQ(it, buffer.end()); + } +} + +TEST(RequestsBuffer, Erase) { + RequestsBuffer buffer(10); + EXPECT_FALSE(buffer.contains("1")); + EXPECT_TRUE( + buffer.emplace("1", RequestEntry(0, Charset::kBinary, false, 10))); + EXPECT_TRUE(buffer.contains("1")); + + { + auto it = buffer.find("1"); + EXPECT_NE(it, buffer.end()); + EXPECT_EQ(it->first, "1"); + EXPECT_EQ(it->second.buffer_size(), 0u); + it->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + it->second.push_response_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + EXPECT_EQ(it->second.buffer_size(), 10u); + + EXPECT_EQ(buffer.total_buffer_size(), 0u); + // Update the total buffer size when the iterator is destroyed. + } + EXPECT_EQ(buffer.total_buffer_size(), 10u); + + buffer.erase("1"); + EXPECT_FALSE(buffer.contains("1")); + EXPECT_EQ(buffer.total_buffer_size(), 0u); + + // Non-existing entry. + buffer.erase("2"); + EXPECT_EQ(buffer.total_buffer_size(), 0u); +} + +TEST(RequestsBuffer, EnforceLimit) { + RequestsBuffer buffer(15); + { + EXPECT_TRUE( + buffer.emplace("1", RequestEntry(0, Charset::kBinary, false, 15))); + buffer.find("1")->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 10)); + EXPECT_EQ(buffer.total_buffer_size(), 10u); + } + { + EXPECT_TRUE( + buffer.emplace("2", RequestEntry(0, Charset::kBinary, false, 15))); + buffer.find("2")->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + EXPECT_EQ(buffer.total_buffer_size(), 15u); + } + + // Exceeds the limit, the oldest entry is removed. + { + EXPECT_TRUE( + buffer.emplace("3", RequestEntry(0, Charset::kBinary, false, 15))); + buffer.find("3")->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 5)); + // "2" and "3" are kept. + EXPECT_EQ(buffer.total_buffer_size(), 10u); + } + + EXPECT_FALSE(buffer.contains("1")); + EXPECT_TRUE(buffer.contains("2")); + EXPECT_TRUE(buffer.contains("3")); + + // Exceeds the limit, the oldest entry is removed. + { + EXPECT_TRUE( + buffer.emplace("4", RequestEntry(0, Charset::kBinary, false, 15))); + buffer.find("4")->second.push_request_data_blob( + protocol::Binary::fromSpan(kDummyData, 10)); + // "3" and "4" are kept. + EXPECT_EQ(buffer.total_buffer_size(), 15u); + } + + EXPECT_FALSE(buffer.contains("1")); + EXPECT_FALSE(buffer.contains("2")); + EXPECT_TRUE(buffer.contains("3")); + EXPECT_TRUE(buffer.contains("4")); +} + +} // namespace inspector +} // namespace node diff --git a/test/cctest/test_crypto_clienthello.cc b/test/cctest/test_crypto_clienthello.cc index 870857cf906109..d5505b4262e9e5 100644 --- a/test/cctest/test_crypto_clienthello.cc +++ b/test/cctest/test_crypto_clienthello.cc @@ -54,7 +54,15 @@ class OverrunGuardedBuffer { #ifdef USE_MPROTECT // Place the packet right before a guard page, which, when accessed, causes // a segmentation fault. + #if defined(__ANDROID__) && __ANDROID_API__ < 28 + void* ptr = nullptr; + if (posix_memalign(&ptr, page, 2 * page) != 0) { + ptr = nullptr; // Handle allocation failure if necessary + } + alloc_base = static_cast(ptr); + #else alloc_base = static_cast(aligned_alloc(page, 2 * page)); + #endif CHECK_NOT_NULL(alloc_base); uint8_t* second_page = alloc_base + page; CHECK_EQ(mprotect(second_page, page, PROT_NONE), 0); diff --git a/test/client-proxy/test-https-proxy-request-invalid-char-in-url.mjs b/test/client-proxy/test-https-proxy-request-invalid-char-in-url.mjs index b5e16e8254f553..80c7be4931cd57 100644 --- a/test/client-proxy/test-https-proxy-request-invalid-char-in-url.mjs +++ b/test/client-proxy/test-https-proxy-request-invalid-char-in-url.mjs @@ -82,7 +82,19 @@ for (const testCase of testCases) { proxy.close(); server.close(); assert.deepStrictEqual(requests, expectedUrls); - assert.deepStrictEqual(new Set(logs), expectedProxyLogs); + const logSet = new Set(logs); + for (const log of logSet) { + if (log.source === 'proxy connect' && log.error?.code === 'EPIPE') { + // There can be a race from eagerly shutting down the servers and severing + // two pipes at the same time but for the purpose of this test, we only + // care about whether the requests are initiated from the client as expected, + // not how the upstream/proxy servers behave. Ignore EPIPE errors from them.. + // Refs: https://github.com/nodejs/node/issues/59741 + console.log('Ignoring EPIPE error from proxy connect', log.error); + logSet.delete(log); + } + } + assert.deepStrictEqual(logSet, expectedProxyLogs); })); } })); diff --git a/test/common/assertSnapshot.js b/test/common/assertSnapshot.js index 16509f12ee89fc..0e350cd1dac6fa 100644 --- a/test/common/assertSnapshot.js +++ b/test/common/assertSnapshot.js @@ -4,6 +4,7 @@ const path = require('node:path'); const test = require('node:test'); const fs = require('node:fs/promises'); const assert = require('node:assert/strict'); +const { hostname } = require('node:os'); const stackFramesRegexp = /(?<=\n)(\s+)((.+?)\s+\()?(?:\(?(.+?):(\d+)(?::(\d+))?)\)?(\s+\{)?(\[\d+m)?(\n|$)/g; const windowNewlineRegexp = /\r/g; @@ -100,6 +101,97 @@ async function spawnAndAssert(filename, transform = (x) => x, { tty = false, ... await assertSnapshot(transform(`${stdout}${stderr}`), filename); } +function replaceTestDuration(str) { + return str + .replaceAll(/duration_ms: [0-9.]+/g, 'duration_ms: *') + .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *'); +} + +const root = path.resolve(__dirname, '..', '..'); +const color = '(\\[\\d+m)'; +const stackTraceBasePath = new RegExp(`${color}\\(${root.replaceAll(/[\\^$*+?.()|[\]{}]/g, '\\$&')}/?${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'); +} + +function replaceJunitDuration(str) { + return 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'); +} + +// The Node test coverage returns results for all files called by the test. This +// will make the output file change if files like test/common/index.js change. +// This transform picks only the first line and then the lines from the test +// file. +function pickTestFileFromLcov(str) { + const lines = str.split(/\n/); + const firstLineOfTestFile = lines.findIndex( + (line) => line.startsWith('SF:') && line.trim().endsWith('output.js'), + ); + const lastLineOfTestFile = lines.findIndex( + (line, index) => index > firstLineOfTestFile && line.trim() === 'end_of_record', + ); + return ( + lines[0] + '\n' + lines.slice(firstLineOfTestFile, lastLineOfTestFile + 1).join('\n') + '\n' + ); +} + +const defaultTransform = transform( + replaceWindowsLineEndings, + replaceStackTrace, + removeWindowsPathEscaping, + transformProjectRoot(), + replaceWindowsPaths, + replaceTestDuration, + replaceTestLocationLine, +); +const specTransform = transform( + replaceSpecDuration, + replaceWindowsLineEndings, + replaceStackTrace, + replaceWindowsPaths, +); +const junitTransform = transform( + replaceJunitDuration, + replaceWindowsLineEndings, + replaceStackTrace, + replaceWindowsPaths, +); +const lcovTransform = transform( + replaceWindowsLineEndings, + replaceStackTrace, + transformProjectRoot(), + replaceWindowsPaths, + pickTestFileFromLcov, +); + +function ensureCwdIsProjectRoot() { + if (process.cwd() !== root) { + process.chdir(root); + } +} + +function canColorize() { + // Loading it lazily to avoid breaking `NODE_REGENERATE_SNAPSHOTS`. + return require('internal/tty').getColorDepth() > 2; +} + module.exports = { assertSnapshot, getSnapshotPath, @@ -111,4 +203,11 @@ module.exports = { spawnAndAssert, transform, transformProjectRoot, + replaceTestDuration, + defaultTransform, + specTransform, + junitTransform, + lcovTransform, + ensureCwdIsProjectRoot, + canColorize, }; diff --git a/test/common/child_process.js b/test/common/child_process.js index 6c2bc6c9614af3..d8c957bdf09ce4 100644 --- a/test/common/child_process.js +++ b/test/common/child_process.js @@ -86,8 +86,22 @@ function expectSyncExit(caller, spawnArgs, { console.error(`${tag} status = ${child.status}, signal = ${child.signal}`); const error = new Error(`${failures.join('\n')}`); - if (spawnArgs[2]) { - error.options = spawnArgs[2]; + if (typeof spawnArgs[2] === 'object' && spawnArgs[2] !== null) { + const envInOptions = spawnArgs[2].env; + // If the env is overridden in the spawn options, include it in the error + // object for easier debugging. + if (typeof envInOptions === 'object' && envInOptions !== null && envInOptions !== process.env) { + // Only include the environment variables that are different from + // the current process.env to avoid cluttering the output. + error.options = { ...spawnArgs[2], env: {} }; + for (const key of Object.keys(envInOptions)) { + if (envInOptions[key] !== process.env[key]) { + error.options.env[key] = spawnArgs[2].env[key]; + } + } + } else { + error.options = spawnArgs[2]; + } } let command = spawnArgs[0]; if (Array.isArray(spawnArgs[1])) { diff --git a/test/common/debugger.js b/test/common/debugger.js index 1a258913e00dd7..dbaa62e71d3f1c 100644 --- a/test/common/debugger.js +++ b/test/common/debugger.js @@ -7,12 +7,10 @@ const BREAK_MESSAGE = new RegExp('(?:' + [ 'exception', 'other', 'promiseRejection', 'step', ].join('|') + ') in', 'i'); -// Some macOS machines require more time to receive the outputs from the client. let TIMEOUT = common.platformTimeout(10000); -if (common.isWindows) { - // Some of the windows machines in the CI need more time to receive - // the outputs from the client. - // https://github.com/nodejs/build/issues/3014 +// Some macOS and Windows machines require more time to receive the outputs from the client. +// https://github.com/nodejs/build/issues/3014 +if (common.isWindows || common.isMacOS) { TIMEOUT = common.platformTimeout(15000); } @@ -90,12 +88,12 @@ function startCLI(args, flags = [], spawnOpts = {}, opts = { randomPort: true }) reject(new Error(message)); } + // Capture stack trace here to show where waitFor was called from when it times out. + const timeoutErr = new Error(`Timeout (${TIMEOUT}) while waiting for ${pattern}`); const timer = setTimeout(() => { tearDown(); - reject(new Error([ - `Timeout (${TIMEOUT}) while waiting for ${pattern}`, - `found: ${this.output}`, - ].join('; '))); + timeoutErr.output = this.output; + reject(timeoutErr); }, TIMEOUT); function tearDown() { @@ -143,6 +141,10 @@ function startCLI(args, flags = [], spawnOpts = {}, opts = { randomPort: true }) return getOutput(); }, + get stderrOutput() { + return stderrOutput; + }, + get rawOutput() { return outputBuffer.join('').toString(); }, diff --git a/test/common/index.js b/test/common/index.js index 61b82e28f53064..11465d7b5d77be 100755 --- a/test/common/index.js +++ b/test/common/index.js @@ -54,6 +54,7 @@ const noop = () => {}; const hasCrypto = Boolean(process.versions.openssl) && !process.env.NODE_SKIP_CRYPTO; +const hasInspector = Boolean(process.features.inspector); const hasSQLite = Boolean(process.versions.sqlite); const hasQuic = hasCrypto && !!process.features.quic; @@ -175,8 +176,9 @@ function isPi() { } } -// When using high concurrency or in the CI we need much more time for each connection attempt -net.setDefaultAutoSelectFamilyAttemptTimeout(platformTimeout(net.getDefaultAutoSelectFamilyAttemptTimeout() * 10)); +// When using high concurrency or in the CI we need much more time for each connection attempt. +// Default 500ms becomes 2500ms for tests. +net.setDefaultAutoSelectFamilyAttemptTimeout(platformTimeout(net.getDefaultAutoSelectFamilyAttemptTimeout() * 5)); const defaultAutoSelectFamilyAttemptTimeout = net.getDefaultAutoSelectFamilyAttemptTimeout(); const buildType = process.config.target_defaults ? @@ -711,7 +713,7 @@ function expectsError(validator, exact) { } function skipIfInspectorDisabled() { - if (!process.features.inspector) { + if (!hasInspector) { skip('V8 inspector is disabled'); } } @@ -913,6 +915,12 @@ function expectRequiredTLAError(err) { } } +function sleepSync(ms) { + const sab = new SharedArrayBuffer(4); + const i32 = new Int32Array(sab); + Atomics.wait(i32, 0, 0, ms); +} + const common = { allowGlobals, buildType, @@ -930,6 +938,7 @@ const common = { hasIntl, hasCrypto, hasQuic, + hasInspector, hasSQLite, invalidArgTypeHelper, isAlive, @@ -962,6 +971,7 @@ const common = { skipIfInspectorDisabled, skipIfSQLiteMissing, spawnPromisified, + sleepSync, get enoughTestMem() { return require('os').totalmem() > 0x70000000; /* 1.75 Gb */ diff --git a/test/common/index.mjs b/test/common/index.mjs index 98a26e29ddad27..471d58b7dbbfe0 100644 --- a/test/common/index.mjs +++ b/test/common/index.mjs @@ -17,6 +17,7 @@ const { getTTYfd, hasCrypto, hasQuic, + hasInspector, hasSQLite, hasIntl, hasIPv6, @@ -48,6 +49,7 @@ const { skipIfInspectorDisabled, skipIfSQLiteMissing, spawnPromisified, + sleepSync, } = common; const getPort = () => common.PORT; @@ -68,6 +70,7 @@ export { getTTYfd, hasCrypto, hasQuic, + hasInspector, hasSQLite, hasIntl, hasIPv6, @@ -99,4 +102,5 @@ export { skipIfInspectorDisabled, skipIfSQLiteMissing, spawnPromisified, + sleepSync, }; diff --git a/test/parallel/test-runner-watch-mode.mjs b/test/common/watch.js similarity index 55% rename from test/parallel/test-runner-watch-mode.mjs rename to test/common/watch.js index d23830cbae1704..1831939b5a99e5 100644 --- a/test/parallel/test-runner-watch-mode.mjs +++ b/test/common/watch.js @@ -1,42 +1,53 @@ -import * as common from '../common/index.mjs'; -import { describe, it, beforeEach } from 'node:test'; -import { once } from 'node:events'; -import assert from 'node:assert'; -import { spawn } from 'node:child_process'; -import { writeFileSync, renameSync, unlinkSync } from 'node:fs'; -import { setTimeout } from 'node:timers/promises'; -import tmpdir from '../common/tmpdir.js'; - -if (common.isIBMi) - common.skip('IBMi does not support `fs.watch()`'); - -if (common.isAIX) - common.skip('folder watch capability is limited in AIX.'); - -let fixturePaths; - -// This test updates these files repeatedly, -// Reading them from disk is unreliable due to race conditions. -const fixtureContent = { - 'dependency.js': 'module.exports = {};', - 'dependency.mjs': 'export const a = 1;', - 'test.js': ` -const test = require('node:test'); -require('./dependency.js'); -import('./dependency.mjs'); -import('data:text/javascript,'); -test('test has ran');`, -}; +'use strict'; +const common = require('./index.js'); +const tmpdir = require('./tmpdir.js'); +const fixtures = require('./fixtures.js'); +const { writeFileSync, readdirSync, readFileSync, renameSync, unlinkSync } = require('node:fs'); +const { spawn } = require('node:child_process'); +const { once } = require('node:events'); +const assert = require('node:assert'); +const { setTimeout } = require('node:timers/promises'); + +function skipIfNoWatch() { + if (common.isIBMi) { + common.skip('IBMi does not support `fs.watch()`'); + } + + if (common.isAIX) { + common.skip('folder watch capability is limited in AIX.'); + } +} + +function skipIfNoWatchModeSignals() { + if (common.isWindows) { + common.skip('no signals on Windows'); + } + + if (common.isIBMi) { + common.skip('IBMi does not support `fs.watch()`'); + } -function refresh() { + if (common.isAIX) { + common.skip('folder watch capability is limited in AIX.'); + } +} + +const fixturePaths = {}; +const fixtureContent = {}; + +function refreshForTestRunnerWatch() { tmpdir.refresh(); - fixturePaths = Object.keys(fixtureContent) - .reduce((acc, file) => ({ ...acc, [file]: tmpdir.resolve(file) }), {}); - Object.entries(fixtureContent) - .forEach(([file, content]) => writeFileSync(fixturePaths[file], content)); + const files = readdirSync(fixtures.path('test-runner-watch')); + for (const file of files) { + const src = fixtures.path('test-runner-watch', file); + const dest = tmpdir.resolve(file); + fixturePaths[file] = dest; + fixtureContent[file] = readFileSync(src, 'utf8'); + writeFileSync(dest, fixtureContent[file]); + } } -async function testWatch({ +async function testRunnerWatch({ fileToUpdate, file, action = 'update', @@ -153,41 +164,10 @@ async function testWatch({ action === 'create' && await testCreate(); } -describe('test runner watch mode', () => { - beforeEach(refresh); - for (const isolation of ['none', 'process']) { - describe(`isolation: ${isolation}`, () => { - it('should run tests repeatedly', async () => { - await testWatch({ file: 'test.js', fileToUpdate: 'test.js', isolation }); - }); - - it('should run tests with dependency repeatedly', async () => { - await testWatch({ file: 'test.js', fileToUpdate: 'dependency.js', isolation }); - }); - - it('should run tests with ESM dependency', async () => { - await testWatch({ file: 'test.js', fileToUpdate: 'dependency.mjs', isolation }); - }); - - it('should support running tests without a file', async () => { - await testWatch({ fileToUpdate: 'test.js', isolation }); - }); - - it('should support a watched test file rename', async () => { - await testWatch({ fileToUpdate: 'test.js', action: 'rename', isolation }); - }); - - it('should not throw when delete a watched test file', async () => { - await testWatch({ fileToUpdate: 'test.js', action: 'delete', isolation }); - }); - - it('should run new tests when a new file is created in the watched directory', { - todo: isolation === 'none' ? - 'This test is failing when isolation is set to none and must be fixed' : - undefined, - }, async () => { - await testWatch({ action: 'create', fileToCreate: 'new-test-file.test.js', isolation }); - }); - }); - } -}); + +module.exports = { + skipIfNoWatch, + skipIfNoWatchModeSignals, + testRunnerWatch, + refreshForTestRunnerWatch, +}; diff --git a/test/common/websocket-server.js b/test/common/websocket-server.js index 7f2447396972f7..f120d3bf71bb03 100644 --- a/test/common/websocket-server.js +++ b/test/common/websocket-server.js @@ -9,10 +9,12 @@ class WebSocketServer { constructor({ port = 0, server, + customHandleUpgradeHeaders = [], }) { this.port = port; this.server = server || http.createServer(); this.clients = new Set(); + this.customHandleUpgradeHeaders = customHandleUpgradeHeaders; this.server.on('upgrade', this.handleUpgrade.bind(this)); } @@ -36,6 +38,7 @@ class WebSocketServer { 'Upgrade: websocket', 'Connection: Upgrade', `Sec-WebSocket-Accept: ${acceptKey}`, + ...this.customHandleUpgradeHeaders, ]; socket.write(responseHeaders.join('\r\n') + '\r\n\r\n'); diff --git a/test/common/wpt.js b/test/common/wpt.js index a21ad3363e00cb..6c9a75e4e4cc53 100644 --- a/test/common/wpt.js +++ b/test/common/wpt.js @@ -412,6 +412,9 @@ class BuildRequirement { // Not using common.hasCrypto because of the global leak checks this.hasCrypto = Boolean(process.versions.openssl) && !process.env.NODE_SKIP_CRYPTO; + + // Not using common.hasInspector because of the global leak checks + this.hasInspector = Boolean(process.features.inspector); } /** @@ -429,6 +432,9 @@ class BuildRequirement { if (requires.has('crypto') && !this.hasCrypto) { return 'crypto'; } + if (requires.has('inspector') && !this.hasInspector) { + return 'inspector'; + } return false; } } diff --git a/test/doctool/test-apilinks.mjs b/test/doctool/test-apilinks.mjs index 70b7b4ef8e21c4..ebe1f60a0d796e 100644 --- a/test/doctool/test-apilinks.mjs +++ b/test/doctool/test-apilinks.mjs @@ -1,4 +1,4 @@ -import '../common/index.mjs'; +import { mustCallAtLeast } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import tmpdir from '../common/tmpdir.js'; @@ -14,7 +14,7 @@ const apilinks = fixtures.path('apilinks'); tmpdir.refresh(); -fs.readdirSync(apilinks).forEach((fixture) => { +fs.readdirSync(apilinks).forEach(mustCallAtLeast((fixture) => { if (!fixture.endsWith('.js')) return; const input = path.join(apilinks, fixture); @@ -40,4 +40,4 @@ fs.readdirSync(apilinks).forEach((fixture) => { Object.keys(actualLinks).length, 0, `unexpected links returned ${JSON.stringify(actualLinks)}`, ); -}); +})); diff --git a/test/es-module/test-esm-assert-strict.mjs b/test/es-module/test-esm-assert-strict.mjs index f753c218a50e4a..d12c2ec3a99b76 100644 --- a/test/es-module/test-esm-assert-strict.mjs +++ b/test/es-module/test-esm-assert-strict.mjs @@ -1,5 +1,7 @@ import '../common/index.mjs'; +// eslint-disable-next-line node-core/must-call-assert import assert, { strict } from 'assert'; +// eslint-disable-next-line node-core/must-call-assert import assertStrict from 'assert/strict'; assert.strictEqual(strict, assertStrict); diff --git a/test/es-module/test-esm-assertionless-json-import.js b/test/es-module/test-esm-assertionless-json-import.js index bd8acdae995a76..f5dc5ff810576c 100644 --- a/test/es-module/test-esm-assertionless-json-import.js +++ b/test/es-module/test-esm-assertionless-json-import.js @@ -1,7 +1,7 @@ // Flags: --experimental-loader ./test/fixtures/es-module-loaders/assertionless-json-import.mjs 'use strict'; const common = require('../common'); -const { strictEqual } = require('assert'); +const assert = require('assert'); async function test() { { @@ -13,10 +13,10 @@ async function test() { ), ]); - strictEqual(secret0.default.ofLife, 42); - strictEqual(secret1.default.ofLife, 42); - strictEqual(secret0.default, secret1.default); - strictEqual(secret0, secret1); + assert.strictEqual(secret0.default.ofLife, 42); + assert.strictEqual(secret1.default.ofLife, 42); + assert.strictEqual(secret0.default, secret1.default); + assert.strictEqual(secret0, secret1); } { @@ -28,10 +28,10 @@ async function test() { ), ]); - strictEqual(secret0.default.ofLife, 42); - strictEqual(secret1.default.ofLife, 42); - strictEqual(secret0.default, secret1.default); - strictEqual(secret0, secret1); + assert.strictEqual(secret0.default.ofLife, 42); + assert.strictEqual(secret1.default.ofLife, 42); + assert.strictEqual(secret0.default, secret1.default); + assert.strictEqual(secret0, secret1); } { @@ -43,10 +43,10 @@ async function test() { ), ]); - strictEqual(secret0.default.ofLife, 42); - strictEqual(secret1.default.ofLife, 42); - strictEqual(secret0.default, secret1.default); - strictEqual(secret0, secret1); + assert.strictEqual(secret0.default.ofLife, 42); + assert.strictEqual(secret1.default.ofLife, 42); + assert.strictEqual(secret0.default, secret1.default); + assert.strictEqual(secret0, secret1); } { @@ -58,10 +58,10 @@ async function test() { ), ]); - strictEqual(secret0.default.ofLife, 42); - strictEqual(secret1.default.ofLife, 42); - strictEqual(secret0.default, secret1.default); - strictEqual(secret0, secret1); + assert.strictEqual(secret0.default.ofLife, 42); + assert.strictEqual(secret1.default.ofLife, 42); + assert.strictEqual(secret0.default, secret1.default); + assert.strictEqual(secret0, secret1); } { @@ -73,8 +73,8 @@ async function test() { ), ]); - strictEqual(secret0.default.ofLife, 42); - strictEqual(secret1.default.ofLife, 42); + assert.strictEqual(secret0.default.ofLife, 42); + assert.strictEqual(secret1.default.ofLife, 42); } } diff --git a/test/es-module/test-esm-cjs-named-error.mjs b/test/es-module/test-esm-cjs-named-error.mjs index 548f82b591da3b..6ece31ed3adc8a 100644 --- a/test/es-module/test-esm-cjs-named-error.mjs +++ b/test/es-module/test-esm-cjs-named-error.mjs @@ -1,5 +1,5 @@ import '../common/index.mjs'; -import { rejects } from 'assert'; +import assert from 'assert'; const fixtureBase = '../fixtures/es-modules/package-cjs-named-error'; @@ -23,55 +23,55 @@ const expectedPackageHack = const expectedBare = errTemplate('deep-fail', 'comeOn', '{ comeOn }'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/single-quote.mjs`); }, { name: 'SyntaxError', message: expectedRelative }, 'should support relative specifiers with single quotes'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/double-quote.mjs`); }, { name: 'SyntaxError', message: expectedRelative }, 'should support relative specifiers with double quotes'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/renamed-import.mjs`); }, { name: 'SyntaxError', message: expectedRenamed }, 'should correctly format named imports with renames'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/multi-line.mjs`); }, { name: 'SyntaxError', message: expectedWithoutExample, }, 'should correctly format named imports across multiple lines'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/json-hack.mjs`); }, { name: 'SyntaxError', message: expectedPackageHack }, 'should respect recursive package.json for module type'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/bare-import-single.mjs`); }, { name: 'SyntaxError', message: expectedBare }, 'should support bare specifiers with single quotes'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/bare-import-double.mjs`); }, { name: 'SyntaxError', message: expectedBare }, 'should support bare specifiers with double quotes'); -await rejects(async () => { +await assert.rejects(async () => { await import(`${fixtureBase}/escaped-single-quote.mjs`); }, /import pkg from '\.\/oh'no\.cjs'/, 'should support relative specifiers with escaped single quote'); diff --git a/test/es-module/test-esm-custom-exports.mjs b/test/es-module/test-esm-custom-exports.mjs index e6023387cf8afc..398416a21d6032 100644 --- a/test/es-module/test-esm-custom-exports.mjs +++ b/test/es-module/test-esm-custom-exports.mjs @@ -1,10 +1,10 @@ // Flags: --conditions=custom-condition -C another import { mustCall } from '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; import { requireFixture, importFixture } from '../fixtures/pkgexports.mjs'; [requireFixture, importFixture].forEach((loadFixture) => { loadFixture('pkgexports/condition') .then(mustCall((actual) => { - strictEqual(actual.default, 'from custom condition'); + assert.strictEqual(actual.default, 'from custom condition'); })); }); diff --git a/test/es-module/test-esm-default-type.mjs b/test/es-module/test-esm-default-type.mjs index 4b758df9166986..c00c58f75256c0 100644 --- a/test/es-module/test-esm-default-type.mjs +++ b/test/es-module/test-esm-default-type.mjs @@ -1,7 +1,7 @@ import '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; import asdf from '../fixtures/es-modules/package-type-module/nested-default-type/module.js'; -strictEqual(asdf, 'asdf'); +assert.strictEqual(asdf, 'asdf'); diff --git a/test/es-module/test-esm-detect-ambiguous.mjs b/test/es-module/test-esm-detect-ambiguous.mjs index a583da981fed5c..234e27a947a13f 100644 --- a/test/es-module/test-esm-detect-ambiguous.mjs +++ b/test/es-module/test-esm-detect-ambiguous.mjs @@ -2,7 +2,7 @@ import { spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { spawn } from 'node:child_process'; import { describe, it } from 'node:test'; -import { strictEqual, match } from 'node:assert'; +import assert from 'node:assert'; describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, () => { describe('string input', { concurrency: !process.env.TEST_PARALLEL }, () => { @@ -12,10 +12,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'import { version } from "node:process"; console.log(version);', ]); - strictEqual(stderr, ''); - strictEqual(stdout, `${process.version}\n`); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, `${process.version}\n`); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); // ESM is unsupported for --print via --input-type=module @@ -24,7 +24,7 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, const child = spawn(process.execPath, []); child.stdin.end('console.log(typeof import.meta.resolve)'); - match((await child.stdout.toArray()).toString(), /^function\r?\n$/); + assert.match((await child.stdout.toArray()).toString(), /^function\r?\n$/); }); it('should be overridden by --input-type', async () => { @@ -34,10 +34,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'import.meta.url', ]); - match(stderr, /SyntaxError: Cannot use 'import\.meta' outside a module/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: Cannot use 'import\.meta' outside a module/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); it('should not switch to module if code is parsable as script', async () => { @@ -46,10 +46,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'let __filename,__dirname,require,module,exports;this.a', ]); - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('does not trigger detection via source code `eval()`', async () => { @@ -58,10 +58,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'eval("import \'nonexistent\';");', ]); - match(stderr, /SyntaxError: Cannot use import statement outside a module/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: Cannot use import statement outside a module/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); }); @@ -98,10 +98,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, entryPath, ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); } }); @@ -139,10 +139,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, entryPath, ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); } @@ -161,10 +161,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/package-without-type/noext-esm'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'null\nexecuted\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'null\nexecuted\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); }); @@ -189,10 +189,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, entryPath, ]); - match(stderr, /SyntaxError: Unexpected token 'export'/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: Unexpected token 'export'/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); } }); @@ -217,10 +217,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, entryPath, ]); - match(stderr, /ReferenceError: module is not defined in ES module scope/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /ReferenceError: module is not defined in ES module scope/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); } }); @@ -233,10 +233,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'await Promise.resolve(); console.log("executed");', ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('reports unfinished top-level `await`', async () => { @@ -245,10 +245,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/tla/unresolved.js'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 13); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 13); + assert.strictEqual(signal, null); }); it('permits top-level `await` above import/export syntax', async () => { @@ -257,10 +257,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'await Promise.resolve(); import "node:os"; console.log("executed");', ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('still throws on `await` in an ordinary sync function', async () => { @@ -269,10 +269,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'function fn() { await Promise.resolve(); } fn();', ]); - match(stderr, /SyntaxError: await is only valid in async function/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: await is only valid in async function/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); it('throws on undefined `require` when top-level `await` triggers ESM parsing', async () => { @@ -281,13 +281,13 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'const fs = require("node:fs"); await Promise.resolve();', ]); - match( + assert.match( stderr, /ReferenceError: Cannot determine intended module format because both require\(\) and top-level await are present\. If the code is intended to be CommonJS, wrap await in an async function\. If the code is intended to be an ES module, replace require\(\) with import\./ ); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); it('permits declaration of CommonJS module variables', async () => { @@ -296,10 +296,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/package-without-type/commonjs-wrapper-variables.js'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'exports require module __filename __dirname\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'exports require module __filename __dirname\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('permits declaration of CommonJS module variables above import/export', async () => { @@ -308,10 +308,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'const module = 3; import "node:os"; console.log("executed");', ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('still throws on double `const` declaration not at the top level', async () => { @@ -320,10 +320,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, 'function fn() { const require = 1; const require = 2; } fn();', ]); - match(stderr, /SyntaxError: Identifier 'require' has already been declared/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: Identifier 'require' has already been declared/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); }); @@ -347,10 +347,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, entryPath, ]); - match(stderr, /MODULE_TYPELESS_PACKAGE_JSON/); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.match(stderr, /MODULE_TYPELESS_PACKAGE_JSON/); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); } @@ -359,10 +359,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/loose.js'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); @@ -371,11 +371,11 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/package-without-type/detected-as-esm.js'), ]); - match(stderr, /MODULE_TYPELESS_PACKAGE_JSON/); - strictEqual(stderr.match(/MODULE_TYPELESS_PACKAGE_JSON/g).length, 1); - strictEqual(stdout, 'executed\nexecuted\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.match(stderr, /MODULE_TYPELESS_PACKAGE_JSON/); + assert.strictEqual(stderr.match(/MODULE_TYPELESS_PACKAGE_JSON/g).length, 1); + assert.strictEqual(stdout, 'executed\nexecuted\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('can be disabled via --no-experimental-detect-module', async () => { @@ -384,10 +384,10 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, fixtures.path('es-modules/package-without-type/module.js'), ]); - match(stderr, /SyntaxError: Unexpected token 'export'/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError: Unexpected token 'export'/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); }); }); @@ -406,10 +406,10 @@ describe('Wrapping a `require` of an ES module while using `--abort-on-uncaught- cwd: fixtures.path('es-modules'), }); - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); }); @@ -420,10 +420,10 @@ describe('when working with Worker threads', () => { 'new worker_threads.Worker("let __filename,__dirname,require,module,exports;this.a",{eval:true})', ]); - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); }); @@ -438,12 +438,12 @@ describe('cjs & esm ambiguous syntax case', () => { ] ); - match( + assert.match( stderr, /ReferenceError: Cannot determine intended module format because both require\(\) and top-level await are present\. If the code is intended to be CommonJS, wrap await in an async function\. If the code is intended to be an ES module, replace require\(\) with import\./ ); - strictEqual(code, 1); - strictEqual(signal, null); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); }); diff --git a/test/es-module/test-esm-dynamic-import-attribute.js b/test/es-module/test-esm-dynamic-import-attribute.js index 4558cd27ca4237..bc6186f7433409 100644 --- a/test/es-module/test-esm-dynamic-import-attribute.js +++ b/test/es-module/test-esm-dynamic-import-attribute.js @@ -1,6 +1,6 @@ 'use strict'; const common = require('../common'); -const { strictEqual } = require('assert'); +const assert = require('assert'); async function test() { { @@ -9,8 +9,8 @@ async function test() { import('../fixtures/empty.js'), ]); - strictEqual(results[0].status, 'rejected'); - strictEqual(results[1].status, 'fulfilled'); + assert.strictEqual(results[0].status, 'rejected'); + assert.strictEqual(results[1].status, 'fulfilled'); } { @@ -19,8 +19,8 @@ async function test() { import('../fixtures/empty.js', { with: { type: 'json' } }), ]); - strictEqual(results[0].status, 'fulfilled'); - strictEqual(results[1].status, 'rejected'); + assert.strictEqual(results[0].status, 'fulfilled'); + assert.strictEqual(results[1].status, 'rejected'); } { @@ -29,8 +29,8 @@ async function test() { import('../fixtures/empty.json'), ]); - strictEqual(results[0].status, 'fulfilled'); - strictEqual(results[1].status, 'rejected'); + assert.strictEqual(results[0].status, 'fulfilled'); + assert.strictEqual(results[1].status, 'rejected'); } { @@ -39,8 +39,8 @@ async function test() { import('../fixtures/empty.json', { with: { type: 'json' } }), ]); - strictEqual(results[0].status, 'rejected'); - strictEqual(results[1].status, 'fulfilled'); + assert.strictEqual(results[0].status, 'rejected'); + assert.strictEqual(results[1].status, 'fulfilled'); } } diff --git a/test/es-module/test-esm-dynamic-import-attribute.mjs b/test/es-module/test-esm-dynamic-import-attribute.mjs index b3d2cb20c36e34..c4dead192593a7 100644 --- a/test/es-module/test-esm-dynamic-import-attribute.mjs +++ b/test/es-module/test-esm-dynamic-import-attribute.mjs @@ -1,5 +1,5 @@ import '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; { const results = await Promise.allSettled([ @@ -7,8 +7,8 @@ import { strictEqual } from 'assert'; import('../fixtures/empty.js'), ]); - strictEqual(results[0].status, 'rejected'); - strictEqual(results[1].status, 'fulfilled'); + assert.strictEqual(results[0].status, 'rejected'); + assert.strictEqual(results[1].status, 'fulfilled'); } { @@ -17,8 +17,8 @@ import { strictEqual } from 'assert'; import('../fixtures/empty.js', { with: { type: 'json' } }), ]); - strictEqual(results[0].status, 'fulfilled'); - strictEqual(results[1].status, 'rejected'); + assert.strictEqual(results[0].status, 'fulfilled'); + assert.strictEqual(results[1].status, 'rejected'); } { @@ -27,8 +27,8 @@ import { strictEqual } from 'assert'; import('../fixtures/empty.json'), ]); - strictEqual(results[0].status, 'fulfilled'); - strictEqual(results[1].status, 'rejected'); + assert.strictEqual(results[0].status, 'fulfilled'); + assert.strictEqual(results[1].status, 'rejected'); } { @@ -37,6 +37,6 @@ import { strictEqual } from 'assert'; import('../fixtures/empty.json', { with: { type: 'json' } }), ]); - strictEqual(results[0].status, 'rejected'); - strictEqual(results[1].status, 'fulfilled'); + assert.strictEqual(results[0].status, 'rejected'); + assert.strictEqual(results[1].status, 'fulfilled'); } diff --git a/test/es-module/test-esm-experimental-warnings.mjs b/test/es-module/test-esm-experimental-warnings.mjs index 902583c6db77fa..904b39258e80d1 100644 --- a/test/es-module/test-esm-experimental-warnings.mjs +++ b/test/es-module/test-esm-experimental-warnings.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { fileURL } from '../common/fixtures.mjs'; -import { doesNotMatch, match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -13,13 +13,13 @@ describe('ESM: warn for obsolete hooks provided', { concurrency: !process.env.TE `import ${JSON.stringify(fileURL('es-module-loaders', 'module-named-exports.mjs'))}`, ]); - doesNotMatch( + assert.doesNotMatch( stderr, /ExperimentalWarning/, new Error('No experimental warning(s) should be emitted when no experimental feature is enabled') ); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); describe('experimental warnings for enabled experimental feature', () => { @@ -40,10 +40,10 @@ describe('ESM: warn for obsolete hooks provided', { concurrency: !process.env.TE `import ${JSON.stringify(fileURL('es-module-loaders', 'module-named-exports.mjs'))}`, ]); - match(stderr, /ExperimentalWarning/); - match(stderr, experiment); - strictEqual(code, 0); - strictEqual(signal, null); + assert.match(stderr, /ExperimentalWarning/); + assert.match(stderr, experiment); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); } }); diff --git a/test/es-module/test-esm-exports.mjs b/test/es-module/test-esm-exports.mjs index 21ed3d383e64e9..bc065898c075a1 100644 --- a/test/es-module/test-esm-exports.mjs +++ b/test/es-module/test-esm-exports.mjs @@ -1,5 +1,5 @@ import { mustCall } from '../common/index.mjs'; -import { ok, deepStrictEqual, strictEqual } from 'assert'; +import assert from 'assert'; import { sep } from 'path'; import { requireFixture, importFixture } from '../fixtures/pkgexports.mjs'; @@ -69,7 +69,7 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; loadFixture(validSpecifier) .then(mustCall((actual) => { - deepStrictEqual({ ...actual }, expected); + assert.deepStrictEqual({ ...actual }, expected); })); } @@ -128,7 +128,7 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; for (const [specifier, subpath] of undefinedExports) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_PACKAGE_PATH_NOT_EXPORTED'); + assert.strictEqual(err.code, 'ERR_PACKAGE_PATH_NOT_EXPORTED'); assertStartsWith(err.message, 'Package subpath '); assertIncludes(err.message, subpath); })); @@ -136,7 +136,7 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; for (const [specifier, subpath] of invalidExports) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_PACKAGE_TARGET'); + assert.strictEqual(err.code, 'ERR_INVALID_PACKAGE_TARGET'); assertStartsWith(err.message, 'Invalid "exports"'); assertIncludes(err.message, subpath); if (!subpath.startsWith('./')) { @@ -147,7 +147,7 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; for (const [specifier, subpath] of invalidSpecifiers) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); + assert.strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); assertStartsWith(err.message, 'Invalid module '); assertIncludes(err.message, 'is not a valid match in pattern'); assertIncludes(err.message, subpath); @@ -158,7 +158,7 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; // of falling back to main if (isRequire) { loadFixture('pkgexports-main').catch(mustCall((err) => { - strictEqual(err.code, 'ERR_PACKAGE_PATH_NOT_EXPORTED'); + assert.strictEqual(err.code, 'ERR_PACKAGE_PATH_NOT_EXPORTED'); assertStartsWith(err.message, 'No "exports" main '); })); } @@ -175,17 +175,17 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; ]); if (!isRequire) { - const onDirectoryImport = (err) => { - strictEqual(err.code, 'ERR_UNSUPPORTED_DIR_IMPORT'); - assertStartsWith(err.message, 'Directory import'); + const onDirectoryImport = { + code: 'ERR_UNSUPPORTED_DIR_IMPORT', + message: /^Directory import/, }; - loadFixture('pkgexports/subpath/dir1').catch(mustCall(onDirectoryImport)); - loadFixture('pkgexports/subpath/dir2').catch(mustCall(onDirectoryImport)); + assert.rejects(loadFixture('pkgexports/subpath/dir1'), onDirectoryImport).then(mustCall()); + assert.rejects(loadFixture('pkgexports/subpath/dir2'), onDirectoryImport).then(mustCall()); } for (const [specifier, request] of notFoundExports) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, (isRequire ? '' : 'ERR_') + 'MODULE_NOT_FOUND'); + assert.strictEqual(err.code, (isRequire ? '' : 'ERR_') + 'MODULE_NOT_FOUND'); assertIncludes(err.message, request); assertStartsWith(err.message, 'Cannot find module'); })); @@ -193,20 +193,20 @@ import fromInside from '../fixtures/node_modules/pkgexports/lib/hole.js'; // The use of %2F and %5C escapes in paths fails loading loadFixture('pkgexports/sub/..%2F..%2Fbar.js').catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); + assert.strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); })); loadFixture('pkgexports/sub/..%5C..%5Cbar.js').catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); + assert.strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); })); // Package export with numeric index properties must throw a validation error loadFixture('pkgexports-numeric').catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_PACKAGE_CONFIG'); + assert.strictEqual(err.code, 'ERR_INVALID_PACKAGE_CONFIG'); })); // Sugar conditional exports main mixed failure case loadFixture('pkgexports-sugar-fail').catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_PACKAGE_CONFIG'); + assert.strictEqual(err.code, 'ERR_INVALID_PACKAGE_CONFIG'); assertStartsWith(err.message, 'Invalid package'); assertIncludes(err.message, '"exports" cannot contain some keys starting ' + 'with \'.\' and some not. The exports object must either be an object of ' + @@ -232,17 +232,17 @@ const { requireFromInside, importFromInside } = fromInside; loadFromInside(validSpecifier) .then(mustCall((actual) => { - deepStrictEqual({ ...actual }, expected); + assert.deepStrictEqual({ ...actual }, expected); })); } }); function assertStartsWith(actual, expected) { const start = actual.toString().slice(0, expected.length); - strictEqual(start, expected); + assert.strictEqual(start, expected); } function assertIncludes(actual, expected) { - ok(actual.toString().indexOf(expected) !== -1, - `${JSON.stringify(actual)} includes ${JSON.stringify(expected)}`); + assert.ok(actual.toString().indexOf(expected) !== -1, + `${JSON.stringify(actual)} includes ${JSON.stringify(expected)}`); } diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs index 41fda57cfa4e30..5252111cc4feaf 100644 --- a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -2,7 +2,7 @@ import { spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { describe, it } from 'node:test'; -import { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; describe('extensionless ES modules within a "type": "module" package scope', { concurrency: !process.env.TEST_PARALLEL, @@ -12,23 +12,23 @@ describe('extensionless ES modules within a "type": "module" package scope', { fixtures.path('es-modules/package-type-module/noext-esm'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('should be importable', async () => { const { default: defaultExport } = await import(fixtures.fileURL('es-modules/package-type-module/noext-esm')); - strictEqual(defaultExport, 'module'); + assert.strictEqual(defaultExport, 'module'); }); it('should be importable from a module scope under node_modules', async () => { const { default: defaultExport } = await import(fixtures.fileURL( 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); - strictEqual(defaultExport, 'module'); + assert.strictEqual(defaultExport, 'module'); }); }); describe('extensionless Wasm modules within a "type": "module" package scope', { @@ -41,21 +41,21 @@ describe('extensionless Wasm modules within a "type": "module" package scope', { fixtures.path('es-modules/package-type-module/noext-wasm'), ]); - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('should be importable', async () => { const { add } = await import(fixtures.fileURL('es-modules/package-type-module/noext-wasm')); - strictEqual(add(1, 2), 3); + assert.strictEqual(add(1, 2), 3); }); it('should be importable from a module scope under node_modules', async () => { const { add } = await import(fixtures.fileURL( 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); - strictEqual(add(1, 2), 3); + assert.strictEqual(add(1, 2), 3); }); }); @@ -65,10 +65,10 @@ describe('extensionless ES modules within no package scope', { concurrency: !pro fixtures.path('es-modules/noext-esm'), ]); - strictEqual(stdout, 'executed\n'); - strictEqual(stderr, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stdout, 'executed\n'); + assert.strictEqual(stderr, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); it('should run on import', async () => { @@ -84,10 +84,10 @@ describe('extensionless Wasm within no package scope', { concurrency: !process.e fixtures.path('es-modules/noext-wasm'), ]); - match(stderr, /SyntaxError/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /SyntaxError/); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); it('should run on import', async () => { diff --git a/test/es-module/test-esm-import-attributes-1.mjs b/test/es-module/test-esm-import-attributes-1.mjs index c699a27bb51a75..3a08fcc844b2a5 100644 --- a/test/es-module/test-esm-import-attributes-1.mjs +++ b/test/es-module/test-esm-import-attributes-1.mjs @@ -1,6 +1,6 @@ import '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; import secret from '../fixtures/experimental.json' with { type: 'json' }; -strictEqual(secret.ofLife, 42); +assert.strictEqual(secret.ofLife, 42); diff --git a/test/es-module/test-esm-import-attributes-2.mjs b/test/es-module/test-esm-import-attributes-2.mjs index 85d6020019af05..f81deebf8d0e82 100644 --- a/test/es-module/test-esm-import-attributes-2.mjs +++ b/test/es-module/test-esm-import-attributes-2.mjs @@ -1,11 +1,11 @@ import '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; import secret0 from '../fixtures/experimental.json' with { type: 'json' }; const secret1 = await import('../fixtures/experimental.json', { with: { type: 'json' }, }); -strictEqual(secret0.ofLife, 42); -strictEqual(secret1.default.ofLife, 42); -strictEqual(secret1.default, secret0); +assert.strictEqual(secret0.ofLife, 42); +assert.strictEqual(secret1.default.ofLife, 42); +assert.strictEqual(secret1.default, secret0); diff --git a/test/es-module/test-esm-import-attributes-3.mjs b/test/es-module/test-esm-import-attributes-3.mjs index 8950ca5c595e12..884d20f491dc92 100644 --- a/test/es-module/test-esm-import-attributes-3.mjs +++ b/test/es-module/test-esm-import-attributes-3.mjs @@ -1,10 +1,10 @@ import '../common/index.mjs'; -import { strictEqual } from 'assert'; +import assert from 'assert'; import secret0 from '../fixtures/experimental.json' with { type: 'json' }; const secret1 = await import('../fixtures/experimental.json', { with: { type: 'json' } }); -strictEqual(secret0.ofLife, 42); -strictEqual(secret1.default.ofLife, 42); -strictEqual(secret1.default, secret0); +assert.strictEqual(secret0.ofLife, 42); +assert.strictEqual(secret1.default.ofLife, 42); +assert.strictEqual(secret1.default, secret0); diff --git a/test/es-module/test-esm-import-attributes-errors.js b/test/es-module/test-esm-import-attributes-errors.js index 9789484be986b3..c8ffd9320ad566 100644 --- a/test/es-module/test-esm-import-attributes-errors.js +++ b/test/es-module/test-esm-import-attributes-errors.js @@ -1,67 +1,67 @@ 'use strict'; const common = require('../common'); -const { rejects } = require('assert'); +const assert = require('assert'); -const jsModuleDataUrl = 'data:text/javascript,export{}'; +const jsModuleDataUrl = 'data:text/javascript,exportassert'; const jsonModuleDataUrl = 'data:application/json,""'; async function test() { - await rejects( + await assert.rejects( import('data:text/css,', { with: { type: 'css' } }), { code: 'ERR_UNKNOWN_MODULE_FORMAT' } ); - await rejects( + await assert.rejects( import('data:text/css,', { with: { unsupportedAttribute: 'value' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); - await rejects( + await assert.rejects( import(`data:text/javascript,import${JSON.stringify(jsModuleDataUrl)}with{type:"json"}`), { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); - await rejects( + await assert.rejects( import(jsModuleDataUrl, { with: { type: 'json' } }), { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); - await rejects( + await assert.rejects( import(jsModuleDataUrl, { with: { type: 'json', other: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); - await rejects( + await assert.rejects( import(jsModuleDataUrl, { with: { type: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); - await rejects( + await assert.rejects( import(jsonModuleDataUrl), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); - await rejects( + await assert.rejects( import(jsonModuleDataUrl, { with: {} }), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); - await rejects( + await assert.rejects( import(jsonModuleDataUrl, { with: { foo: 'bar' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); - await rejects( + await assert.rejects( import(jsonModuleDataUrl, { with: { type: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); - await rejects( + await assert.rejects( import(jsonModuleDataUrl, { assert: { type: 'json' } }), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); - await rejects( + await assert.rejects( import(`data:text/javascript,import${JSON.stringify(jsonModuleDataUrl)}assert{type:"json"}`), SyntaxError ); diff --git a/test/es-module/test-esm-import-attributes-errors.mjs b/test/es-module/test-esm-import-attributes-errors.mjs index 8095662b104135..1168c109fdc4d0 100644 --- a/test/es-module/test-esm-import-attributes-errors.mjs +++ b/test/es-module/test-esm-import-attributes-errors.mjs @@ -1,62 +1,62 @@ import '../common/index.mjs'; -import { rejects } from 'assert'; +import assert from 'assert'; const jsModuleDataUrl = 'data:text/javascript,export{}'; const jsonModuleDataUrl = 'data:application/json,""'; -await rejects( +await assert.rejects( // This rejects because of the unsupported MIME type, not because of the // unsupported assertion. import('data:text/css,', { with: { type: 'css' } }), { code: 'ERR_UNKNOWN_MODULE_FORMAT' } ); -await rejects( +await assert.rejects( import(`data:text/javascript,import${JSON.stringify(jsModuleDataUrl)}with{type:"json"}`), { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); -await rejects( +await assert.rejects( import(jsModuleDataUrl, { with: { type: 'json' } }), { code: 'ERR_IMPORT_ATTRIBUTE_TYPE_INCOMPATIBLE' } ); -await rejects( +await assert.rejects( import(jsModuleDataUrl, { with: { type: 'json', other: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); -await rejects( +await assert.rejects( import(import.meta.url, { with: { type: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); -await rejects( +await assert.rejects( import(jsonModuleDataUrl), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); -await rejects( +await assert.rejects( import(jsonModuleDataUrl, { with: {} }), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); -await rejects( +await assert.rejects( import(jsonModuleDataUrl, { with: { foo: 'bar' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); -await rejects( +await assert.rejects( import(jsonModuleDataUrl, { with: { type: 'unsupported' } }), { code: 'ERR_IMPORT_ATTRIBUTE_UNSUPPORTED' } ); -await rejects( +await assert.rejects( import(jsonModuleDataUrl, { assert: { type: 'json' } }), { code: 'ERR_IMPORT_ATTRIBUTE_MISSING' } ); -await rejects( +await assert.rejects( import(`data:text/javascript,import${JSON.stringify(jsonModuleDataUrl)}assert{type:"json"}`), SyntaxError ); diff --git a/test/es-module/test-esm-import-meta-resolve.mjs b/test/es-module/test-esm-import-meta-resolve.mjs index 504d8968995bf1..695527c3974202 100644 --- a/test/es-module/test-esm-import-meta-resolve.mjs +++ b/test/es-module/test-esm-import-meta-resolve.mjs @@ -26,7 +26,7 @@ assert.strictEqual( assert.strictEqual( import.meta.resolve('../fixtures/', new URL(import.meta.url)), fixtures); -[[], {}, Symbol(), 0, 1, 1n, 1.1, () => {}, true, false].map((arg) => +[[], {}, Symbol(), 0, 1, 1n, 1.1, () => {}, true, false].forEach((arg) => assert.throws(() => import.meta.resolve('../fixtures/', arg), { code: 'ERR_INVALID_ARG_TYPE', }) diff --git a/test/es-module/test-esm-imports.mjs b/test/es-module/test-esm-imports.mjs index d005355e4ab5af..7d2f7a63773514 100644 --- a/test/es-module/test-esm-imports.mjs +++ b/test/es-module/test-esm-imports.mjs @@ -1,5 +1,5 @@ import { mustCall } from '../common/index.mjs'; -import { ok, deepStrictEqual, strictEqual } from 'assert'; +import assert from 'assert'; import importer from '../fixtures/es-modules/pkgimports/importer.js'; import { requireFixture } from '../fixtures/pkgexports.mjs'; @@ -36,7 +36,7 @@ const { requireImport, importImport } = importer; loadFixture(validSpecifier) .then(mustCall((actual) => { - deepStrictEqual({ ...actual }, expected); + assert.deepStrictEqual({ ...actual }, expected); })); } @@ -49,7 +49,7 @@ const { requireImport, importImport } = importer; for (const [specifier, subpath] of invalidImportTargets) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_PACKAGE_TARGET'); + assert.strictEqual(err.code, 'ERR_INVALID_PACKAGE_TARGET'); assertStartsWith(err.message, 'Invalid "imports"'); assertIncludes(err.message, subpath); assertNotIncludes(err.message, 'targets must start with'); @@ -73,7 +73,7 @@ const { requireImport, importImport } = importer; for (const [specifier, expected] of invalidImportSpecifiers) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); + assert.strictEqual(err.code, 'ERR_INVALID_MODULE_SPECIFIER'); assertStartsWith(err.message, 'Invalid module'); assertIncludes(err.message, expected); })); @@ -98,7 +98,7 @@ const { requireImport, importImport } = importer; for (const specifier of undefinedImports) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, 'ERR_PACKAGE_IMPORT_NOT_DEFINED'); + assert.strictEqual(err.code, 'ERR_PACKAGE_IMPORT_NOT_DEFINED'); assertStartsWith(err.message, 'Package import '); assertIncludes(err.message, specifier); })); @@ -115,28 +115,28 @@ const { requireImport, importImport } = importer; ]); for (const specifier of nonDefinedImports) { loadFixture(specifier).catch(mustCall((err) => { - strictEqual(err.code, - isRequire ? 'MODULE_NOT_FOUND' : 'ERR_MODULE_NOT_FOUND'); + assert.strictEqual(err.code, + isRequire ? 'MODULE_NOT_FOUND' : 'ERR_MODULE_NOT_FOUND'); })); } }); // CJS resolver must still support #package packages in node_modules requireFixture('#cjs').then(mustCall((actual) => { - strictEqual(actual.default, 'cjs backcompat'); + assert.strictEqual(actual.default, 'cjs backcompat'); })); function assertStartsWith(actual, expected) { const start = actual.toString().slice(0, expected.length); - strictEqual(start, expected); + assert.strictEqual(start, expected); } function assertIncludes(actual, expected) { - ok(actual.toString().indexOf(expected) !== -1, - `${JSON.stringify(actual)} includes ${JSON.stringify(expected)}`); + assert.ok(actual.toString().indexOf(expected) !== -1, + `${JSON.stringify(actual)} includes ${JSON.stringify(expected)}`); } function assertNotIncludes(actual, expected) { - ok(actual.toString().indexOf(expected) === -1, - `${JSON.stringify(actual)} doesn't include ${JSON.stringify(expected)}`); + assert.ok(actual.toString().indexOf(expected) === -1, + `${JSON.stringify(actual)} doesn't include ${JSON.stringify(expected)}`); } diff --git a/test/es-module/test-esm-json-cache.mjs b/test/es-module/test-esm-json-cache.mjs index f8d24fd394a4a2..9b61137db65531 100644 --- a/test/es-module/test-esm-json-cache.mjs +++ b/test/es-module/test-esm-json-cache.mjs @@ -1,6 +1,6 @@ import '../common/index.mjs'; -import { strictEqual, deepStrictEqual } from 'assert'; +import assert from 'assert'; import { createRequire } from 'module'; @@ -15,10 +15,10 @@ const modCjs = require('../fixtures/es-modules/json-cache/mod.cjs'); const anotherCjs = require('../fixtures/es-modules/json-cache/another.cjs'); const testCjs = require('../fixtures/es-modules/json-cache/test.json'); -strictEqual(mod.one, 1); -strictEqual(another.one, 'zalgo'); -strictEqual(test.one, 'it comes'); +assert.strictEqual(mod.one, 1); +assert.strictEqual(another.one, 'zalgo'); +assert.strictEqual(test.one, 'it comes'); -deepStrictEqual(mod, modCjs); -deepStrictEqual(another, anotherCjs); -deepStrictEqual(test, testCjs); +assert.deepStrictEqual(mod, modCjs); +assert.deepStrictEqual(another, anotherCjs); +assert.deepStrictEqual(test, testCjs); diff --git a/test/es-module/test-esm-loader-hooks.mjs b/test/es-module/test-esm-loader-hooks.mjs index 9e25232146d458..3ff5954c06ef54 100644 --- a/test/es-module/test-esm-loader-hooks.mjs +++ b/test/es-module/test-esm-loader-hooks.mjs @@ -119,7 +119,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { assert.strictEqual(signal, null); }); - it('import.meta.resolve of a never-settling resolve', async () => { + it('import.meta.resolve of a never-settling resolve should throw', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ '--no-warnings', '--experimental-loader', @@ -129,7 +129,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { assert.strictEqual(stderr, ''); assert.match(stdout, /^should be output\r?\n$/); - assert.strictEqual(code, 13); + assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); }); @@ -668,13 +668,17 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { '--eval', ` import {register} from 'node:module'; - register('data:text/javascript,export function initialize(){return new Promise(()=>{})}'); + try { + register('data:text/javascript,export function initialize(){return new Promise(()=>{})}'); + } catch (e) { + console.log('caught', e.code); + } `, ]); assert.strictEqual(stderr, ''); - assert.strictEqual(stdout, ''); - assert.strictEqual(code, 13); + assert.strictEqual(stdout.trim(), 'caught ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED'); + assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); @@ -772,7 +776,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { assert.strictEqual(signal, null); }); - describe('should use hooks', async () => { + it('should use hooks', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--no-experimental-require-module', '--import', diff --git a/test/es-module/test-esm-loader-modulemap.js b/test/es-module/test-esm-loader-modulemap.js index 83125fce738139..c725f093fa3bda 100644 --- a/test/es-module/test-esm-loader-modulemap.js +++ b/test/es-module/test-esm-loader-modulemap.js @@ -3,7 +3,7 @@ require('../common'); -const { strictEqual, throws } = require('assert'); +const assert = require('assert'); const { createModuleLoader } = require('internal/modules/esm/loader'); const { LoadCache, ResolveCache } = require('internal/modules/esm/module_map'); const { ModuleJob } = require('internal/modules/esm/module_job'); @@ -16,13 +16,10 @@ const jsonModuleDataUrl = 'data:application/json,""'; const stubJsModule = createDynamicModule([], ['default'], jsModuleDataUrl); const stubJsonModule = createDynamicModule([], ['default'], jsonModuleDataUrl); -const loader = createModuleLoader(false); -const jsModuleJob = new ModuleJob(loader, stubJsModule.module, undefined, - () => new Promise(() => {})); -const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, - { type: 'json' }, - () => new Promise(() => {})); - +const loader = createModuleLoader(); +const jsModuleJob = new ModuleJob(loader, jsModuleDataUrl, {}, stubJsModule.module); +const jsonModuleJob = new ModuleJob(loader, jsonModuleDataUrl, + { type: 'json' }, stubJsonModule.module); // LoadCache.set and LoadCache.get store and retrieve module jobs for a // specified url/type tuple; LoadCache.has correctly reports whether such jobs @@ -33,21 +30,21 @@ const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, moduleMap.set(jsModuleDataUrl, undefined, jsModuleJob); moduleMap.set(jsonModuleDataUrl, 'json', jsonModuleJob); - strictEqual(moduleMap.get(jsModuleDataUrl), jsModuleJob); - strictEqual(moduleMap.get(jsonModuleDataUrl, 'json'), jsonModuleJob); + assert.strictEqual(moduleMap.get(jsModuleDataUrl), jsModuleJob); + assert.strictEqual(moduleMap.get(jsonModuleDataUrl, 'json'), jsonModuleJob); - strictEqual(moduleMap.has(jsModuleDataUrl), true); - strictEqual(moduleMap.has(jsModuleDataUrl, 'javascript'), true); - strictEqual(moduleMap.has(jsonModuleDataUrl, 'json'), true); + assert.strictEqual(moduleMap.has(jsModuleDataUrl), true); + assert.strictEqual(moduleMap.has(jsModuleDataUrl, 'javascript'), true); + assert.strictEqual(moduleMap.has(jsonModuleDataUrl, 'json'), true); - strictEqual(moduleMap.has('unknown'), false); + assert.strictEqual(moduleMap.has('unknown'), false); // The types must match - strictEqual(moduleMap.has(jsModuleDataUrl, 'json'), false); - strictEqual(moduleMap.has(jsonModuleDataUrl, 'javascript'), false); - strictEqual(moduleMap.has(jsonModuleDataUrl), false); - strictEqual(moduleMap.has(jsModuleDataUrl, 'unknown'), false); - strictEqual(moduleMap.has(jsonModuleDataUrl, 'unknown'), false); + assert.strictEqual(moduleMap.has(jsModuleDataUrl, 'json'), false); + assert.strictEqual(moduleMap.has(jsonModuleDataUrl, 'javascript'), false); + assert.strictEqual(moduleMap.has(jsonModuleDataUrl), false); + assert.strictEqual(moduleMap.has(jsModuleDataUrl, 'unknown'), false); + assert.strictEqual(moduleMap.has(jsonModuleDataUrl, 'unknown'), false); } // LoadCache.get, LoadCache.has and LoadCache.set should only accept string @@ -62,9 +59,9 @@ const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, }; [{}, [], true, 1].forEach((value) => { - throws(() => moduleMap.get(value), errorObj); - throws(() => moduleMap.has(value), errorObj); - throws(() => moduleMap.set(value, undefined, jsModuleJob), errorObj); + assert.throws(() => moduleMap.get(value), errorObj); + assert.throws(() => moduleMap.has(value), errorObj); + assert.throws(() => moduleMap.set(value, undefined, jsModuleJob), errorObj); }); } @@ -80,9 +77,9 @@ const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, }; [{}, [], true, 1].forEach((value) => { - throws(() => moduleMap.get(jsModuleDataUrl, value), errorObj); - throws(() => moduleMap.has(jsModuleDataUrl, value), errorObj); - throws(() => moduleMap.set(jsModuleDataUrl, value, jsModuleJob), errorObj); + assert.throws(() => moduleMap.get(jsModuleDataUrl, value), errorObj); + assert.throws(() => moduleMap.has(jsModuleDataUrl, value), errorObj); + assert.throws(() => moduleMap.set(jsModuleDataUrl, value, jsModuleJob), errorObj); }); } @@ -91,7 +88,7 @@ const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, const moduleMap = new LoadCache(); [{}, [], true, 1].forEach((value) => { - throws(() => moduleMap.set('', undefined, value), { + assert.throws(() => moduleMap.set('', undefined, value), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: /^The "job" argument must be an instance of ModuleJob/ @@ -102,17 +99,20 @@ const jsonModuleJob = new ModuleJob(loader, stubJsonModule.module, { const resolveMap = new ResolveCache(); - strictEqual(resolveMap.serializeKey('./file', { __proto__: null }), './file::'); - strictEqual(resolveMap.serializeKey('./file', { __proto__: null, type: 'json' }), './file::"type""json"'); - strictEqual(resolveMap.serializeKey('./file::"type""json"', { __proto__: null }), './file::"type""json"::'); - strictEqual(resolveMap.serializeKey('./file', { __proto__: null, c: 'd', a: 'b' }), './file::"a""b","c""d"'); - strictEqual(resolveMap.serializeKey('./s', { __proto__: null, c: 'd', a: 'b', b: 'c' }), './s::"a""b","b""c","c""d"'); + assert.strictEqual(resolveMap.serializeKey('./file', { __proto__: null }), './file::'); + assert.strictEqual(resolveMap.serializeKey('./file', { __proto__: null, type: 'json' }), './file::"type""json"'); + assert.strictEqual(resolveMap.serializeKey('./file::"type""json"', { __proto__: null }), './file::"type""json"::'); + assert.strictEqual(resolveMap.serializeKey('./file', { __proto__: null, c: 'd', a: 'b' }), './file::"a""b","c""d"'); + assert.strictEqual( + resolveMap.serializeKey('./s', { __proto__: null, c: 'd', a: 'b', b: 'c' }), + './s::"a""b","b""c","c""d"', + ); resolveMap.set('key1', 'parent1', 1); resolveMap.set('key2', 'parent1', 2); resolveMap.set('key2', 'parent2', 3); - strictEqual(resolveMap.get('key1', 'parent1'), 1); - strictEqual(resolveMap.get('key2', 'parent1'), 2); - strictEqual(resolveMap.get('key2', 'parent2'), 3); + assert.strictEqual(resolveMap.get('key1', 'parent1'), 1); + assert.strictEqual(resolveMap.get('key2', 'parent1'), 2); + assert.strictEqual(resolveMap.get('key2', 'parent2'), 3); } diff --git a/test/es-module/test-esm-loader-resolve-type.mjs b/test/es-module/test-esm-loader-resolve-type.mjs index 94f409490227af..7dcc65a10c09cf 100644 --- a/test/es-module/test-esm-loader-resolve-type.mjs +++ b/test/es-module/test-esm-loader-resolve-type.mjs @@ -1,7 +1,7 @@ import { spawnPromisified } from '../common/index.mjs'; import * as tmpdir from '../common/tmpdir.js'; import * as fixtures from '../common/fixtures.mjs'; -import { deepStrictEqual } from 'node:assert'; +import assert from 'node:assert'; import { mkdir, rm, cp } from 'node:fs/promises'; import { execPath } from 'node:process'; @@ -33,7 +33,7 @@ try { { cwd: base }, ); - deepStrictEqual(output, { + assert.deepStrictEqual(output, { code: 0, signal: null, stderr: '', diff --git a/test/es-module/test-esm-loader-thenable.mjs b/test/es-module/test-esm-loader-thenable.mjs index 1f394e8607acc5..8cb3f50650cb2e 100644 --- a/test/es-module/test-esm-loader-thenable.mjs +++ b/test/es-module/test-esm-loader-thenable.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { fileURL, path } from '../common/fixtures.mjs'; -import { match, ok, notStrictEqual, strictEqual } from 'assert'; +import assert from 'assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -13,8 +13,8 @@ describe('ESM: thenable loader hooks', { concurrency: !process.env.TEST_PARALLEL path('es-modules', 'test-esm-ok.mjs'), ]); - strictEqual(code, 0); - ok(!stderr.includes('must not call')); + assert.strictEqual(code, 0); + assert.ok(!stderr.includes('must not call')); }); it('should crash the node process rejection with an error', async () => { @@ -24,9 +24,9 @@ describe('ESM: thenable loader hooks', { concurrency: !process.env.TEST_PARALLEL path('es-modules', 'test-esm-ok.mjs'), ]); - notStrictEqual(code, 0); - match(stderr, /\sError: must crash the process\r?\n/); - ok(!stderr.includes('must not call')); + assert.notStrictEqual(code, 0); + assert.match(stderr, /\sError: must crash the process\r?\n/); + assert.ok(!stderr.includes('must not call')); }); it('should just reject without an error (but NOT crash the node process)', async () => { @@ -36,8 +36,8 @@ describe('ESM: thenable loader hooks', { concurrency: !process.env.TEST_PARALLEL path('es-modules', 'test-esm-ok.mjs'), ]); - notStrictEqual(code, 0); - match(stderr, /\sundefined\r?\n/); - ok(!stderr.includes('must not call')); + assert.notStrictEqual(code, 0); + assert.match(stderr, /\sundefined\r?\n/); + assert.ok(!stderr.includes('must not call')); }); }); diff --git a/test/es-module/test-esm-loader-with-syntax-error.mjs b/test/es-module/test-esm-loader-with-syntax-error.mjs index a2461677730a63..48071a3dc1e80d 100644 --- a/test/es-module/test-esm-loader-with-syntax-error.mjs +++ b/test/es-module/test-esm-loader-with-syntax-error.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { fileURL, path } from '../common/fixtures.mjs'; -import { match, ok, notStrictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -13,8 +13,8 @@ describe('ESM: loader with syntax error', { concurrency: !process.env.TEST_PARAL path('print-error-message.js'), ]); - match(stderr, /SyntaxError/); - ok(!stderr.includes('Bad command or file name')); - notStrictEqual(code, 0); + assert.match(stderr, /SyntaxError/); + assert.ok(!stderr.includes('Bad command or file name')); + assert.notStrictEqual(code, 0); }); }); diff --git a/test/es-module/test-esm-module-not-found-commonjs-hint.mjs b/test/es-module/test-esm-module-not-found-commonjs-hint.mjs index 7f2bb38bfc1adf..fcd7ec62bc8c09 100644 --- a/test/es-module/test-esm-module-not-found-commonjs-hint.mjs +++ b/test/es-module/test-esm-module-not-found-commonjs-hint.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { fixturesDir, fileURL as fixtureSubDir } from '../common/fixtures.mjs'; -import { match, notStrictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -49,7 +49,7 @@ describe('ESM: module not found hint', { concurrency: !process.env.TEST_PARALLEL input, ], { cwd }); - match(stderr, expected); - notStrictEqual(code, 0); + assert.match(stderr, expected); + assert.notStrictEqual(code, 0); }); }); diff --git a/test/es-module/test-esm-non-js.mjs b/test/es-module/test-esm-non-js.mjs index 9ecb2a64397bda..f341bb082a6431 100644 --- a/test/es-module/test-esm-non-js.mjs +++ b/test/es-module/test-esm-non-js.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { fileURL } from '../common/fixtures.mjs'; -import { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -13,8 +13,8 @@ describe('ESM: non-js extensions fail', { concurrency: !process.env.TEST_PARALLE `import ${JSON.stringify(fileURL('es-modules', 'file.unknown'))}`, ]); - match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); }); }); diff --git a/test/es-module/test-esm-nowarn-exports.mjs b/test/es-module/test-esm-nowarn-exports.mjs index b141cc43db85e5..4ca4b2f344a2f5 100644 --- a/test/es-module/test-esm-nowarn-exports.mjs +++ b/test/es-module/test-esm-nowarn-exports.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { path } from '../common/fixtures.mjs'; -import { strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -12,8 +12,8 @@ describe('ESM: experiemental warning for import.meta.resolve', { concurrency: !p path('es-modules/import-resolve-exports.mjs'), ]); - strictEqual(stderr, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); }); }); diff --git a/test/es-module/test-esm-preserve-symlinks.js b/test/es-module/test-esm-preserve-symlinks.js index a91373b0c05b93..36f64956d55ee8 100644 --- a/test/es-module/test-esm-preserve-symlinks.js +++ b/test/es-module/test-esm-preserve-symlinks.js @@ -33,6 +33,6 @@ try { spawn(process.execPath, ['--preserve-symlinks', entry], - { stdio: 'inherit' }).on('exit', (code) => { + { stdio: 'inherit' }).on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); -}); +})); diff --git a/test/es-module/test-esm-recursive-cjs-dependencies.mjs b/test/es-module/test-esm-recursive-cjs-dependencies.mjs index d75f0fae95df6c..61061a219047f0 100644 --- a/test/es-module/test-esm-recursive-cjs-dependencies.mjs +++ b/test/es-module/test-esm-recursive-cjs-dependencies.mjs @@ -1,7 +1,7 @@ import '../common/index.mjs'; -import { strictEqual } from 'node:assert'; +import assert from 'node:assert'; import '../fixtures/recursive-a.cjs'; -strictEqual(global.counter, 1); +assert.strictEqual(global.counter, 1); delete global.counter; diff --git a/test/es-module/test-esm-repl.js b/test/es-module/test-esm-repl.js index 872d2c1f6ef8f4..6587d19d02dd6f 100644 --- a/test/es-module/test-esm-repl.js +++ b/test/es-module/test-esm-repl.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const { spawn } = require('child_process'); @@ -13,6 +13,6 @@ import('fs').then( ).then(process.exit) `); -child.on('exit', (code) => { +child.on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); -}); +})); diff --git a/test/es-module/test-esm-symlink-main.js b/test/es-module/test-esm-symlink-main.js index 2be495ad7dcfb5..930bfeb9aa401a 100644 --- a/test/es-module/test-esm-symlink-main.js +++ b/test/es-module/test-esm-symlink-main.js @@ -20,6 +20,6 @@ try { spawn(process.execPath, ['--preserve-symlinks', symlinkPath], - { stdio: 'inherit' }).on('exit', (code) => { + { stdio: 'inherit' }).on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); -}); +})); diff --git a/test/es-module/test-esm-symlink.js b/test/es-module/test-esm-symlink.js index 139e6820ed5354..0ed2dac792a1bb 100644 --- a/test/es-module/test-esm-symlink.js +++ b/test/es-module/test-esm-symlink.js @@ -42,6 +42,6 @@ try { } spawn(process.execPath, [entry], - { stdio: 'inherit' }).on('exit', (code) => { + { stdio: 'inherit' }).on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); -}); +})); diff --git a/test/es-module/test-esm-syntax-error.mjs b/test/es-module/test-esm-syntax-error.mjs index 6a15207a544f52..7f697b0105ed18 100644 --- a/test/es-module/test-esm-syntax-error.mjs +++ b/test/es-module/test-esm-syntax-error.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { path } from '../common/fixtures.mjs'; -import { match, notStrictEqual } from 'node:assert'; +import assert from 'node:assert'; import { execPath } from 'node:process'; import { describe, it } from 'node:test'; @@ -10,7 +10,7 @@ describe('ESM: importing a module with syntax error(s)', { concurrency: !process const { code, stderr } = await spawnPromisified(execPath, [ path('es-module-loaders', 'syntax-error.mjs'), ]); - match(stderr, /SyntaxError:/); - notStrictEqual(code, 0); + assert.match(stderr, /SyntaxError:/); + assert.notStrictEqual(code, 0); }); }); diff --git a/test/es-module/test-esm-tla-syntax-errors-not-recognized-as-tla-error.mjs b/test/es-module/test-esm-tla-syntax-errors-not-recognized-as-tla-error.mjs index f6d1ca962c94a3..ed6d3e44f8f14b 100644 --- a/test/es-module/test-esm-tla-syntax-errors-not-recognized-as-tla-error.mjs +++ b/test/es-module/test-esm-tla-syntax-errors-not-recognized-as-tla-error.mjs @@ -1,6 +1,6 @@ import { spawnPromisified } from '../common/index.mjs'; import { describe, it } from 'node:test'; -import { strictEqual, match } from 'node:assert'; +import assert from 'node:assert'; describe('unusual top-level await syntax errors', () => { const expressions = [ @@ -41,10 +41,10 @@ describe('unusual top-level await syntax errors', () => { `, ]); - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); + assert.strictEqual(stderr, ''); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 0); + assert.strictEqual(signal, null); } } }); @@ -69,10 +69,10 @@ describe('unusual top-level await syntax errors', () => { ${wrapperExpression} `, ]); - match(stderr, error); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); + assert.match(stderr, error); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); } }); }); diff --git a/test/es-module/test-esm-wasm-escape-import-names.mjs b/test/es-module/test-esm-wasm-escape-import-names.mjs new file mode 100644 index 00000000000000..fa84587f6efc49 --- /dev/null +++ b/test/es-module/test-esm-wasm-escape-import-names.mjs @@ -0,0 +1,10 @@ +// Test that import names are properly escaped +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-escape-import-names.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-globals-all-types.mjs b/test/es-module/test-esm-wasm-globals-all-types.mjs new file mode 100644 index 00000000000000..aa9fff3bf07d77 --- /dev/null +++ b/test/es-module/test-esm-wasm-globals-all-types.mjs @@ -0,0 +1,10 @@ +// Test that all WebAssembly global types are properly handled +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-globals-all-types.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-js-string-builtins.mjs b/test/es-module/test-esm-wasm-js-string-builtins.mjs new file mode 100644 index 00000000000000..4d5417f7f82baa --- /dev/null +++ b/test/es-module/test-esm-wasm-js-string-builtins.mjs @@ -0,0 +1,10 @@ +// Test that js-string builtins are supported +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-js-string-builtins.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-load-exports.mjs b/test/es-module/test-esm-wasm-load-exports.mjs new file mode 100644 index 00000000000000..c0d96f826650b3 --- /dev/null +++ b/test/es-module/test-esm-wasm-load-exports.mjs @@ -0,0 +1,10 @@ +// Test that WASM modules can load and export functions correctly +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-load-exports.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-module-instances-warning.mjs b/test/es-module/test-esm-wasm-module-instances-warning.mjs new file mode 100644 index 00000000000000..e8ca55258131d6 --- /dev/null +++ b/test/es-module/test-esm-wasm-module-instances-warning.mjs @@ -0,0 +1,17 @@ +// Test that experimental warning is emitted for WASM module instances +import '../common/index.mjs'; +import assert from 'node:assert'; + +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + [fixtures.path('es-modules/wasm-modules.mjs')], + { + stderr(output) { + assert.match(output, /ExperimentalWarning/); + assert.match(output, /Importing WebAssembly module instances/); + } + } +); diff --git a/test/es-module/test-esm-wasm-no-code-injection.mjs b/test/es-module/test-esm-wasm-no-code-injection.mjs new file mode 100644 index 00000000000000..af5cbc93276cf1 --- /dev/null +++ b/test/es-module/test-esm-wasm-no-code-injection.mjs @@ -0,0 +1,10 @@ +// Test that code injection through export names is not allowed +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/export-name-code-injection.wasm')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-non-identifier-exports.mjs b/test/es-module/test-esm-wasm-non-identifier-exports.mjs new file mode 100644 index 00000000000000..87dc1670b14d9a --- /dev/null +++ b/test/es-module/test-esm-wasm-non-identifier-exports.mjs @@ -0,0 +1,10 @@ +// Test that WASM modules can have non-identifier export names +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-non-identifier-exports.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-reject-wasm-export-names.mjs b/test/es-module/test-esm-wasm-reject-wasm-export-names.mjs new file mode 100644 index 00000000000000..710933922777bd --- /dev/null +++ b/test/es-module/test-esm-wasm-reject-wasm-export-names.mjs @@ -0,0 +1,10 @@ +// Test WASM module with invalid export name starting with 'wasm:' +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-reject-wasm-export-names.mjs')], + { status: 1, stderr: /Invalid Wasm export/ } +); diff --git a/test/es-module/test-esm-wasm-reject-wasm-import-names.mjs b/test/es-module/test-esm-wasm-reject-wasm-import-names.mjs new file mode 100644 index 00000000000000..0c977db2233e02 --- /dev/null +++ b/test/es-module/test-esm-wasm-reject-wasm-import-names.mjs @@ -0,0 +1,10 @@ +// Test WASM module with invalid import name starting with 'wasm:' +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-reject-wasm-import-names.mjs')], + { status: 1, stderr: /Invalid Wasm import name/ } +); diff --git a/test/es-module/test-esm-wasm-reject-wasm-js-export-names.mjs b/test/es-module/test-esm-wasm-reject-wasm-js-export-names.mjs new file mode 100644 index 00000000000000..40af037ab67881 --- /dev/null +++ b/test/es-module/test-esm-wasm-reject-wasm-js-export-names.mjs @@ -0,0 +1,10 @@ +// Test WASM module with invalid export name starting with 'wasm-js:' +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-reject-wasm-js-export-names.mjs')], + { status: 1, stderr: /Invalid Wasm export/ } +); diff --git a/test/es-module/test-esm-wasm-reject-wasm-js-import-module.mjs b/test/es-module/test-esm-wasm-reject-wasm-js-import-module.mjs new file mode 100644 index 00000000000000..e85d86c6654261 --- /dev/null +++ b/test/es-module/test-esm-wasm-reject-wasm-js-import-module.mjs @@ -0,0 +1,10 @@ +// Test WASM module with invalid import module name starting with 'wasm-js:' +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-reject-wasm-js-import-module.mjs')], + { status: 1, stderr: /Invalid Wasm import/ } +); diff --git a/test/es-module/test-esm-wasm-reject-wasm-js-import-names.mjs b/test/es-module/test-esm-wasm-reject-wasm-js-import-names.mjs new file mode 100644 index 00000000000000..14151c349a1b0b --- /dev/null +++ b/test/es-module/test-esm-wasm-reject-wasm-js-import-names.mjs @@ -0,0 +1,10 @@ +// Test WASM module with invalid import name starting with 'wasm-js:' +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-reject-wasm-js-import-names.mjs')], + { status: 1, stderr: /Invalid Wasm import name/ } +); diff --git a/test/es-module/test-esm-wasm-source-phase-dynamic.mjs b/test/es-module/test-esm-wasm-source-phase-dynamic.mjs new file mode 100644 index 00000000000000..eb223d8e96e643 --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-dynamic.mjs @@ -0,0 +1,10 @@ +// Test that dynamic source phase imports are supported +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-dynamic.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-source-phase-no-execute-dynamic.mjs b/test/es-module/test-esm-wasm-source-phase-no-execute-dynamic.mjs new file mode 100644 index 00000000000000..77a0eb914bebfe --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-no-execute-dynamic.mjs @@ -0,0 +1,10 @@ +// Test that dynamic source phase imports don't execute +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-no-execute-dynamic.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-source-phase-no-execute.mjs b/test/es-module/test-esm-wasm-source-phase-no-execute.mjs new file mode 100644 index 00000000000000..26bcefccbacb49 --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-no-execute.mjs @@ -0,0 +1,10 @@ +// Test that source phase imports don't execute +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-no-execute.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-source-phase-not-defined-dynamic.mjs b/test/es-module/test-esm-wasm-source-phase-not-defined-dynamic.mjs new file mode 100644 index 00000000000000..8e78a6f4837363 --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-not-defined-dynamic.mjs @@ -0,0 +1,10 @@ +// Test that error is thrown for dynamic source phase imports not defined +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-not-defined-dynamic.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-source-phase-not-defined-static.mjs b/test/es-module/test-esm-wasm-source-phase-not-defined-static.mjs new file mode 100644 index 00000000000000..a53ea04194f149 --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-not-defined-static.mjs @@ -0,0 +1,19 @@ +// Test that error is thrown for static source phase imports not defined +import '../common/index.mjs'; +import assert from 'node:assert'; + +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +const fileUrl = fixtures.fileURL('es-modules/wasm-source-phase.js').href; +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-not-defined-static.mjs')], + { + status: 1, + stderr(output) { + assert.match(output, /Source phase import object is not defined for module/); + assert(output.includes(fileUrl)); + } + } +); diff --git a/test/es-module/test-esm-wasm-source-phase-static.mjs b/test/es-module/test-esm-wasm-source-phase-static.mjs new file mode 100644 index 00000000000000..c0cc1eeb698df3 --- /dev/null +++ b/test/es-module/test-esm-wasm-source-phase-static.mjs @@ -0,0 +1,10 @@ +// Test that static source phase imports are supported +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/test-wasm-source-phase-static.mjs')], + { stdout: '', stderr: '', trim: true } +); diff --git a/test/es-module/test-esm-wasm-top-level-execution.mjs b/test/es-module/test-esm-wasm-top-level-execution.mjs new file mode 100644 index 00000000000000..99ce94e00c5350 --- /dev/null +++ b/test/es-module/test-esm-wasm-top-level-execution.mjs @@ -0,0 +1,14 @@ +// Test that WASM modules support top-level execution +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', fixtures.path('es-modules/top-level-wasm.wasm')], + { + stdout: '[Object: null prototype] { prop: \'hello world\' }', + stderr: '', + trim: true + } +); diff --git a/test/es-module/test-esm-wasm-vm-source-phase-dynamic.mjs b/test/es-module/test-esm-wasm-vm-source-phase-dynamic.mjs new file mode 100644 index 00000000000000..fd43d9638abcca --- /dev/null +++ b/test/es-module/test-esm-wasm-vm-source-phase-dynamic.mjs @@ -0,0 +1,10 @@ +// Test that error is thrown for vm source phase dynamic import +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', '--experimental-vm-modules', fixtures.path('es-modules/test-wasm-vm-source-phase-dynamic.mjs')], + { status: 1, stderr: /Source phase import object is not defined for module/ } +); diff --git a/test/es-module/test-esm-wasm-vm-source-phase-static.mjs b/test/es-module/test-esm-wasm-vm-source-phase-static.mjs new file mode 100644 index 00000000000000..648ad15bd446d3 --- /dev/null +++ b/test/es-module/test-esm-wasm-vm-source-phase-static.mjs @@ -0,0 +1,10 @@ +// Test that error is thrown for vm source phase static import +import '../common/index.mjs'; +import { spawnSyncAndAssert } from '../common/child_process.js'; +import * as fixtures from '../common/fixtures.js'; + +spawnSyncAndAssert( + process.execPath, + ['--no-warnings', '--experimental-vm-modules', fixtures.path('es-modules/test-wasm-vm-source-phase-static.mjs')], + { status: 1, stderr: /Source phase import object is not defined for module/ } +); diff --git a/test/es-module/test-esm-wasm.mjs b/test/es-module/test-esm-wasm.mjs deleted file mode 100644 index 5f3632c8390d22..00000000000000 --- a/test/es-module/test-esm-wasm.mjs +++ /dev/null @@ -1,476 +0,0 @@ -import { spawnPromisified } from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import { ok, strictEqual, notStrictEqual, match } from 'node:assert'; -import { execPath } from 'node:process'; -import { describe, it } from 'node:test'; - - -describe('ESM: WASM modules', { concurrency: !process.env.TEST_PARALLEL }, () => { - it('should load exports', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual, match } from "node:assert";', - `import { add, addImported } from ${JSON.stringify(fixtures.fileURL('es-modules/simple.wasm'))};`, - `import { state } from ${JSON.stringify(fixtures.fileURL('es-modules/wasm-dep.mjs'))};`, - 'strictEqual(state, "WASM Start Executed");', - 'strictEqual(add(10, 20), 30);', - 'strictEqual(addImported(0), 42);', - 'strictEqual(state, "WASM JS Function Executed");', - 'strictEqual(addImported(1), 43);', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should not allow code injection through export names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/export-name-code-injection.wasm'))};`, - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should allow non-identifier export names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/export-name-syntax-error.wasm'))};`, - 'assert.strictEqual(wasmExports["?f!o:oa[r]"], 12682);', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should properly handle all WebAssembly global types', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual, deepStrictEqual, ok } from "node:assert";', - - // WASM SIMD is not supported on older architectures such as IBM Power8 - 'let wasmExports;', - 'try {', - ` wasmExports = await import(${JSON.stringify(fixtures.fileURL('es-modules/globals.wasm'))});`, - '} catch (e) {', - ' ok(e instanceof WebAssembly.CompileError);', - ' ok(e.message.includes("SIMD unsupported"));', - '}', - - 'if (wasmExports) {', - - // Test imported globals using direct access - ' strictEqual(wasmExports.importedI32, 42);', - ' strictEqual(wasmExports.importedMutI32, 100);', - ' strictEqual(wasmExports.importedI64, 9223372036854775807n);', - ' strictEqual(wasmExports.importedMutI64, 200n);', - ' strictEqual(Math.round(wasmExports.importedF32 * 100000) / 100000, 3.14159);', - ' strictEqual(Math.round(wasmExports.importedMutF32 * 100000) / 100000, 2.71828);', - ' strictEqual(wasmExports.importedF64, 3.141592653589793);', - ' strictEqual(wasmExports.importedMutF64, 2.718281828459045);', - ' strictEqual(wasmExports.importedExternref !== null, true);', - ' strictEqual(wasmExports.importedMutExternref !== null, true);', - ' strictEqual(wasmExports.importedNullExternref, null);', - - // Test local globals exported directly - ' strictEqual(wasmExports[\'🚀localI32\'], 42);', - ' strictEqual(wasmExports.localMutI32, 100);', - ' strictEqual(wasmExports.localI64, 9223372036854775807n);', - ' strictEqual(wasmExports.localMutI64, 200n);', - ' strictEqual(Math.round(wasmExports.localF32 * 100000) / 100000, 3.14159);', - ' strictEqual(Math.round(wasmExports.localMutF32 * 100000) / 100000, 2.71828);', - ' strictEqual(wasmExports.localF64, 2.718281828459045);', - ' strictEqual(wasmExports.localMutF64, 3.141592653589793);', - - // Test imported globals using getter functions - ' strictEqual(wasmExports.getImportedMutI32(), 100);', - ' strictEqual(wasmExports.getImportedMutI64(), 200n);', - ' strictEqual(Math.round(wasmExports.getImportedMutF32() * 100000) / 100000, 2.71828);', - ' strictEqual(wasmExports.getImportedMutF64(), 2.718281828459045);', - ' strictEqual(wasmExports.getImportedMutExternref() !== null, true);', - - // Test local globals using getter functions - ' strictEqual(wasmExports.getLocalMutI32(), 100);', - ' strictEqual(wasmExports.getLocalMutI64(), 200n);', - ' strictEqual(Math.round(wasmExports.getLocalMutF32() * 100000) / 100000, 2.71828);', - ' strictEqual(wasmExports.getLocalMutF64(), 3.141592653589793);', - ' strictEqual(wasmExports.getLocalMutExternref(), null);', - - ' assert.throws(wasmExports.getLocalMutV128);', - - // Pending TDZ support - ' strictEqual(wasmExports.depV128, undefined);', - - // Test modifying mutable globals and reading the new values - ' wasmExports.setImportedMutI32(999);', - ' strictEqual(wasmExports.getImportedMutI32(), 999);', - - ' wasmExports.setImportedMutI64(888n);', - ' strictEqual(wasmExports.getImportedMutI64(), 888n);', - - ' wasmExports.setImportedMutF32(7.77);', - ' strictEqual(Math.round(wasmExports.getImportedMutF32() * 100) / 100, 7.77);', - - ' wasmExports.setImportedMutF64(6.66);', - ' strictEqual(wasmExports.getImportedMutF64(), 6.66);', - - // Test modifying mutable externref - ' const testObj = { test: "object" };', - ' wasmExports.setImportedMutExternref(testObj);', - ' strictEqual(wasmExports.getImportedMutExternref(), testObj);', - - // Test modifying local mutable globals - ' wasmExports.setLocalMutI32(555);', - ' strictEqual(wasmExports.getLocalMutI32(), 555);', - - ' wasmExports.setLocalMutI64(444n);', - ' strictEqual(wasmExports.getLocalMutI64(), 444n);', - - ' wasmExports.setLocalMutF32(3.33);', - ' strictEqual(Math.round(wasmExports.getLocalMutF32() * 100) / 100, 3.33);', - - ' wasmExports.setLocalMutF64(2.22);', - ' strictEqual(wasmExports.getLocalMutF64(), 2.22);', - - // These mutating pending live bindings support - ' strictEqual(wasmExports.localMutI32, 100);', - ' strictEqual(wasmExports.localMutI64, 200n);', - ' strictEqual(Math.round(wasmExports.localMutF32 * 100) / 100, 2.72);', - ' strictEqual(wasmExports.localMutF64, 3.141592653589793);', - - // Test modifying local mutable externref - ' const anotherTestObj = { another: "test object" };', - ' wasmExports.setLocalMutExternref(anotherTestObj);', - ' strictEqual(wasmExports.getLocalMutExternref(), anotherTestObj);', - ' strictEqual(wasmExports.localMutExternref, null);', - - // Test dep.wasm imports - ' strictEqual(wasmExports.depI32, 1001);', - ' strictEqual(wasmExports.depMutI32, 2001);', - ' strictEqual(wasmExports.getDepMutI32(), 2001);', - ' strictEqual(wasmExports.depI64, 10000000001n);', - ' strictEqual(wasmExports.depMutI64, 20000000001n);', - ' strictEqual(wasmExports.getDepMutI64(), 20000000001n);', - ' strictEqual(Math.round(wasmExports.depF32 * 100) / 100, 10.01);', - ' strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01);', - ' strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 20.01);', - ' strictEqual(wasmExports.depF64, 100.0001);', - ' strictEqual(wasmExports.depMutF64, 200.0001);', - ' strictEqual(wasmExports.getDepMutF64(), 200.0001);', - - // Test modifying dep.wasm mutable globals - ' wasmExports.setDepMutI32(3001);', - ' strictEqual(wasmExports.getDepMutI32(), 3001);', - - ' wasmExports.setDepMutI64(30000000001n);', - ' strictEqual(wasmExports.getDepMutI64(), 30000000001n);', - - ' wasmExports.setDepMutF32(30.01);', - ' strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 30.01);', - - ' wasmExports.setDepMutF64(300.0001);', - ' strictEqual(wasmExports.getDepMutF64(), 300.0001);', - - // These pending live bindings support - ' strictEqual(wasmExports.depMutI32, 2001);', - ' strictEqual(wasmExports.depMutI64, 20000000001n);', - ' strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01);', - ' strictEqual(wasmExports.depMutF64, 200.0001);', - - '}', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should properly escape import names as well', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/import-name.wasm'))};`, - 'assert.strictEqual(wasmExports.xor(), 12345);', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should emit experimental warning for module instances', async () => { - const { code, signal, stderr } = await spawnPromisified(execPath, [ - fixtures.path('es-modules/wasm-modules.mjs'), - ]); - - strictEqual(code, 0); - strictEqual(signal, null); - match(stderr, /ExperimentalWarning/); - match(stderr, /Importing WebAssembly module instances/); - }); - - it('should support top-level execution', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - fixtures.path('es-modules/top-level-wasm.wasm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, '[Object: null prototype] { prop: \'hello world\' }\n'); - strictEqual(code, 0); - }); - - it('should support static source phase imports', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/wasm-source-phase.js'))};`, - 'strictEqual(wasmExports.mod instanceof WebAssembly.Module, true);', - 'const AbstractModuleSourceProto = Object.getPrototypeOf(Object.getPrototypeOf(wasmExports.mod));', - 'const toStringTag = Object.getOwnPropertyDescriptor(AbstractModuleSourceProto, Symbol.toStringTag).get;', - 'strictEqual(toStringTag.call(wasmExports.mod), "WebAssembly.Module");', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should support dynamic source phase imports', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/wasm-source-phase.js'))};`, - 'strictEqual(wasmExports.mod instanceof WebAssembly.Module, true);', - 'strictEqual(await wasmExports.dyn("./simple.wasm") instanceof WebAssembly.Module, true);', - 'const AbstractModuleSourceProto = Object.getPrototypeOf(Object.getPrototypeOf(wasmExports.mod));', - 'const toStringTag = Object.getOwnPropertyDescriptor(AbstractModuleSourceProto, Symbol.toStringTag).get;', - 'strictEqual(toStringTag.call(wasmExports.mod), "WebAssembly.Module");', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should not execute source phase imports', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import source mod from ${JSON.stringify(fixtures.fileURL('es-modules/unimportable.wasm'))};`, - 'assert.strictEqual(mod instanceof WebAssembly.Module, true);', - `await assert.rejects(import(${JSON.stringify(fixtures.fileURL('es-modules/unimportable.wasm'))}));`, - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should not execute dynamic source phase imports', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `await import.source(${JSON.stringify(fixtures.fileURL('es-modules/unimportable.wasm'))})`, - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should throw for dynamic source phase imports not defined', async () => { - const fileUrl = fixtures.fileURL('es-modules/wasm-source-phase.js'); - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { ok, strictEqual } from "node:assert";', - `await assert.rejects(import.source(${JSON.stringify(fileUrl)}), (e) => {`, - ' strictEqual(e instanceof SyntaxError, true);', - ' strictEqual(e.message.includes("Source phase import object is not defined for module"), true);', - ` strictEqual(e.message.includes(${JSON.stringify(fileUrl)}), true);`, - ` return true`, - '});', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); - - it('should throw for static source phase imports not defined', async () => { - const fileUrl = fixtures.fileURL('es-modules/wasm-source-phase.js'); - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import source nosource from ${JSON.stringify(fileUrl)};`, - ]); - match(stderr, /Source phase import object is not defined for module/); - ok(stderr.includes(fileUrl)); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should throw for vm source phase static import', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--experimental-vm-modules', - '--input-type=module', - '--eval', - [ - 'const m1 = new vm.SourceTextModule("import source x from \\"y\\";");', - 'const m2 = new vm.SourceTextModule("export var p = 5;");', - 'await m1.link(() => m2);', - 'await m1.evaluate();', - ].join('\n'), - ]); - match(stderr, /Source phase import object is not defined for module/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should throw for vm source phase dynamic import', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--experimental-vm-modules', - '--input-type=module', - '--eval', - [ - 'import { constants } from "node:vm";', - 'const opts = { importModuleDynamically: () => m2 };', - 'const m1 = new vm.SourceTextModule("await import.source(\\"y\\");", opts);', - 'const m2 = new vm.SourceTextModule("export var p = 5;");', - 'await m1.link(() => m2);', - 'await m1.evaluate();', - ].join('\n'), - ]); - match(stderr, /Source phase import object is not defined for module/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should reject wasm: import names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import(${JSON.stringify(fixtures.fileURL('es-modules/invalid-import-name.wasm'))})`, - ]); - - match(stderr, /Invalid Wasm import name/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should reject wasm-js: import names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import(${JSON.stringify(fixtures.fileURL('es-modules/invalid-import-name-wasm-js.wasm'))})`, - ]); - - match(stderr, /Invalid Wasm import name/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should reject wasm-js: import module names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import(${JSON.stringify(fixtures.fileURL('es-modules/invalid-import-module.wasm'))})`, - ]); - - match(stderr, /Invalid Wasm import/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should reject wasm: export names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import(${JSON.stringify(fixtures.fileURL('es-modules/invalid-export-name.wasm'))})`, - ]); - - match(stderr, /Invalid Wasm export/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should reject wasm-js: export names', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - `import(${JSON.stringify(fixtures.fileURL('es-modules/invalid-export-name-wasm-js.wasm'))})`, - ]); - - match(stderr, /Invalid Wasm export/); - strictEqual(stdout, ''); - notStrictEqual(code, 0); - }); - - it('should support js-string builtins', async () => { - const { code, stderr, stdout } = await spawnPromisified(execPath, [ - '--no-warnings', - '--input-type=module', - '--eval', - [ - 'import { strictEqual } from "node:assert";', - `import * as wasmExports from ${JSON.stringify(fixtures.fileURL('es-modules/js-string-builtins.wasm'))};`, - 'strictEqual(wasmExports.getLength("hello"), 5);', - 'strictEqual(wasmExports.concatStrings("hello", " world"), "hello world");', - 'strictEqual(wasmExports.compareStrings("test", "test"), 1);', - 'strictEqual(wasmExports.compareStrings("test", "different"), 0);', - ].join('\n'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - }); -}); diff --git a/test/es-module/test-typescript-commonjs.mjs b/test/es-module/test-typescript-commonjs.mjs index 548f440e59b5aa..bcbd275d59554e 100644 --- a/test/es-module/test-typescript-commonjs.mjs +++ b/test/es-module/test-typescript-commonjs.mjs @@ -1,6 +1,6 @@ import { skip, spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; -import assert, { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { test } from 'node:test'; if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); @@ -14,9 +14,9 @@ test('require a .ts file with explicit extension succeeds', async () => { cwd: fixtures.path('typescript/ts'), }); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello, TypeScript!\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello, TypeScript!\n'); + assert.strictEqual(result.code, 0); }); test('eval require a .ts file with implicit extension fails', async () => { @@ -28,9 +28,9 @@ test('eval require a .ts file with implicit extension fails', async () => { cwd: fixtures.path('typescript/ts'), }); - strictEqual(result.stdout, ''); - match(result.stderr, /Error: Cannot find module/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Error: Cannot find module/); + assert.strictEqual(result.code, 1); }); test('eval require a .cts file with implicit extension fails', async () => { @@ -42,9 +42,9 @@ test('eval require a .cts file with implicit extension fails', async () => { cwd: fixtures.path('typescript/ts'), }); - strictEqual(result.stdout, ''); - match(result.stderr, /Error: Cannot find module/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Error: Cannot find module/); + assert.strictEqual(result.code, 1); }); test('require a .ts file with implicit extension fails', async () => { @@ -53,9 +53,9 @@ test('require a .ts file with implicit extension fails', async () => { fixtures.path('typescript/cts/test-extensionless-require.ts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /Error: Cannot find module/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Error: Cannot find module/); + assert.strictEqual(result.code, 1); }); test('expect failure of an .mts file with CommonJS syntax', async () => { @@ -96,9 +96,9 @@ test('execute a .cts file importing a .cts file', async () => { fixtures.path('typescript/cts/test-require-commonjs.cts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a .cts file importing a .ts file export', async () => { @@ -107,9 +107,9 @@ test('execute a .cts file importing a .ts file export', async () => { fixtures.path('typescript/cts/test-require-ts-file.cts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a .cts file importing a .mts file export', async () => { @@ -118,9 +118,9 @@ test('execute a .cts file importing a .mts file export', async () => { fixtures.path('typescript/cts/test-require-mts-module.cts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /Error \[ERR_REQUIRE_ESM\]: require\(\) of ES Module/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Error \[ERR_REQUIRE_ESM\]: require\(\) of ES Module/); + assert.strictEqual(result.code, 1); }); test('execute a .cts file importing a .mts file export', async () => { @@ -129,8 +129,8 @@ test('execute a .cts file importing a .mts file export', async () => { fixtures.path('typescript/cts/test-require-mts-module.cts'), ]); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('expect failure of a .cts file in node_modules', async () => { @@ -138,9 +138,9 @@ test('expect failure of a .cts file in node_modules', async () => { fixtures.path('typescript/cts/test-cts-node_modules.cts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.code, 1); }); test('expect failure of a .ts file in node_modules', async () => { @@ -148,9 +148,9 @@ test('expect failure of a .ts file in node_modules', async () => { fixtures.path('typescript/cts/test-ts-node_modules.cts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.code, 1); }); test('expect failure of a .cts requiring esm without default type module', async () => { @@ -159,9 +159,9 @@ test('expect failure of a .cts requiring esm without default type module', async fixtures.path('typescript/cts/test-mts-node_modules.cts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_REQUIRE_ESM/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_REQUIRE_ESM/); + assert.strictEqual(result.code, 1); }); test('expect failure of a .cts file requiring esm in node_modules', async () => { @@ -170,9 +170,9 @@ test('expect failure of a .cts file requiring esm in node_modules', async () => fixtures.path('typescript/cts/test-mts-node_modules.cts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.code, 1); }); test('cts -> require mts -> import cts', async () => { @@ -180,7 +180,7 @@ test('cts -> require mts -> import cts', async () => { fixtures.path('typescript/cts/issue-59963/a.cts'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello from c.cts\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello from c.cts\n'); + assert.strictEqual(result.code, 0); }); diff --git a/test/es-module/test-typescript-eval.mjs b/test/es-module/test-typescript-eval.mjs index 72ad8dfaaf2f45..24a80e4d210700 100644 --- a/test/es-module/test-typescript-eval.mjs +++ b/test/es-module/test-typescript-eval.mjs @@ -1,5 +1,5 @@ import { skip, spawnPromisified } from '../common/index.mjs'; -import { doesNotMatch, match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { test } from 'node:test'; if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); @@ -11,9 +11,9 @@ test('eval TypeScript ESM syntax', async () => { const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('eval TypeScript ESM syntax with input-type module', async () => { @@ -24,9 +24,9 @@ test('eval TypeScript ESM syntax with input-type module', async () => { const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('eval TypeScript CommonJS syntax', async () => { @@ -35,9 +35,9 @@ test('eval TypeScript CommonJS syntax', async () => { `const util = require('node:util'); const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.stderr, ''); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.code, 0); }); test('eval TypeScript CommonJS syntax with input-type commonjs-typescript', async () => { @@ -48,9 +48,9 @@ test('eval TypeScript CommonJS syntax with input-type commonjs-typescript', asyn const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`, '--no-warnings']); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.stderr, ''); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.code, 0); }); test('eval TypeScript CommonJS syntax by default', async () => { @@ -61,9 +61,9 @@ test('eval TypeScript CommonJS syntax by default', async () => { console.log(util.styleText('red', text));`, '--no-warnings']); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('TypeScript ESM syntax not specified', async () => { @@ -72,9 +72,9 @@ test('TypeScript ESM syntax not specified', async () => { `import util from 'node:util' const text: string = 'Hello, TypeScript!' console.log(text);`]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('expect fail eval TypeScript CommonJS syntax with input-type module-typescript', async () => { @@ -85,9 +85,9 @@ test('expect fail eval TypeScript CommonJS syntax with input-type module-typescr const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - strictEqual(result.stdout, ''); - match(result.stderr, /require is not defined in ES module scope, you can use import instead/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /require is not defined in ES module scope, you can use import instead/); + assert.strictEqual(result.code, 1); }); test('expect fail eval TypeScript ESM syntax with input-type commonjs-typescript', async () => { @@ -97,19 +97,19 @@ test('expect fail eval TypeScript ESM syntax with input-type commonjs-typescript `import util from 'node:util' const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - strictEqual(result.stdout, ''); - match(result.stderr, /Cannot use import statement outside a module/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Cannot use import statement outside a module/); + assert.strictEqual(result.code, 1); }); test('check syntax error is thrown when passing unsupported syntax', async () => { const result = await spawnPromisified(process.execPath, [ '--eval', 'enum Foo { A, B, C }']); - strictEqual(result.stdout, ''); - match(result.stderr, /SyntaxError/); - doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /SyntaxError/); + assert.doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('check syntax error is thrown when passing unsupported syntax with --input-type=module-typescript', async () => { @@ -117,9 +117,9 @@ test('check syntax error is thrown when passing unsupported syntax with --input- '--input-type=module-typescript', '--eval', 'enum Foo { A, B, C }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('check syntax error is thrown when passing unsupported syntax with --input-type=commonjs-typescript', async () => { @@ -127,9 +127,9 @@ test('check syntax error is thrown when passing unsupported syntax with --input- '--input-type=commonjs-typescript', '--eval', 'enum Foo { A, B, C }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('should not parse TypeScript with --type-module=commonjs', async () => { @@ -138,10 +138,10 @@ test('should not parse TypeScript with --type-module=commonjs', async () => { '--eval', `enum Foo {}`]); - strictEqual(result.stdout, ''); - match(result.stderr, /SyntaxError/); - doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /SyntaxError/); + assert.doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('should not parse TypeScript with --type-module=module', async () => { @@ -150,10 +150,10 @@ test('should not parse TypeScript with --type-module=module', async () => { '--eval', `enum Foo {}`]); - strictEqual(result.stdout, ''); - match(result.stderr, /SyntaxError/); - doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /SyntaxError/); + assert.doesNotMatch(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('check warning is emitted when eval TypeScript CommonJS syntax', async () => { @@ -162,18 +162,18 @@ test('check warning is emitted when eval TypeScript CommonJS syntax', async () = `const util = require('node:util'); const text: string = 'Hello, TypeScript!' console.log(util.styleText('red', text));`]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('code is throwing a non Error is rethrown', async () => { const result = await spawnPromisified(process.execPath, [ '--eval', `throw null;`]); - doesNotMatch(result.stderr, /node:internal\/process\/execution/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.doesNotMatch(result.stderr, /node:internal\/process\/execution/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('code is throwing an error with customized accessors', async () => { @@ -181,10 +181,10 @@ test('code is throwing an error with customized accessors', async () => { '--eval', `throw Object.defineProperty(new Error, "stack", { set() {throw this} });`]); - match(result.stderr, /Error/); - match(result.stderr, /at \[eval\]:1:29/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /Error/); + assert.match(result.stderr, /at \[eval\]:1:29/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('typescript code is throwing an error', async () => { @@ -192,9 +192,9 @@ test('typescript code is throwing an error', async () => { '--eval', `const foo: string = 'Hello, TypeScript!'; throw new Error(foo);`]); - match(result.stderr, /Hello, TypeScript!/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /Hello, TypeScript!/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('typescript ESM code is throwing a syntax error at runtime', async () => { @@ -205,9 +205,9 @@ test('typescript ESM code is throwing a syntax error at runtime', async () => { // If evaluated in JavaScript `foo(1)` is evaluated as `foo < Number > (1)` // result in false // If evaluated in TypeScript `foo(1)` is evaluated as `foo(1)` - match(result.stderr, /SyntaxError: false/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /SyntaxError: false/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('typescript CJS code is throwing a syntax error at runtime', async () => { @@ -218,9 +218,9 @@ test('typescript CJS code is throwing a syntax error at runtime', async () => { // If evaluated in JavaScript `foo(1)` is evaluated as `foo < Number > (1)` // result in false // If evaluated in TypeScript `foo(1)` is evaluated as `foo(1)` - match(result.stderr, /SyntaxError: false/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /SyntaxError: false/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('check syntax error is thrown when passing invalid syntax with --input-type=commonjs-typescript', async () => { @@ -228,9 +228,9 @@ test('check syntax error is thrown when passing invalid syntax with --input-type '--input-type=commonjs-typescript', '--eval', 'function foo(){ await Promise.resolve(1); }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('check syntax error is thrown when passing invalid syntax with --input-type=module-typescript', async () => { @@ -238,9 +238,9 @@ test('check syntax error is thrown when passing invalid syntax with --input-type '--input-type=module-typescript', '--eval', 'function foo(){ await Promise.resolve(1); }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('should not allow module keyword', async () => { @@ -248,9 +248,9 @@ test('should not allow module keyword', async () => { '--input-type=module-typescript', '--eval', 'module F { export type x = number }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); test('should not allow declare module keyword', async () => { @@ -258,9 +258,9 @@ test('should not allow declare module keyword', async () => { '--input-type=module-typescript', '--eval', 'declare module F { export type x = number }']); - strictEqual(result.stdout, ''); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.code, 1); }); // TODO (marco-ippolito) Remove the extra padding from the error message @@ -270,13 +270,13 @@ test('the error message should not contain extra padding', async () => { '--input-type=module-typescript', '--eval', 'declare module F { export type x = number }']); - strictEqual(result.stdout, ''); + assert.strictEqual(result.stdout, ''); // Windows uses \r\n as line endings const lines = result.stderr.replace(/\r\n/g, '\n').split('\n'); - strictEqual(lines[0], '[eval]:1'); - strictEqual(lines[1], 'declare module F { export type x = number }'); - strictEqual(lines[2], ' ^^^^^^^^'); - strictEqual(lines[4], 'SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]:' + + assert.strictEqual(lines[0], '[eval]:1'); + assert.strictEqual(lines[1], 'declare module F { export type x = number }'); + assert.strictEqual(lines[2], ' ^^^^^^^^'); + assert.strictEqual(lines[4], 'SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]:' + ' `module` keyword is not supported. Use `namespace` instead.'); - strictEqual(result.code, 1); + assert.strictEqual(result.code, 1); }); diff --git a/test/es-module/test-typescript-module.mjs b/test/es-module/test-typescript-module.mjs index eab2fc620fd18e..010f42d825510b 100644 --- a/test/es-module/test-typescript-module.mjs +++ b/test/es-module/test-typescript-module.mjs @@ -1,6 +1,6 @@ import { skip, spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; -import { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { test } from 'node:test'; if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); @@ -10,9 +10,9 @@ test('expect failure of a .mts file with CommonJS syntax', async () => { fixtures.path('typescript/mts/test-mts-but-commonjs-syntax.mts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /require is not defined in ES module scope, you can use import instead/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /require is not defined in ES module scope, you can use import instead/); + assert.strictEqual(result.code, 1); }); test('execute an .mts file importing an .mts file', async () => { @@ -20,9 +20,9 @@ test('execute an .mts file importing an .mts file', async () => { fixtures.path('typescript/mts/test-import-module.mts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute an .mts file importing a .ts file', async () => { @@ -31,9 +31,9 @@ test('execute an .mts file importing a .ts file', async () => { fixtures.path('typescript/mts/test-import-ts-file.mts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute an .mts file importing a .cts file', async () => { @@ -42,9 +42,9 @@ test('execute an .mts file importing a .cts file', async () => { fixtures.path('typescript/mts/test-import-commonjs.mts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute an .mts file from node_modules', async () => { @@ -52,9 +52,9 @@ test('execute an .mts file from node_modules', async () => { fixtures.path('typescript/mts/test-mts-node_modules.mts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a .cts file from node_modules', async () => { @@ -62,9 +62,9 @@ test('execute a .cts file from node_modules', async () => { fixtures.path('typescript/mts/test-cts-node_modules.mts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a .ts file from node_modules', async () => { @@ -72,9 +72,9 @@ test('execute a .ts file from node_modules', async () => { fixtures.path('typescript/mts/test-ts-node_modules.mts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute an empty .ts file', async () => { @@ -83,9 +83,9 @@ test('execute an empty .ts file', async () => { fixtures.path('typescript/ts/test-empty-file.ts'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, ''); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 0); }); test('execute .ts file importing a module', async () => { @@ -94,9 +94,9 @@ test('execute .ts file importing a module', async () => { fixtures.path('typescript/ts/test-import-fs.ts'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello, TypeScript!\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello, TypeScript!\n'); + assert.strictEqual(result.code, 0); }); test('mts -> import cts -> require mts', async () => { @@ -105,7 +105,7 @@ test('mts -> import cts -> require mts', async () => { fixtures.path('typescript/mts/issue-59963/a.mts'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello from c.mts\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello from c.mts\n'); + assert.strictEqual(result.code, 0); }); diff --git a/test/es-module/test-typescript-transform.mjs b/test/es-module/test-typescript-transform.mjs index 1dcad6647b01ac..e8be43bbd4ccd5 100644 --- a/test/es-module/test-typescript-transform.mjs +++ b/test/es-module/test-typescript-transform.mjs @@ -1,6 +1,6 @@ import { skip, spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; -import { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { test } from 'node:test'; if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); @@ -12,9 +12,9 @@ test('execute a TypeScript file with transformation enabled', async () => { fixtures.path('typescript/ts/transformation/test-enum.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('reconstruct error of a TypeScript file with transformation enabled and sourcemaps', async () => { @@ -24,9 +24,9 @@ test('reconstruct error of a TypeScript file with transformation enabled and sou fixtures.path('typescript/ts/transformation/test-enum-stacktrace.ts'), ]); - match(result.stderr, /test-enum-stacktrace\.ts:4:7/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /test-enum-stacktrace\.ts:4:7/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('reconstruct error of a TypeScript file with transformation enabled without sourcemaps', async () => { @@ -36,9 +36,9 @@ test('reconstruct error of a TypeScript file with transformation enabled without '--no-warnings', fixtures.path('typescript/ts/transformation/test-enum-stacktrace.ts'), ]); - match(result.stderr, /test-enum-stacktrace\.ts:5:7/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /test-enum-stacktrace\.ts:5:7/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('should not elide unused imports', async () => { @@ -47,9 +47,9 @@ test('should not elide unused imports', async () => { '--no-warnings', fixtures.path('typescript/ts/transformation/test-unused-import.ts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_DIR_IMPORT/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_DIR_IMPORT/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with namespace', async () => { @@ -59,9 +59,9 @@ test('execute a TypeScript file with namespace', async () => { fixtures.path('typescript/ts/transformation/test-namespace.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); // Decorators are currently ignored by transpilation @@ -73,9 +73,9 @@ test('execute a TypeScript file with decorator', async () => { fixtures.path('typescript/ts/transformation/test-decorator.ts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /Invalid or unexpected token/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /Invalid or unexpected token/); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with legacy-module', async () => { @@ -85,10 +85,10 @@ test('execute a TypeScript file with legacy-module', async () => { fixtures.path('typescript/ts/transformation/test-legacy-module.ts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - match(result.stderr, /`module` keyword is not supported\. Use `namespace` instead/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.match(result.stderr, /`module` keyword is not supported\. Use `namespace` instead/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with modern typescript syntax', async () => { @@ -98,9 +98,9 @@ test('execute a TypeScript file with modern typescript syntax', async () => { fixtures.path('typescript/ts/transformation/test-modern-typescript.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a transpiled JavaScript file', async () => { @@ -110,10 +110,10 @@ test('execute a transpiled JavaScript file', async () => { fixtures.path('typescript/ts/transformation/test-transformed-typescript.js'), ]); - match(result.stderr, /Stacktrace at line 28/); - match(result.stderr, /test-failing-arm64\.js:28:7/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /Stacktrace at line 28/); + assert.match(result.stderr, /test-failing-arm64\.js:28:7/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute TypeScript file with import = require', async () => { @@ -123,7 +123,7 @@ test('execute TypeScript file with import = require', async () => { fixtures.path('typescript/cts/test-import-require.cts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); diff --git a/test/es-module/test-typescript.mjs b/test/es-module/test-typescript.mjs index 52d096b0e0b6fe..df25f60defd35b 100644 --- a/test/es-module/test-typescript.mjs +++ b/test/es-module/test-typescript.mjs @@ -1,6 +1,6 @@ import { skip, spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; -import { match, strictEqual } from 'node:assert'; +import assert from 'node:assert'; import { test } from 'node:test'; test('expect process.features.typescript to be false when --no-experimental-strip-types ', async () => { @@ -10,9 +10,9 @@ test('expect process.features.typescript to be false when --no-experimental-stri fixtures.path('typescript/echo-process-features-typescript.cjs'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'false\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'false\n'); + assert.strictEqual(result.code, 0); }); test('expect process.features.typescript to be \'transform\' when --experimental-transform-types', async () => { @@ -22,9 +22,9 @@ test('expect process.features.typescript to be \'transform\' when --experimental fixtures.path('typescript/echo-process-features-typescript.cjs'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, process.config.variables.node_use_amaro ? 'transform\n' : 'false\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, process.config.variables.node_use_amaro ? 'transform\n' : 'false\n'); + assert.strictEqual(result.code, 0); }); @@ -35,9 +35,9 @@ test('execute a TypeScript file', async () => { fixtures.path('typescript/ts/test-typescript.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with imports', async () => { @@ -46,9 +46,9 @@ test('execute a TypeScript file with imports', async () => { fixtures.path('typescript/ts/test-import-foo.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with imports', async () => { @@ -58,9 +58,9 @@ test('execute a TypeScript file with imports', async () => { `require(${JSON.stringify(fixtures.path('typescript/ts/test-import-fs.ts'))})`, ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with node_modules', async () => { @@ -69,9 +69,9 @@ test('execute a TypeScript file with node_modules', async () => { fixtures.path('typescript/ts/test-typescript-node-modules.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('expect error when executing a TypeScript file with imports with no extensions', async () => { @@ -79,9 +79,9 @@ test('expect error when executing a TypeScript file with imports with no extensi fixtures.path('typescript/ts/test-import-no-extension.ts'), ]); - match(result.stderr, /Error \[ERR_MODULE_NOT_FOUND\]:/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /Error \[ERR_MODULE_NOT_FOUND\]:/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('expect error when executing a TypeScript file with enum', async () => { @@ -90,9 +90,9 @@ test('expect error when executing a TypeScript file with enum', async () => { ]); // This error should be thrown during transformation - match(result.stderr, /TypeScript enum is not supported in strip-only mode/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /TypeScript enum is not supported in strip-only mode/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('expect error when executing a TypeScript file with experimental decorators', async () => { @@ -100,9 +100,9 @@ test('expect error when executing a TypeScript file with experimental decorators fixtures.path('typescript/ts/test-experimental-decorators.ts'), ]); // This error should be thrown at runtime - match(result.stderr, /Invalid or unexpected token/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /Invalid or unexpected token/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('expect error when executing a TypeScript file with namespaces', async () => { @@ -110,9 +110,9 @@ test('expect error when executing a TypeScript file with namespaces', async () = fixtures.path('typescript/ts/test-namespaces.ts'), ]); // This error should be thrown during transformation - match(result.stderr, /TypeScript namespace declaration is not supported in strip-only mode/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /TypeScript namespace declaration is not supported in strip-only mode/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with type definition', async () => { @@ -121,9 +121,9 @@ test('execute a TypeScript file with type definition', async () => { fixtures.path('typescript/ts/test-import-types.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with type definition but no type keyword', async () => { @@ -131,9 +131,9 @@ test('execute a TypeScript file with type definition but no type keyword', async fixtures.path('typescript/ts/test-import-no-type-keyword.ts'), ]); - match(result.stderr, /does not provide an export named 'MyType'/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /does not provide an export named 'MyType'/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with CommonJS syntax', async () => { @@ -141,9 +141,9 @@ test('execute a TypeScript file with CommonJS syntax', async () => { '--no-warnings', fixtures.path('typescript/ts/test-commonjs-parsing.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with ES module syntax', async () => { @@ -152,9 +152,9 @@ test('execute a TypeScript file with ES module syntax', async () => { fixtures.path('typescript/ts/test-module-typescript.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('expect failure of a TypeScript file requiring ES module syntax', async () => { @@ -163,8 +163,8 @@ test('expect failure of a TypeScript file requiring ES module syntax', async () fixtures.path('typescript/ts/test-require-module.ts'), ]); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('expect stack trace of a TypeScript file to be correct', async () => { @@ -172,9 +172,9 @@ test('expect stack trace of a TypeScript file to be correct', async () => { fixtures.path('typescript/ts/test-whitespacing.ts'), ]); - strictEqual(result.stdout, ''); - match(result.stderr, /test-whitespacing\.ts:5:7/); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.match(result.stderr, /test-whitespacing\.ts:5:7/); + assert.strictEqual(result.code, 1); }); test('execute CommonJS TypeScript file from node_modules with require-module', async () => { @@ -182,9 +182,9 @@ test('execute CommonJS TypeScript file from node_modules with require-module', a fixtures.path('typescript/ts/test-import-ts-node-modules.ts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript file with CommonJS syntax requiring .cts', async () => { @@ -193,9 +193,9 @@ test('execute a TypeScript file with CommonJS syntax requiring .cts', async () = fixtures.path('typescript/ts/test-require-cts.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with CommonJS syntax requiring .mts', async () => { @@ -203,8 +203,8 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts', async () = fixtures.path('typescript/ts/test-require-mts.ts'), ]); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with CommonJS syntax requiring .mts using require-module', async () => { @@ -213,8 +213,8 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts using requir fixtures.path('typescript/ts/test-require-mts.ts'), ]); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with CommonJS syntax requiring .cts using commonjs', async () => { @@ -223,9 +223,9 @@ test('execute a TypeScript file with CommonJS syntax requiring .cts using common fixtures.path('typescript/ts/test-require-cts.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript file with CommonJS syntax requiring .mts with require-module', @@ -235,9 +235,9 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts with require fixtures.path('typescript/ts/test-require-cts.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a JavaScript file importing a cjs TypeScript file', async () => { @@ -245,9 +245,9 @@ test('execute a JavaScript file importing a cjs TypeScript file', async () => { '--no-warnings', fixtures.path('typescript/ts/issue-54457.mjs'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript test mocking module', async () => { @@ -257,14 +257,14 @@ test('execute a TypeScript test mocking module', async () => { '--no-warnings', fixtures.path('typescript/ts/test-mock-module.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript-Module!/); - match(result.stdout, /Hello, TypeScript-CommonJS!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript-Module!/); + assert.match(result.stdout, /Hello, TypeScript-CommonJS!/); + assert.strictEqual(result.code, 0); }); test('expect process.features.typescript to be strip', async () => { - strictEqual(process.features.typescript, 'strip'); + assert.strictEqual(process.features.typescript, 'strip'); }); test('execute a TypeScript file with union types', async () => { @@ -273,15 +273,15 @@ test('execute a TypeScript file with union types', async () => { fixtures.path('typescript/ts/test-union-types.ts'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, - '{' + - " name: 'Hello, TypeScript!' }\n" + - '{ role: \'admin\', permission: \'all\' }\n' + - '{\n foo: \'Testing Partial Type\',\n bar: 42,\n' + - ' zoo: true,\n metadata: undefined\n' + - '}\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, + '{' + + " name: 'Hello, TypeScript!' }\n" + + '{ role: \'admin\', permission: \'all\' }\n' + + '{\n foo: \'Testing Partial Type\',\n bar: 42,\n' + + ' zoo: true,\n metadata: undefined\n' + + '}\n'); + assert.strictEqual(result.code, 0); }); test('expect error when executing a TypeScript file with generics', async () => { @@ -290,12 +290,12 @@ test('expect error when executing a TypeScript file with generics', async () => ]); // This error should be thrown during transformation - match( + assert.match( result.stderr, /TypeScript parameter property is not supported in strip-only mode/ ); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('execute a TypeScript loader and a .ts file', async () => { @@ -305,9 +305,9 @@ test('execute a TypeScript loader and a .ts file', async () => { fixtures.fileURL('typescript/ts/test-loader.ts'), fixtures.path('typescript/ts/test-typescript.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute a TypeScript loader and a .js file', async () => { @@ -317,9 +317,9 @@ test('execute a TypeScript loader and a .js file', async () => { fixtures.fileURL('typescript/ts/test-loader.ts'), fixtures.path('typescript/ts/test-simple.js'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('execute invalid TypeScript syntax', async () => { @@ -327,9 +327,9 @@ test('execute invalid TypeScript syntax', async () => { fixtures.path('typescript/ts/test-invalid-syntax.ts'), ]); - match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('check transform types warning', async () => { @@ -338,7 +338,7 @@ test('check transform types warning', async () => { fixtures.path('typescript/ts/test-typescript.ts'), ]); - match(result.stderr, /Transform Types is an experimental feature and might change at any time/); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stderr, /Transform Types is an experimental feature and might change at any time/); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); diff --git a/test/es-module/test-wasm-web-api.js b/test/es-module/test-wasm-web-api.js index 879748e4403b07..a6943254d88d83 100644 --- a/test/es-module/test-wasm-web-api.js +++ b/test/es-module/test-wasm-web-api.js @@ -45,17 +45,17 @@ function testCompileStreaming(makeResponsePromise, checkResult) { } function testCompileStreamingSuccess(makeResponsePromise) { - return testCompileStreaming(makeResponsePromise, async (modPromise) => { + return testCompileStreaming(makeResponsePromise, common.mustCall(async (modPromise) => { const mod = await modPromise; assert.strictEqual(mod.constructor, WebAssembly.Module); - }); + }, 2)); } function testCompileStreamingRejection(makeResponsePromise, rejection) { - return testCompileStreaming(makeResponsePromise, (modPromise) => { + return testCompileStreaming(makeResponsePromise, common.mustCall((modPromise) => { assert.strictEqual(modPromise.constructor, Promise); return assert.rejects(modPromise, rejection); - }); + }, 2)); } function testCompileStreamingSuccessUsingFetch(responseCallback) { @@ -70,13 +70,13 @@ function testCompileStreamingRejectionUsingFetch(responseCallback, rejection) { (async () => { // A non-Response should cause a TypeError. for (const invalid of [undefined, null, 0, true, 'foo', {}, [], Symbol()]) { - await withPromiseAndResolved(() => Promise.resolve(invalid), (arg) => { + await withPromiseAndResolved(() => Promise.resolve(invalid), common.mustCall((arg) => { return assert.rejects(() => WebAssembly.compileStreaming(arg), { name: 'TypeError', code: 'ERR_INVALID_ARG_TYPE', message: /^The "source" argument .*$/ }); - }); + }, 2)); } // When given a Promise, any rejection should be propagated as-is. @@ -120,7 +120,7 @@ function testCompileStreamingRejectionUsingFetch(responseCallback, rejection) { // the same WebAssembly file as in the previous test but insert useless custom // sections into the WebAssembly module to increase the file size without // changing the relevant contents. - await testCompileStreamingSuccessUsingFetch((res) => { + await testCompileStreamingSuccessUsingFetch(common.mustCall((res) => { res.setHeader('Content-Type', 'application/wasm'); // Send the WebAssembly magic and version first. @@ -150,7 +150,7 @@ function testCompileStreamingRejectionUsingFetch(responseCallback, rejection) { res.end(simpleWasmBytes.slice(8)); } })(0); - }); + }, 2)); // A valid WebAssembly file with an empty parameter in the (otherwise valid) // MIME type. @@ -233,7 +233,7 @@ function testCompileStreamingRejectionUsingFetch(responseCallback, rejection) { // which only contains an 'unreachable' instruction. res.setHeader('Content-Type', 'application/wasm'); res.end(fixtures.readSync('crash.wasm')); - }), async (modPromise) => { + }), common.mustCall(async (modPromise) => { // Call the WebAssembly function and check that the error stack contains the // correct "WebAssembly location" as per the specification. const mod = await modPromise; @@ -245,5 +245,5 @@ function testCompileStreamingRejectionUsingFetch(responseCallback, rejection) { /^\s*at http:\/\/127\.0\.0\.1:\d+\/foo\.wasm:wasm-function\[0\]:0x22$/); return true; }); - }); + }, 2)); })().then(common.mustCall()); diff --git a/test/eslint.config_partial.mjs b/test/eslint.config_partial.mjs index 915a8b97b347ef..85a80ef67f1da6 100644 --- a/test/eslint.config_partial.mjs +++ b/test/eslint.config_partial.mjs @@ -156,7 +156,49 @@ export default [ }, { files: [ - 'test/{async-hooks,benchmark,cctest,client-proxy,message,module-hooks,node-api,pummel,pseudo-tty,v8-updates,wasi}/**/*.{js,mjs,cjs}', + `test/{${[ + 'abort', + 'addons', + 'async-hooks', + 'benchmark', + 'cctest', + 'client-proxy', + 'doctool', + 'embedding', + 'es-module', + 'fixtures', + 'fuzzers', + 'internet', + 'js-native-api', + 'known_issues', + 'message', + 'module-hooks', + 'node-api', + 'nop', + 'overlapped-checker', + 'pseudo-tty', + 'pummel', + 'report', + 'sea', + 'sequential', + 'sqlite', + 'system-ca', + 'test426', + 'testpy', + 'tick-processor', + 'tools', + 'v8-updates', + 'wasi', + 'wasm-allocation', + 'wpt', + ].join(',')}}/**/*.{js,mjs,cjs}`, + `test/parallel/test-{${ + // 0x61 is code for 'a', this generates a string enumerating latin letters: 'a*,b*,…' + Array.from({ length: 3 }, (_, i) => String.fromCharCode(0x61 + i, 42)).join(',') + },${ + // 0x61 is code for 'a', this generates a string enumerating latin letters: 'z*,y*,…' + Array.from({ length: 2 }, (_, i) => String.fromCharCode(0x61 + 25 - i, 42)).join(',') + }}.{js,mjs,cjs}`, ], rules: { 'node-core/must-call-assert': 'error', diff --git a/test/fixtures/crypto/ecdsa.js b/test/fixtures/crypto/ecdsa.js index b8827b24d41965..c3545fb20ec7df 100644 --- a/test/fixtures/crypto/ecdsa.js +++ b/test/fixtures/crypto/ecdsa.js @@ -72,18 +72,20 @@ module.exports = function() { 'b6a0a14d7e4bc6dd2eda82c9234f174b670b60c8f7d101f68fdf5889e02373b025' + 'dcbc4c82f2929b8e06c68535da98e38fe399c53a814b097935581ef21535eb', 'hex'), - 'SHA3-256': Buffer.from( - 'f6a48eb5557f484ed0c3e4b5c78a3cf497cbd346db06a4165d429248aa2cc51a69' + - '747d09f57af145469a8b607a9b8b9709629d74e8f5ca337c6ddc581b6f6103', - 'hex'), - 'SHA3-384': Buffer.from( - '777785978eb59da32888554dc7fd62d1ba1a3033cddaa8c36b8f3dcea8f85e1c8e' + - '6db26f509747bd144dfa9436784bf4abbcaa6abcf1ecc09cea3b921d46738c', - 'hex'), - 'SHA3-512': Buffer.from( - '0f01c2083b5dd7fccb2784563f88cd9a815d570a1690695e426643ab725780760d' + - 'e972e26e18d67f5557be89f17b4cd0065ce2937de299bdb2e972ebf7635084', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'f6a48eb5557f484ed0c3e4b5c78a3cf497cbd346db06a4165d429248aa2cc51a69' + + '747d09f57af145469a8b607a9b8b9709629d74e8f5ca337c6ddc581b6f6103', + 'hex'), + 'SHA3-384': Buffer.from( + '777785978eb59da32888554dc7fd62d1ba1a3033cddaa8c36b8f3dcea8f85e1c8e' + + '6db26f509747bd144dfa9436784bf4abbcaa6abcf1ecc09cea3b921d46738c', + 'hex'), + 'SHA3-512': Buffer.from( + '0f01c2083b5dd7fccb2784563f88cd9a815d570a1690695e426643ab725780760d' + + 'e972e26e18d67f5557be89f17b4cd0065ce2937de299bdb2e972ebf7635084', + 'hex') + } : {}) }, 'P-384': { 'SHA-1': Buffer.from( @@ -102,18 +104,20 @@ module.exports = function() { '72fbdb369fd34c1c54264d07f4facd69b02e4206f8a8bb259b882a305c56fde2d3' + '5107e493c53cd6b4af0b31306f4d03fd43cfc762a1030e17a3d775453a1212b142' + '9f7b3d93066a5f42a10b138cd177dc09616e827d598822d78d4627b754e6', 'hex'), - 'SHA3-256': Buffer.from( - '0b07c078be30fa5925a307d6fc559c5f398e63fb5d007d6b24a834847f2d3d18d5' + - 'b5e840711c52a7bc6626c3ced93301e873c013a706f6b297c12cc6d47a71e0529e' + - '719f43957de9995621d3cb0217469adaa6fd3135470771d0aa9d05d7a9c6', 'hex'), - 'SHA3-384': Buffer.from( - '2f36e8b04af46f68ef900c2720e3518b06f5440865d44072bbad5d62288c575042' + - 'b183a372acd70328c738668dcecb9866801462d62df3c35450fdc6c95433103fcd' + - 'c77999b640e3f92bd4e9be6e27ab129d1bc4f0b2a4c829388666920892d3', 'hex'), - 'SHA3-512': Buffer.from( - '32a951e886c33ac57a008efe9643bc92aa3ece9521d115e0c7240caecf124d1f7c' + - 'dcba7fabb9ad5202e04f7aa591ab01ed3f060f04f493e4f24430fe8159200612f0' + - '2849108b8be6edc8494c328097ad9265928efe5cb9d91be2f013ee17ee4e', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + '0b07c078be30fa5925a307d6fc559c5f398e63fb5d007d6b24a834847f2d3d18d5' + + 'b5e840711c52a7bc6626c3ced93301e873c013a706f6b297c12cc6d47a71e0529e' + + '719f43957de9995621d3cb0217469adaa6fd3135470771d0aa9d05d7a9c6', 'hex'), + 'SHA3-384': Buffer.from( + '2f36e8b04af46f68ef900c2720e3518b06f5440865d44072bbad5d62288c575042' + + 'b183a372acd70328c738668dcecb9866801462d62df3c35450fdc6c95433103fcd' + + 'c77999b640e3f92bd4e9be6e27ab129d1bc4f0b2a4c829388666920892d3', 'hex'), + 'SHA3-512': Buffer.from( + '32a951e886c33ac57a008efe9643bc92aa3ece9521d115e0c7240caecf124d1f7c' + + 'dcba7fabb9ad5202e04f7aa591ab01ed3f060f04f493e4f24430fe8159200612f0' + + '2849108b8be6edc8494c328097ad9265928efe5cb9d91be2f013ee17ee4e', 'hex') + } : {}) }, 'P-521': { 'SHA-1': Buffer.from( @@ -140,29 +144,35 @@ module.exports = function() { '01f0071e6a32867fa70f695cd39c4e87e142b9e4134d38740bd6fee354a575167e' + '13524e94832637910fe11e53a85fb21b91adb81bb1779c4e2b8bc87c717dc35084', 'hex'), - 'SHA3-256': Buffer.from( - '00463679f47a4c705e03447360dcf34d1743e0d4b2591cc66832a6bc80d92e538c' + - '169a1fd330f98e7235ca7fec7e16ac44fb13095b8edf2c76b75c4845177d59e425' + - '0127c4359f6a4c9ccb63e7a9ff8122c0b4a8b7408e28c96817ecc3baf8c559c413' + - 'c3bb580447dec9f52139b2afde369cd51730f050bc94137556ae137f0509464219', - 'hex'), - 'SHA3-384': Buffer.from( - '01969a4db0888bc067a68a31fe5d0fc97e0b701f570565f7b25cb27707c6f020ff' + - '680f8553ec5c2d6885e9e91b39262ed1bde375525eb13fdf12089b7939c7689735' + - '0101c8b8d1129a217e8e956bef78cf7b9a0458523b04ac8e0b84ce73d54326f7a8' + - '704ee42fe183f3ef79d83e676f34dc5476e2342641a5b973d3d94e8503676fbbc5', - 'hex'), - 'SHA3-512': Buffer.from( - '000f362e914ee0136663cf57bf4085c25604af6dc198b4818751e1195ee7e41a16' + - '91be909dcbc2bae00b8917f6bb918eae3740ac1b76e0913137c2da1171d6400b55' + - '01ec6e1dc5987a27fe16fc2ce5c8e954088f898a9bbefb176eaa8bbd9ccc264c4c' + - 'cc38c83ac8b5a168f90228daf8405a2b9bf7829c263a646b4e1098e2ace38deec7', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + '00463679f47a4c705e03447360dcf34d1743e0d4b2591cc66832a6bc80d92e538c' + + '169a1fd330f98e7235ca7fec7e16ac44fb13095b8edf2c76b75c4845177d59e425' + + '0127c4359f6a4c9ccb63e7a9ff8122c0b4a8b7408e28c96817ecc3baf8c559c413' + + 'c3bb580447dec9f52139b2afde369cd51730f050bc94137556ae137f0509464219', + 'hex'), + 'SHA3-384': Buffer.from( + '01969a4db0888bc067a68a31fe5d0fc97e0b701f570565f7b25cb27707c6f020ff' + + '680f8553ec5c2d6885e9e91b39262ed1bde375525eb13fdf12089b7939c7689735' + + '0101c8b8d1129a217e8e956bef78cf7b9a0458523b04ac8e0b84ce73d54326f7a8' + + '704ee42fe183f3ef79d83e676f34dc5476e2342641a5b973d3d94e8503676fbbc5', + 'hex'), + 'SHA3-512': Buffer.from( + '000f362e914ee0136663cf57bf4085c25604af6dc198b4818751e1195ee7e41a16' + + '91be909dcbc2bae00b8917f6bb918eae3740ac1b76e0913137c2da1171d6400b55' + + '01ec6e1dc5987a27fe16fc2ce5c8e954088f898a9bbefb176eaa8bbd9ccc264c4c' + + 'cc38c83ac8b5a168f90228daf8405a2b9bf7829c263a646b4e1098e2ace38deec7', + 'hex') + } : {}) } } const curves = ['P-256', 'P-384', 'P-521']; - const hashes = ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512', 'SHA3-256', 'SHA3-384', 'SHA3-512']; + const hashes = ['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512']; + + if (!process.features.openssl_is_boringssl) { + hashes.push('SHA3-256', 'SHA3-384', 'SHA3-512'); + } const vectors = []; curves.forEach((namedCurve) => { diff --git a/test/fixtures/crypto/hmac.js b/test/fixtures/crypto/hmac.js index 6505c6e2ae55b5..acdf3229a4bc7c 100644 --- a/test/fixtures/crypto/hmac.js +++ b/test/fixtures/crypto/hmac.js @@ -22,16 +22,18 @@ module.exports = function () { '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', 'hex'), - 'SHA3-256': Buffer.from( - 'e588ec0811463d767241df1074b47ae4071b51f2ce36537ba69ccdc3fdc2b7a8', - 'hex'), - 'SHA3-384': Buffer.from( - '6b1da28eab1f582ad9718effe05e23d5fd2c9877a2d9443f90bec093bece2ea7' + - 'd2354cd0bdc5e147d2e9009373494488', 'hex'), - 'SHA3-512': Buffer.from( - '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + - '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'e588ec0811463d767241df1074b47ae4071b51f2ce36537ba69ccdc3fdc2b7a8', + 'hex'), + 'SHA3-384': Buffer.from( + '6b1da28eab1f582ad9718effe05e23d5fd2c9877a2d9443f90bec093bece2ea7' + + 'd2354cd0bdc5e147d2e9009373494488', 'hex'), + 'SHA3-512': Buffer.from( + '5dcc359443aaf652fa1375d6b3e61fdcf29bb4a28bd5d3dcfa40f82f906bb280' + + '0455db03b5d31fb972a15a6d0103a24e56d156a119c0e5a1e92a44c3c5657cf9', + 'hex') + } : {}) } const signatures = { @@ -46,16 +48,18 @@ module.exports = function () { '61fb278c3ffb0cce2bf1cf723ddfd8ef1f931c0c618c25907324605939e3f9a2' + 'c6f4af690bda3407dc2f5770f6a0a44b954d64a332e3ee0821abf82b7f3e99c1', 'hex'), - 'SHA3-256': Buffer.from( - 'c1ac5e11fcd50c48bf567f6e296632f5801c4eb07a8a47579b41dee971a3099b', - 'hex'), - 'SHA3-384': Buffer.from( - 'ac8c97f6dd8d9e16101063077c16b23fe291a5e6d149653e9ac7002365159317' + - 'adcfad511996578b0053a5c14b75f16c', 'hex'), - 'SHA3-512': Buffer.from( - '2162c2a8907e6b2f68599a69e81a464d8f076b5eeb555d98b4d20330034df3c7' + - 'cf35b1fa958a074ca12f0d242df39f0da3d4f1dbfb3629057798fe1f883974ee', - 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': Buffer.from( + 'c1ac5e11fcd50c48bf567f6e296632f5801c4eb07a8a47579b41dee971a3099b', + 'hex'), + 'SHA3-384': Buffer.from( + 'ac8c97f6dd8d9e16101063077c16b23fe291a5e6d149653e9ac7002365159317' + + 'adcfad511996578b0053a5c14b75f16c', 'hex'), + 'SHA3-512': Buffer.from( + '2162c2a8907e6b2f68599a69e81a464d8f076b5eeb555d98b4d20330034df3c7' + + 'cf35b1fa958a074ca12f0d242df39f0da3d4f1dbfb3629057798fe1f883974ee', + 'hex') + } : {}) } const vectors = []; diff --git a/test/fixtures/crypto/rsa_pkcs.js b/test/fixtures/crypto/rsa_pkcs.js index 4630e4af913580..d54c44b6d820d8 100644 --- a/test/fixtures/crypto/rsa_pkcs.js +++ b/test/fixtures/crypto/rsa_pkcs.js @@ -97,33 +97,35 @@ module.exports = function () { '7a6335c70e193235dcda48add6858626bd96311e60f7e5ea4491b6c1e6248afe12b' + 'bbd54f8869b043a5b0444562813f0a98b300356f306e6b783a29f3bec97ca40ea20' + '062cab8926ec5d96aa387cc84821a6d72b8ea126e7d', 'hex'), - 'sha3-256': Buffer.from( - 'be1b476c1911a01d71710fd8a2f3158d6f7839e91443b01bed30dfdd04336d80c6b' + - 'f692c06fad254877901c10a73853e8fb202a29cddefdf16c3adcda1fc123625897d' + - '1b81b32a9dec38957e023be221d8f31e7470ad32e761edce9170eefa37ec19bd0c3' + - 'e0b0ad2a244e98f54a08f873efb63c6fad14d7322b50eb05b6bae767305da92a90a' + - '53cdae52b0d81e158a00003ec626e50423b7377a34a7b28cc7483b55bfde05bd431' + - 'cfa436c38c285531e0d476ee13f151c8ae832ffd51ba00f2ab06f1844e73c0fe0f6' + - 'ce17d966b1e07727af4161368aa0a74a594a6fdb782b46a9ae6098799c366fc0d71' + - '1b2d965cf5eeeed9175b39b1d0bcefdd7df376e8ac9', 'hex'), - 'sha3-384': Buffer.from( - '002eaf5837443f1a33dc03729a308c503888d7a8cc013be424a91bce18105f7334a' + - '499a5eddc5f4fab2fdf80f52988d53bf8bd5e78c3ce1a43abaf3b8146c260b6ce8b' + - 'ffc9857f4b35c190cea85921c46d3ab573113744472d1afb637a0e9ab5021bcb355' + - '7f5b52faf89fa864a7d3bf5799096c54ee53fa139e1bc13842a2a5bf0f1d85f041d' + - 'a4e0e87425b421f22f0240ad62ef77ba6f090e0d48e17c07fd1e477c7e16a3196f5' + - '0142d0f0c5e525a10325569e5a1f50cb4577e782a643972857cc918ae5409587d9e' + - '44e1c1e89540e87deed7dda5005ac63ba609f522fdd92c81d95c1ffa383558a10f3' + - '064f59ca0534bfad31acbf3e2807cb7d3147c59ee4d', 'hex'), - 'sha3-512': Buffer.from( - '561585b621c916453762285c8bb6ede3f303074ad6f2826ca15b3900e49c4d94c07' + - 'aab0b875eaa79049ba2ed97e9a87c44fff9bffe638a1bf8c4db69c627b6adbe8fca' + - '2b38cb8b4c2810a16286bef498327b9db4b53043ed5012c7c58f037edf669baf772' + - '9b58e413e133ebb90a5fcb6dc3936f4f87971c0e85f362189b4279bbb2d9293a427' + - '5653068c1bc8772cebc4733a5d1df0b454d4f628c645c22bb1c8cc601fbc92dc091' + - 'db38fad4a36289ae9ed424c46643a8161a102ae511877d25f2eab7342dff6b92bf3' + - '65951e76ee84c2bd84a595f63d7cc04d00e1589870956491e518b3ba245efc37a28' + - 'ec018d8788a92ab93a90bb314f9ab0788a0b5b50489', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'sha3-256': Buffer.from( + 'be1b476c1911a01d71710fd8a2f3158d6f7839e91443b01bed30dfdd04336d80c6b' + + 'f692c06fad254877901c10a73853e8fb202a29cddefdf16c3adcda1fc123625897d' + + '1b81b32a9dec38957e023be221d8f31e7470ad32e761edce9170eefa37ec19bd0c3' + + 'e0b0ad2a244e98f54a08f873efb63c6fad14d7322b50eb05b6bae767305da92a90a' + + '53cdae52b0d81e158a00003ec626e50423b7377a34a7b28cc7483b55bfde05bd431' + + 'cfa436c38c285531e0d476ee13f151c8ae832ffd51ba00f2ab06f1844e73c0fe0f6' + + 'ce17d966b1e07727af4161368aa0a74a594a6fdb782b46a9ae6098799c366fc0d71' + + '1b2d965cf5eeeed9175b39b1d0bcefdd7df376e8ac9', 'hex'), + 'sha3-384': Buffer.from( + '002eaf5837443f1a33dc03729a308c503888d7a8cc013be424a91bce18105f7334a' + + '499a5eddc5f4fab2fdf80f52988d53bf8bd5e78c3ce1a43abaf3b8146c260b6ce8b' + + 'ffc9857f4b35c190cea85921c46d3ab573113744472d1afb637a0e9ab5021bcb355' + + '7f5b52faf89fa864a7d3bf5799096c54ee53fa139e1bc13842a2a5bf0f1d85f041d' + + 'a4e0e87425b421f22f0240ad62ef77ba6f090e0d48e17c07fd1e477c7e16a3196f5' + + '0142d0f0c5e525a10325569e5a1f50cb4577e782a643972857cc918ae5409587d9e' + + '44e1c1e89540e87deed7dda5005ac63ba609f522fdd92c81d95c1ffa383558a10f3' + + '064f59ca0534bfad31acbf3e2807cb7d3147c59ee4d', 'hex'), + 'sha3-512': Buffer.from( + '561585b621c916453762285c8bb6ede3f303074ad6f2826ca15b3900e49c4d94c07' + + 'aab0b875eaa79049ba2ed97e9a87c44fff9bffe638a1bf8c4db69c627b6adbe8fca' + + '2b38cb8b4c2810a16286bef498327b9db4b53043ed5012c7c58f037edf669baf772' + + '9b58e413e133ebb90a5fcb6dc3936f4f87971c0e85f362189b4279bbb2d9293a427' + + '5653068c1bc8772cebc4733a5d1df0b454d4f628c645c22bb1c8cc601fbc92dc091' + + 'db38fad4a36289ae9ed424c46643a8161a102ae511877d25f2eab7342dff6b92bf3' + + '65951e76ee84c2bd84a595f63d7cc04d00e1589870956491e518b3ba245efc37a28' + + 'ec018d8788a92ab93a90bb314f9ab0788a0b5b50489', 'hex') + } : {}) } const vectors = [ @@ -159,30 +161,32 @@ module.exports = function () { plaintext, signature: signatures['sha-512'] }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSASSA-PKCS1-v1_5' }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512'] - }, + ...(!process.features.openssl_is_boringssl ? [ + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSASSA-PKCS1-v1_5' }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512'] + }, + ] : []), ]; return vectors; diff --git a/test/fixtures/crypto/rsa_pss.js b/test/fixtures/crypto/rsa_pss.js index 101122b2ffe31c..423f2c4d77bfc9 100644 --- a/test/fixtures/crypto/rsa_pss.js +++ b/test/fixtures/crypto/rsa_pss.js @@ -150,42 +150,44 @@ module.exports = function() { 'b68c04bfe452c3adc6c10066a915231b7b404727eb6201b4921eb96d9407de2b963' + '3879ceb71d759d9828d7b4d062f6ef100757d8328187caf57dfb859d1555345207c' + '1cce7905c3564c08fec78867a53d5a2cf84810e1ffa', 'hex'), - 'sha3-512, no salt': Buffer.from( - 'd2430dc87abeaa7d13f7cec8510f1a296e1c608f44b1696829c59a99e8eefe9b2ee' + - '6ee8ad6fdc93c24fcba2f04d1da195924b6209717e1992c10ed9f4783478765fe34' + - '3e761203bff9d326bb6dc2061b0a7554c8ce0814b29249136c20c8e30054df0c6bc' + - '656509a82845149368896690e32ff5dd32ef01543686f01d6a69bb438b049e66a8b' + - 'df485a13edcd7dc482da4cc57d0b740aca3e56f0da247794e600afd27b22b6da13b' + - 'cc15dd2059b525f8cb6bcd07540aa843f0ae51d4b0eea27045485914b908bdd01d0' + - 'a9d42379f9f7180f4ad162ff73df5fed0200eb02ad01473975d54a77c15a9c61a3c' + - 'b5e27de5d1eecc363d45506f7123a5ddd115c5e4c9e', 'hex'), - 'sha3-256, salted': Buffer.from( - '59cb9cce6ae838eb20d38d6af4acb9b866b0753bb7df9e441037d788512c03279e8' + - '3d9a9cf5c0921fe1c0b6e8e895a8c0ad24a18b123f809b34ef2a3a1f05974030320' + - '435692ef5d378cef4368c3658c098a25371dfaf1c0b6910f653a4ec15f2c08956c1' + - '405136c2aba7f25a808fa7dbf57a4cb2978bd91af710b27ee239d955c8cac7a76ae' + - '9085cefeda2a585a99cc948f064b5da66a9c4aa4f3f767ac905a9f314b47038e05c' + - '3608fbb7e67a278e4f009a62c3cd3fdf43692e759d9361be1217999a76a69d4d119' + - 'f8791a90e207e46b3f6125721f56fd819292d06a3cdae2c62c9a1dc0d964a06036c' + - '8c18661cc6c873532a3536ab51e1ce210926db299e2', 'hex'), - 'sha3-384, salted': Buffer.from( - '8d1f9297c8169f27f0c58827dba991d862de58c1155f612ad2995d2bf862d051c4a' + - '91b48571849b0412384382e5b77990de6a3c84010046b35c4a504f175a3479483d9' + - '5c58f86bb96d53a27e59d6f67fddaae295ce90610f5086acc711557c2c85aac32d3' + - '24199cff2367ae44e1d91307a98c8cbfb085a8bce6b1c20714711bc15b0eddb7881' + - '823227d4be477ffdad8093663a6a1fc62eb39c49c2c3a821c2b202cf7904b49ca92' + - '3c83819602bb13931577354a80f99309030044935b1cd41f0513160e661db1959fb' + - '1ec15f087f3d288e875d54cbf070ec860b0aeecc951ea65e97cd5460750d4b7de52' + - '22cb9e7466b1f506ecf6a81fc399dfd8334160f9084', 'hex'), - 'sha3-512, salted': Buffer.from( - '7b6d7be418c5d37cc8070698b8b03d818ecd8b673d047d34921913f6d59c69cb496' + - '172d6118207d9ff92b8e1246acf0e03a845d935a70f8a82c3d5d6db6a1a0e337269' + - '4b904372413dcbaa7ac5486bc8ccaf70d7e9470be82b928a90017e272cf9761ed26' + - 'c160fe874a2675a4fb2acad72c50fbfffdd70b5a6f2919553d7ea1829934670f8de' + - 'f2a5c2816404b1aa153323c92c58400622f184b9b0463fa48d6b27091f68c287e3f' + - '6d9ab9eb451711a5d984c547f3d56f14a686a89ddf36c47ce25092b8c6530904de9' + - '5df7fc602fe9394315f1b1847aae304cb5ad71e2cb78acfbc997a87a9d62a6898bb' + - '6d84a81bb89b50186265f4be171a93d837a4bf777c8', 'hex') + ...(!process.features.openssl_is_boringssl ? { + 'sha3-512, no salt': Buffer.from( + 'd2430dc87abeaa7d13f7cec8510f1a296e1c608f44b1696829c59a99e8eefe9b2ee' + + '6ee8ad6fdc93c24fcba2f04d1da195924b6209717e1992c10ed9f4783478765fe34' + + '3e761203bff9d326bb6dc2061b0a7554c8ce0814b29249136c20c8e30054df0c6bc' + + '656509a82845149368896690e32ff5dd32ef01543686f01d6a69bb438b049e66a8b' + + 'df485a13edcd7dc482da4cc57d0b740aca3e56f0da247794e600afd27b22b6da13b' + + 'cc15dd2059b525f8cb6bcd07540aa843f0ae51d4b0eea27045485914b908bdd01d0' + + 'a9d42379f9f7180f4ad162ff73df5fed0200eb02ad01473975d54a77c15a9c61a3c' + + 'b5e27de5d1eecc363d45506f7123a5ddd115c5e4c9e', 'hex'), + 'sha3-256, salted': Buffer.from( + '59cb9cce6ae838eb20d38d6af4acb9b866b0753bb7df9e441037d788512c03279e8' + + '3d9a9cf5c0921fe1c0b6e8e895a8c0ad24a18b123f809b34ef2a3a1f05974030320' + + '435692ef5d378cef4368c3658c098a25371dfaf1c0b6910f653a4ec15f2c08956c1' + + '405136c2aba7f25a808fa7dbf57a4cb2978bd91af710b27ee239d955c8cac7a76ae' + + '9085cefeda2a585a99cc948f064b5da66a9c4aa4f3f767ac905a9f314b47038e05c' + + '3608fbb7e67a278e4f009a62c3cd3fdf43692e759d9361be1217999a76a69d4d119' + + 'f8791a90e207e46b3f6125721f56fd819292d06a3cdae2c62c9a1dc0d964a06036c' + + '8c18661cc6c873532a3536ab51e1ce210926db299e2', 'hex'), + 'sha3-384, salted': Buffer.from( + '8d1f9297c8169f27f0c58827dba991d862de58c1155f612ad2995d2bf862d051c4a' + + '91b48571849b0412384382e5b77990de6a3c84010046b35c4a504f175a3479483d9' + + '5c58f86bb96d53a27e59d6f67fddaae295ce90610f5086acc711557c2c85aac32d3' + + '24199cff2367ae44e1d91307a98c8cbfb085a8bce6b1c20714711bc15b0eddb7881' + + '823227d4be477ffdad8093663a6a1fc62eb39c49c2c3a821c2b202cf7904b49ca92' + + '3c83819602bb13931577354a80f99309030044935b1cd41f0513160e661db1959fb' + + '1ec15f087f3d288e875d54cbf070ec860b0aeecc951ea65e97cd5460750d4b7de52' + + '22cb9e7466b1f506ecf6a81fc399dfd8334160f9084', 'hex'), + 'sha3-512, salted': Buffer.from( + '7b6d7be418c5d37cc8070698b8b03d818ecd8b673d047d34921913f6d59c69cb496' + + '172d6118207d9ff92b8e1246acf0e03a845d935a70f8a82c3d5d6db6a1a0e337269' + + '4b904372413dcbaa7ac5486bc8ccaf70d7e9470be82b928a90017e272cf9761ed26' + + 'c160fe874a2675a4fb2acad72c50fbfffdd70b5a6f2919553d7ea1829934670f8de' + + 'f2a5c2816404b1aa153323c92c58400622f184b9b0463fa48d6b27091f68c287e3f' + + '6d9ab9eb451711a5d984c547f3d56f14a686a89ddf36c47ce25092b8c6530904de9' + + '5df7fc602fe9394315f1b1847aae304cb5ad71e2cb78acfbc997a87a9d62a6898bb' + + '6d84a81bb89b50186265f4be171a93d837a4bf777c8', 'hex') + } : {}) } const vectors = [ @@ -253,54 +255,56 @@ module.exports = function() { plaintext, signature: signatures['sha-512, salted'] }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 0 }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512, no salt'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 32 }, - hash: 'SHA3-256', - plaintext, - signature: signatures['sha3-256, salted'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 48 }, - hash: 'SHA3-384', - plaintext, - signature: signatures['sha3-384, salted'] - }, - { - publicKeyBuffer: spki, - privateKeyBuffer: pkcs8, - algorithm: { name: 'RSA-PSS', saltLength: 64 }, - hash: 'SHA3-512', - plaintext, - signature: signatures['sha3-512, salted'] - } + ...(!process.features.openssl_is_boringssl ? [ + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 0 }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512, no salt'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 32 }, + hash: 'SHA3-256', + plaintext, + signature: signatures['sha3-256, salted'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 48 }, + hash: 'SHA3-384', + plaintext, + signature: signatures['sha3-384, salted'] + }, + { + publicKeyBuffer: spki, + privateKeyBuffer: pkcs8, + algorithm: { name: 'RSA-PSS', saltLength: 64 }, + hash: 'SHA3-512', + plaintext, + signature: signatures['sha3-512, salted'] + } + ] : []), ]; return vectors; diff --git a/test/fixtures/es-module-loaders/never-settling-resolve-step/import.meta.never-resolve.mjs b/test/fixtures/es-module-loaders/never-settling-resolve-step/import.meta.never-resolve.mjs index fc3a077abe6ddc..2bc389cc3e1d57 100644 --- a/test/fixtures/es-module-loaders/never-settling-resolve-step/import.meta.never-resolve.mjs +++ b/test/fixtures/es-module-loaders/never-settling-resolve-step/import.meta.never-resolve.mjs @@ -1,5 +1,8 @@ +import assert from 'node:assert'; console.log('should be output'); -import.meta.resolve('never-settle-resolve'); - -console.log('should not be output'); +assert.throws(() => { + import.meta.resolve('never-settle-resolve'); +}, { + code: 'ERR_ASYNC_LOADER_REQUEST_NEVER_SETTLED' +}); diff --git a/test/fixtures/es-modules/test-wasm-escape-import-names.mjs b/test/fixtures/es-modules/test-wasm-escape-import-names.mjs new file mode 100644 index 00000000000000..ee39fddd9e09f3 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-escape-import-names.mjs @@ -0,0 +1,5 @@ +// Test fixture for properly escaping import names +import { strictEqual } from 'node:assert'; +import * as wasmExports from './import-name.wasm'; + +strictEqual(wasmExports.xor(), 12345); diff --git a/test/fixtures/es-modules/test-wasm-globals-all-types.mjs b/test/fixtures/es-modules/test-wasm-globals-all-types.mjs new file mode 100644 index 00000000000000..c48ad4d7190ec2 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-globals-all-types.mjs @@ -0,0 +1,131 @@ +// Test fixture for all WebAssembly global types +import { strictEqual, ok, throws } from 'node:assert'; + +// WASM SIMD is not supported on older architectures such as IBM Power8 +let wasmExports; +try { + wasmExports = await import('./globals.wasm'); +} catch (e) { + ok(e instanceof WebAssembly.CompileError); + ok(e.message.includes('SIMD unsupported')); +} + +if (wasmExports) { + // Test imported globals using direct access + strictEqual(wasmExports.importedI32, 42); + strictEqual(wasmExports.importedMutI32, 100); + strictEqual(wasmExports.importedI64, 9223372036854775807n); + strictEqual(wasmExports.importedMutI64, 200n); + strictEqual(Math.round(wasmExports.importedF32 * 100000) / 100000, 3.14159); + strictEqual(Math.round(wasmExports.importedMutF32 * 100000) / 100000, 2.71828); + strictEqual(wasmExports.importedF64, 3.141592653589793); + strictEqual(wasmExports.importedMutF64, 2.718281828459045); + strictEqual(wasmExports.importedExternref !== null, true); + strictEqual(wasmExports.importedMutExternref !== null, true); + strictEqual(wasmExports.importedNullExternref, null); + + // Test local globals exported directly + strictEqual(wasmExports['🚀localI32'], 42); + strictEqual(wasmExports.localMutI32, 100); + strictEqual(wasmExports.localI64, 9223372036854775807n); + strictEqual(wasmExports.localMutI64, 200n); + strictEqual(Math.round(wasmExports.localF32 * 100000) / 100000, 3.14159); + strictEqual(Math.round(wasmExports.localMutF32 * 100000) / 100000, 2.71828); + strictEqual(wasmExports.localF64, 2.718281828459045); + strictEqual(wasmExports.localMutF64, 3.141592653589793); + + // Test imported globals using getter functions + strictEqual(wasmExports.getImportedMutI32(), 100); + strictEqual(wasmExports.getImportedMutI64(), 200n); + strictEqual(Math.round(wasmExports.getImportedMutF32() * 100000) / 100000, 2.71828); + strictEqual(wasmExports.getImportedMutF64(), 2.718281828459045); + strictEqual(wasmExports.getImportedMutExternref() !== null, true); + + // Test local globals using getter functions + strictEqual(wasmExports.getLocalMutI32(), 100); + strictEqual(wasmExports.getLocalMutI64(), 200n); + strictEqual(Math.round(wasmExports.getLocalMutF32() * 100000) / 100000, 2.71828); + strictEqual(wasmExports.getLocalMutF64(), 3.141592653589793); + strictEqual(wasmExports.getLocalMutExternref(), null); + + throws(wasmExports.getLocalMutV128); + + // Pending TDZ support + strictEqual(wasmExports.depV128, undefined); + + // Test modifying mutable globals and reading the new values + wasmExports.setImportedMutI32(999); + strictEqual(wasmExports.getImportedMutI32(), 999); + + wasmExports.setImportedMutI64(888n); + strictEqual(wasmExports.getImportedMutI64(), 888n); + + wasmExports.setImportedMutF32(7.77); + strictEqual(Math.round(wasmExports.getImportedMutF32() * 100) / 100, 7.77); + + wasmExports.setImportedMutF64(6.66); + strictEqual(wasmExports.getImportedMutF64(), 6.66); + + // Test modifying mutable externref + const testObj = { test: 'object' }; + wasmExports.setImportedMutExternref(testObj); + strictEqual(wasmExports.getImportedMutExternref(), testObj); + + // Test modifying local mutable globals + wasmExports.setLocalMutI32(555); + strictEqual(wasmExports.getLocalMutI32(), 555); + + wasmExports.setLocalMutI64(444n); + strictEqual(wasmExports.getLocalMutI64(), 444n); + + wasmExports.setLocalMutF32(3.33); + strictEqual(Math.round(wasmExports.getLocalMutF32() * 100) / 100, 3.33); + + wasmExports.setLocalMutF64(2.22); + strictEqual(wasmExports.getLocalMutF64(), 2.22); + + // These mutating pending live bindings support + strictEqual(wasmExports.localMutI32, 100); + strictEqual(wasmExports.localMutI64, 200n); + strictEqual(Math.round(wasmExports.localMutF32 * 100) / 100, 2.72); + strictEqual(wasmExports.localMutF64, 3.141592653589793); + + // Test modifying local mutable externref + const anotherTestObj = { another: 'test object' }; + wasmExports.setLocalMutExternref(anotherTestObj); + strictEqual(wasmExports.getLocalMutExternref(), anotherTestObj); + strictEqual(wasmExports.localMutExternref, null); + + // Test dep.wasm imports + strictEqual(wasmExports.depI32, 1001); + strictEqual(wasmExports.depMutI32, 2001); + strictEqual(wasmExports.getDepMutI32(), 2001); + strictEqual(wasmExports.depI64, 10000000001n); + strictEqual(wasmExports.depMutI64, 20000000001n); + strictEqual(wasmExports.getDepMutI64(), 20000000001n); + strictEqual(Math.round(wasmExports.depF32 * 100) / 100, 10.01); + strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01); + strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 20.01); + strictEqual(wasmExports.depF64, 100.0001); + strictEqual(wasmExports.depMutF64, 200.0001); + strictEqual(wasmExports.getDepMutF64(), 200.0001); + + // Test modifying dep.wasm mutable globals + wasmExports.setDepMutI32(3001); + strictEqual(wasmExports.getDepMutI32(), 3001); + + wasmExports.setDepMutI64(30000000001n); + strictEqual(wasmExports.getDepMutI64(), 30000000001n); + + wasmExports.setDepMutF32(30.01); + strictEqual(Math.round(wasmExports.getDepMutF32() * 100) / 100, 30.01); + + wasmExports.setDepMutF64(300.0001); + strictEqual(wasmExports.getDepMutF64(), 300.0001); + + // These pending live bindings support + strictEqual(wasmExports.depMutI32, 2001); + strictEqual(wasmExports.depMutI64, 20000000001n); + strictEqual(Math.round(wasmExports.depMutF32 * 100) / 100, 20.01); + strictEqual(wasmExports.depMutF64, 200.0001); +} diff --git a/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs b/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs new file mode 100644 index 00000000000000..2364f246b2558d --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-js-string-builtins.mjs @@ -0,0 +1,8 @@ +// Test fixture for js-string builtins support +import { strictEqual } from 'node:assert'; +import * as wasmExports from './js-string-builtins.wasm'; + +strictEqual(wasmExports.getLength('hello'), 5); +strictEqual(wasmExports.concatStrings('hello', ' world'), 'hello world'); +strictEqual(wasmExports.compareStrings('test', 'test'), 1); +strictEqual(wasmExports.compareStrings('test', 'different'), 0); diff --git a/test/fixtures/es-modules/test-wasm-load-exports.mjs b/test/fixtures/es-modules/test-wasm-load-exports.mjs new file mode 100644 index 00000000000000..cdb1caa3c90457 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-load-exports.mjs @@ -0,0 +1,11 @@ +// Test fixture for loading WASM exports +import { strictEqual, match } from 'node:assert'; +import { fileURLToPath } from 'node:url'; +import { add, addImported } from './simple.wasm'; +import { state } from './wasm-dep.mjs'; + +strictEqual(state, 'WASM Start Executed'); +strictEqual(add(10, 20), 30); +strictEqual(addImported(0), 42); +strictEqual(state, 'WASM JS Function Executed'); +strictEqual(addImported(1), 43); diff --git a/test/fixtures/es-modules/test-wasm-non-identifier-exports.mjs b/test/fixtures/es-modules/test-wasm-non-identifier-exports.mjs new file mode 100644 index 00000000000000..14e43adf20201a --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-non-identifier-exports.mjs @@ -0,0 +1,5 @@ +// Test fixture for non-identifier export names +import { strictEqual } from 'node:assert'; +import * as wasmExports from './export-name-syntax-error.wasm'; + +strictEqual(wasmExports['?f!o:oa[r]'], 12682); diff --git a/test/fixtures/es-modules/test-wasm-reject-wasm-export-names.mjs b/test/fixtures/es-modules/test-wasm-reject-wasm-export-names.mjs new file mode 100644 index 00000000000000..684132910fc2d4 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-reject-wasm-export-names.mjs @@ -0,0 +1,6 @@ +// Test WASM module with invalid export name starting with 'wasm:' +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const url = pathToFileURL(fileURLToPath(new URL('./invalid-export-name.wasm', import.meta.url))).href; +await import(url); diff --git a/test/fixtures/es-modules/test-wasm-reject-wasm-import-names.mjs b/test/fixtures/es-modules/test-wasm-reject-wasm-import-names.mjs new file mode 100644 index 00000000000000..aa4aa59238b018 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-reject-wasm-import-names.mjs @@ -0,0 +1,6 @@ +// Test WASM module with invalid import name starting with 'wasm:' +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const url = pathToFileURL(fileURLToPath(new URL('./invalid-import-name.wasm', import.meta.url))).href; +await import(url); diff --git a/test/fixtures/es-modules/test-wasm-reject-wasm-js-export-names.mjs b/test/fixtures/es-modules/test-wasm-reject-wasm-js-export-names.mjs new file mode 100644 index 00000000000000..a96871d827c22a --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-reject-wasm-js-export-names.mjs @@ -0,0 +1,6 @@ +// Test WASM module with invalid export name starting with 'wasm-js:' +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const url = pathToFileURL(fileURLToPath(new URL('./invalid-export-name-wasm-js.wasm', import.meta.url))).href; +await import(url); diff --git a/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-module.mjs b/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-module.mjs new file mode 100644 index 00000000000000..d23dfea8a78d12 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-module.mjs @@ -0,0 +1,6 @@ +// Test WASM module with invalid import module name starting with 'wasm-js:' +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const url = pathToFileURL(fileURLToPath(new URL('./invalid-import-module.wasm', import.meta.url))).href; +await import(url); diff --git a/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-names.mjs b/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-names.mjs new file mode 100644 index 00000000000000..817b1437d9523d --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-reject-wasm-js-import-names.mjs @@ -0,0 +1,6 @@ +// Test WASM module with invalid import name starting with 'wasm-js:' +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const url = pathToFileURL(fileURLToPath(new URL('./invalid-import-name-wasm-js.wasm', import.meta.url))).href; +await import(url); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-dynamic.mjs b/test/fixtures/es-modules/test-wasm-source-phase-dynamic.mjs new file mode 100644 index 00000000000000..a544fbbec5ace2 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-dynamic.mjs @@ -0,0 +1,9 @@ +// Test fixture for dynamic source phase imports +import { strictEqual } from 'node:assert'; +import * as wasmExports from './wasm-source-phase.js'; + +strictEqual(wasmExports.mod instanceof WebAssembly.Module, true); +strictEqual(await wasmExports.dyn('./simple.wasm') instanceof WebAssembly.Module, true); +const AbstractModuleSourceProto = Object.getPrototypeOf(Object.getPrototypeOf(wasmExports.mod)); +const toStringTag = Object.getOwnPropertyDescriptor(AbstractModuleSourceProto, Symbol.toStringTag).get; +strictEqual(toStringTag.call(wasmExports.mod), 'WebAssembly.Module'); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-no-execute-dynamic.mjs b/test/fixtures/es-modules/test-wasm-source-phase-no-execute-dynamic.mjs new file mode 100644 index 00000000000000..5979ad29184bde --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-no-execute-dynamic.mjs @@ -0,0 +1,6 @@ +// Test fixture that dynamic source phase imports don't execute +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const unimportableUrl = pathToFileURL(fileURLToPath(new URL('./unimportable.wasm', import.meta.url))).href; +await import.source(unimportableUrl); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-no-execute.mjs b/test/fixtures/es-modules/test-wasm-source-phase-no-execute.mjs new file mode 100644 index 00000000000000..e1a2a486364cef --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-no-execute.mjs @@ -0,0 +1,9 @@ +// Test fixture that source phase imports don't execute +import { strictEqual, rejects } from 'node:assert'; +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; +import source mod from './unimportable.wasm'; + +strictEqual(mod instanceof WebAssembly.Module, true); +const unimportableUrl = pathToFileURL(fileURLToPath(new URL('./unimportable.wasm', import.meta.url))).href; +await rejects(import(unimportableUrl)); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-not-defined-dynamic.mjs b/test/fixtures/es-modules/test-wasm-source-phase-not-defined-dynamic.mjs new file mode 100644 index 00000000000000..9ce07461492668 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-not-defined-dynamic.mjs @@ -0,0 +1,12 @@ +// Test fixture that throws when source phase not defined for dynamic import +import { ok, strictEqual, rejects } from 'node:assert'; +import { fileURLToPath } from 'node:url'; +import { pathToFileURL } from 'node:url'; + +const fileUrl = pathToFileURL(fileURLToPath(new URL('./wasm-source-phase.js', import.meta.url))).href; +await rejects(import.source(fileUrl), (e) => { + strictEqual(e instanceof SyntaxError, true); + strictEqual(e.message.includes('Source phase import object is not defined for module'), true); + strictEqual(e.message.includes(fileUrl), true); + return true; +}); diff --git a/test/fixtures/es-modules/test-wasm-source-phase-not-defined-static.mjs b/test/fixtures/es-modules/test-wasm-source-phase-not-defined-static.mjs new file mode 100644 index 00000000000000..5b308f366f599c --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-not-defined-static.mjs @@ -0,0 +1,2 @@ +// Test fixture that throws when source phase not defined for static import +import source nosource from './wasm-source-phase.js'; diff --git a/test/fixtures/es-modules/test-wasm-source-phase-static.mjs b/test/fixtures/es-modules/test-wasm-source-phase-static.mjs new file mode 100644 index 00000000000000..1cdbe06d11436f --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-source-phase-static.mjs @@ -0,0 +1,8 @@ +// Test fixture for static source phase imports +import { strictEqual } from 'node:assert'; +import * as wasmExports from './wasm-source-phase.js'; + +strictEqual(wasmExports.mod instanceof WebAssembly.Module, true); +const AbstractModuleSourceProto = Object.getPrototypeOf(Object.getPrototypeOf(wasmExports.mod)); +const toStringTag = Object.getOwnPropertyDescriptor(AbstractModuleSourceProto, Symbol.toStringTag).get; +strictEqual(toStringTag.call(wasmExports.mod), 'WebAssembly.Module'); diff --git a/test/fixtures/es-modules/test-wasm-vm-source-phase-dynamic.mjs b/test/fixtures/es-modules/test-wasm-vm-source-phase-dynamic.mjs new file mode 100644 index 00000000000000..2da4cfa06764da --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-vm-source-phase-dynamic.mjs @@ -0,0 +1,8 @@ +// Test fixture that throws for vm source phase dynamic import +import vm from 'node:vm'; + +const opts = { importModuleDynamically: () => m2 }; +const m1 = new vm.SourceTextModule('await import.source("y");', opts); +const m2 = new vm.SourceTextModule('export var p = 5;'); +await m1.link(() => m2); +await m1.evaluate(); diff --git a/test/fixtures/es-modules/test-wasm-vm-source-phase-static.mjs b/test/fixtures/es-modules/test-wasm-vm-source-phase-static.mjs new file mode 100644 index 00000000000000..dee9a84ab1b721 --- /dev/null +++ b/test/fixtures/es-modules/test-wasm-vm-source-phase-static.mjs @@ -0,0 +1,7 @@ +// Test fixture that throws for vm source phase static import +import vm from 'node:vm'; + +const m1 = new vm.SourceTextModule('import source x from "y";'); +const m2 = new vm.SourceTextModule('export var p = 5;'); +await m1.link(() => m2); +await m1.evaluate(); diff --git a/test/fixtures/kill-signal-for-watch.js b/test/fixtures/kill-signal-for-watch.js new file mode 100644 index 00000000000000..fe1e91fb5c3971 --- /dev/null +++ b/test/fixtures/kill-signal-for-watch.js @@ -0,0 +1,13 @@ +process.on('SIGTERM', () => { + console.log(`__SIGTERM received__ ${process.pid}`); + process.exit(); +}); +process.on('SIGINT', () => { + console.log(`__SIGINT received__ ${process.pid}`); + process.exit(); +}); +process.send(`script ready ${process.pid}`); +const timeout = 100_000; +setTimeout(() => { + process._rawDebug(`[CHILD] Timeout ${timeout} fired`); +}, timeout); diff --git a/test/fixtures/module-hooks/logger-async-hooks.mjs b/test/fixtures/module-hooks/logger-async-hooks.mjs new file mode 100644 index 00000000000000..f26d0ce2ae3e11 --- /dev/null +++ b/test/fixtures/module-hooks/logger-async-hooks.mjs @@ -0,0 +1,19 @@ +import fs from 'node:fs'; + +export async function resolve(specifier, context, nextResolve) { + fs.writeSync(1, `resolve ${specifier} from ${context.parentURL}\n`); + const result = await nextResolve(specifier, context); + result.shortCircuit = true; + return result; +} + +export async function load(url, context, nextLoad) { + fs.writeSync(1, `load ${url}\n`); + const result = await nextLoad(url, context); + result.shortCircuit = true; + // Handle the async loader hook quirk where source can be nullish for CommonJS. + // If this returns that nullish value verbatim, the `require` in imported + // CJS won't get the hook invoked. + result.source ??= fs.readFileSync(new URL(url), 'utf8'); + return result; +} diff --git a/test/fixtures/module-hooks/register-logger-async-hooks.mjs b/test/fixtures/module-hooks/register-logger-async-hooks.mjs new file mode 100644 index 00000000000000..28a6ae5f223cc0 --- /dev/null +++ b/test/fixtures/module-hooks/register-logger-async-hooks.mjs @@ -0,0 +1,2 @@ +import { register } from 'node:module'; +register('./logger-async-hooks.mjs', import.meta.url); diff --git a/test/fixtures/module-hooks/require-esm/cjs.cjs b/test/fixtures/module-hooks/require-esm/cjs.cjs new file mode 100644 index 00000000000000..c4a229c0ccc7c6 --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/cjs.cjs @@ -0,0 +1 @@ +exports.cjsValue = require('./inner.cjs'); \ No newline at end of file diff --git a/test/fixtures/module-hooks/require-esm/esm.mjs b/test/fixtures/module-hooks/require-esm/esm.mjs new file mode 100644 index 00000000000000..832a099e3811ce --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/esm.mjs @@ -0,0 +1,2 @@ +export { esmValue } from './inner.mjs' +export { cjsValue } from './cjs.cjs' \ No newline at end of file diff --git a/test/fixtures/module-hooks/require-esm/inner.cjs b/test/fixtures/module-hooks/require-esm/inner.cjs new file mode 100644 index 00000000000000..89de7dbd40f684 --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/inner.cjs @@ -0,0 +1 @@ +module.exports = 'commonjs'; diff --git a/test/fixtures/module-hooks/require-esm/inner.mjs b/test/fixtures/module-hooks/require-esm/inner.mjs new file mode 100644 index 00000000000000..ed57030dff3832 --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/inner.mjs @@ -0,0 +1 @@ +export const esmValue = 'esm'; diff --git a/test/fixtures/module-hooks/require-esm/main.cjs b/test/fixtures/module-hooks/require-esm/main.cjs new file mode 100644 index 00000000000000..d7997a17351d22 --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/main.cjs @@ -0,0 +1,4 @@ +const { esmValue, cjsValue } = require('./esm.mjs'); +console.log('esmValue in main.cjs:', esmValue); +console.log('cjsValue in main.cjs:', cjsValue); +module.exports = { esmValue, cjsValue }; diff --git a/test/fixtures/module-hooks/require-esm/main.mjs b/test/fixtures/module-hooks/require-esm/main.mjs new file mode 100644 index 00000000000000..c875685e0d6c04 --- /dev/null +++ b/test/fixtures/module-hooks/require-esm/main.mjs @@ -0,0 +1,3 @@ +import { esmValue, cjsValue } from './main.cjs'; +console.log('esmValue in main.mjs:', esmValue); +console.log('cjsValue in main.mjs:', cjsValue); diff --git a/test/fixtures/module-hooks/sync-and-async/app.js b/test/fixtures/module-hooks/sync-and-async/app.js new file mode 100644 index 00000000000000..c14477b70f7183 --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/app.js @@ -0,0 +1,2 @@ +console.log('Hello world'); + diff --git a/test/fixtures/module-hooks/sync-and-async/async-customize-loader.js b/test/fixtures/module-hooks/sync-and-async/async-customize-loader.js new file mode 100644 index 00000000000000..ac961f0b97a3ab --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/async-customize-loader.js @@ -0,0 +1,10 @@ +export async function load(url, context, nextLoad) { + if (url.endsWith('app.js')) { + return { + shortCircuit: true, + format: 'module', + source: 'console.log("customized by async hook");', + }; + } + return nextLoad(url, context); +} diff --git a/test/fixtures/module-hooks/sync-and-async/async-customize.js b/test/fixtures/module-hooks/sync-and-async/async-customize.js new file mode 100644 index 00000000000000..78bf7fc5564bd8 --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/async-customize.js @@ -0,0 +1,3 @@ +import { register } from 'node:module'; + +register(new URL('async-customize-loader.js', import.meta.url)); diff --git a/test/fixtures/module-hooks/sync-and-async/async-forward-loader.js b/test/fixtures/module-hooks/sync-and-async/async-forward-loader.js new file mode 100644 index 00000000000000..4a1ced7e8dbfbf --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/async-forward-loader.js @@ -0,0 +1,3 @@ +export async function load(url, context, nextLoad) { + return nextLoad(url, context); +} diff --git a/test/fixtures/module-hooks/sync-and-async/async-forward.js b/test/fixtures/module-hooks/sync-and-async/async-forward.js new file mode 100644 index 00000000000000..fd10aa6df8987c --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/async-forward.js @@ -0,0 +1,3 @@ +import { register } from 'node:module'; + +register(new URL('async-forward-loader.js', import.meta.url)); diff --git a/test/fixtures/module-hooks/sync-and-async/sync-customize.js b/test/fixtures/module-hooks/sync-and-async/sync-customize.js new file mode 100644 index 00000000000000..90d63db1c7cc2e --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/sync-customize.js @@ -0,0 +1,14 @@ +import { registerHooks } from 'node:module'; + +registerHooks({ + load(url, context, nextLoad) { + if (url.endsWith('app.js')) { + return { + shortCircuit: true, + format: 'module', + source: 'console.log("customized by sync hook")', + }; + } + return nextLoad(url, context); + }, +}); diff --git a/test/fixtures/module-hooks/sync-and-async/sync-forward.js b/test/fixtures/module-hooks/sync-and-async/sync-forward.js new file mode 100644 index 00000000000000..2688a240dc88f8 --- /dev/null +++ b/test/fixtures/module-hooks/sync-and-async/sync-forward.js @@ -0,0 +1,7 @@ +import { registerHooks } from 'node:module'; + +registerHooks({ + load(url, context, nextLoad) { + return nextLoad(url, context); + }, +}); diff --git a/test/fixtures/test-runner-watch/dependency.js b/test/fixtures/test-runner-watch/dependency.js new file mode 100644 index 00000000000000..a0995453769c8a --- /dev/null +++ b/test/fixtures/test-runner-watch/dependency.js @@ -0,0 +1 @@ +module.exports = {}; \ No newline at end of file diff --git a/test/fixtures/test-runner-watch/dependency.mjs b/test/fixtures/test-runner-watch/dependency.mjs new file mode 100644 index 00000000000000..d852a426b2bf36 --- /dev/null +++ b/test/fixtures/test-runner-watch/dependency.mjs @@ -0,0 +1 @@ +export const a = 1; \ No newline at end of file diff --git a/test/fixtures/test-runner-watch/test.js b/test/fixtures/test-runner-watch/test.js new file mode 100644 index 00000000000000..85606b1535b286 --- /dev/null +++ b/test/fixtures/test-runner-watch/test.js @@ -0,0 +1,5 @@ +const test = require('node:test'); +require('./dependency.js'); +import('./dependency.mjs'); +import('data:text/javascript,'); +test('test has ran'); \ No newline at end of file diff --git a/test/fixtures/test-runner/output/filtered-suite-delayed-build.js b/test/fixtures/test-runner/output/filtered-suite-delayed-build.js index c6b7060c2b88b2..8e5f8e5acd8df1 100644 --- a/test/fixtures/test-runner/output/filtered-suite-delayed-build.js +++ b/test/fixtures/test-runner/output/filtered-suite-delayed-build.js @@ -3,14 +3,14 @@ const common = require('../../../common'); const { suite, test } = require('node:test'); -suite('async suite', async () => { +suite('async suite', common.mustCall(async () => { await 1; test('enabled 1', common.mustCall()); await 1; test('not run', common.mustNotCall()); await 1; -}); +})); -suite('sync suite', () => { +suite('sync suite', common.mustCall(() => { test('enabled 2', common.mustCall()); -}); +})); diff --git a/test/fixtures/test-runner/output/hooks-with-no-global-test.js b/test/fixtures/test-runner/output/hooks-with-no-global-test.js index 02e5d94ce169e3..abe65ee04456db 100644 --- a/test/fixtures/test-runner/output/hooks-with-no-global-test.js +++ b/test/fixtures/test-runner/output/hooks-with-no-global-test.js @@ -9,6 +9,7 @@ before(() => testArr.push('global before')); after(() => { testArr.push('global after'); + // eslint-disable-next-line node-core/must-call-assert assert.deepStrictEqual(testArr, [ 'global before', 'describe before', diff --git a/test/fixtures/test-runner/output/hooks.js b/test/fixtures/test-runner/output/hooks.js index 77143a3fa33e85..23a8d2a7c42467 100644 --- a/test/fixtures/test-runner/output/hooks.js +++ b/test/fixtures/test-runner/output/hooks.js @@ -7,7 +7,7 @@ const { setTimeout } = require('node:timers/promises'); before((t) => t.diagnostic('before 1 called')); after((t) => t.diagnostic('after 1 called')); -describe('describe hooks', () => { +describe('describe hooks', common.mustCall(() => { const testArr = []; before(function() { testArr.push('before ' + this.name); @@ -51,9 +51,9 @@ describe('describe hooks', () => { it('nested 1', () => testArr.push('nested 1')); test('nested 2', () => testArr.push('nested 2')); }); -}); +})); -describe('describe hooks - no subtests', () => { +describe('describe hooks - no subtests', common.mustCall(() => { const testArr = []; before(function() { testArr.push('before ' + this.name); @@ -67,7 +67,7 @@ describe('describe hooks - no subtests', () => { })); beforeEach(common.mustNotCall()); afterEach(common.mustNotCall()); -}); +})); describe('before throws', () => { before(() => { throw new Error('before'); }); @@ -75,10 +75,10 @@ describe('before throws', () => { test('2', () => {}); }); -describe('before throws - no subtests', () => { +describe('before throws - no subtests', common.mustCall(() => { before(() => { throw new Error('before'); }); after(common.mustCall()); -}); +})); describe('after throws', () => { after(() => { throw new Error('after'); }); @@ -102,11 +102,11 @@ describe('afterEach throws', () => { test('2', () => {}); }); -describe('afterEach when test fails', () => { +describe('afterEach when test fails', common.mustCall(() => { afterEach(common.mustCall(2)); it('1', () => { throw new Error('test'); }); test('2', () => {}); -}); +})); describe('afterEach throws and test fails', () => { afterEach(() => { throw new Error('afterEach'); }); @@ -246,13 +246,13 @@ test('t.after() is called if test body throws', (t) => { throw new Error('bye'); }); -describe('run after when before throws', () => { +describe('run after when before throws', common.mustCall(() => { after(common.mustCall(() => { console.log('- after() called'); })); before(() => { throw new Error('before'); }); it('1', () => {}); -}); +})); test('test hooks - async', async (t) => { diff --git a/test/fixtures/test-runner/output/name_pattern.js b/test/fixtures/test-runner/output/name_pattern.js index c9c4e062dc0957..70834aced11fd7 100644 --- a/test/fixtures/test-runner/output/name_pattern.js +++ b/test/fixtures/test-runner/output/name_pattern.js @@ -32,7 +32,7 @@ test('top level test enabled', common.mustCall(async (t) => { ); })); -describe('top level describe enabled', () => { +describe('top level describe enabled', common.mustCall(() => { before(common.mustCall()); beforeEach(common.mustCall(3)); afterEach(common.mustCall(3)); @@ -44,7 +44,7 @@ describe('top level describe enabled', () => { describe('nested describe enabled', common.mustCall(() => { it('is enabled', common.mustCall()); })); -}); +})); describe('yes', function() { it('no', () => {}); @@ -76,13 +76,13 @@ describe('no with todo', { todo: true }, () => { }); }); -describe('DescribeForMatchWithAncestors', () => { +describe('DescribeForMatchWithAncestors', common.mustCall(() => { it('NestedTest', () => common.mustNotCall()); - describe('NestedDescribeForMatchWithAncestors', () => { + describe('NestedDescribeForMatchWithAncestors', common.mustCall(() => { it('NestedTest', common.mustCall()); - }); -}); + })); +})); describe('DescribeForMatchWithAncestors', () => { it('NestedTest', () => common.mustNotCall()); diff --git a/test/fixtures/webcrypto/supports-modern-algorithms.mjs b/test/fixtures/webcrypto/supports-modern-algorithms.mjs index 337ed577b14306..76d5e805cbc0e7 100644 --- a/test/fixtures/webcrypto/supports-modern-algorithms.mjs +++ b/test/fixtures/webcrypto/supports-modern-algorithms.mjs @@ -9,6 +9,7 @@ const shake256 = crypto.getHashes().includes('shake256'); const chacha = crypto.getCiphers().includes('chacha20-poly1305'); const ocb = hasOpenSSL(3); const kmac = hasOpenSSL(3); +const boringSSL = process.features.openssl_is_boringssl; const { subtle } = globalThis.crypto; const X25519 = await subtle.generateKey('X25519', false, ['deriveBits', 'deriveKey']); @@ -108,9 +109,9 @@ export const vectors = { [true, 'RSA-PSS'], [true, 'RSASSA-PKCS1-v1_5'], [true, 'X25519'], - [true, 'X448'], + [!boringSSL, 'X448'], [true, 'Ed25519'], - [true, 'Ed448'], + [!boringSSL, 'Ed448'], [true, 'ECDH'], [true, 'ECDSA'], [pqc, 'ML-DSA-44'], diff --git a/test/internet/test-dgram-broadcast-multi-process.js b/test/internet/test-dgram-broadcast-multi-process.js index a71b01aac5df84..aa6ef56e9f4d60 100644 --- a/test/internet/test-dgram-broadcast-multi-process.js +++ b/test/internet/test-dgram-broadcast-multi-process.js @@ -84,7 +84,7 @@ if (process.argv[2] !== 'child') { worker.messagesReceived = []; // Handle the death of workers - worker.on('exit', (code, signal) => { + worker.on('exit', common.mustCall((code, signal) => { // Don't consider this the true death if the worker // has finished successfully // or if the exit code is 0 @@ -108,9 +108,9 @@ if (process.argv[2] !== 'child') { process.exit(1); } - }); + })); - worker.on('message', (msg) => { + worker.on('message', common.mustCallAtLeast((msg) => { if (msg.listening) { listening += 1; @@ -134,7 +134,7 @@ if (process.argv[2] !== 'child') { 'required number of ' + 'messages. Will now compare.'); - Object.keys(workers).forEach((pid) => { + for (const pid of Object.keys(workers)) { const worker = workers[pid]; let count = 0; @@ -153,14 +153,14 @@ if (process.argv[2] !== 'child') { count); assert.strictEqual(count, messages.length); - }); + } clearTimeout(timer); console.error('[PARENT] Success'); killSubprocesses(workers); } } - }); + })); })(x); } @@ -196,14 +196,13 @@ if (process.argv[2] !== 'child') { buf.length, common.PORT, LOCAL_BROADCAST_HOST, - (err) => { - assert.ifError(err); + common.mustSucceed(() => { console.error('[PARENT] sent %s to %s:%s', util.inspect(buf.toString()), LOCAL_BROADCAST_HOST, common.PORT); process.nextTick(sendSocket.sendNext); - }, + }), ); }; diff --git a/test/internet/test-dgram-multicast-multi-process.js b/test/internet/test-dgram-multicast-multi-process.js index fe9c2cb02e772a..20051dbb07ecd6 100644 --- a/test/internet/test-dgram-multicast-multi-process.js +++ b/test/internet/test-dgram-multicast-multi-process.js @@ -69,7 +69,7 @@ function launchChildProcess() { } }); - worker.on('message', function(msg) { + worker.on('message', common.mustCallAtLeast((msg) => { if (msg.listening) { listening += 1; @@ -94,7 +94,7 @@ function launchChildProcess() { console.error('[PARENT] All workers have received the ' + 'required number of messages. Will now compare.'); - Object.keys(workers).forEach(function(pid) { + for (const pid of Object.keys(workers)) { const worker = workers[pid]; let count = 0; @@ -112,14 +112,14 @@ function launchChildProcess() { worker.pid, count); assert.strictEqual(count, messages.length); - }); + } clearTimeout(timer); console.error('[PARENT] Success'); killSubprocesses(workers); } } - }); + })); } function killSubprocesses(subprocesses) { @@ -182,13 +182,12 @@ if (process.argv[2] !== 'child') { buf.length, common.PORT, LOCAL_BROADCAST_HOST, - function(err) { - assert.ifError(err); + common.mustSucceed(() => { console.error('[PARENT] sent "%s" to %s:%s', buf.toString(), LOCAL_BROADCAST_HOST, common.PORT); process.nextTick(sendSocket.sendNext); - }, + }), ); }; } diff --git a/test/internet/test-dgram-multicast-set-interface-lo.js b/test/internet/test-dgram-multicast-set-interface-lo.js index b33a6922c181ad..8944f695f37090 100644 --- a/test/internet/test-dgram-multicast-set-interface-lo.js +++ b/test/internet/test-dgram-multicast-set-interface-lo.js @@ -144,7 +144,7 @@ if (process.argv[2] !== 'child') { } }); - worker.on('message', (msg) => { + worker.on('message', common.mustCallAtLeast((msg) => { if (msg.listening) { listening += 1; @@ -168,7 +168,7 @@ if (process.argv[2] !== 'child') { 'required number of ' + 'messages. Will now compare.'); - Object.keys(workers).forEach((pid) => { + for (const pid of Object.keys(workers)) { const worker = workers[pid]; let count = 0; @@ -189,14 +189,14 @@ if (process.argv[2] !== 'child') { assert.strictEqual(count, worker.messagesNeeded.length, 'A worker received ' + 'an invalid multicast message'); - }); + } clearTimeout(timer); console.error('[PARENT] Success'); killSubprocesses(workers); } } - }); + })); } const sendSocket = dgram.createSocket({ @@ -234,14 +234,13 @@ if (process.argv[2] !== 'child') { buf.length, PORTS[msg.mcast], msg.mcast, - (err) => { - assert.ifError(err); + common.mustSucceed(() => { console.error('[PARENT] sent %s to %s:%s', util.inspect(buf.toString()), msg.mcast, PORTS[msg.mcast]); process.nextTick(sendSocket.sendNext); - }, + }), ); }; } diff --git a/test/internet/test-dgram-multicast-ssm-multi-process.js b/test/internet/test-dgram-multicast-ssm-multi-process.js index 693d717a0d237e..e363b6234fae6c 100644 --- a/test/internet/test-dgram-multicast-ssm-multi-process.js +++ b/test/internet/test-dgram-multicast-ssm-multi-process.js @@ -63,7 +63,7 @@ function launchChildProcess() { } }); - worker.on('message', function(msg) { + worker.on('message', common.mustCallAtLeast((msg) => { if (msg.listening) { listening += 1; @@ -88,7 +88,7 @@ function launchChildProcess() { console.error('[PARENT] All workers have received the ' + 'required number of messages. Will now compare.'); - Object.keys(workers).forEach(function(pid) { + for (const pid of Object.keys(workers)) { const worker = workers[pid]; let count = 0; @@ -106,14 +106,14 @@ function launchChildProcess() { worker.pid, count); assert.strictEqual(count, messages.length); - }); + } clearTimeout(timer); console.error('[PARENT] Success'); killChildren(workers); } } - }); + })); } function killChildren(children) { @@ -176,13 +176,12 @@ if (process.argv[2] !== 'child') { buf.length, common.PORT, GROUP_ADDRESS, - function(err) { - assert.ifError(err); + common.mustSucceed((err) => { console.error('[PARENT] sent "%s" to %s:%s', buf.toString(), GROUP_ADDRESS, common.PORT); process.nextTick(sendSocket.sendNext); - }, + }), ); }; } diff --git a/test/internet/test-dgram-multicast-ssmv6-multi-process.js b/test/internet/test-dgram-multicast-ssmv6-multi-process.js index c8ecafdca910dc..fda5fa5fab0620 100644 --- a/test/internet/test-dgram-multicast-ssmv6-multi-process.js +++ b/test/internet/test-dgram-multicast-ssmv6-multi-process.js @@ -63,7 +63,7 @@ function launchChildProcess() { } }); - worker.on('message', function(msg) { + worker.on('message', common.mustCallAtLeast((msg) => { if (msg.listening) { listening += 1; @@ -88,7 +88,7 @@ function launchChildProcess() { console.error('[PARENT] All workers have received the ' + 'required number of messages. Will now compare.'); - Object.keys(workers).forEach(function(pid) { + for (const pid of Object.keys(workers)) { const worker = workers[pid]; let count = 0; @@ -106,14 +106,14 @@ function launchChildProcess() { worker.pid, count); assert.strictEqual(count, messages.length); - }); + } clearTimeout(timer); console.error('[PARENT] Success'); killChildren(workers); } } - }); + })); } function killChildren(children) { @@ -176,13 +176,12 @@ if (process.argv[2] !== 'child') { buf.length, common.PORT, GROUP_ADDRESS, - function(err) { - assert.ifError(err); + common.mustSucceed(() => { console.error('[PARENT] sent "%s" to %s:%s', buf.toString(), GROUP_ADDRESS, common.PORT); process.nextTick(sendSocket.sendNext); - }, + }), ); }; } diff --git a/test/internet/test-dns-any.js b/test/internet/test-dns-any.js index b3d087ca721aad..986e2bb283cc24 100644 --- a/test/internet/test-dns-any.js +++ b/test/internet/test-dns-any.js @@ -19,6 +19,7 @@ function checkWrap(req) { assert.ok(typeof req === 'object'); } +/* eslint-disable node-core/must-call-assert */ const checkers = { checkA(r) { assert.ok(isIPv4(r.address)); @@ -80,13 +81,14 @@ const checkers = { assert.strictEqual(r.type, 'SRV'); }, }; +/* eslint-enable node-core/must-call-assert */ -function TEST(f) { +function test(f) { function next() { const f = queue.shift(); if (f) { running = true; - f(done); + f(done).then(common.mustCall()); } } @@ -115,7 +117,7 @@ function processResult(res) { return types; } -TEST(async function test_sip2sip_for_naptr(done) { +test(async function test_sip2sip_for_naptr(done) { function validateResult(res) { const types = processResult(res); assert.ok(types.A && types.NS && types.NAPTR && types.SOA, @@ -135,7 +137,7 @@ TEST(async function test_sip2sip_for_naptr(done) { checkWrap(req); }); -TEST(async function test_google_for_cname_and_srv(done) { +test(async function test_google_for_cname_and_srv(done) { function validateResult(res) { const types = processResult(res); assert.ok(types.SRV); @@ -154,7 +156,7 @@ TEST(async function test_google_for_cname_and_srv(done) { checkWrap(req); }); -TEST(async function test_ptr(done) { +test(async function test_ptr(done) { function validateResult(res) { const types = processResult(res); assert.ok(types.PTR); diff --git a/test/internet/test-dns-cares-domains.js b/test/internet/test-dns-cares-domains.js index 92b7f543880218..3312a0e3f8ca21 100644 --- a/test/internet/test-dns-cares-domains.js +++ b/test/internet/test-dns-cares-domains.js @@ -5,7 +5,7 @@ const assert = require('assert'); const dns = require('dns'); const domain = require('domain'); -const methods = [ +[ 'resolve4', 'resolve6', 'resolveCname', @@ -17,13 +17,11 @@ const methods = [ 'resolvePtr', 'resolveNaptr', 'resolveSoa', -]; - -methods.forEach(function(method) { +].forEach(function(method) { const d = domain.create(); - d.run(function() { + d.run(common.mustCall(() => { dns[method](addresses.INET_HOST, common.mustCall(() => { assert.strictEqual(process.domain, d, `${method} retains domain`); })); - }); + })); }); diff --git a/test/internet/test-dns-ipv4.js b/test/internet/test-dns-ipv4.js index 0d674e8390b163..56b679d45aec7d 100644 --- a/test/internet/test-dns-ipv4.js +++ b/test/internet/test-dns-ipv4.js @@ -13,13 +13,13 @@ const dnsPromises = dns.promises; let running = false; const queue = []; -function TEST(f) { +function test(f) { function next() { const f = queue.shift(); if (f) { running = true; console.log(f.name); - f(done); + f(done)?.then(common.mustCall()); } } @@ -39,7 +39,7 @@ function checkWrap(req) { assert.ok(typeof req === 'object'); } -TEST(async function test_resolve4(done) { +test(async function test_resolve4(done) { function validateResult(res) { assert.ok(res.length > 0); @@ -60,7 +60,7 @@ TEST(async function test_resolve4(done) { checkWrap(req); }); -TEST(async function test_reverse_ipv4(done) { +test(async function test_reverse_ipv4(done) { function validateResult(res) { assert.ok(res.length > 0); @@ -82,7 +82,7 @@ TEST(async function test_reverse_ipv4(done) { checkWrap(req); }); -TEST(async function test_lookup_ipv4_explicit(done) { +test(async function test_lookup_ipv4_explicit(done) { function validateResult(res) { assert.ok(net.isIPv4(res.address)); assert.strictEqual(res.family, 4); @@ -100,7 +100,7 @@ TEST(async function test_lookup_ipv4_explicit(done) { checkWrap(req); }); -TEST(async function test_lookup_ipv4_implicit(done) { +test(async function test_lookup_ipv4_implicit(done) { function validateResult(res) { assert.ok(net.isIPv4(res.address)); assert.strictEqual(res.family, 4); @@ -118,7 +118,7 @@ TEST(async function test_lookup_ipv4_implicit(done) { checkWrap(req); }); -TEST(async function test_lookup_ipv4_explicit_object(done) { +test(async function test_lookup_ipv4_explicit_object(done) { function validateResult(res) { assert.ok(net.isIPv4(res.address)); assert.strictEqual(res.family, 4); @@ -136,7 +136,7 @@ TEST(async function test_lookup_ipv4_explicit_object(done) { checkWrap(req); }); -TEST(async function test_lookup_ipv4_hint_addrconfig(done) { +test(async function test_lookup_ipv4_hint_addrconfig(done) { function validateResult(res) { assert.ok(net.isIPv4(res.address)); assert.strictEqual(res.family, 4); @@ -156,7 +156,7 @@ TEST(async function test_lookup_ipv4_hint_addrconfig(done) { checkWrap(req); }); -TEST(async function test_lookup_ip_ipv4(done) { +test(async function test_lookup_ip_ipv4(done) { function validateResult(res) { assert.strictEqual(res.address, '127.0.0.1'); assert.strictEqual(res.family, 4); @@ -173,7 +173,7 @@ TEST(async function test_lookup_ip_ipv4(done) { checkWrap(req); }); -TEST(async function test_lookup_localhost_ipv4(done) { +test(async function test_lookup_localhost_ipv4(done) { function validateResult(res) { assert.strictEqual(res.address, '127.0.0.1'); assert.strictEqual(res.family, 4); @@ -190,7 +190,7 @@ TEST(async function test_lookup_localhost_ipv4(done) { checkWrap(req); }); -TEST(async function test_lookup_all_ipv4(done) { +test(async function test_lookup_all_ipv4(done) { function validateResult(res) { assert.ok(Array.isArray(res)); assert.ok(res.length > 0); @@ -218,7 +218,7 @@ TEST(async function test_lookup_all_ipv4(done) { checkWrap(req); }); -TEST(async function test_lookupservice_ip_ipv4(done) { +test(async function test_lookupservice_ip_ipv4(done) { function validateResult(res) { assert.strictEqual(typeof res.hostname, 'string'); assert(res.hostname); @@ -238,12 +238,12 @@ TEST(async function test_lookupservice_ip_ipv4(done) { checkWrap(req); }); -TEST(function test_lookupservice_ip_ipv4_promise(done) { +test(function test_lookupservice_ip_ipv4_promise(done) { util.promisify(dns.lookupService)('127.0.0.1', 80) - .then(common.mustCall(({ hostname, service }) => { + .then(({ hostname, service }) => { assert.strictEqual(typeof hostname, 'string'); assert(hostname.length > 0); assert(['http', 'www', '80'].includes(service)); done(); - })); + }).then(common.mustCall()); }); diff --git a/test/internet/test-dns-ipv6.js b/test/internet/test-dns-ipv6.js index b1c8a095c0b991..c682765b5a9007 100644 --- a/test/internet/test-dns-ipv6.js +++ b/test/internet/test-dns-ipv6.js @@ -13,13 +13,13 @@ const isIPv6 = net.isIPv6; let running = false; const queue = []; -function TEST(f) { +function test(f) { function next() { const f = queue.shift(); if (f) { running = true; console.log(f.name); - f(done); + f(done)?.then(common.mustCall()); } } @@ -39,7 +39,7 @@ function checkWrap(req) { assert.ok(typeof req === 'object'); } -TEST(async function test_resolve6(done) { +test(async function test_resolve6(done) { function validateResult(res) { assert.ok(res.length > 0); @@ -60,7 +60,7 @@ TEST(async function test_resolve6(done) { checkWrap(req); }); -TEST(async function test_reverse_ipv6(done) { +test(async function test_reverse_ipv6(done) { function validateResult(res) { assert.ok(res.length > 0); @@ -81,7 +81,7 @@ TEST(async function test_reverse_ipv6(done) { checkWrap(req); }); -TEST(async function test_lookup_ipv6_explicit(done) { +test(async function test_lookup_ipv6_explicit(done) { function validateResult(res) { assert.ok(isIPv6(res.address)); assert.strictEqual(res.family, 6); @@ -101,7 +101,7 @@ TEST(async function test_lookup_ipv6_explicit(done) { }); // This ends up just being too problematic to test -// TEST(function test_lookup_ipv6_implicit(done) { +// test(function test_lookup_ipv6_implicit(done) { // var req = dns.lookup(addresses.INET6_HOST, function(err, ip, family) { // assert.ifError(err); // assert.ok(net.isIPv6(ip)); @@ -113,7 +113,7 @@ TEST(async function test_lookup_ipv6_explicit(done) { // checkWrap(req); // }); -TEST(async function test_lookup_ipv6_explicit_object(done) { +test(async function test_lookup_ipv6_explicit_object(done) { function validateResult(res) { assert.ok(isIPv6(res.address)); assert.strictEqual(res.family, 6); @@ -131,7 +131,7 @@ TEST(async function test_lookup_ipv6_explicit_object(done) { checkWrap(req); }); -TEST(function test_lookup_ipv6_hint(done) { +test(function test_lookup_ipv6_hint(done) { const req = dns.lookup(addresses.INET6_HOST, { family: 6, hints: dns.V4MAPPED, @@ -159,7 +159,7 @@ TEST(function test_lookup_ipv6_hint(done) { checkWrap(req); }); -TEST(async function test_lookup_ip_ipv6(done) { +test(async function test_lookup_ip_ipv6(done) { function validateResult(res) { assert.ok(isIPv6(res.address)); assert.strictEqual(res.family, 6); @@ -177,7 +177,7 @@ TEST(async function test_lookup_ip_ipv6(done) { checkWrap(req); }); -TEST(async function test_lookup_all_ipv6(done) { +test(async function test_lookup_all_ipv6(done) { function validateResult(res) { assert.ok(Array.isArray(res)); assert.ok(res.length > 0); @@ -206,7 +206,7 @@ TEST(async function test_lookup_all_ipv6(done) { checkWrap(req); }); -TEST(function test_lookupservice_ip_ipv6(done) { +test(function test_lookupservice_ip_ipv6(done) { const req = dns.lookupService( '::1', 80, common.mustCall((err, host, service) => { @@ -227,7 +227,7 @@ TEST(function test_lookupservice_ip_ipv6(done) { }); // Disabled because it appears to be not working on Linux. -// TEST(function test_lookup_localhost_ipv6(done) { +// test(function test_lookup_localhost_ipv6(done) { // var req = dns.lookup('localhost', 6, function(err, ip, family) { // assert.ifError(err); // assert.ok(net.isIPv6(ip)); diff --git a/test/internet/test-dns-txt-sigsegv.js b/test/internet/test-dns-txt-sigsegv.js index eeebf28fc7761c..013394f2d9c2e8 100644 --- a/test/internet/test-dns-txt-sigsegv.js +++ b/test/internet/test-dns-txt-sigsegv.js @@ -9,7 +9,7 @@ const dnsPromises = dns.promises; assert.strictEqual(result.length, 0); })().then(common.mustCall()); -dns.resolveTxt('www.microsoft.com', function(err, records) { +dns.resolveTxt('www.microsoft.com', common.mustCall((err, records) => { assert.strictEqual(err, null); assert.strictEqual(records.length, 0); -}); +})); diff --git a/test/internet/test-dns.js b/test/internet/test-dns.js index 5299fd6e7dbcdd..a6534441636507 100644 --- a/test/internet/test-dns.js +++ b/test/internet/test-dns.js @@ -39,13 +39,13 @@ let running = false; const queue = []; -function TEST(f) { +function test(f) { function next() { const f = queue.shift(); if (f) { running = true; console.log(f.name); - f(done); + f(done)?.then(common.mustCall()); } } @@ -69,13 +69,15 @@ function checkWrap(req) { } -TEST(function test_reverse_bogus(done) { - dnsPromises.reverse('bogus ip') - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { +test(function test_reverse_bogus(done) { + assert.rejects( + dnsPromises.reverse('bogus ip'), + (err) => { assert.strictEqual(err.code, 'EINVAL'); assert.strictEqual(getSystemErrorName(err.errno), 'EINVAL'); - })); + return true; + }, + ).then(common.mustCall()); assert.throws(() => { dns.reverse('bogus ip', common.mustNotCall()); @@ -83,7 +85,7 @@ TEST(function test_reverse_bogus(done) { done(); }); -TEST(async function test_resolve4_ttl(done) { +test(async function test_resolve4_ttl(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -102,16 +104,15 @@ TEST(async function test_resolve4_ttl(done) { const req = dns.resolve4(addresses.INET4_HOST, { ttl: true, - }, function(err, result) { - assert.ifError(err); + }, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolve6_ttl(done) { +test(async function test_resolve6_ttl(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -130,16 +131,15 @@ TEST(async function test_resolve6_ttl(done) { const req = dns.resolve6(addresses.INET6_HOST, { ttl: true, - }, function(err, result) { - assert.ifError(err); + }, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveMx(done) { +test(async function test_resolveMx(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -153,35 +153,33 @@ TEST(async function test_resolveMx(done) { validateResult(await dnsPromises.resolveMx(addresses.MX_HOST)); - const req = dns.resolveMx(addresses.MX_HOST, function(err, result) { - assert.ifError(err); + const req = dns.resolveMx(addresses.MX_HOST, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveMx_failure(done) { - dnsPromises.resolveMx(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveMx_failure(done) { + assert.rejects( + dnsPromises.resolveMx(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveMx(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveMx(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveNs(done) { +test(async function test_resolveNs(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -193,35 +191,33 @@ TEST(async function test_resolveNs(done) { validateResult(await dnsPromises.resolveNs(addresses.NS_HOST)); - const req = dns.resolveNs(addresses.NS_HOST, function(err, names) { - assert.ifError(err); + const req = dns.resolveNs(addresses.NS_HOST, common.mustSucceed((names) => { validateResult(names); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveNs_failure(done) { - dnsPromises.resolveNs(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveNs_failure(done) { + assert.rejects( + dnsPromises.resolveNs(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveNs(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveNs(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveSrv(done) { +test(async function test_resolveSrv(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -237,35 +233,33 @@ TEST(async function test_resolveSrv(done) { validateResult(await dnsPromises.resolveSrv(addresses.SRV_HOST)); - const req = dns.resolveSrv(addresses.SRV_HOST, function(err, result) { - assert.ifError(err); + const req = dns.resolveSrv(addresses.SRV_HOST, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveSrv_failure(done) { - dnsPromises.resolveSrv(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveSrv_failure(done) { + assert.rejects( + dnsPromises.resolveSrv(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveSrv(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveSrv(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolvePtr(done) { +test(async function test_resolvePtr(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -277,35 +271,33 @@ TEST(async function test_resolvePtr(done) { validateResult(await dnsPromises.resolvePtr(addresses.PTR_HOST)); - const req = dns.resolvePtr(addresses.PTR_HOST, function(err, result) { - assert.ifError(err); + const req = dns.resolvePtr(addresses.PTR_HOST, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolvePtr_failure(done) { - dnsPromises.resolvePtr(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolvePtr_failure(done) { + assert.rejects( + dnsPromises.resolvePtr(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolvePtr(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolvePtr(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveNaptr(done) { +test(async function test_resolveNaptr(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -322,35 +314,33 @@ TEST(async function test_resolveNaptr(done) { validateResult(await dnsPromises.resolveNaptr(addresses.NAPTR_HOST)); - const req = dns.resolveNaptr(addresses.NAPTR_HOST, function(err, result) { - assert.ifError(err); + const req = dns.resolveNaptr(addresses.NAPTR_HOST, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveNaptr_failure(done) { - dnsPromises.resolveNaptr(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveNaptr_failure(done) { + assert.rejects( + dnsPromises.resolveNaptr(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveNaptr(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveNaptr(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveSoa(done) { +test(async function test_resolveSoa(done) { function validateResult(result) { assert.strictEqual(typeof result, 'object'); assert.strictEqual(typeof result.nsname, 'string'); @@ -371,35 +361,33 @@ TEST(async function test_resolveSoa(done) { validateResult(await dnsPromises.resolveSoa(addresses.SOA_HOST)); - const req = dns.resolveSoa(addresses.SOA_HOST, function(err, result) { - assert.ifError(err); + const req = dns.resolveSoa(addresses.SOA_HOST, common.mustSucceed((result) => { validateResult(result); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveSoa_failure(done) { - dnsPromises.resolveSoa(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveSoa_failure(done) { + assert.rejects( + dnsPromises.resolveSoa(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveSoa(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveSoa(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveCaa(done) { +test(async function test_resolveCaa(done) { function validateResult(result) { assert.ok(Array.isArray(result), `expected array, got ${util.inspect(result)}`); @@ -411,35 +399,33 @@ TEST(async function test_resolveCaa(done) { validateResult(await dnsPromises.resolveCaa(addresses.CAA_HOST)); - const req = dns.resolveCaa(addresses.CAA_HOST, function(err, records) { - assert.ifError(err); + const req = dns.resolveCaa(addresses.CAA_HOST, common.mustSucceed((records) => { validateResult(records); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveCaa_failure(done) { - dnsPromises.resolveTxt(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveCaa_failure(done) { + assert.rejects( + dnsPromises.resolveTxt(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveCaa(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveCaa(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveCname(done) { +test(async function test_resolveCname(done) { function validateResult(result) { assert.ok(result.length > 0); @@ -451,35 +437,33 @@ TEST(async function test_resolveCname(done) { validateResult(await dnsPromises.resolveCname(addresses.CNAME_HOST)); - const req = dns.resolveCname(addresses.CNAME_HOST, function(err, names) { - assert.ifError(err); + const req = dns.resolveCname(addresses.CNAME_HOST, common.mustSucceed((names) => { validateResult(names); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveCname_failure(done) { - dnsPromises.resolveCname(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveCname_failure(done) { + assert.rejects( + dnsPromises.resolveCname(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveCname(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveCname(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveTlsa(done) { +test(async function test_resolveTlsa(done) { function validateResult(result) { assert.ok(Array.isArray(result)); assert.ok(result.length >= 1); @@ -493,35 +477,33 @@ TEST(async function test_resolveTlsa(done) { validateResult(await dnsPromises.resolveTlsa(addresses.TLSA_HOST)); - const req = dns.resolveTlsa(addresses.TLSA_HOST, function(err, records) { - assert.ifError(err); + const req = dns.resolveTlsa(addresses.TLSA_HOST, common.mustSucceed((records) => { validateResult(records); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveTlsa_failure(done) { - dnsPromises.resolveTlsa(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveTlsa_failure(done) { + assert.rejects( + dnsPromises.resolveTlsa(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveTlsa(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveTlsa(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(async function test_resolveTxt(done) { +test(async function test_resolveTxt(done) { function validateResult(result) { assert.ok(result.length > 0); assert.ok(result.every((elem) => Array.isArray(elem) && elem.length === 1)); @@ -530,41 +512,40 @@ TEST(async function test_resolveTxt(done) { validateResult(await dnsPromises.resolveTxt(addresses.TXT_HOST)); - const req = dns.resolveTxt(addresses.TXT_HOST, function(err, records) { - assert.ifError(err); + const req = dns.resolveTxt(addresses.TXT_HOST, common.mustSucceed((records) => { validateResult(records); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolveTxt_failure(done) { - dnsPromises.resolveTxt(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOTFOUND'); - })); +test(function test_resolveTxt_failure(done) { + assert.rejects( + dnsPromises.resolveTxt(addresses.NOT_FOUND), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.resolveTxt(addresses.NOT_FOUND, function(err, result) { + const req = dns.resolveTxt(addresses.NOT_FOUND, common.mustCall((err, result) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.strictEqual(result, undefined); done(); - }); + })); checkWrap(req); }); -TEST(function test_lookup_failure(done) { - dnsPromises.lookup(addresses.NOT_FOUND, 4) - .then(common.mustNotCall()) - .catch(common.expectsError({ code: dns.NOTFOUND })); +test(function test_lookup_failure(done) { + assert.rejects( + dnsPromises.lookup(addresses.NOT_FOUND, 4), + { code: dns.NOTFOUND }, + ).then(common.mustCall()); - const req = dns.lookup(addresses.NOT_FOUND, 4, (err) => { + const req = dns.lookup(addresses.NOT_FOUND, 4, common.mustCall((err) => { assert.ok(err instanceof Error); assert.strictEqual(err.code, dns.NOTFOUND); assert.strictEqual(err.code, 'ENOTFOUND'); @@ -572,13 +553,13 @@ TEST(function test_lookup_failure(done) { assert.ok(err.message.includes(addresses.NOT_FOUND)); done(); - }); + })); checkWrap(req); }); -TEST(async function test_lookup_ip_all(done) { +test(async function test_lookup_ip_all(done) { function validateResult(result) { assert.ok(Array.isArray(result)); assert.ok(result.length > 0); @@ -591,19 +572,18 @@ TEST(async function test_lookup_ip_all(done) { const req = dns.lookup( '127.0.0.1', { all: true }, - function(err, ips, family) { - assert.ifError(err); + common.mustSucceed((ips, family) => { assert.strictEqual(family, undefined); validateResult(ips); done(); - }, + }), ); checkWrap(req); }); -TEST(function test_lookup_ip_all_promise(done) { +test(function test_lookup_ip_all_promise(done) { const req = util.promisify(dns.lookup)('127.0.0.1', { all: true }) .then(function(ips) { assert.ok(Array.isArray(ips)); @@ -618,7 +598,7 @@ TEST(function test_lookup_ip_all_promise(done) { }); -TEST(function test_lookup_ip_promise(done) { +test(function test_lookup_ip_promise(done) { util.promisify(dns.lookup)('127.0.0.1') .then(function({ address, family }) { assert.strictEqual(address, '127.0.0.1'); @@ -629,7 +609,7 @@ TEST(function test_lookup_ip_promise(done) { }); -TEST(async function test_lookup_all_mixed(done) { +test(async function test_lookup_all_mixed(done) { function validateResult(result) { assert.ok(Array.isArray(result)); assert.ok(result.length > 0); @@ -648,78 +628,80 @@ TEST(async function test_lookup_all_mixed(done) { const req = dns.lookup(addresses.INET_HOST, { all: true, - }, function(err, ips) { - assert.ifError(err); + }, common.mustSucceed((ips) => { validateResult(ips); done(); - }); + })); checkWrap(req); }); -TEST(function test_lookupservice_invalid(done) { - dnsPromises.lookupService('1.2.3.4', 80) - .then(common.mustNotCall()) - .catch(common.expectsError({ code: 'ENOTFOUND' })); +test(function test_lookupservice_invalid(done) { + assert.rejects( + dnsPromises.lookupService('1.2.3.4', 80), + { code: 'ENOTFOUND' }, + ).then(common.mustCall()); - const req = dns.lookupService('1.2.3.4', 80, (err) => { + const req = dns.lookupService('1.2.3.4', 80, common.mustCall((err) => { assert(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); assert.match(err.message, /1\.2\.3\.4/); done(); - }); + })); checkWrap(req); }); -TEST(function test_reverse_failure(done) { - dnsPromises.reverse('203.0.113.0') - .then(common.mustNotCall()) - .catch(common.expectsError({ +test(function test_reverse_failure(done) { + assert.rejects( + dnsPromises.reverse('203.0.113.0'), + { code: 'ENOTFOUND', hostname: '203.0.113.0', - })); + }, + ).then(common.mustCall()); // 203.0.113.0/24 are addresses reserved for (RFC) documentation use only - const req = dns.reverse('203.0.113.0', function(err) { + const req = dns.reverse('203.0.113.0', common.mustCall((err) => { assert(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code... assert.strictEqual(err.hostname, '203.0.113.0'); assert.match(err.message, /203\.0\.113\.0/); done(); - }); + })); checkWrap(req); }); -TEST(function test_lookup_failure(done) { - dnsPromises.lookup(addresses.NOT_FOUND) - .then(common.mustNotCall()) - .catch(common.expectsError({ +test(function test_lookup_failure(done) { + assert.rejects( + dnsPromises.lookup(addresses.NOT_FOUND), + { code: 'ENOTFOUND', hostname: addresses.NOT_FOUND, - })); + }, + ).then(common.mustCall()); - const req = dns.lookup(addresses.NOT_FOUND, (err) => { + const req = dns.lookup(addresses.NOT_FOUND, common.mustCall((err) => { assert(err instanceof Error); assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code... assert.strictEqual(err.hostname, addresses.NOT_FOUND); assert.ok(err.message.includes(addresses.NOT_FOUND)); done(); - }); + })); checkWrap(req); }); -TEST(function test_resolve_failure(done) { - const req = dns.resolve4(addresses.NOT_FOUND, (err) => { +test(function test_resolve_failure(done) { + const req = dns.resolve4(addresses.NOT_FOUND, common.mustCall((err) => { assert(err instanceof Error); switch (err.code) { @@ -735,7 +717,7 @@ TEST(function test_resolve_failure(done) { assert.ok(err.message.includes(addresses.NOT_FOUND)); done(); - }); + })); checkWrap(req); }); @@ -750,14 +732,14 @@ const req = new cares.GetAddrInfoReqWrap(); cares.getaddrinfo(req, addresses.INET4_HOST, 4, /* hints */ 0, /* order */ cares.DNS_ORDER_VERBATIM); -req.oncomplete = function(err, domains) { +req.oncomplete = common.mustCallAtLeast((err, domains) => { assert.strictEqual(err, 0); console.log(`${addresses.INET4_HOST} = ${domains}`); assert.ok(Array.isArray(domains)); assert.ok(domains.length >= 1); assert.strictEqual(typeof domains[0], 'string'); getaddrinfoCallbackCalled = true; -}; +}); process.on('exit', function() { console.log(`${completed} tests completed`); diff --git a/test/internet/test-https-autoselectfamily-slow-timeout.js b/test/internet/test-https-autoselectfamily-slow-timeout.js index e7c55df9c8da40..ae7bb566be2b5a 100644 --- a/test/internet/test-https-autoselectfamily-slow-timeout.js +++ b/test/internet/test-https-autoselectfamily-slow-timeout.js @@ -13,8 +13,8 @@ request( `https://${addresses.INET_HOST}/en`, // Purposely set this to a low value because we want all connection but the last to fail { autoSelectFamily: true, autoSelectFamilyAttemptTimeout: 10 }, - (res) => { + common.mustCall((res) => { assert.strictEqual(res.statusCode, 200); res.resume(); - }, + }), ).end(); diff --git a/test/internet/test-https-issue-43963.js b/test/internet/test-https-issue-43963.js index 0d5a6109145d1b..aa86be77cbcda4 100644 --- a/test/internet/test-https-issue-43963.js +++ b/test/internet/test-https-issue-43963.js @@ -18,7 +18,7 @@ server.on( }), ); -server.listen(0, () => { +server.listen(0, common.mustCallAtLeast(() => { const req = https.request({ hostname: '127.0.0.1', port: server.address().port, @@ -28,4 +28,4 @@ server.listen(0, () => { common.mustCall(() => server.close()), ); req.end(); -}); +})); diff --git a/test/internet/test-net-autoselectfamily-events-failure.js b/test/internet/test-net-autoselectfamily-events-failure.js index a1d1930a9b4907..27f0ad96d32858 100644 --- a/test/internet/test-net-autoselectfamily-events-failure.js +++ b/test/internet/test-net-autoselectfamily-events-failure.js @@ -28,15 +28,15 @@ const { createConnection } = require('net'); autoSelectFamilyAttemptTimeout: 10, }); - connection.on('connectionAttempt', (address, port, family) => { + connection.on('connectionAttempt', common.mustCallAtLeast((address, port, family) => { assert.strictEqual(address, INET4_IP); assert.strictEqual(port, 10); assert.strictEqual(family, 4); pass(); - }); + }, 0)); - connection.on('connectionAttemptFailed', (address, port, family, error) => { + connection.on('connectionAttemptFailed', common.mustCallAtLeast((address, port, family, error) => { assert.strictEqual(address, INET4_IP); assert.strictEqual(port, 10); assert.strictEqual(family, 4); @@ -47,7 +47,7 @@ const { createConnection } = require('net'); ); pass(); - }); + }, 0)); connection.on('ready', () => { pass(); @@ -85,7 +85,7 @@ const { createConnection } = require('net'); { address: INET4_IP, port: 10, family: 4 }, ]; - connection.on('connectionAttempt', (address, port, family) => { + connection.on('connectionAttempt', common.mustCallAtLeast((address, port, family) => { const expected = addresses.shift(); assert.strictEqual(address, expected.address); @@ -93,9 +93,9 @@ const { createConnection } = require('net'); assert.strictEqual(family, expected.family); pass(); - }); + }, 0)); - connection.on('connectionAttemptFailed', (address, port, family, error) => { + connection.on('connectionAttemptFailed', common.mustCallAtLeast((address, port, family, error) => { const expected = addresses.shift(); assert.strictEqual(address, expected.address); @@ -108,7 +108,7 @@ const { createConnection } = require('net'); ); pass(); - }); + }, 0)); connection.on('ready', () => { pass(); diff --git a/test/internet/test-net-autoselectfamily-events-timeout.js b/test/internet/test-net-autoselectfamily-events-timeout.js index 5968b68afd037e..3fc3052a876bfd 100644 --- a/test/internet/test-net-autoselectfamily-events-timeout.js +++ b/test/internet/test-net-autoselectfamily-events-timeout.js @@ -34,13 +34,13 @@ const { createConnection } = require('net'); const pass = common.mustCall(); - connection.on('connectionAttemptTimeout', (address, port, family) => { + connection.on('connectionAttemptTimeout', common.mustCallAtLeast((address, port, family) => { assert.strictEqual(address, INET4_IP); assert.strictEqual(port, 443); assert.strictEqual(family, 4); connection.destroy(); pass(); - }); + }, 0)); connection.on('ready', () => { pass(); diff --git a/test/js-native-api/3_callbacks/test.js b/test/js-native-api/3_callbacks/test.js index b84d3fbc9ddec0..9c61e18c982b89 100644 --- a/test/js-native-api/3_callbacks/test.js +++ b/test/js-native-api/3_callbacks/test.js @@ -3,14 +3,14 @@ const common = require('../../common'); const assert = require('assert'); const addon = require(`./build/${common.buildType}/3_callbacks`); -addon.RunCallback(function(msg) { +addon.RunCallback(common.mustCall((msg) => { assert.strictEqual(msg, 'hello world'); -}); +})); function testRecv(desiredRecv) { - addon.RunCallbackWithRecv(function() { + addon.RunCallbackWithRecv(common.mustCall(function() { assert.strictEqual(this, desiredRecv); - }, desiredRecv); + }), desiredRecv); } testRecv(undefined); diff --git a/test/js-native-api/test_general/testInstanceOf.js b/test/js-native-api/test_general/testInstanceOf.js index dedc5a0e6b96f8..0946dda957d48c 100644 --- a/test/js-native-api/test_general/testInstanceOf.js +++ b/test/js-native-api/test_general/testInstanceOf.js @@ -1,58 +1,9 @@ 'use strict'; const common = require('../../common'); -const fs = require('fs'); const assert = require('assert'); // Addon is referenced through the eval expression in testFile const addon = require(`./build/${common.buildType}/test_general`); -const path = require('path'); - -// This test depends on a number of V8 tests. -const v8TestsDir = path.resolve(__dirname, '..', '..', '..', 'deps', 'v8', - 'test', 'mjsunit'); -const v8TestsDirExists = fs.existsSync(v8TestsDir); - -// The following assert functions are referenced by v8's unit tests -// See for instance deps/v8/test/mjsunit/instanceof.js -// eslint-disable-next-line no-unused-vars -function assertTrue(assertion) { - return assert.strictEqual(assertion, true); -} - -// eslint-disable-next-line no-unused-vars -function assertFalse(assertion) { - assert.strictEqual(assertion, false); -} - -// eslint-disable-next-line no-unused-vars -function assertEquals(leftHandSide, rightHandSide) { - assert.strictEqual(leftHandSide, rightHandSide); -} - -// eslint-disable-next-line no-unused-vars -function assertThrows(statement) { - assert.throws(function() { - eval(statement); - }, Error); -} - -function testFile(fileName) { - try { - const contents = fs.readFileSync(fileName, { encoding: 'utf8' }); - eval(contents.replace(/[(]([^\s(]+)\s+instanceof\s+([^)]+)[)]/g, - '(addon.doInstanceOf($1, $2))')); - } catch (err) { - // This test depends on V8 test files, which may not exist in downloaded - // archives. Emit a warning if the tests cannot be found instead of failing. - if (err.code === 'ENOENT' && !v8TestsDirExists) - process.emitWarning(`test file ${fileName} does not exist.`); - else - throw err; - } -} - -testFile(path.join(v8TestsDir, 'instanceof.js')); -testFile(path.join(v8TestsDir, 'instanceof-2.js')); // We can only perform this test if we have a working Symbol.hasInstance if (typeof Symbol !== 'undefined' && 'hasInstance' in Symbol && diff --git a/test/js-native-api/test_general/testV8Instanceof.js b/test/js-native-api/test_general/testV8Instanceof.js new file mode 100644 index 00000000000000..d8016c94ce4bd1 --- /dev/null +++ b/test/js-native-api/test_general/testV8Instanceof.js @@ -0,0 +1,102 @@ +// This test is adopted from V8's test suite. +// See deps/v8/test/mjsunit/instanceof.js in Node.js source repository. +// +// Copyright 2008 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +'use strict'; + +const common = require('../../common'); +const addon = require(`./build/${common.buildType}/test_general`); +const assert = require('assert'); + +assert.ok(addon.doInstanceOf({}, Object)); +assert.ok(addon.doInstanceOf([], Object)); + +assert.ok(!addon.doInstanceOf({}, Array)); +assert.ok(addon.doInstanceOf([], Array)); + +function TestChains() { + const A = {}; + const B = {}; + const C = {}; + Object.setPrototypeOf(B, A); + Object.setPrototypeOf(C, B); + + function F() { } + F.prototype = A; + assert.ok(addon.doInstanceOf(C, F)); + assert.ok(addon.doInstanceOf(B, F)); + assert.ok(!addon.doInstanceOf(A, F)); + + F.prototype = B; + assert.ok(addon.doInstanceOf(C, F)); + assert.ok(!addon.doInstanceOf(B, F)); + assert.ok(!addon.doInstanceOf(A, F)); + + F.prototype = C; + assert.ok(!addon.doInstanceOf(C, F)); + assert.ok(!addon.doInstanceOf(B, F)); + assert.ok(!addon.doInstanceOf(A, F)); +} + +TestChains(); + +function TestExceptions() { + function F() { } + const items = [ 1, new Number(42), + true, + 'string', new String('hest'), + {}, [], + F, new F(), + Object, String ]; + + let exceptions = 0; + let instanceofs = 0; + + for (let i = 0; i < items.length; i++) { + for (let j = 0; j < items.length; j++) { + try { + if (addon.doInstanceOf(items[i], items[j])) instanceofs++; + } catch (e) { + assert.ok(addon.doInstanceOf(e, TypeError)); + exceptions++; + } + } + } + assert.strictEqual(instanceofs, 10); + assert.strictEqual(exceptions, 88); + + // Make sure to throw an exception if the function prototype + // isn't a proper JavaScript object. + function G() { } + G.prototype = undefined; + assert.throws(function() { + addon.doInstanceOf({}, G); + }, Error); +} + +TestExceptions(); diff --git a/test/js-native-api/test_general/testV8Instanceof2.js b/test/js-native-api/test_general/testV8Instanceof2.js new file mode 100644 index 00000000000000..a118b5c43294b8 --- /dev/null +++ b/test/js-native-api/test_general/testV8Instanceof2.js @@ -0,0 +1,338 @@ +// This test is adopted from V8's test suite. +// See deps/v8/test/mjsunit/instanceof-2.js in Node.js source repository. +// +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +'use strict'; + +const common = require('../../common'); +const addon = require(`./build/${common.buildType}/test_general`); +const assert = require('assert'); + +const except = 'exception'; + +let correct_answer_index = 0; +const correct_answers = [ + false, false, true, true, false, false, true, true, + true, false, false, true, true, false, false, true, + false, true, true, false, false, true, true, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, false, true, + except, except, true, false, except, except, true, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, true, false, except, except, + false, true, except, except, false, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, false, true, true, false, + true, true, false, false, false, true, true, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, true, false, + except, except, false, false, except, except, true, false, + false, false, except, except, false, false, except, except, + true, false, except, except, true, false, except, except, + false, true, except, except, false, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, true, true, false, + true, false, false, true, true, true, false, false, + false, true, true, false, false, true, true, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, false, true, + except, except, true, false, except, except, true, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, true, true, false, + true, false, false, true, false, true, true, false, + false, true, true, false, false, true, true, false, + true, true, false, false, false, true, true, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, true, false, + except, except, false, false, except, except, true, false, + false, false, except, except, false, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, false, false, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, false, false, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, true, true, false, false, + true, false, false, true, true, true, false, false, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, true, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, true, true, false, false, + true, false, false, true, true, true, false, false, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, true, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, true, true, false, false, + false, true, true, false, false, false, true, true, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, false, false, + except, except, true, false, except, except, true, true, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, false, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, false, false, true, true, + true, true, false, false, false, false, true, true, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, true, true, + except, except, false, false, except, except, true, true, + false, false, except, except, false, false, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, false, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, true, true, false, false, + false, true, true, false, false, false, true, true, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, false, false, + except, except, true, false, except, except, true, true, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, false, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, false, false, true, true, + true, true, false, false, false, false, true, true, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, true, true, + except, except, false, false, except, except, true, true, + false, false, except, except, false, false, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, false, false, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, false, false, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, false, false, true, true, + true, false, false, true, false, false, true, true, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, false, false, except, except, + true, false, except, except, false, false, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, true, true, false, false, + true, false, false, true, true, true, false, false, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, true, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + false, false, true, true, true, true, false, false, + true, false, false, true, true, true, false, false, + false, true, true, false, true, true, false, false, + true, true, false, false, true, true, false, false, + except, except, true, true, except, except, true, true, + except, except, false, true, except, except, true, true, + except, except, true, false, except, except, false, false, + except, except, false, false, except, except, false, false, + false, false, except, except, true, true, except, except, + true, false, except, except, true, true, except, except, + false, true, except, except, true, true, except, except, + true, true, except, except, true, true, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except, + except, except, except, except, except, except, except, except]; + +for (let i = 0; i < 256; i++) { + Test(i & 1, i & 2, i & 4, i & 8, i & 0x10, i & 0x20, i & 0x40, i & 0x80); +} + + +function InstanceTest(x, func) { + try { + const answer = addon.doInstanceOf(x, func); + assert.strictEqual(correct_answers[correct_answer_index], answer); + } catch (e) { + assert.ok(/prototype/.test(e)); + assert.strictEqual(correct_answers[correct_answer_index], except); + } + correct_answer_index++; +} + + +function Test(a, b, c, d, e, f, g, h) { + function Foo() { } + + function Bar() { } + + if (c) Foo.prototype = 12; + if (d) Bar.prototype = 13; + const x = a ? new Foo() : new Bar(); + const y = b ? new Foo() : new Bar(); + InstanceTest(x, Foo); + InstanceTest(y, Foo); + InstanceTest(x, Bar); + InstanceTest(y, Bar); + if (e) x.__proto__ = Bar.prototype; // eslint-disable-line no-proto + if (f) y.__proto__ = Foo.prototype; // eslint-disable-line no-proto + if (g) { + Object.setPrototypeOf(x, y); + } else if (h) { + Object.setPrototypeOf(y, x); + } + InstanceTest(x, Foo); + InstanceTest(y, Foo); + InstanceTest(x, Bar); + InstanceTest(y, Bar); +} diff --git a/test/js-native-api/test_object/binding.gyp b/test/js-native-api/test_object/binding.gyp index e63c1649a05140..cb1dca11ad65ad 100644 --- a/test/js-native-api/test_object/binding.gyp +++ b/test/js-native-api/test_object/binding.gyp @@ -5,7 +5,10 @@ "sources": [ "test_null.c", "test_object.c" - ] + ], + "defines": [ + "NAPI_EXPERIMENTAL" + ], }, { "target_name": "test_exceptions", diff --git a/test/js-native-api/test_object/test.js b/test/js-native-api/test_object/test.js index a745d45e6f75e1..603f7d765aa703 100644 --- a/test/js-native-api/test_object/test.js +++ b/test/js-native-api/test_object/test.js @@ -5,7 +5,6 @@ const assert = require('assert'); // Testing api calls for objects const test_object = require(`./build/${common.buildType}/test_object`); - const object = { hello: 'world', array: [ @@ -391,3 +390,21 @@ assert.deepStrictEqual(test_object.TestGetProperty(), { delete obj.x; }, /Cannot delete property 'x' of #/); } + +{ + const objectWithProperties = test_object.TestCreateObjectWithProperties(); + assert.strictEqual(typeof objectWithProperties, 'object'); + assert.strictEqual(objectWithProperties.name, 'Foo'); + assert.strictEqual(objectWithProperties.age, 42); + assert.strictEqual(objectWithProperties.active, true); + + const emptyObject = test_object.TestCreateObjectWithPropertiesEmpty(); + assert.strictEqual(typeof emptyObject, 'object'); + assert.strictEqual(Object.keys(emptyObject).length, 0); + + const objectWithCustomPrototype = test_object.TestCreateObjectWithCustomPrototype(); + assert.strictEqual(typeof objectWithCustomPrototype, 'object'); + assert.deepStrictEqual(Object.getOwnPropertyNames(objectWithCustomPrototype), ['value']); + assert.strictEqual(objectWithCustomPrototype.value, 42); + assert.strictEqual(typeof objectWithCustomPrototype.test, 'function'); +} diff --git a/test/js-native-api/test_object/test_object.c b/test/js-native-api/test_object/test_object.c index 6d74128118f997..0b807f9a62342d 100644 --- a/test/js-native-api/test_object/test_object.c +++ b/test/js-native-api/test_object/test_object.c @@ -710,6 +710,79 @@ CheckTypeTag(napi_env env, napi_callback_info info) { return js_result; } +static napi_value TestCreateObjectWithProperties(napi_env env, + napi_callback_info info) { + napi_value names[3]; + napi_value values[3]; + napi_value result; + + NODE_API_CALL( + env, napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &names[0])); + NODE_API_CALL( + env, napi_create_string_utf8(env, "Foo", NAPI_AUTO_LENGTH, &values[0])); + + NODE_API_CALL( + env, napi_create_string_utf8(env, "age", NAPI_AUTO_LENGTH, &names[1])); + NODE_API_CALL(env, napi_create_int32(env, 42, &values[1])); + + NODE_API_CALL( + env, napi_create_string_utf8(env, "active", NAPI_AUTO_LENGTH, &names[2])); + NODE_API_CALL(env, napi_get_boolean(env, true, &values[2])); + + napi_value null_prototype; + NODE_API_CALL(env, napi_get_null(env, &null_prototype)); + NODE_API_CALL(env, + napi_create_object_with_properties( + env, null_prototype, names, values, 3, &result)); + + return result; +} + +static napi_value TestCreateObjectWithPropertiesEmpty(napi_env env, + napi_callback_info info) { + napi_value result; + + NODE_API_CALL( + env, + napi_create_object_with_properties(env, NULL, NULL, NULL, 0, &result)); + + return result; +} + +static napi_value TestCreateObjectWithCustomPrototype(napi_env env, + napi_callback_info info) { + napi_value prototype; + napi_value method_name; + napi_value method_func; + napi_value names[1]; + napi_value values[1]; + napi_value result; + + NODE_API_CALL(env, napi_create_object(env, &prototype)); + NODE_API_CALL( + env, + napi_create_string_utf8(env, "test", NAPI_AUTO_LENGTH, &method_name)); + NODE_API_CALL(env, + napi_create_function(env, + "test", + NAPI_AUTO_LENGTH, + TestCreateObjectWithProperties, + NULL, + &method_func)); + NODE_API_CALL(env, + napi_set_property(env, prototype, method_name, method_func)); + + NODE_API_CALL( + env, napi_create_string_utf8(env, "value", NAPI_AUTO_LENGTH, &names[0])); + NODE_API_CALL(env, napi_create_int32(env, 42, &values[0])); + + NODE_API_CALL(env, + napi_create_object_with_properties( + env, prototype, names, values, 1, &result)); + + return result; +} + EXTERN_C_START napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor descriptors[] = { @@ -743,6 +816,12 @@ napi_value Init(napi_env env, napi_value exports) { DECLARE_NODE_API_PROPERTY("TestGetProperty", TestGetProperty), DECLARE_NODE_API_PROPERTY("TestFreeze", TestFreeze), DECLARE_NODE_API_PROPERTY("TestSeal", TestSeal), + DECLARE_NODE_API_PROPERTY("TestCreateObjectWithProperties", + TestCreateObjectWithProperties), + DECLARE_NODE_API_PROPERTY("TestCreateObjectWithPropertiesEmpty", + TestCreateObjectWithPropertiesEmpty), + DECLARE_NODE_API_PROPERTY("TestCreateObjectWithCustomPrototype", + TestCreateObjectWithCustomPrototype), }; init_test_null(env, exports); diff --git a/test/js-native-api/test_promise/test.js b/test/js-native-api/test_promise/test.js index feaa4ebfef688a..c53dbb5459ad10 100644 --- a/test/js-native-api/test_promise/test.js +++ b/test/js-native-api/test_promise/test.js @@ -50,9 +50,9 @@ test_promise.concludeCurrentPromise(undefined, true); const rejectPromise = Promise.reject(-1); const expected_reason = -1; assert.strictEqual(test_promise.isPromise(rejectPromise), true); -rejectPromise.catch((reason) => { +rejectPromise.catch(common.mustCall((reason) => { assert.strictEqual(reason, expected_reason); -}); +})); assert.strictEqual(test_promise.isPromise(2.4), false); assert.strictEqual(test_promise.isPromise('I promise!'), false); diff --git a/test/known_issues/test-dgram-bind-shared-ports-after-port-0.js b/test/known_issues/test-dgram-bind-shared-ports-after-port-0.js index 9d668b702880e7..7fc5447e2b5ef1 100644 --- a/test/known_issues/test-dgram-bind-shared-ports-after-port-0.js +++ b/test/known_issues/test-dgram-bind-shared-ports-after-port-0.js @@ -21,25 +21,25 @@ if (cluster.isPrimary) { if (err.code === 'ENOTSUP') throw err; }); - worker1.on('message', (msg) => { + worker1.on('message', common.mustCall((msg) => { if (typeof msg !== 'object') process.exit(0); if (msg.message !== 'success') process.exit(0); if (typeof msg.port1 !== 'number') process.exit(0); const worker2 = cluster.fork({ PRT1: msg.port1 }); worker2.on('message', () => process.exit(0)); - worker2.on('exit', (code, signal) => { + worker2.on('exit', common.mustCall((code, signal) => { // This is the droid we are looking for assert.strictEqual(code, 0); assert.strictEqual(signal, null); - }); + })); // cleanup anyway process.on('exit', () => { worker1.send(BYE); worker2.send(BYE); }); - }); + })); // end primary code } else { // worker code diff --git a/test/known_issues/test-fs-cp-non-utf8.js b/test/known_issues/test-fs-cp-non-utf8.js index 12c04a4227f6c2..814859be8ea63e 100644 --- a/test/known_issues/test-fs-cp-non-utf8.js +++ b/test/known_issues/test-fs-cp-non-utf8.js @@ -9,7 +9,7 @@ if (!common.isLinux) { common.skip('This test is only applicable to Linux'); } -const { ok, strictEqual } = require('assert'); +const assert = require('assert'); const { join } = require('path'); const path = require('path'); const tmpdir = require('../common/tmpdir'); @@ -42,8 +42,8 @@ const name = Buffer.from([ const testPath = Buffer.concat([tmpdirPath, sepBuf, name]); writeFileSync(testPath, 'test content'); -ok(existsSync(testPath)); -strictEqual(readFileSync(testPath, 'utf8'), 'test content'); +assert.ok(existsSync(testPath)); +assert.strictEqual(readFileSync(testPath, 'utf8'), 'test content'); // The cpSync is expected to fail because the implementation does not // properly handle non-UTF8 names in the path. diff --git a/test/known_issues/test-http-clientrequest-end-contentlength.js b/test/known_issues/test-http-clientrequest-end-contentlength.js index 9d5370ad07a303..988dd08bd26e7c 100644 --- a/test/known_issues/test-http-clientrequest-end-contentlength.js +++ b/test/known_issues/test-http-clientrequest-end-contentlength.js @@ -16,9 +16,9 @@ const response = 'content-length: 19\r\n'; const methods = [ 'GET', 'HEAD', 'DELETE', 'POST', 'PATCH', 'PUT', 'OPTIONS' ]; const server = http.createServer(common.mustCall(function(req, res) { - req.on('data', function(chunk) { + req.on('data', common.mustCall((chunk) => { assert.strictEqual(chunk, Buffer.from(upload)); - }); + })); res.setHeader('Content-Type', 'text/plain'); let payload = `${req.method}\r\n`; for (let i = 0; i < req.rawHeaders.length; i += 2) { @@ -30,22 +30,22 @@ const server = http.createServer(common.mustCall(function(req, res) { res.end(payload); }), methods.length); -server.listen(0, function tryNextRequest() { +server.listen(0, common.mustCall(function tryNextRequest() { const method = methods.pop(); if (method === undefined) return; const port = server.address().port; - const req = http.request({ method, port }, function(res) { + const req = http.request({ method, port }, common.mustCall((res) => { const chunks = []; res.on('data', function(chunk) { chunks.push(chunk); }); - res.on('end', function() { + res.on('end', common.mustCall(() => { const received = Buffer.concat(chunks).toString(); const expected = method.toLowerCase() + '\r\n' + response; assert.strictEqual(received.toLowerCase(), expected); tryNextRequest(); - }); - }); + })); + })); req.end(upload); -}).unref(); +})).unref(); diff --git a/test/known_issues/test-http-clientrequest-end-empty-response-body.js b/test/known_issues/test-http-clientrequest-end-empty-response-body.js index 2edbe239a3cae2..36aad2ed047075 100644 --- a/test/known_issues/test-http-clientrequest-end-empty-response-body.js +++ b/test/known_issues/test-http-clientrequest-end-empty-response-body.js @@ -17,9 +17,9 @@ const response = ''; const methods = [ 'GET', 'HEAD', 'DELETE', 'POST', 'PATCH', 'PUT', 'OPTIONS' ]; const server = http.createServer(common.mustCall(function(req, res) { - req.on('data', function(chunk) { + req.on('data', common.mustCall((chunk) => { assert.strictEqual(chunk.toString(), upload); - }); + })); res.setHeader('Content-Type', 'text/plain'); res.write(`${req.method}\r\n`); for (let i = 0; i < req.rawHeaders.length; i += 2) { @@ -31,22 +31,22 @@ const server = http.createServer(common.mustCall(function(req, res) { res.end(); }), methods.length); -server.listen(0, function tryNextRequest() { +server.listen(0, common.mustCall(function tryNextRequest() { const method = methods.pop(); if (method === undefined) return; const port = server.address().port; - const req = http.request({ method, port }, function(res) { + const req = http.request({ method, port }, common.mustCall((res) => { const chunks = []; res.on('data', function(chunk) { chunks.push(chunk); }); - res.on('end', function() { + res.on('end', common.mustCall(() => { const received = Buffer.concat(chunks).toString(); const expected = method.toLowerCase() + '\r\n' + response; assert.strictEqual(received.toLowerCase(), expected); tryNextRequest(); - }); - }); + })); + })); req.end(); -}).unref(); +})).unref(); diff --git a/test/known_issues/test-http-clientrequest-write-chunked.js b/test/known_issues/test-http-clientrequest-write-chunked.js index 2cf63a8be85297..77d9f503fbd07c 100644 --- a/test/known_issues/test-http-clientrequest-write-chunked.js +++ b/test/known_issues/test-http-clientrequest-write-chunked.js @@ -16,9 +16,9 @@ const response = 'transfer-encoding: chunked\r\n'; const methods = [ 'GET', 'HEAD', 'DELETE', 'POST', 'PATCH', 'PUT', 'OPTIONS' ]; const server = http.createServer(common.mustCall(function(req, res) { - req.on('data', function(chunk) { + req.on('data', common.mustCall((chunk) => { assert.strictEqual(chunk.toString(), upload); - }); + })); res.setHeader('Content-Type', 'text/plain'); res.write(`${req.method}\r\n`); for (let i = 0; i < req.rawHeaders.length; i += 2) { @@ -30,23 +30,23 @@ const server = http.createServer(common.mustCall(function(req, res) { res.end(); }), methods.length); -server.listen(0, function tryNextRequest() { +server.listen(0, common.mustCall(function tryNextRequest() { const method = methods.pop(); if (method === undefined) return; const port = server.address().port; - const req = http.request({ method, port }, function(res) { + const req = http.request({ method, port }, common.mustCall((res) => { const chunks = []; res.on('data', function(chunk) { chunks.push(chunk); }); - res.on('end', function() { + res.on('end', common.mustCall(() => { const received = Buffer.concat(chunks).toString(); const expected = method.toLowerCase() + '\r\n' + response; assert.strictEqual(received.toLowerCase(), expected); tryNextRequest(); - }); - }); + })); + })); req.write(upload); req.end(); -}).unref(); +})).unref(); diff --git a/test/known_issues/test-http-path-contains-unicode.js b/test/known_issues/test-http-path-contains-unicode.js index 1e063a3e70fad2..dfa632922b1d1e 100644 --- a/test/known_issues/test-http-path-contains-unicode.js +++ b/test/known_issues/test-http-path-contains-unicode.js @@ -22,7 +22,7 @@ const server = http.createServer(common.mustCall(function(req, res) { })); -server.listen(0, () => { +server.listen(0, common.mustCall(() => { http.request({ port: server.address().port, path: expected, @@ -33,4 +33,4 @@ server.listen(0, () => { console.log(e.message); process.exit(1); }).end(); -}); +})); diff --git a/test/known_issues/test-inspector-cluster-port-clash.js b/test/known_issues/test-inspector-cluster-port-clash.js index e5daee61b78ff6..14f09016c485b7 100644 --- a/test/known_issues/test-inspector-cluster-port-clash.js +++ b/test/known_issues/test-inspector-cluster-port-clash.js @@ -30,11 +30,11 @@ function serialFork() { const worker = cluster.fork(); worker.on('error', (err) => assert.fail(err)); // No common.mustCall since 1 out of 3 should fail. - worker.on('online', () => { + worker.on('online', common.mustCall(() => { worker.on('message', common.mustCall((message) => { ports.push(message.debugPort); })); - }); + })); worker.on('exit', common.mustCall((code, signal) => { assert.strictEqual(signal, null); // worker 2 should fail because of port clash with `server` diff --git a/test/module-hooks/test-module-hooks-load-async-and-sync.js b/test/module-hooks/test-module-hooks-load-async-and-sync.js new file mode 100644 index 00000000000000..75f4987942f93d --- /dev/null +++ b/test/module-hooks/test-module-hooks-load-async-and-sync.js @@ -0,0 +1,32 @@ +'use strict'; +// This tests that sync and async hooks can be mixed. + +require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const fixtures = require('../common/fixtures'); + +const app = fixtures.path('module-hooks', 'sync-and-async', 'app.js'); + +const testCases = [ + // When mixing sync and async hooks, the sync ones always run first. + { preload: ['sync-customize', 'async-customize'], stdout: 'customized by sync hook' }, + { preload: ['async-customize', 'sync-customize'], stdout: 'customized by sync hook' }, + // It should still work when neither hook does any customization. + { preload: ['sync-forward', 'async-forward'], stdout: 'Hello world' }, + { preload: ['async-forward', 'sync-forward'], stdout: 'Hello world' }, + // It should work when only one hook is customizing. + { preload: ['sync-customize', 'async-forward'], stdout: 'customized by sync hook' }, + { preload: ['async-customize', 'sync-forward'], stdout: 'customized by async hook' }, +]; + + +for (const { preload, stdout } of testCases) { + const importArgs = []; + for (const p of preload) { + importArgs.push('--import', fixtures.fileURL(`module-hooks/sync-and-async/${p}.js`)); + } + spawnSyncAndAssert(process.execPath, [...importArgs, app], { + stdout, + trim: true, + }); +} diff --git a/test/module-hooks/test-module-hooks-require-esm.js b/test/module-hooks/test-module-hooks-require-esm.js new file mode 100644 index 00000000000000..a3bb0dd2c4bb50 --- /dev/null +++ b/test/module-hooks/test-module-hooks-require-esm.js @@ -0,0 +1,72 @@ +'use strict'; + +// This tests that the async loader hooks can be invoked for require(esm). + +require('../common'); +const common = require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const fixtures = require('../common/fixtures'); +const assert = require('assert'); + +function assertSubGraph(output) { + // FIXME(node:59666): the async resolve hook invoked for require() in imported CJS only get the URL, + // not the specifier. This may be fixable if we re-implement the async loader hooks from within + // the synchronous loader hooks and use the original require() implementation. + assert.match(output, /resolve .+esm\.mjs from file:.+main\.cjs/); + assert.match(output, /load file:.+esm\.mjs/); + + assert.match(output, /resolve \.\/inner\.mjs from file:.+esm\.mjs/); + assert.match(output, /load file:.+inner\.mjs/); + + assert.match(output, /resolve \.\/cjs\.cjs from file:.+esm\.mjs/); + assert.match(output, /load file:.+cjs\.cjs/); + + // FIXME(node:59666): see above. + assert.match(output, /resolve .+inner\.cjs from file:.+cjs\.cjs/); + assert.match(output, /load file:.+inner\.cjs/); + + assert.match(output, /esmValue in main\.cjs: esm/); + assert.match(output, /cjsValue in main\.cjs: commonjs/); +} + +spawnSyncAndAssert(process.execPath, [ + '--import', + fixtures.fileURL('module-hooks', 'register-logger-async-hooks.mjs'), + fixtures.path('module-hooks', 'require-esm', 'main.cjs'), +], { + stdout: common.mustCall((output) => { + // The graph is: + // main.cjs + // -> esm.mjs + // -> inner.mjs + // -> cjs.cjs + // -> inner.cjs + assert.match(output, /resolve .+main\.cjs from undefined/); + assert.match(output, /load file:.+main\.cjs/); + + assertSubGraph(output); + }), +}); + +spawnSyncAndAssert(process.execPath, [ + '--import', + fixtures.fileURL('module-hooks', 'register-logger-async-hooks.mjs'), + fixtures.path('module-hooks', 'require-esm', 'main.mjs'), +], { + stdout: common.mustCall((output) => { + // The graph is: + // main.mjs + // -> main.cjs + // -> esm.mjs + // -> inner.mjs + // -> cjs.cjs + // -> inner.cjs + assert.match(output, /resolve .+main\.mjs from undefined/); + assert.match(output, /load file:.+main\.mjs/); + + assert.match(output, /resolve .+main\.cjs from file:.+main\.mjs/); + assert.match(output, /load file:.+main\.cjs/); + + assertSubGraph(output); + }), +}); diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index 5cb15393e42d4f..8ac30c589926a4 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -50,16 +50,14 @@ test-runner-run-watch: PASS, FLAKY # https://github.com/nodejs/node/issues/58353 test-http2-debug: PASS, FLAKY -[$system==linux || $system==win32] -# https://github.com/nodejs/node/issues/49605 -test-runner-watch-mode: PASS,FLAKY - [$system==macos] # https://github.com/nodejs/node/issues/42741 test-http-server-headers-timeout-keepalive: PASS,FLAKY test-http-server-request-timeout-keepalive: PASS,FLAKY # https://github.com/nodejs/node/issues/54534 test-runner-run-watch: PASS, FLAKY +# https://github.com/nodejs/node/issues/60050 +test-cluster-dgram-1: SKIP [$arch==arm || $arch==arm64] # https://github.com/nodejs/node/pull/31178 diff --git a/test/parallel/test-abortcontroller-internal.js b/test/parallel/test-abortcontroller-internal.js index 4347d308de3545..63dd26c36e32a0 100644 --- a/test/parallel/test-abortcontroller-internal.js +++ b/test/parallel/test-abortcontroller-internal.js @@ -2,9 +2,7 @@ 'use strict'; require('../common'); -const { - strictEqual, -} = require('assert'); +const assert = require('assert'); const { test, @@ -30,5 +28,5 @@ test('A weak event listener should not prevent gc', async () => { await sleep(10); globalThis.gc(); - strictEqual(ref.deref(), undefined); + assert.strictEqual(ref.deref(), undefined); }); diff --git a/test/parallel/test-abortcontroller.js b/test/parallel/test-abortcontroller.js index 87781f849ffb52..948bd208cd2b90 100644 --- a/test/parallel/test-abortcontroller.js +++ b/test/parallel/test-abortcontroller.js @@ -1,15 +1,10 @@ // Flags: --expose-gc 'use strict'; -require('../common'); +const common = require('../common'); const { inspect } = require('util'); -const { - ok, - notStrictEqual, - strictEqual, - throws, -} = require('assert'); +const assert = require('assert'); const { test, @@ -25,34 +20,34 @@ const { setTimeout: sleep } = require('timers/promises'); test('Abort is fired with the correct event type on AbortControllers', () => { // Tests that abort is fired with the correct event type on AbortControllers const ac = new AbortController(); - ok(ac.signal); + assert.ok(ac.signal); - const fn = mock.fn((event) => { - ok(event); - strictEqual(event.type, 'abort'); - }); + const fn = mock.fn(common.mustCall((event) => { + assert.ok(event); + assert.strictEqual(event.type, 'abort'); + }, 2)); ac.signal.onabort = fn; ac.signal.addEventListener('abort', fn); ac.abort(); ac.abort(); - ok(ac.signal.aborted); + assert.ok(ac.signal.aborted); - strictEqual(fn.mock.calls.length, 2); + assert.strictEqual(fn.mock.calls.length, 2); }); test('Abort events are trusted', () => { // Tests that abort events are trusted const ac = new AbortController(); - const fn = mock.fn((event) => { - ok(event.isTrusted); - }); + const fn = mock.fn(common.mustCall((event) => { + assert.ok(event.isTrusted); + })); ac.signal.onabort = fn; ac.abort(); - strictEqual(fn.mock.calls.length, 1); + assert.strictEqual(fn.mock.calls.length, 1); }); test('Abort events have the same isTrusted reference', () => { @@ -73,14 +68,14 @@ test('Abort events have the same isTrusted reference', () => { const firstTrusted = Reflect.getOwnPropertyDescriptor(Object.getPrototypeOf(ev1), 'isTrusted').get; const secondTrusted = Reflect.getOwnPropertyDescriptor(Object.getPrototypeOf(ev2), 'isTrusted').get; const untrusted = Reflect.getOwnPropertyDescriptor(Object.getPrototypeOf(ev3), 'isTrusted').get; - strictEqual(firstTrusted, secondTrusted); - strictEqual(untrusted, firstTrusted); + assert.strictEqual(firstTrusted, secondTrusted); + assert.strictEqual(untrusted, firstTrusted); }); test('AbortSignal is impossible to construct manually', () => { // Tests that AbortSignal is impossible to construct manually const ac = new AbortController(); - throws(() => new ac.signal.constructor(), { + assert.throws(() => new ac.signal.constructor(), { code: 'ERR_ILLEGAL_CONSTRUCTOR', }); }); @@ -89,13 +84,13 @@ test('Symbol.toStringTag is correct', () => { // Symbol.toStringTag const toString = (o) => Object.prototype.toString.call(o); const ac = new AbortController(); - strictEqual(toString(ac), '[object AbortController]'); - strictEqual(toString(ac.signal), '[object AbortSignal]'); + assert.strictEqual(toString(ac), '[object AbortController]'); + assert.strictEqual(toString(ac.signal), '[object AbortSignal]'); }); test('AbortSignal.abort() creates an already aborted signal', () => { const signal = AbortSignal.abort(); - ok(signal.aborted); + assert.ok(signal.aborted); }); test('AbortController properties and methods valiate the receiver', () => { @@ -106,7 +101,7 @@ test('AbortController properties and methods valiate the receiver', () => { const acAbort = AbortController.prototype.abort; const goodController = new AbortController(); - ok(acSignalGet.call(goodController)); + assert.ok(acSignalGet.call(goodController)); acAbort.call(goodController); const badAbortControllers = [ @@ -119,11 +114,11 @@ test('AbortController properties and methods valiate the receiver', () => { { __proto__: AbortController.prototype }, ]; for (const badController of badAbortControllers) { - throws( + assert.throws( () => acSignalGet.call(badController), { name: 'TypeError' } ); - throws( + assert.throws( () => acAbort.call(badController), { name: 'TypeError' } ); @@ -137,7 +132,7 @@ test('AbortSignal properties validate the receiver', () => { ).get; const goodSignal = new AbortController().signal; - strictEqual(signalAbortedGet.call(goodSignal), false); + assert.strictEqual(signalAbortedGet.call(goodSignal), false); const badAbortSignals = [ null, @@ -149,7 +144,7 @@ test('AbortSignal properties validate the receiver', () => { { __proto__: AbortSignal.prototype }, ]; for (const badSignal of badAbortSignals) { - throws( + assert.throws( () => signalAbortedGet.call(badSignal), { name: 'TypeError' } ); @@ -158,38 +153,38 @@ test('AbortSignal properties validate the receiver', () => { test('AbortController inspection depth 1 or null works', () => { const ac = new AbortController(); - strictEqual(inspect(ac, { depth: 1 }), - 'AbortController { signal: [AbortSignal] }'); - strictEqual(inspect(ac, { depth: null }), - 'AbortController { signal: AbortSignal { aborted: false } }'); + assert.strictEqual(inspect(ac, { depth: 1 }), + 'AbortController { signal: [AbortSignal] }'); + assert.strictEqual(inspect(ac, { depth: null }), + 'AbortController { signal: AbortSignal { aborted: false } }'); }); test('AbortSignal reason is set correctly', () => { // Test AbortSignal.reason const ac = new AbortController(); ac.abort('reason'); - strictEqual(ac.signal.reason, 'reason'); + assert.strictEqual(ac.signal.reason, 'reason'); }); test('AbortSignal reasonable is set correctly with AbortSignal.abort()', () => { // Test AbortSignal.reason const signal = AbortSignal.abort('reason'); - strictEqual(signal.reason, 'reason'); + assert.strictEqual(signal.reason, 'reason'); }); test('AbortSignal.timeout() works as expected', async () => { // Test AbortSignal timeout const signal = AbortSignal.timeout(10); - ok(!signal.aborted); + assert.ok(!signal.aborted); const { promise, resolve } = Promise.withResolvers(); - const fn = mock.fn(() => { - ok(signal.aborted); - strictEqual(signal.reason.name, 'TimeoutError'); - strictEqual(signal.reason.code, 23); + const fn = mock.fn(common.mustCall(() => { + assert.ok(signal.aborted); + assert.strictEqual(signal.reason.name, 'TimeoutError'); + assert.strictEqual(signal.reason.code, 23); resolve(); - }); + })); setTimeout(fn, 20); await promise; @@ -205,7 +200,7 @@ test('AbortSignal.timeout() does not prevent the signal from being collected', a await sleep(10); globalThis.gc(); - strictEqual(ref.deref(), undefined); + assert.strictEqual(ref.deref(), undefined); }); test('AbortSignal with a timeout is not collected while there is an active listener', async () => { @@ -220,14 +215,14 @@ test('AbortSignal with a timeout is not collected while there is an active liste await sleep(10); globalThis.gc(); - notStrictEqual(ref.deref(), undefined); - ok(ref.deref() instanceof AbortSignal); + assert.notStrictEqual(ref.deref(), undefined); + assert.ok(ref.deref() instanceof AbortSignal); ref.deref().removeEventListener('abort', handler); await sleep(10); globalThis.gc(); - strictEqual(ref.deref(), undefined); + assert.strictEqual(ref.deref(), undefined); }); test('Setting a long timeout should not keep the process open', () => { @@ -237,18 +232,18 @@ test('Setting a long timeout should not keep the process open', () => { test('AbortSignal.reason should default', () => { // Test AbortSignal.reason default const signal = AbortSignal.abort(); - ok(signal.reason instanceof DOMException); - strictEqual(signal.reason.code, 20); + assert.ok(signal.reason instanceof DOMException); + assert.strictEqual(signal.reason.code, 20); const ac = new AbortController(); ac.abort(); - ok(ac.signal.reason instanceof DOMException); - strictEqual(ac.signal.reason.code, 20); + assert.ok(ac.signal.reason instanceof DOMException); + assert.strictEqual(ac.signal.reason.code, 20); }); test('abortSignal.throwIfAborted() works as expected', () => { // Test abortSignal.throwIfAborted() - throws(() => AbortSignal.abort().throwIfAborted(), { + assert.throws(() => AbortSignal.abort().throwIfAborted(), { code: 20, name: 'AbortError', }); @@ -262,7 +257,7 @@ test('abortSignal.throwIfAobrted() works as expected (2)', () => { const originalDesc = Reflect.getOwnPropertyDescriptor(AbortSignal.prototype, 'aborted'); const actualReason = new Error(); Reflect.defineProperty(AbortSignal.prototype, 'aborted', { value: false }); - throws(() => AbortSignal.abort(actualReason).throwIfAborted(), actualReason); + assert.throws(() => AbortSignal.abort(actualReason).throwIfAborted(), actualReason); Reflect.defineProperty(AbortSignal.prototype, 'aborted', originalDesc); }); @@ -271,6 +266,6 @@ test('abortSignal.throwIfAobrted() works as expected (3)', () => { const actualReason = new Error(); const fakeExcuse = new Error(); Reflect.defineProperty(AbortSignal.prototype, 'reason', { value: fakeExcuse }); - throws(() => AbortSignal.abort(actualReason).throwIfAborted(), actualReason); + assert.throws(() => AbortSignal.abort(actualReason).throwIfAborted(), actualReason); Reflect.defineProperty(AbortSignal.prototype, 'reason', originalDesc); }); diff --git a/test/parallel/test-aborted-util.js b/test/parallel/test-aborted-util.js index 0566204ccdb074..f352cacb48c652 100644 --- a/test/parallel/test-aborted-util.js +++ b/test/parallel/test-aborted-util.js @@ -1,13 +1,9 @@ // Flags: --expose-gc 'use strict'; -require('../common'); +const common = require('../common'); const { aborted } = require('util'); -const { - match, - rejects, - strictEqual, -} = require('assert'); +const assert = require('assert'); const { getEventListeners } = require('events'); const { inspect } = require('util'); @@ -20,8 +16,8 @@ test('Aborted works when provided a resource', async () => { const promise = aborted(ac.signal, {}); ac.abort(); await promise; - strictEqual(ac.signal.aborted, true); - strictEqual(getEventListeners(ac.signal, 'abort').length, 0); + assert.strictEqual(ac.signal.aborted, true); + assert.strictEqual(getEventListeners(ac.signal, 'abort').length, 0); }); test('Aborted with gc cleanup', async () => { @@ -31,23 +27,23 @@ test('Aborted with gc cleanup', async () => { const abortedPromise = aborted(ac.signal, {}); const { promise, resolve } = Promise.withResolvers(); - setImmediate(() => { + setImmediate(common.mustCall(() => { globalThis.gc(); ac.abort(); - strictEqual(ac.signal.aborted, true); - strictEqual(getEventListeners(ac.signal, 'abort').length, 0); + assert.strictEqual(ac.signal.aborted, true); + assert.strictEqual(getEventListeners(ac.signal, 'abort').length, 0); resolve(); - }); + })); await promise; // Ensure that the promise is still pending - match(inspect(abortedPromise), //); + assert.match(inspect(abortedPromise), //); }); test('Fails with error if not provided AbortSignal', async () => { await Promise.all([{}, null, undefined, Symbol(), [], 1, 0, 1n, true, false, 'a', () => {}].map((sig) => - rejects(aborted(sig, {}), { + assert.rejects(aborted(sig, {}), { code: 'ERR_INVALID_ARG_TYPE', }) )); @@ -57,7 +53,7 @@ test('Fails if not provided a resource', async () => { // Fails if not provided a resource const ac = new AbortController(); await Promise.all([null, undefined, 0, 1, 0n, 1n, Symbol(), '', 'a'].map((resource) => - rejects(aborted(ac.signal, resource), { + assert.rejects(aborted(ac.signal, resource), { code: 'ERR_INVALID_ARG_TYPE', }) )); @@ -82,10 +78,10 @@ function lazySpawn() { test('Does not hang forever', { skip: !lazySpawn() }, async () => { const { promise, resolve } = Promise.withResolvers(); const childProcess = spawn(process.execPath, ['--input-type=module']); - childProcess.on('exit', (code) => { - strictEqual(code, 13); + childProcess.on('exit', common.mustCall((code) => { + assert.strictEqual(code, 13); resolve(); - }); + })); childProcess.stdin.end(` import { aborted } from 'node:util'; await aborted(new AbortController().signal, {}); diff --git a/test/parallel/test-abortsignal-cloneable.js b/test/parallel/test-abortsignal-cloneable.js index cfd194909db38e..7a90cbde5e13ab 100644 --- a/test/parallel/test-abortsignal-cloneable.js +++ b/test/parallel/test-abortsignal-cloneable.js @@ -1,7 +1,7 @@ 'use strict'; -require('../common'); -const { ok, strictEqual } = require('assert'); +const common = require('../common'); +const assert = require('assert'); const { setImmediate: sleep } = require('timers/promises'); const { transferableAbortSignal, @@ -25,13 +25,13 @@ test('Can create a transferable abort controller', async () => { const abort3 = Promise.withResolvers(); const abortResolvers = [abort1, abort2, abort3]; - mc.port1.onmessage = ({ data }) => { - data.addEventListener('abort', () => { - strictEqual(data.reason, 'boom'); + mc.port1.onmessage = common.mustCallAtLeast(({ data }) => { + data.addEventListener('abort', common.mustCall(() => { + assert.strictEqual(data.reason, 'boom'); abortResolvers.shift().resolve(); - }); + })); setupResolvers.shift().resolve(); - }; + }); mc.port2.postMessage(ac.signal, [ac.signal]); @@ -40,10 +40,10 @@ test('Can create a transferable abort controller', async () => { // Although we're using transfer semantics, the local AbortSignal // is still usable locally. - ac.signal.addEventListener('abort', () => { - strictEqual(ac.signal.reason, 'boom'); + ac.signal.addEventListener('abort', common.mustCall(() => { + assert.strictEqual(ac.signal.reason, 'boom'); abortResolvers.shift().resolve(); - }); + })); await Promise.all([ setup1.promise, setup2.promise ]); @@ -57,16 +57,16 @@ test('Can create a transferable abort controller', async () => { test('Can create a transferable abort signal', async () => { const signal = transferableAbortSignal(AbortSignal.abort('boom')); - ok(signal.aborted); - strictEqual(signal.reason, 'boom'); + assert.ok(signal.aborted); + assert.strictEqual(signal.reason, 'boom'); const mc = new MessageChannel(); const { promise, resolve } = Promise.withResolvers(); - mc.port1.onmessage = ({ data }) => { - ok(data instanceof AbortSignal); - ok(data.aborted); - strictEqual(data.reason, 'boom'); + mc.port1.onmessage = common.mustCallAtLeast(({ data }) => { + assert.ok(data instanceof AbortSignal); + assert.ok(data.aborted); + assert.strictEqual(data.reason, 'boom'); resolve(); - }; + }); mc.port2.postMessage(signal, [signal]); await promise; mc.port1.close(); @@ -86,6 +86,6 @@ test('A cloned AbortSignal does not keep the event loop open', async () => { // the loop runs long enough for the test to complete. await sleep(); await sleep(); - strictEqual(fn.mock.calls.length, 1); + assert.strictEqual(fn.mock.calls.length, 1); mc.port2.close(); }); diff --git a/test/parallel/test-als-defaultvalue-original.js b/test/parallel/test-als-defaultvalue-original.js index 7ea5ec0eab45c2..1bfe239abfcf69 100644 --- a/test/parallel/test-als-defaultvalue-original.js +++ b/test/parallel/test-als-defaultvalue-original.js @@ -7,26 +7,23 @@ const { AsyncLocalStorage, } = require('async_hooks'); -const { - strictEqual, - throws, -} = require('assert'); +const assert = require('assert'); // ============================================================================ // The defaultValue option const als1 = new AsyncLocalStorage(); -strictEqual(als1.getStore(), undefined, 'value should be undefined'); +assert.strictEqual(als1.getStore(), undefined); const als2 = new AsyncLocalStorage({ defaultValue: 'default' }); -strictEqual(als2.getStore(), 'default', 'value should be "default"'); +assert.strictEqual(als2.getStore(), 'default'); const als3 = new AsyncLocalStorage({ defaultValue: 42 }); -strictEqual(als3.getStore(), 42, 'value should be 42'); +assert.strictEqual(als3.getStore(), 42); const als4 = new AsyncLocalStorage({ defaultValue: null }); -strictEqual(als4.getStore(), null, 'value should be null'); +assert.strictEqual(als4.getStore(), null); -throws(() => new AsyncLocalStorage(null), { +assert.throws(() => new AsyncLocalStorage(null), { code: 'ERR_INVALID_ARG_TYPE', }); @@ -34,7 +31,7 @@ throws(() => new AsyncLocalStorage(null), { // The name option const als5 = new AsyncLocalStorage({ name: 'test' }); -strictEqual(als5.name, 'test'); +assert.strictEqual(als5.name, 'test'); const als6 = new AsyncLocalStorage(); -strictEqual(als6.name, ''); +assert.strictEqual(als6.name, ''); diff --git a/test/parallel/test-als-defaultvalue.js b/test/parallel/test-als-defaultvalue.js index 0e905104f27c6b..5b5b43b57a72e6 100644 --- a/test/parallel/test-als-defaultvalue.js +++ b/test/parallel/test-als-defaultvalue.js @@ -7,26 +7,23 @@ const { AsyncLocalStorage, } = require('async_hooks'); -const { - strictEqual, - throws, -} = require('assert'); +const assert = require('assert'); // ============================================================================ // The defaultValue option const als1 = new AsyncLocalStorage(); -strictEqual(als1.getStore(), undefined, 'value should be undefined'); +assert.strictEqual(als1.getStore(), undefined); const als2 = new AsyncLocalStorage({ defaultValue: 'default' }); -strictEqual(als2.getStore(), 'default', 'value should be "default"'); +assert.strictEqual(als2.getStore(), 'default'); const als3 = new AsyncLocalStorage({ defaultValue: 42 }); -strictEqual(als3.getStore(), 42, 'value should be 42'); +assert.strictEqual(als3.getStore(), 42); const als4 = new AsyncLocalStorage({ defaultValue: null }); -strictEqual(als4.getStore(), null, 'value should be null'); +assert.strictEqual(als4.getStore(), null); -throws(() => new AsyncLocalStorage(null), { +assert.throws(() => new AsyncLocalStorage(null), { code: 'ERR_INVALID_ARG_TYPE', }); @@ -34,7 +31,7 @@ throws(() => new AsyncLocalStorage(null), { // The name option const als5 = new AsyncLocalStorage({ name: 'test' }); -strictEqual(als5.name, 'test'); +assert.strictEqual(als5.name, 'test'); const als6 = new AsyncLocalStorage(); -strictEqual(als6.name, ''); +assert.strictEqual(als6.name, ''); diff --git a/test/parallel/test-assert-async.js b/test/parallel/test-assert-async.js index bcf3d55622b863..3fc7e3c0a0ea88 100644 --- a/test/parallel/test-assert-async.js +++ b/test/parallel/test-assert-async.js @@ -85,7 +85,7 @@ const invalidThenableFunc = () => { } { - const handler = (err) => { + const handler = common.mustCallAtLeast((err) => { assert(err instanceof assert.AssertionError, `${err.name} is not instance of AssertionError`); assert.strictEqual(err.code, 'ERR_ASSERTION'); @@ -94,7 +94,7 @@ const invalidThenableFunc = () => { assert.strictEqual(err.operator, 'rejects'); assert.ok(!err.stack.includes('at Function.rejects')); return true; - }; + }); let promise = assert.rejects(async () => {}, common.mustNotCall()); promises.push(assert.rejects(promise, common.mustCall(handler))); @@ -132,14 +132,14 @@ promises.push(assert.rejects( )); { - const handler = (generated, actual, err) => { + const handler = common.mustCallAtLeast((generated, actual, err) => { assert.strictEqual(err.generatedMessage, generated); assert.strictEqual(err.code, 'ERR_ASSERTION'); assert.strictEqual(err.actual, actual); assert.strictEqual(err.operator, 'rejects'); assert.match(err.stack, /rejects/); return true; - }; + }); const err = new Error(); promises.push(assert.rejects( assert.rejects(Promise.reject(null), { code: 'FOO' }), @@ -192,14 +192,14 @@ promises.push(assert.rejects( }) ); - const handler1 = (err) => { + const handler1 = common.mustCallAtLeast((err) => { assert(err instanceof assert.AssertionError, `${err.name} is not instance of AssertionError`); assert.strictEqual(err.code, 'ERR_ASSERTION'); assert.strictEqual(err.message, 'Failed'); return true; - }; - const handler2 = (err) => { + }); + const handler2 = common.mustCallAtLeast((err) => { assert(err instanceof assert.AssertionError, `${err.name} is not instance of AssertionError`); assert.strictEqual(err.code, 'ERR_ASSERTION'); @@ -209,7 +209,7 @@ promises.push(assert.rejects( assert.ok(err.stack); assert.ok(!err.stack.includes('at Function.doesNotReject')); return true; - }; + }); const rejectingFn = async () => assert.fail(); diff --git a/test/parallel/test-assert-class-destructuring.js b/test/parallel/test-assert-class-destructuring.js index eb353f095d2da2..ac82ab58631269 100644 --- a/test/parallel/test-assert-class-destructuring.js +++ b/test/parallel/test-assert-class-destructuring.js @@ -2,6 +2,7 @@ require('../common'); const assert = require('assert'); +// eslint-disable-next-line node-core/must-call-assert const { Assert } = require('assert'); const { test } = require('node:test'); @@ -18,18 +19,12 @@ test('Assert class destructuring behavior - diff option', () => { assertInstanceFull.throws( () => assertInstanceFull.strictEqual({ a: 1 }, { a: 2 }), - (err) => { - assert.strictEqual(err.diff, 'full'); - return true; - } + { diff: 'full' }, ); assertInstanceSimple.throws( () => assertInstanceSimple.strictEqual({ a: 1 }, { a: 2 }), - (err) => { - assert.strictEqual(err.diff, 'simple'); - return true; - } + { diff: 'simple' }, ); const { strictEqual: strictEqualSimple } = assertInstanceSimple; diff --git a/test/parallel/test-assert-class.js b/test/parallel/test-assert-class.js index 41271af65ffcbe..cccc7a2f36fff9 100644 --- a/test/parallel/test-assert-class.js +++ b/test/parallel/test-assert-class.js @@ -2,6 +2,7 @@ require('../common'); const assert = require('assert'); +// eslint-disable-next-line node-core/must-call-assert const { Assert } = require('assert'); const { inspect } = require('util'); const { test } = require('node:test'); diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js index 6a19e4d0877988..d458a272f2bd61 100644 --- a/test/parallel/test-assert-deep.js +++ b/test/parallel/test-assert-deep.js @@ -1,6 +1,6 @@ 'use strict'; -const { hasCrypto } = require('../common'); +const { mustCall, hasCrypto } = require('../common'); const assert = require('assert'); const util = require('util'); const { test } = require('node:test'); @@ -223,10 +223,10 @@ function assertNotDeepOrStrict(a, b, err, options) { () => assert.deepStrictEqual(b, a), err || { code: 'ERR_ASSERTION' } ); - const partial = () => { + const partial = mustCall(() => { assert.partialDeepStrictEqual(b, a); assert.partialDeepStrictEqual(a, b); - }; + }); if (options?.partial === 'pass') { partial(); } else { diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index ee48c0e1e24817..5db588ff5b94c9 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -491,7 +491,26 @@ test('Custom errors', () => { }); test('Verify that throws() and doesNotThrow() throw on non-functions', () => { - const testBlockTypeError = (method, fn) => { + [ + [assert.throws, 'string'], + [assert.doesNotThrow, 'string'], + [assert.throws, 1], + [assert.doesNotThrow, 1], + [assert.throws, true], + [assert.doesNotThrow, true], + [assert.throws, false], + [assert.doesNotThrow, false], + [assert.throws, []], + [assert.doesNotThrow, []], + [assert.throws, {}], + [assert.doesNotThrow, {}], + [assert.throws, /foo/], + [assert.doesNotThrow, /foo/], + [assert.throws, null], + [assert.doesNotThrow, null], + [assert.throws, undefined], + [assert.doesNotThrow, undefined], + ].forEach(([method, fn]) => { assert.throws( () => method(fn), { @@ -501,26 +520,7 @@ test('Verify that throws() and doesNotThrow() throw on non-functions', () => { invalidArgTypeHelper(fn) } ); - }; - - testBlockTypeError(assert.throws, 'string'); - testBlockTypeError(assert.doesNotThrow, 'string'); - testBlockTypeError(assert.throws, 1); - testBlockTypeError(assert.doesNotThrow, 1); - testBlockTypeError(assert.throws, true); - testBlockTypeError(assert.doesNotThrow, true); - testBlockTypeError(assert.throws, false); - testBlockTypeError(assert.doesNotThrow, false); - testBlockTypeError(assert.throws, []); - testBlockTypeError(assert.doesNotThrow, []); - testBlockTypeError(assert.throws, {}); - testBlockTypeError(assert.doesNotThrow, {}); - testBlockTypeError(assert.throws, /foo/); - testBlockTypeError(assert.doesNotThrow, /foo/); - testBlockTypeError(assert.throws, null); - testBlockTypeError(assert.doesNotThrow, null); - testBlockTypeError(assert.throws, undefined); - testBlockTypeError(assert.doesNotThrow, undefined); + }); }); test('https://github.com/nodejs/node/issues/3275', () => { @@ -582,6 +582,7 @@ test('NaN is handled correctly', () => { }); test('Test strict assert', () => { + // eslint-disable-next-line node-core/must-call-assert const { strict } = require('assert'); strict.throws(() => strict.equal(1, true), strict.AssertionError); @@ -1592,6 +1593,7 @@ test('Additional assert', () => { }); test('assert/strict exists', () => { + // eslint-disable-next-line node-core/must-call-assert assert.strictEqual(require('assert/strict'), assert.strict); }); diff --git a/test/parallel/test-async-hooks-destroy-on-gc.js b/test/parallel/test-async-hooks-destroy-on-gc.js index dd7eef8776cdf3..a401f6651ccc20 100644 --- a/test/parallel/test-async-hooks-destroy-on-gc.js +++ b/test/parallel/test-async-hooks-destroy-on-gc.js @@ -21,7 +21,7 @@ let asyncId = null; asyncId = res.asyncId(); } -setImmediate(() => { +setImmediate(common.mustCall(() => { globalThis.gc(); - setImmediate(() => assert.ok(destroyedIds.has(asyncId))); -}); + setImmediate(common.mustCall(() => assert.ok(destroyedIds.has(asyncId)))); +})); diff --git a/test/parallel/test-async-hooks-enable-before-promise-resolve.js b/test/parallel/test-async-hooks-enable-before-promise-resolve.js index 4f6e65df9d29e3..e6facfb6392e29 100644 --- a/test/parallel/test-async-hooks-enable-before-promise-resolve.js +++ b/test/parallel/test-async-hooks-enable-before-promise-resolve.js @@ -9,13 +9,13 @@ const async_hooks = require('async_hooks'); let initialAsyncId; const promise = new Promise((resolve) => { - setTimeout(() => { + setTimeout(common.mustCall(() => { initialAsyncId = async_hooks.executionAsyncId(); async_hooks.createHook({ after: common.mustCall(2) }).enable(); resolve(); - }, 0); + }), 0); }); promise.then(common.mustCall(() => { diff --git a/test/parallel/test-async-hooks-http-parser-destroy.js b/test/parallel/test-async-hooks-http-parser-destroy.js index 6cbc2043b09583..b2d1fd9a94f1de 100644 --- a/test/parallel/test-async-hooks-http-parser-destroy.js +++ b/test/parallel/test-async-hooks-http-parser-destroy.js @@ -44,12 +44,12 @@ async_hooks.createHook({ } }).enable(); -const server = http.createServer((req, res) => { +const server = http.createServer(common.mustCallAtLeast((req, res) => { req.on('close', common.mustCall(() => { req.on('readable', common.mustNotCall()); })); res.end('Hello'); -}); +})); let keepAliveAgent = new http.Agent({ keepAlive: true, diff --git a/test/parallel/test-async-hooks-recursive-stack-runInAsyncScope.js b/test/parallel/test-async-hooks-recursive-stack-runInAsyncScope.js index bc4ac86e7f1ca1..d0d5ee76e9d115 100644 --- a/test/parallel/test-async-hooks-recursive-stack-runInAsyncScope.js +++ b/test/parallel/test-async-hooks-recursive-stack-runInAsyncScope.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const async_hooks = require('async_hooks'); @@ -7,14 +7,14 @@ const async_hooks = require('async_hooks'); function recurse(n) { const a = new async_hooks.AsyncResource('foobar'); - a.runInAsyncScope(() => { + a.runInAsyncScope(common.mustCall(() => { assert.strictEqual(a.asyncId(), async_hooks.executionAsyncId()); assert.strictEqual(a.triggerAsyncId(), async_hooks.triggerAsyncId()); if (n >= 0) recurse(n - 1); assert.strictEqual(a.asyncId(), async_hooks.executionAsyncId()); assert.strictEqual(a.triggerAsyncId(), async_hooks.triggerAsyncId()); - }); + })); } recurse(1000); diff --git a/test/parallel/test-async-local-storage-contexts.js b/test/parallel/test-async-local-storage-contexts.js index 9a6327133794f6..b63d383fecc4e5 100644 --- a/test/parallel/test-async-local-storage-contexts.js +++ b/test/parallel/test-async-local-storage-contexts.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const vm = require('vm'); const { AsyncLocalStorage } = require('async_hooks'); @@ -26,10 +26,10 @@ vm.runInContext(` const storage = new AsyncLocalStorage(); async function test() { - return storage.run({ test: 'main context' }, async () => { + return storage.run({ test: 'main context' }, common.mustCall(async () => { assert.strictEqual(storage.getStore().test, 'main context'); await 42; assert.strictEqual(storage.getStore().test, 'main context'); - }); + })); } test(); diff --git a/test/parallel/test-async-local-storage-snapshot.js b/test/parallel/test-async-local-storage-snapshot.js index 63e47ba3ce0ac0..169da60c3a3286 100644 --- a/test/parallel/test-async-local-storage-snapshot.js +++ b/test/parallel/test-async-local-storage-snapshot.js @@ -1,7 +1,7 @@ 'use strict'; const common = require('../common'); -const { strictEqual } = require('assert'); +const assert = require('assert'); const { AsyncLocalStorage } = require('async_hooks'); const asyncLocalStorage = new AsyncLocalStorage(); @@ -13,4 +13,4 @@ const result = return asyncLocalStorage.getStore(); }); })); -strictEqual(result, 123); +assert.strictEqual(result, 123); diff --git a/test/parallel/test-async-wrap-promise-after-enabled.js b/test/parallel/test-async-wrap-promise-after-enabled.js index cbca873574c1f8..afd049192bd57b 100644 --- a/test/parallel/test-async-wrap-promise-after-enabled.js +++ b/test/parallel/test-async-wrap-promise-after-enabled.js @@ -32,8 +32,8 @@ const hooks = async_hooks.createHook({ }) }); -setImmediate(() => { +setImmediate(common.mustCall(() => { assert.deepStrictEqual(seenEvents, ['before', 'then', 'after']); -}); +})); hooks.enable(); // After `setImmediate` in order to not catch its init event. diff --git a/test/parallel/test-async-wrap-tlssocket-asyncreset.js b/test/parallel/test-async-wrap-tlssocket-asyncreset.js index e0dd8be2904429..513911978b1dd3 100644 --- a/test/parallel/test-async-wrap-tlssocket-asyncreset.js +++ b/test/parallel/test-async-wrap-tlssocket-asyncreset.js @@ -42,7 +42,7 @@ server.listen( res.socket.on('error', (err) => assert.fail(err)); res.resume(); // Drain the socket and wait for it to be free to reuse - res.socket.once('free', () => { + res.socket.once('free', common.mustCall(() => { // This is the pain point. Internally the Agent will call // `socket._handle.asyncReset()` and if the _handle does not implement // `asyncReset` this will throw TypeError @@ -58,7 +58,7 @@ server.listen( }) ); req2.on('error', (err) => assert.fail(err)); - }); + })); }) ); req.on('error', (err) => assert.fail(err)); diff --git a/test/parallel/test-asyncresource-bind.js b/test/parallel/test-asyncresource-bind.js index 0d1f5fb62ab9eb..fb47a04b1ff1e9 100644 --- a/test/parallel/test-asyncresource-bind.js +++ b/test/parallel/test-asyncresource-bind.js @@ -8,10 +8,10 @@ const fn = common.mustCall(AsyncResource.bind(() => { return executionAsyncId(); })); -setImmediate(() => { +setImmediate(common.mustCall(() => { const asyncId = executionAsyncId(); assert.notStrictEqual(asyncId, fn()); -}); +})); const asyncResource = new AsyncResource('test'); @@ -27,11 +27,11 @@ const fn2 = asyncResource.bind((a, b) => { assert.strictEqual(fn2.length, 2); -setImmediate(() => { +setImmediate(common.mustCall(() => { const asyncId = executionAsyncId(); assert.strictEqual(asyncResource.asyncId(), fn2()); assert.notStrictEqual(asyncId, fn2()); -}); +})); const foo = {}; const fn3 = asyncResource.bind(common.mustCall(function() { diff --git a/test/parallel/test-blob-file-backed.js b/test/parallel/test-blob-file-backed.js index 6e919d2982f78d..f94eae6d6ed760 100644 --- a/test/parallel/test-blob-file-backed.js +++ b/test/parallel/test-blob-file-backed.js @@ -1,11 +1,7 @@ 'use strict'; const common = require('../common'); -const { - strictEqual, - rejects, - throws, -} = require('assert'); +const assert = require('assert'); const { TextDecoder } = require('util'); const { writeFileSync, @@ -39,22 +35,22 @@ writeFileSync(testfile5, ''); const ab = await blob.arrayBuffer(); const dec = new TextDecoder(); - strictEqual(dec.decode(new Uint8Array(ab)), data); - strictEqual(await blob.text(), data); + assert.strictEqual(dec.decode(new Uint8Array(ab)), data); + assert.strictEqual(await blob.text(), data); // Can be read multiple times let stream = blob.stream(); let check = ''; for await (const chunk of stream) check = dec.decode(chunk); - strictEqual(check, data); + assert.strictEqual(check, data); // Can be combined with other Blob's and read const combined = new Blob(['hello', blob, 'world']); const ab2 = await combined.arrayBuffer(); - strictEqual(dec.decode(ab2.slice(0, 5)), 'hello'); - strictEqual(dec.decode(ab2.slice(5, -5)), data); - strictEqual(dec.decode(ab2.slice(-5)), 'world'); + assert.strictEqual(dec.decode(ab2.slice(0, 5)), 'hello'); + assert.strictEqual(dec.decode(ab2.slice(5, -5)), data); + assert.strictEqual(dec.decode(ab2.slice(-5)), 'world'); // If the file is modified tho, the stream errors. writeFileSync(testfile, data + 'abc'); @@ -66,7 +62,7 @@ writeFileSync(testfile5, ''); for await (const _ of stream) {} }; - await rejects(read(), { name: 'NotReadableError' }); + await assert.rejects(read(), { name: 'NotReadableError' }); await unlink(testfile); })().then(common.mustCall()); @@ -76,16 +72,16 @@ writeFileSync(testfile5, ''); const blob = await openAsBlob(testfile2); const res = blob.slice(10, 20); const ab = await res.arrayBuffer(); - strictEqual(res.size, ab.byteLength); + assert.strictEqual(res.size, ab.byteLength); let length = 0; const stream = await res.stream(); for await (const chunk of stream) length += chunk.length; - strictEqual(res.size, length); + assert.strictEqual(res.size, length); const res1 = blob.slice(995, 1005); - strictEqual(await res1.text(), data.slice(995, 1005)); + assert.strictEqual(await res1.text(), data.slice(995, 1005)); // Refs: https://github.com/nodejs/node/issues/53908 for (const res2 of [ @@ -93,7 +89,7 @@ writeFileSync(testfile5, ''); blob.slice(995).slice(0, 10), blob.slice(0, 1005).slice(995), ]) { - strictEqual(await res2.text(), data.slice(995, 1005)); + assert.strictEqual(await res2.text(), data.slice(995, 1005)); } await unlink(testfile2); @@ -109,27 +105,27 @@ writeFileSync(testfile5, ''); } }; - await rejects(read(), { name: 'NotReadableError' }); + await assert.rejects(read(), { name: 'NotReadableError' }); await unlink(testfile3); })().then(common.mustCall()); (async () => { const blob = await openAsBlob(testfile4); - strictEqual(blob.size, 0); - strictEqual(await blob.text(), ''); + assert.strictEqual(blob.size, 0); + assert.strictEqual(await blob.text(), ''); writeFileSync(testfile4, 'abc'); - await rejects(blob.text(), { name: 'NotReadableError' }); + await assert.rejects(blob.text(), { name: 'NotReadableError' }); await unlink(testfile4); })().then(common.mustCall()); (async () => { const blob = await openAsBlob(testfile5); - strictEqual(blob.size, 0); + assert.strictEqual(blob.size, 0); writeFileSync(testfile5, 'abc'); const stream = blob.stream(); const reader = stream.getReader(); - await rejects(() => reader.read(), { name: 'NotReadableError' }); + await assert.rejects(() => reader.read(), { name: 'NotReadableError' }); await unlink(testfile5); })().then(common.mustCall()); @@ -138,7 +134,7 @@ writeFileSync(testfile5, ''); // across worker threads. This is largely because the underlying FdEntry // is bound to the Environment/Realm under which is was created. const blob = await openAsBlob(__filename); - throws(() => structuredClone(blob), { + assert.throws(() => structuredClone(blob), { code: 'ERR_INVALID_STATE', message: 'Invalid state: File-backed Blobs are not cloneable' }); diff --git a/test/parallel/test-blob.js b/test/parallel/test-blob.js index df753c4b2975ba..8ce1c53012ddcc 100644 --- a/test/parallel/test-blob.js +++ b/test/parallel/test-blob.js @@ -336,11 +336,11 @@ assert.throws(() => new Blob({}), { const { value, done } = await reader.read(); assert.strictEqual(value.byteLength, 5); assert(!done); - setTimeout(() => { + setTimeout(common.mustCall(() => { // The blob stream is now a byte stream hence after the first read, // it should pull in the next 'hello' which is 5 bytes hence -5. assert.strictEqual(stream[kState].controller.desiredSize, 0); - }, 0); + }), 0); })().then(common.mustCall()); (async () => { @@ -365,9 +365,9 @@ assert.throws(() => new Blob({}), { const { value, done } = await reader.read(new Uint8Array(100)); assert.strictEqual(value.byteLength, 5); assert(!done); - setTimeout(() => { + setTimeout(common.mustCall(() => { assert.strictEqual(stream[kState].controller.desiredSize, 0); - }, 0); + }), 0); })().then(common.mustCall()); (async () => { @@ -378,9 +378,9 @@ assert.throws(() => new Blob({}), { const { value, done } = await reader.read(new Uint8Array(2)); assert.strictEqual(value.byteLength, 2); assert(!done); - setTimeout(() => { + setTimeout(common.mustCall(() => { assert.strictEqual(stream[kState].controller.desiredSize, -3); - }, 0); + }), 0); })().then(common.mustCall()); { diff --git a/test/parallel/test-blocklist-clone.js b/test/parallel/test-blocklist-clone.js index 4264b36f54ca1e..ea6471c7df8742 100644 --- a/test/parallel/test-blocklist-clone.js +++ b/test/parallel/test-blocklist-clone.js @@ -6,10 +6,7 @@ const { BlockList, } = require('net'); -const { - ok, - notStrictEqual, -} = require('assert'); +const assert = require('assert'); const blocklist = new BlockList(); blocklist.addAddress('123.123.123.123'); @@ -17,13 +14,13 @@ blocklist.addAddress('123.123.123.123'); const mc = new MessageChannel(); mc.port1.onmessage = common.mustCall(({ data }) => { - notStrictEqual(data, blocklist); - ok(data.check('123.123.123.123')); - ok(!data.check('123.123.123.124')); + assert.notStrictEqual(data, blocklist); + assert.ok(data.check('123.123.123.123')); + assert.ok(!data.check('123.123.123.124')); data.addAddress('123.123.123.124'); - ok(blocklist.check('123.123.123.124')); - ok(data.check('123.123.123.124')); + assert.ok(blocklist.check('123.123.123.124')); + assert.ok(data.check('123.123.123.124')); mc.port1.close(); }); diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index a66a3ec9ce360f..b050f5bffde04a 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -107,15 +107,15 @@ expected.beforePreExec = new Set([ 'NativeModule internal/modules/typescript', 'NativeModule internal/data_url', 'NativeModule internal/mime', -]); - -expected.atRunTime = new Set([ + 'NativeModule internal/modules/esm/utils', 'Internal Binding worker', 'NativeModule internal/modules/run_main', 'NativeModule internal/net', 'NativeModule internal/dns/utils', +]); + +expected.atRunTime = new Set([ 'NativeModule internal/process/pre_execution', - 'NativeModule internal/modules/esm/utils', ]); const { isMainThread } = require('worker_threads'); @@ -173,7 +173,7 @@ if (common.hasIntl) { if (process.features.inspector) { expected.beforePreExec.add('Internal Binding inspector'); expected.beforePreExec.add('NativeModule internal/util/inspector'); - expected.atRunTime.add('NativeModule internal/inspector_async_hook'); + expected.beforePreExec.add('NativeModule internal/inspector_async_hook'); } // This is loaded if the test is run with NODE_V8_COVERAGE. diff --git a/test/parallel/test-btoa-atob.js b/test/parallel/test-btoa-atob.js index abf05adeef1042..a2c8d9e3134c99 100644 --- a/test/parallel/test-btoa-atob.js +++ b/test/parallel/test-btoa-atob.js @@ -2,37 +2,37 @@ require('../common'); -const { strictEqual, throws } = require('assert'); +const assert = require('assert'); const buffer = require('buffer'); // Exported on the global object -strictEqual(globalThis.atob, buffer.atob); -strictEqual(globalThis.btoa, buffer.btoa); +assert.strictEqual(globalThis.atob, buffer.atob); +assert.strictEqual(globalThis.btoa, buffer.btoa); // Throws type error on no argument passed -throws(() => buffer.atob(), /TypeError/); -throws(() => buffer.btoa(), /TypeError/); +assert.throws(() => buffer.atob(), /TypeError/); +assert.throws(() => buffer.btoa(), /TypeError/); -strictEqual(atob(' '), ''); -strictEqual(atob(' Y\fW\tJ\njZ A=\r= '), 'abcd'); +assert.strictEqual(atob(' '), ''); +assert.strictEqual(atob(' Y\fW\tJ\njZ A=\r= '), 'abcd'); -strictEqual(atob(null), '\x9Eée'); -strictEqual(atob(NaN), '5£'); -strictEqual(atob(Infinity), '"wâ\x9E+r'); -strictEqual(atob(true), '¶»\x9E'); -strictEqual(atob(1234), '×mø'); -strictEqual(atob([]), ''); -strictEqual(atob({ toString: () => '' }), ''); -strictEqual(atob({ [Symbol.toPrimitive]: () => '' }), ''); +assert.strictEqual(atob(null), '\x9Eée'); +assert.strictEqual(atob(NaN), '5£'); +assert.strictEqual(atob(Infinity), '"wâ\x9E+r'); +assert.strictEqual(atob(true), '¶»\x9E'); +assert.strictEqual(atob(1234), '×mø'); +assert.strictEqual(atob([]), ''); +assert.strictEqual(atob({ toString: () => '' }), ''); +assert.strictEqual(atob({ [Symbol.toPrimitive]: () => '' }), ''); -throws(() => atob(Symbol()), /TypeError/); +assert.throws(() => atob(Symbol()), /TypeError/); [ undefined, false, () => {}, {}, [1], 0, 1, 0n, 1n, -Infinity, 'a', 'a\n\n\n', '\ra\r\r', ' a ', '\t\t\ta', 'a\f\f\f', '\ta\r \n\f', ].forEach((value) => // See #2 - https://html.spec.whatwg.org/multipage/webappapis.html#dom-atob - throws(() => atob(value), { + assert.throws(() => atob(value), { constructor: DOMException, name: 'InvalidCharacterError', code: 5, diff --git a/test/parallel/test-buffer-alloc-unsafe-is-initialized-with-zero-fill-flag.js b/test/parallel/test-buffer-alloc-unsafe-is-initialized-with-zero-fill-flag.js new file mode 100644 index 00000000000000..075fa94e418457 --- /dev/null +++ b/test/parallel/test-buffer-alloc-unsafe-is-initialized-with-zero-fill-flag.js @@ -0,0 +1,21 @@ +// Flags: --expose-internals --zero-fill-buffers +// Verifies that Buffer.allocUnsafe() allocates initialized memory under --zero-fill-buffers by +// checking the usage count of the relevant native allocator code path. +'use strict'; + +const common = require('../common'); +if (!common.isDebug) { + common.skip('Only works in debug mode'); +} +const { internalBinding } = require('internal/test/binding'); +const { getGenericUsageCount } = internalBinding('debug'); +const assert = require('assert'); + +const initialUninitializedCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.Uninitialized'); +const initialZeroFilledCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.ZeroFilled'); +const buffer = Buffer.allocUnsafe(Buffer.poolSize + 1); +assert(buffer.every((b) => b === 0)); +const newUninitializedCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.Uninitialized'); +const newZeroFilledCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.ZeroFilled'); +assert.strictEqual(newUninitializedCount, initialUninitializedCount); +assert.notStrictEqual(newZeroFilledCount, initialZeroFilledCount); diff --git a/test/parallel/test-buffer-alloc-unsafe-is-uninitialized.js b/test/parallel/test-buffer-alloc-unsafe-is-uninitialized.js new file mode 100644 index 00000000000000..557851c8a7c231 --- /dev/null +++ b/test/parallel/test-buffer-alloc-unsafe-is-uninitialized.js @@ -0,0 +1,23 @@ +// Flags: --expose-internals +// Verifies that Buffer.allocUnsafe() indeed allocates uninitialized memory by checking +// the usage count of the relevant native allocator code path. +'use strict'; + +const common = require('../common'); +if (!common.isDebug) { + common.skip('Only works in debug mode'); +} +const { internalBinding } = require('internal/test/binding'); +const { getGenericUsageCount } = internalBinding('debug'); +const assert = require('assert'); + +const initialUninitializedCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.Uninitialized'); +const initialZeroFilledCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.ZeroFilled'); +Buffer.allocUnsafe(Buffer.poolSize + 1); +// We can't reliably check the contents of the buffer here because the OS or memory allocator +// used might zero-fill memory for us, or they might happen to return reused memory that was +// previously used by a process that zero-filled it. So instead we just check the usage counts. +const newUninitializedCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.Uninitialized'); +const newZeroFilledCount = getGenericUsageCount('NodeArrayBufferAllocator.Allocate.ZeroFilled'); +assert.notStrictEqual(newUninitializedCount, initialUninitializedCount); +assert.strictEqual(newZeroFilledCount, initialZeroFilledCount); diff --git a/test/parallel/test-buffer-bytelength.js b/test/parallel/test-buffer-bytelength.js index 1013469181fa23..fec508ffb4048a 100644 --- a/test/parallel/test-buffer-bytelength.js +++ b/test/parallel/test-buffer-bytelength.js @@ -105,17 +105,13 @@ assert.strictEqual(Buffer.byteLength('aaaa==', 'base64url'), 3); assert.strictEqual(Buffer.byteLength('Il était tué'), 14); assert.strictEqual(Buffer.byteLength('Il était tué', 'utf8'), 14); -['ascii', 'latin1', 'binary'] - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 12); - }); - -['ucs2', 'ucs-2', 'utf16le', 'utf-16le'] - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 24); - }); +for (const encoding of ['ascii', 'latin1', 'binary'].flatMap((e) => [e, e.toUpperCase()])) { + assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 12); +} + +for (const encoding of ['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].flatMap((e) => [e, e.toUpperCase()])) { + assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 24); +} // Test that ArrayBuffer from a different context is detected correctly const arrayBuf = vm.runInNewContext('new ArrayBuffer()'); diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 2e7541fb58b063..39e6ca7997ecba 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -76,6 +76,13 @@ assert.throws(() => { const random10 = common.hasCrypto ? require('crypto').randomBytes(10) : Buffer.alloc(10, 1); +const derived18 = Buffer.alloc(18); +for (let i = 0, j = 0; i < 18; i++) { + if (i < 10) + derived18[i] = random10[i]; + else + derived18[i] = random10[j++]; +} const empty = Buffer.alloc(0); assert.notDeepStrictEqual(random10, empty); @@ -85,6 +92,7 @@ assert.deepStrictEqual(Buffer.concat([], 100), empty); assert.deepStrictEqual(Buffer.concat([random10], 0), empty); assert.deepStrictEqual(Buffer.concat([random10], 10), random10); assert.deepStrictEqual(Buffer.concat([random10, random10], 10), random10); +assert.deepStrictEqual(Buffer.concat([random10, random10], 18), derived18); assert.deepStrictEqual(Buffer.concat([empty, random10]), random10); assert.deepStrictEqual(Buffer.concat([random10, empty, empty]), random10); diff --git a/test/parallel/test-buffer-copy.js b/test/parallel/test-buffer-copy.js index fef20578cfd396..9864fc7c551715 100644 --- a/test/parallel/test-buffer-copy.js +++ b/test/parallel/test-buffer-copy.js @@ -226,6 +226,23 @@ b.copy(c, 'not a valid offset'); // Make sure this acted like a regular copy with `0` offset. assert.deepStrictEqual(c, b.slice(0, c.length)); +// Copy into a Uint16Array target; bytes are packed into 16-bit elements. +{ + const x = new Uint16Array(4); + const buf = Buffer.of(1, 2, 3, 4); + const copied = buf.copy(x); + assert.strictEqual(copied, 4); + assert.ok(x instanceof Uint16Array); + const bytes = new Uint8Array(x.buffer, x.byteOffset, 4); + assert.deepStrictEqual(Array.from(bytes), [1, 2, 3, 4]); + const remaining = new Uint8Array( + x.buffer, + x.byteOffset + 4, + x.byteLength - 4 + ); + assert.ok(remaining.every((b) => b === 0)); +} + { c.fill('C'); assert.throws(() => { diff --git a/test/parallel/test-buffer-from.js b/test/parallel/test-buffer-from.js index 416a3b3a3105b5..6c08b973e6ab41 100644 --- a/test/parallel/test-buffer-from.js +++ b/test/parallel/test-buffer-from.js @@ -1,7 +1,7 @@ 'use strict'; const common = require('../common'); -const { deepStrictEqual, strictEqual, throws } = require('assert'); +const assert = require('assert'); const { runInNewContext } = require('vm'); const checkString = 'test'; @@ -26,10 +26,10 @@ class MyBadPrimitive { } } -deepStrictEqual(Buffer.from(new String(checkString)), check); -deepStrictEqual(Buffer.from(new MyString()), check); -deepStrictEqual(Buffer.from(new MyPrimitive()), check); -deepStrictEqual( +assert.deepStrictEqual(Buffer.from(new String(checkString)), check); +assert.deepStrictEqual(Buffer.from(new MyString()), check); +assert.deepStrictEqual(Buffer.from(new MyPrimitive()), check); +assert.deepStrictEqual( Buffer.from(runInNewContext('new String(checkString)', { checkString })), check ); @@ -56,8 +56,8 @@ deepStrictEqual( 'Buffer, ArrayBuffer, or Array or an Array-like Object.' + common.invalidArgTypeHelper(input) }; - throws(() => Buffer.from(input), errObj); - throws(() => Buffer.from(input, 'hex'), errObj); + assert.throws(() => Buffer.from(input), errObj); + assert.throws(() => Buffer.from(input, 'hex'), errObj); }); Buffer.allocUnsafe(10); // Should not throw. @@ -68,9 +68,9 @@ Buffer.from('deadbeaf', 'hex'); // Should not throw. const u16 = new Uint16Array([0xffff]); const b16 = Buffer.copyBytesFrom(u16); u16[0] = 0; - strictEqual(b16.length, 2); - strictEqual(b16[0], 255); - strictEqual(b16[1], 255); + assert.strictEqual(b16.length, 2); + assert.strictEqual(b16[0], 255); + assert.strictEqual(b16[1], 255); } { @@ -78,30 +78,30 @@ Buffer.from('deadbeaf', 'hex'); // Should not throw. const b16 = Buffer.copyBytesFrom(u16, 1, 5); u16[0] = 0xffff; u16[1] = 0; - strictEqual(b16.length, 2); - strictEqual(b16[0], 255); - strictEqual(b16[1], 255); + assert.strictEqual(b16.length, 2); + assert.strictEqual(b16[0], 255); + assert.strictEqual(b16[1], 255); } { const u32 = new Uint32Array([0xffffffff]); const b32 = Buffer.copyBytesFrom(u32); u32[0] = 0; - strictEqual(b32.length, 4); - strictEqual(b32[0], 255); - strictEqual(b32[1], 255); - strictEqual(b32[2], 255); - strictEqual(b32[3], 255); + assert.strictEqual(b32.length, 4); + assert.strictEqual(b32[0], 255); + assert.strictEqual(b32[1], 255); + assert.strictEqual(b32[2], 255); + assert.strictEqual(b32[3], 255); } -throws(() => { +assert.throws(() => { Buffer.copyBytesFrom(); }, { code: 'ERR_INVALID_ARG_TYPE', }); ['', Symbol(), true, false, {}, [], () => {}, 1, 1n, null, undefined].forEach( - (notTypedArray) => throws(() => { + (notTypedArray) => assert.throws(() => { Buffer.copyBytesFrom('nope'); }, { code: 'ERR_INVALID_ARG_TYPE', @@ -109,7 +109,7 @@ throws(() => { ); ['', Symbol(), true, false, {}, [], () => {}, 1n].forEach((notANumber) => - throws(() => { + assert.throws(() => { Buffer.copyBytesFrom(new Uint8Array(1), notANumber); }, { code: 'ERR_INVALID_ARG_TYPE', @@ -117,7 +117,7 @@ throws(() => { ); [-1, NaN, 1.1, -Infinity].forEach((outOfRange) => - throws(() => { + assert.throws(() => { Buffer.copyBytesFrom(new Uint8Array(1), outOfRange); }, { code: 'ERR_OUT_OF_RANGE', @@ -125,7 +125,7 @@ throws(() => { ); ['', Symbol(), true, false, {}, [], () => {}, 1n].forEach((notANumber) => - throws(() => { + assert.throws(() => { Buffer.copyBytesFrom(new Uint8Array(1), 0, notANumber); }, { code: 'ERR_INVALID_ARG_TYPE', @@ -133,7 +133,7 @@ throws(() => { ); [-1, NaN, 1.1, -Infinity].forEach((outOfRange) => - throws(() => { + assert.throws(() => { Buffer.copyBytesFrom(new Uint8Array(1), 0, outOfRange); }, { code: 'ERR_OUT_OF_RANGE', diff --git a/test/parallel/test-buffer-resizable.js b/test/parallel/test-buffer-resizable.js index dcfe6385b680d8..133206c763f4ab 100644 --- a/test/parallel/test-buffer-resizable.js +++ b/test/parallel/test-buffer-resizable.js @@ -3,27 +3,27 @@ require('../common'); const { Buffer } = require('node:buffer'); -const { strictEqual } = require('node:assert'); +const assert = require('node:assert'); const { describe, it } = require('node:test'); describe('Using resizable ArrayBuffer with Buffer...', () => { it('works as expected', () => { const ab = new ArrayBuffer(10, { maxByteLength: 20 }); const buffer = Buffer.from(ab, 1); - strictEqual(buffer.byteLength, 9); + assert.strictEqual(buffer.byteLength, 9); ab.resize(15); - strictEqual(buffer.byteLength, 14); + assert.strictEqual(buffer.byteLength, 14); ab.resize(5); - strictEqual(buffer.byteLength, 4); + assert.strictEqual(buffer.byteLength, 4); }); it('works with the deprecated constructor also', () => { const ab = new ArrayBuffer(10, { maxByteLength: 20 }); const buffer = new Buffer(ab, 1); - strictEqual(buffer.byteLength, 9); + assert.strictEqual(buffer.byteLength, 9); ab.resize(15); - strictEqual(buffer.byteLength, 14); + assert.strictEqual(buffer.byteLength, 14); ab.resize(5); - strictEqual(buffer.byteLength, 4); + assert.strictEqual(buffer.byteLength, 4); }); }); diff --git a/test/parallel/test-buffer-tostring.js b/test/parallel/test-buffer-tostring.js index 4219649fa37eb3..a3dad0146d7536 100644 --- a/test/parallel/test-buffer-tostring.js +++ b/test/parallel/test-buffer-tostring.js @@ -4,14 +4,10 @@ const common = require('../common'); const assert = require('assert'); // utf8, ucs2, ascii, latin1, utf16le -const encodings = ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', - 'binary', 'utf16le', 'utf-16le']; - -encodings - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.from('foo', encoding).toString(encoding), 'foo'); - }); +for (const encoding of ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', + 'binary', 'utf16le', 'utf-16le'].flatMap((e) => [e, e.toUpperCase()])) { + assert.strictEqual(Buffer.from('foo', encoding).toString(encoding), 'foo'); +} // base64 ['base64', 'BASE64'].forEach((encoding) => { diff --git a/test/parallel/test-buffer-write.js b/test/parallel/test-buffer-write.js index 81076629b1d847..4c797059b5925b 100644 --- a/test/parallel/test-buffer-write.js +++ b/test/parallel/test-buffer-write.js @@ -28,21 +28,14 @@ const resultMap = new Map([ ]); // utf8, ucs2, ascii, latin1, utf16le -const encodings = ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', - 'binary', 'utf16le', 'utf-16le']; - -encodings - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - const buf = Buffer.alloc(9); - const len = Buffer.byteLength('foo', encoding); - assert.strictEqual(buf.write('foo', 0, len, encoding), len); - - if (encoding.includes('-')) - encoding = encoding.replace('-', ''); +for (const encoding of ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', + 'binary', 'utf16le', 'utf-16le'].flatMap((e) => [e, e.toUpperCase()])) { + const buf = Buffer.alloc(9); + const len = Buffer.byteLength('foo', encoding); + assert.strictEqual(buf.write('foo', 0, len, encoding), len); - assert.deepStrictEqual(buf, resultMap.get(encoding.toLowerCase())); - }); + assert.deepStrictEqual(buf, resultMap.get(encoding.replace('-', '').toLowerCase())); +} // base64 ['base64', 'BASE64', 'base64url', 'BASE64URL'].forEach((encoding) => { diff --git a/test/parallel/test-child-process-bad-stdio.js b/test/parallel/test-child-process-bad-stdio.js index 3b17e2ce0d5a72..1e5bd4afc44e44 100644 --- a/test/parallel/test-child-process-bad-stdio.js +++ b/test/parallel/test-child-process-bad-stdio.js @@ -36,31 +36,31 @@ function createChild(options, callback) { } test('normal execution of a child process is handled', (_, done) => { - createChild({}, (err, stdout, stderr) => { + createChild({}, common.mustCall((err, stdout, stderr) => { assert.strictEqual(err, null); assert.strictEqual(stdout, ''); assert.strictEqual(stderr, ''); done(); - }); + })); }); test('execution with an error event is handled', (_, done) => { const error = new Error('foo'); - const child = createChild({}, (err, stdout, stderr) => { + const child = createChild({}, common.mustCall((err, stdout, stderr) => { assert.strictEqual(err, error); assert.strictEqual(stdout, ''); assert.strictEqual(stderr, ''); done(); - }); + })); child.emit('error', error); }); test('execution with a killed process is handled', (_, done) => { - createChild({ timeout: 1 }, (err, stdout, stderr) => { + createChild({ timeout: 1 }, common.mustCall((err, stdout, stderr) => { assert.strictEqual(err.killed, true); assert.strictEqual(stdout, ''); assert.strictEqual(stderr, ''); done(); - }); + })); }); diff --git a/test/parallel/test-child-process-can-write-to-stdout.js b/test/parallel/test-child-process-can-write-to-stdout.js index 069e07fb160282..68e1bff877fff4 100644 --- a/test/parallel/test-child-process-can-write-to-stdout.js +++ b/test/parallel/test-child-process-can-write-to-stdout.js @@ -2,7 +2,7 @@ // Tests that a spawned child process can write to stdout without throwing. // See https://github.com/nodejs/node-v0.x-archive/issues/1899. -require('../common'); +const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const spawn = require('child_process').spawn; @@ -16,7 +16,7 @@ child.stdout.on('data', function(data) { output += data; }); -child.on('exit', function(code, signal) { +child.on('exit', common.mustCall((code) => { assert.strictEqual(code, 0); assert.strictEqual(output, 'hello, world!\n'); -}); +})); diff --git a/test/parallel/test-child-process-cwd.js b/test/parallel/test-child-process-cwd.js index e876361b167ffb..847c666a9077d3 100644 --- a/test/parallel/test-child-process-cwd.js +++ b/test/parallel/test-child-process-cwd.js @@ -32,7 +32,7 @@ const { spawn } = require('child_process'); // - whether the child pid is undefined or number, // - whether the exit code equals expectCode, // - optionally whether the trimmed stdout result matches expectData -function testCwd(options, expectPidType, expectCode = 0, expectData) { +function testCwd(options, expectPidType, expectCode = 0, expectData, shouldCallExit = true) { const child = spawn(...common.pwdCommand, options); assert.strictEqual(typeof child.pid, expectPidType); @@ -47,9 +47,9 @@ function testCwd(options, expectPidType, expectCode = 0, expectData) { // Can't assert callback, as stayed in to API: // _The 'exit' event may or may not fire after an error has occurred._ - child.on('exit', function(code, signal) { + child.on('exit', shouldCallExit ? common.mustCall((code) => { assert.strictEqual(code, expectCode); - }); + }) : common.mustNotCall()); child.on('close', common.mustCall(function() { if (expectData) { @@ -68,7 +68,7 @@ function testCwd(options, expectPidType, expectCode = 0, expectData) { // Assume does-not-exist doesn't exist, expect exitCode=-1 and errno=ENOENT { - testCwd({ cwd: 'does-not-exist' }, 'undefined', -1) + testCwd({ cwd: 'does-not-exist' }, 'undefined', -1, undefined, false) .on('error', common.mustCall(function(e) { assert.strictEqual(e.code, 'ENOENT'); })); diff --git a/test/parallel/test-child-process-disconnect.js b/test/parallel/test-child-process-disconnect.js index fb8a2dd0ea2213..0e4f37ae61d537 100644 --- a/test/parallel/test-child-process-disconnect.js +++ b/test/parallel/test-child-process-disconnect.js @@ -30,13 +30,13 @@ if (process.argv[2] === 'child') { // Check that the 'disconnect' event is deferred to the next event loop tick. const disconnect = process.disconnect; - process.disconnect = function() { + process.disconnect = common.mustCall(function() { disconnect.apply(this, arguments); // If the event is emitted synchronously, we're too late by now. process.once('disconnect', common.mustCall(disconnectIsNotAsync)); // The funky function name makes it show up legible in mustCall errors. function disconnectIsNotAsync() {} - }; + }); const server = net.createServer(); @@ -81,13 +81,13 @@ if (process.argv[2] === 'child') { child.on('exit', common.mustCall()); // When child is listening - child.on('message', function(obj) { + child.on('message', common.mustCallAtLeast((obj) => { if (obj && obj.msg === 'ready') { // Connect to child using TCP to know if disconnect was emitted const socket = net.connect(obj.port); - socket.on('data', function(data) { + socket.on('data', common.mustCallAtLeast((data) => { data = data.toString(); // Ready to be disconnected @@ -103,10 +103,10 @@ if (process.argv[2] === 'child') { // 'disconnect' is emitted childFlag = (data === 'true'); - }); + })); } - }); + })); process.on('exit', function() { assert.strictEqual(childFlag, false); diff --git a/test/parallel/test-child-process-exec-encoding.js b/test/parallel/test-child-process-exec-encoding.js index 059e300e4e760e..21ab207fca8ce2 100644 --- a/test/parallel/test-child-process-exec-encoding.js +++ b/test/parallel/test-child-process-exec-encoding.js @@ -22,28 +22,28 @@ if (process.argv[2] === 'child') { } // Test default encoding, which should be utf8. - run({}, (stdout, stderr) => { + run({}, common.mustCall((stdout, stderr) => { assert.strictEqual(typeof stdout, 'string'); assert.strictEqual(typeof stderr, 'string'); assert.strictEqual(stdout, expectedStdout); assert.strictEqual(stderr, expectedStderr); - }); + })); // Test explicit utf8 encoding. - run({ encoding: 'utf8' }, (stdout, stderr) => { + run({ encoding: 'utf8' }, common.mustCall((stdout, stderr) => { assert.strictEqual(typeof stdout, 'string'); assert.strictEqual(typeof stderr, 'string'); assert.strictEqual(stdout, expectedStdout); assert.strictEqual(stderr, expectedStderr); - }); + })); // Test cases that result in buffer encodings. [undefined, null, 'buffer', 'invalid'].forEach((encoding) => { - run({ encoding }, (stdout, stderr) => { + run({ encoding }, common.mustCall((stdout, stderr) => { assert(stdout instanceof Buffer); assert(stdout instanceof Buffer); assert.strictEqual(stdout.toString(), expectedStdout); assert.strictEqual(stderr.toString(), expectedStderr); - }); + })); }); } diff --git a/test/parallel/test-child-process-execfile.js b/test/parallel/test-child-process-execfile.js index 80d94cc5626f2f..d44bae59d17484 100644 --- a/test/parallel/test-child-process-execfile.js +++ b/test/parallel/test-child-process-execfile.js @@ -65,14 +65,14 @@ common.expectWarning( const ac = new AbortController(); const { signal } = ac; - const test = () => { + const test = common.mustCall(() => { const check = common.mustCall((err) => { assert.strictEqual(err.code, 'ABORT_ERR'); assert.strictEqual(err.name, 'AbortError'); assert.strictEqual(err.signal, undefined); }); execFile(process.execPath, [echoFixture, 0], { signal }, check); - }; + }); // Verify that it still works the same way now that the signal is aborted. test(); diff --git a/test/parallel/test-child-process-flush-stdio.js b/test/parallel/test-child-process-flush-stdio.js index 7b9a2a049cb20b..37e63e64990e95 100644 --- a/test/parallel/test-child-process-flush-stdio.js +++ b/test/parallel/test-child-process-flush-stdio.js @@ -17,7 +17,7 @@ p.on('close', common.mustCall((code, signal) => { p.stdout.read(); -const spawnWithReadable = () => { +const spawnWithReadable = common.mustCall(() => { const buffer = []; const p = cp.spawn('echo', ['123'], opts); p.on('close', common.mustCall((code, signal) => { @@ -30,4 +30,4 @@ const spawnWithReadable = () => { while ((buf = p.stdout.read()) !== null) buffer.push(buf); }); -}; +}); diff --git a/test/parallel/test-child-process-fork-abort-signal.js b/test/parallel/test-child-process-fork-abort-signal.js index b963306fb1bed3..1d170134f715dd 100644 --- a/test/parallel/test-child-process-fork-abort-signal.js +++ b/test/parallel/test-child-process-fork-abort-signal.js @@ -1,7 +1,7 @@ 'use strict'; const { mustCall, mustNotCall } = require('../common'); -const { strictEqual } = require('assert'); +const assert = require('assert'); const fixtures = require('../common/fixtures'); const { fork } = require('child_process'); @@ -13,11 +13,11 @@ const { fork } = require('child_process'); signal }); cp.on('exit', mustCall((code, killSignal) => { - strictEqual(code, null); - strictEqual(killSignal, 'SIGTERM'); + assert.strictEqual(code, null); + assert.strictEqual(killSignal, 'SIGTERM'); })); cp.on('error', mustCall((err) => { - strictEqual(err.name, 'AbortError'); + assert.strictEqual(err.name, 'AbortError'); })); process.nextTick(() => ac.abort()); } @@ -30,13 +30,13 @@ const { fork } = require('child_process'); signal }); cp.on('exit', mustCall((code, killSignal) => { - strictEqual(code, null); - strictEqual(killSignal, 'SIGTERM'); + assert.strictEqual(code, null); + assert.strictEqual(killSignal, 'SIGTERM'); })); cp.on('error', mustCall((err) => { - strictEqual(err.name, 'AbortError'); - strictEqual(err.cause.name, 'Error'); - strictEqual(err.cause.message, 'boom'); + assert.strictEqual(err.name, 'AbortError'); + assert.strictEqual(err.cause.name, 'Error'); + assert.strictEqual(err.cause.message, 'boom'); })); process.nextTick(() => ac.abort(new Error('boom'))); } @@ -48,11 +48,11 @@ const { fork } = require('child_process'); signal }); cp.on('exit', mustCall((code, killSignal) => { - strictEqual(code, null); - strictEqual(killSignal, 'SIGTERM'); + assert.strictEqual(code, null); + assert.strictEqual(killSignal, 'SIGTERM'); })); cp.on('error', mustCall((err) => { - strictEqual(err.name, 'AbortError'); + assert.strictEqual(err.name, 'AbortError'); })); } @@ -63,13 +63,13 @@ const { fork } = require('child_process'); signal }); cp.on('exit', mustCall((code, killSignal) => { - strictEqual(code, null); - strictEqual(killSignal, 'SIGTERM'); + assert.strictEqual(code, null); + assert.strictEqual(killSignal, 'SIGTERM'); })); cp.on('error', mustCall((err) => { - strictEqual(err.name, 'AbortError'); - strictEqual(err.cause.name, 'Error'); - strictEqual(err.cause.message, 'boom'); + assert.strictEqual(err.name, 'AbortError'); + assert.strictEqual(err.cause.name, 'Error'); + assert.strictEqual(err.cause.message, 'boom'); })); } @@ -81,11 +81,11 @@ const { fork } = require('child_process'); killSignal: 'SIGKILL', }); cp.on('exit', mustCall((code, killSignal) => { - strictEqual(code, null); - strictEqual(killSignal, 'SIGKILL'); + assert.strictEqual(code, null); + assert.strictEqual(killSignal, 'SIGKILL'); })); cp.on('error', mustCall((err) => { - strictEqual(err.name, 'AbortError'); + assert.strictEqual(err.name, 'AbortError'); })); } diff --git a/test/parallel/test-child-process-fork-closed-channel-segfault.js b/test/parallel/test-child-process-fork-closed-channel-segfault.js index 47eb87c45fd045..73bd118ddce363 100644 --- a/test/parallel/test-child-process-fork-closed-channel-segfault.js +++ b/test/parallel/test-child-process-fork-closed-channel-segfault.js @@ -28,7 +28,7 @@ const server = net s.destroy(); }, 100); }) - .listen(0, function() { + .listen(0, common.mustCall(() => { const worker = cluster.fork(); worker.on('error', function(err) { @@ -70,9 +70,8 @@ const server = net }) ); - worker.on('online', function() { - send(function(err) { - assert.ifError(err); + worker.on('online', common.mustCall(() => { + send(common.mustSucceed(() => { send(function(err) { // Ignore errors when sending the second handle because the worker // may already have exited. @@ -83,6 +82,6 @@ const server = net throw err; } }); - }); - }); - }); + })); + })); + })); diff --git a/test/parallel/test-child-process-fork-dgram.js b/test/parallel/test-child-process-fork-dgram.js index 4ea2edc60c29c1..6a7be71f9d87ea 100644 --- a/test/parallel/test-child-process-fork-dgram.js +++ b/test/parallel/test-child-process-fork-dgram.js @@ -92,9 +92,7 @@ if (process.argv[2] === 'child') { msg.length, serverPort, '127.0.0.1', - (err) => { - assert.ifError(err); - } + common.mustSucceed(), ); } }, 1); diff --git a/test/parallel/test-child-process-fork-net-server.js b/test/parallel/test-child-process-fork-net-server.js index 3a3f01c6d664cb..e52b4dbe53e67a 100644 --- a/test/parallel/test-child-process-fork-net-server.js +++ b/test/parallel/test-child-process-fork-net-server.js @@ -60,7 +60,7 @@ if (process.argv[2] === 'child') { // TODO(@jasnell): The close event is not called consistently // across platforms. Need to investigate if it can be made // more consistent. - const onClose = (msg) => { + const onClose = common.mustCallAtLeast((msg) => { if (msg.what !== 'close') return; process.removeListener('message', onClose); @@ -68,7 +68,7 @@ if (process.argv[2] === 'child') { process.send({ what: 'close' }); })); serverScope.close(); - }; + }); process.on('message', onClose); @@ -86,13 +86,13 @@ if (process.argv[2] === 'child') { function testServer(callback) { // Destroy server execute callback when done. - const countdown = new Countdown(2, () => { + const countdown = new Countdown(2, common.mustCall(() => { server.on('close', common.mustCall(() => { debug('PARENT: server closed'); child.send({ what: 'close' }); })); server.close(); - }); + })); // We expect 4 connections and close events. const connections = new Countdown(4, () => countdown.dec()); @@ -122,7 +122,7 @@ if (process.argv[2] === 'child') { // event is emitted appears to be variable across platforms. // Need to investigate why and whether it can be made // more consistent. - const messageHandlers = (msg) => { + const messageHandlers = common.mustCallAtLeast((msg) => { if (msg.what === 'listening') { // Make connections. let socket; @@ -143,7 +143,7 @@ if (process.argv[2] === 'child') { child.removeListener('message', messageHandlers); callback(); } - }; + }); child.on('message', messageHandlers); } diff --git a/test/parallel/test-child-process-fork-ref.js b/test/parallel/test-child-process-fork-ref.js index bbf4432af80866..ae025a72fa2748 100644 --- a/test/parallel/test-child-process-fork-ref.js +++ b/test/parallel/test-child-process-fork-ref.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 fork = require('child_process').fork; @@ -52,8 +52,8 @@ if (process.argv[2] === 'child') { stdout += chunk; }); - child.once('exit', function() { + child.once('exit', common.mustCall(() => { assert.deepStrictEqual(ipc, ['1', '2']); assert.strictEqual(stdout, '3'); - }); + })); } diff --git a/test/parallel/test-child-process-fork-timeout-kill-signal.js b/test/parallel/test-child-process-fork-timeout-kill-signal.js index f3f605d7f5e24b..3d9dada1415d5e 100644 --- a/test/parallel/test-child-process-fork-timeout-kill-signal.js +++ b/test/parallel/test-child-process-fork-timeout-kill-signal.js @@ -1,7 +1,7 @@ 'use strict'; const { mustCall } = require('../common'); -const { strictEqual, throws } = require('assert'); +const assert = require('assert'); const fixtures = require('../common/fixtures'); const { fork } = require('child_process'); const { getEventListeners } = require('events'); @@ -11,7 +11,7 @@ const { getEventListeners } = require('events'); const cp = fork(fixtures.path('child-process-stay-alive-forever.js'), { timeout: 5, }); - cp.on('exit', mustCall((code, ks) => strictEqual(ks, 'SIGTERM'))); + cp.on('exit', mustCall((code, ks) => assert.strictEqual(ks, 'SIGTERM'))); } { @@ -20,16 +20,16 @@ const { getEventListeners } = require('events'); timeout: 5, killSignal: 'SIGKILL', }); - cp.on('exit', mustCall((code, ks) => strictEqual(ks, 'SIGKILL'))); + cp.on('exit', mustCall((code, ks) => assert.strictEqual(ks, 'SIGKILL'))); } { // Verify timeout verification - throws(() => fork(fixtures.path('child-process-stay-alive-forever.js'), { + assert.throws(() => fork(fixtures.path('child-process-stay-alive-forever.js'), { timeout: 'badValue', }), /ERR_INVALID_ARG_TYPE/); - throws(() => fork(fixtures.path('child-process-stay-alive-forever.js'), { + assert.throws(() => fork(fixtures.path('child-process-stay-alive-forever.js'), { timeout: {}, }), /ERR_INVALID_ARG_TYPE/); } @@ -43,8 +43,8 @@ const { getEventListeners } = require('events'); timeout: 6, signal, }); - strictEqual(getEventListeners(signal, 'abort').length, 1); + assert.strictEqual(getEventListeners(signal, 'abort').length, 1); cp.on('exit', mustCall(() => { - strictEqual(getEventListeners(signal, 'abort').length, 0); + assert.strictEqual(getEventListeners(signal, 'abort').length, 0); })); } diff --git a/test/parallel/test-child-process-fork.js b/test/parallel/test-child-process-fork.js index ee9dd3fc9f4746..3146c4fea18237 100644 --- a/test/parallel/test-child-process-fork.js +++ b/test/parallel/test-child-process-fork.js @@ -30,10 +30,10 @@ const n = fork(fixtures.path('child-process-spawn-node.js'), args); assert.deepStrictEqual(args, ['foo', 'bar']); -n.on('message', (m) => { +n.on('message', common.mustCall((m) => { debug('PARENT got message:', m); assert.ok(m.foo); -}); +})); // https://github.com/joyent/node/issues/2355 - JSON.stringify(undefined) // returns "undefined" but JSON.parse() cannot parse that... diff --git a/test/parallel/test-child-process-http-socket-leak.js b/test/parallel/test-child-process-http-socket-leak.js index cae4b051bc2b35..285411ddb137b1 100644 --- a/test/parallel/test-child-process-http-socket-leak.js +++ b/test/parallel/test-child-process-http-socket-leak.js @@ -39,7 +39,7 @@ const server = http.createServer(common.mustCall((req, res) => { server.listen(0, common.mustCall(() => { child = fork(__filename, [ 'child' ]); - child.once('message', (msg) => { + child.once('message', common.mustCall((msg) => { assert.strictEqual(msg, 'ready'); const req = http.request({ port: server.address().port, @@ -53,5 +53,5 @@ server.listen(0, common.mustCall(() => { })); req.end(); - }); + })); })); diff --git a/test/parallel/test-child-process-kill.js b/test/parallel/test-child-process-kill.js index 4d045feba434fb..d143b21a8681d1 100644 --- a/test/parallel/test-child-process-kill.js +++ b/test/parallel/test-child-process-kill.js @@ -67,10 +67,10 @@ process.stdout.write('x');`; const checkProcess = spawn(process.execPath, ['-e', code]); -checkProcess.on('exit', (code, signal) => { +checkProcess.on('exit', common.mustCall((code, signal) => { assert.strictEqual(code, 0); assert.strictEqual(signal, null); -}); +})); checkProcess.stdout.on('data', common.mustCall((chunk) => { assert.strictEqual(chunk.toString(), 'x'); diff --git a/test/parallel/test-child-process-prototype-tampering.mjs b/test/parallel/test-child-process-prototype-tampering.mjs index d94c4bdbc61621..cc30c1b6c89d6e 100644 --- a/test/parallel/test-child-process-prototype-tampering.mjs +++ b/test/parallel/test-child-process-prototype-tampering.mjs @@ -1,7 +1,7 @@ import * as common from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { EOL } from 'node:os'; -import { strictEqual, notStrictEqual, throws } from 'node:assert'; +import assert from 'node:assert'; import cp from 'node:child_process'; // TODO(LiviaMedeiros): test on different platforms @@ -15,17 +15,17 @@ for (const tamperedCwd of ['', '/tmp', '/not/existing/malicious/path', 42n]) { Object.prototype.cwd = tamperedCwd; cp.exec('pwd', common.mustSucceed((out) => { - strictEqual(`${out}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${out}`, `${expectedCWD}${EOL}`); })); - strictEqual(`${cp.execSync('pwd')}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${cp.execSync('pwd')}`, `${expectedCWD}${EOL}`); cp.execFile('pwd', common.mustSucceed((out) => { - strictEqual(`${out}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${out}`, `${expectedCWD}${EOL}`); })); - strictEqual(`${cp.execFileSync('pwd')}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${cp.execFileSync('pwd')}`, `${expectedCWD}${EOL}`); cp.spawn('pwd').stdout.on('data', common.mustCall((out) => { - strictEqual(`${out}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${out}`, `${expectedCWD}${EOL}`); })); - strictEqual(`${cp.spawnSync('pwd').stdout}`, `${expectedCWD}${EOL}`); + assert.strictEqual(`${cp.spawnSync('pwd').stdout}`, `${expectedCWD}${EOL}`); delete Object.prototype.cwd; } @@ -34,17 +34,17 @@ for (const tamperedUID of [0, 1, 999, 1000, 0n, 'gwak']) { Object.prototype.uid = tamperedUID; cp.exec('id -u', common.mustSucceed((out) => { - strictEqual(`${out}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${out}`, `${expectedUID}${EOL}`); })); - strictEqual(`${cp.execSync('id -u')}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${cp.execSync('id -u')}`, `${expectedUID}${EOL}`); cp.execFile('id', ['-u'], common.mustSucceed((out) => { - strictEqual(`${out}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${out}`, `${expectedUID}${EOL}`); })); - strictEqual(`${cp.execFileSync('id', ['-u'])}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${cp.execFileSync('id', ['-u'])}`, `${expectedUID}${EOL}`); cp.spawn('id', ['-u']).stdout.on('data', common.mustCall((out) => { - strictEqual(`${out}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${out}`, `${expectedUID}${EOL}`); })); - strictEqual(`${cp.spawnSync('id', ['-u']).stdout}`, `${expectedUID}${EOL}`); + assert.strictEqual(`${cp.spawnSync('id', ['-u']).stdout}`, `${expectedUID}${EOL}`); delete Object.prototype.uid; } @@ -68,24 +68,24 @@ for (const shellCommandArgument of ['-L && echo "tampered"']) { program.stdout.on('data', common.mustNotCall()); program.on('exit', common.mustCall((code) => { - notStrictEqual(code, 0); + assert.notStrictEqual(code, 0); })); cp.execFile(cmd, [shellCommandArgument], { cwd: expectedCWD }, common.mustCall((err) => { - notStrictEqual(err.code, 0); + assert.notStrictEqual(err.code, 0); }) ); - throws(() => { + assert.throws(() => { cp.execFileSync(cmd, [shellCommandArgument], { cwd: expectedCWD }); }, (e) => { - notStrictEqual(e.status, 0); + assert.notStrictEqual(e.status, 0); return true; }); cmdExitCode = cp.spawnSync(cmd, [shellCommandArgument], { cwd: expectedCWD }).status; - notStrictEqual(cmdExitCode, 0); + assert.notStrictEqual(cmdExitCode, 0); delete Object.prototype.shell; } diff --git a/test/parallel/test-child-process-reject-null-bytes.js b/test/parallel/test-child-process-reject-null-bytes.js index b5239cdddcdd07..3b3a25d961a95f 100644 --- a/test/parallel/test-child-process-reject-null-bytes.js +++ b/test/parallel/test-child-process-reject-null-bytes.js @@ -3,7 +3,7 @@ const { mustNotCall } = require('../common'); // Regression test for https://github.com/nodejs/node/issues/44768 -const { throws } = require('assert'); +const assert = require('assert'); const { exec, execFile, @@ -16,56 +16,56 @@ const { // Tests for the 'command' argument -throws(() => exec(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`, mustNotCall()), { +assert.throws(() => exec(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => exec('BBB\0XXX AAA CCC', mustNotCall()), { +assert.throws(() => exec('BBB\0XXX AAA CCC', mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`), { +assert.throws(() => execSync(`${process.execPath} ${__filename} AAA BBB\0XXX CCC`), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync('BBB\0XXX AAA CCC'), { +assert.throws(() => execSync('BBB\0XXX AAA CCC'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'file' argument -throws(() => spawn('BBB\0XXX'), { +assert.throws(() => spawn('BBB\0XXX'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile('BBB\0XXX', mustNotCall()), { +assert.throws(() => execFile('BBB\0XXX', mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync('BBB\0XXX'), { +assert.throws(() => execFileSync('BBB\0XXX'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn('BBB\0XXX'), { +assert.throws(() => spawn('BBB\0XXX'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync('BBB\0XXX'), { +assert.throws(() => spawnSync('BBB\0XXX'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'modulePath' argument -throws(() => fork('BBB\0XXX'), { +assert.throws(() => fork('BBB\0XXX'), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); @@ -75,123 +75,123 @@ throws(() => fork('BBB\0XXX'), { // Not testing exec() and execSync() because these accept 'args' as a part of // 'command' as space-separated arguments. -throws(() => execFile(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC'], mustNotCall()), { +assert.throws(() => execFile(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC'], mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { +assert.throws(() => execFileSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => fork(__filename, ['AAA', 'BBB\0XXX', 'CCC']), { +assert.throws(() => fork(__filename, ['AAA', 'BBB\0XXX', 'CCC']), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { +assert.throws(() => spawn(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { +assert.throws(() => spawnSync(process.execPath, [__filename, 'AAA', 'BBB\0XXX', 'CCC']), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.cwd' argument -throws(() => exec(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => exec(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => execFile(process.execPath, { cwd: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, { cwd: 'BBB\0XXX' }), { +assert.throws(() => execFileSync(process.execPath, { cwd: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(process.execPath, { cwd: 'BBB\0XXX' }), { +assert.throws(() => execSync(process.execPath, { cwd: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => fork(__filename, { cwd: 'BBB\0XXX' }), { +assert.throws(() => fork(__filename, { cwd: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn(process.execPath, { cwd: 'BBB\0XXX' }), { +assert.throws(() => spawn(process.execPath, { cwd: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, { cwd: 'BBB\0XXX' }), { +assert.throws(() => spawnSync(process.execPath, { cwd: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.argv0' argument -throws(() => exec(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => exec(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => execFile(process.execPath, { argv0: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, { argv0: 'BBB\0XXX' }), { +assert.throws(() => execFileSync(process.execPath, { argv0: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(process.execPath, { argv0: 'BBB\0XXX' }), { +assert.throws(() => execSync(process.execPath, { argv0: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => fork(__filename, { argv0: 'BBB\0XXX' }), { +assert.throws(() => fork(__filename, { argv0: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn(process.execPath, { argv0: 'BBB\0XXX' }), { +assert.throws(() => spawn(process.execPath, { argv0: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, { argv0: 'BBB\0XXX' }), { +assert.throws(() => spawnSync(process.execPath, { argv0: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.shell' argument -throws(() => exec(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => exec(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), { +assert.throws(() => execFile(process.execPath, { shell: 'BBB\0XXX' }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, { shell: 'BBB\0XXX' }), { +assert.throws(() => execFileSync(process.execPath, { shell: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(process.execPath, { shell: 'BBB\0XXX' }), { +assert.throws(() => execSync(process.execPath, { shell: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); @@ -199,96 +199,96 @@ throws(() => execSync(process.execPath, { shell: 'BBB\0XXX' }), { // Not testing fork() because it doesn't accept the shell option (internally it // explicitly sets shell to false). -throws(() => spawn(process.execPath, { shell: 'BBB\0XXX' }), { +assert.throws(() => spawn(process.execPath, { shell: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, { shell: 'BBB\0XXX' }), { +assert.throws(() => spawnSync(process.execPath, { shell: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.env' argument -throws(() => exec(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), { +assert.throws(() => exec(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => exec(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), { +assert.throws(() => exec(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), { +assert.throws(() => execFile(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFile(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), { +assert.throws(() => execFile(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }, mustNotCall()), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { +assert.throws(() => execFileSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execFileSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { +assert.throws(() => execFileSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { +assert.throws(() => execSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => execSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { +assert.throws(() => execSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => fork(__filename, { env: { 'AAA': 'BBB\0XXX' } }), { +assert.throws(() => fork(__filename, { env: { 'AAA': 'BBB\0XXX' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => fork(__filename, { env: { 'BBB\0XXX': 'AAA' } }), { +assert.throws(() => fork(__filename, { env: { 'BBB\0XXX': 'AAA' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { +assert.throws(() => spawn(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawn(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { +assert.throws(() => spawn(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { +assert.throws(() => spawnSync(process.execPath, { env: { 'AAA': 'BBB\0XXX' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); -throws(() => spawnSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { +assert.throws(() => spawnSync(process.execPath, { env: { 'BBB\0XXX': 'AAA' } }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.execPath' argument -throws(() => fork(__filename, { execPath: 'BBB\0XXX' }), { +assert.throws(() => fork(__filename, { execPath: 'BBB\0XXX' }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); // Tests for the 'options.execArgv' argument -throws(() => fork(__filename, { execArgv: ['AAA', 'BBB\0XXX', 'CCC'] }), { +assert.throws(() => fork(__filename, { execArgv: ['AAA', 'BBB\0XXX', 'CCC'] }), { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError', }); diff --git a/test/parallel/test-child-process-send-keep-open.js b/test/parallel/test-child-process-send-keep-open.js index 54169dc1885f66..62c862e1b43820 100644 --- a/test/parallel/test-child-process-send-keep-open.js +++ b/test/parallel/test-child-process-send-keep-open.js @@ -23,7 +23,7 @@ if (process.argv[2] !== 'child') { assert.strictEqual(signalCode, null); })); - const server = net.createServer((socket) => { + const server = net.createServer(common.mustCall((socket) => { child.on('message', common.mustCall((msg) => { assert.strictEqual(msg, 'child_done'); socket.end('parent', () => { @@ -33,7 +33,7 @@ if (process.argv[2] !== 'child') { })); child.send('socket', socket, { keepOpen: true }, common.mustSucceed()); - }); + })); server.listen(0, () => { const socket = net.connect(server.address().port, common.localhostIPv4); diff --git a/test/parallel/test-child-process-send-returns-boolean.js b/test/parallel/test-child-process-send-returns-boolean.js index 3d2e913dc265a6..d50a3d84594be0 100644 --- a/test/parallel/test-child-process-send-returns-boolean.js +++ b/test/parallel/test-child-process-send-returns-boolean.js @@ -28,7 +28,7 @@ const subScript = fixtures.path('child-process-persistent.js'); const spawnOptions = { stdio: ['pipe', 'pipe', 'pipe', 'ipc'] }; const s = spawn(process.execPath, [subScript], spawnOptions); - const server = net.createServer(common.mustNotCall()).listen(0, () => { + const server = net.createServer(common.mustNotCall()).listen(0, common.mustCall(() => { const handle = server._handle; // Sending a handle and not giving the tickQueue time to acknowledge should @@ -42,8 +42,7 @@ const subScript = fixtures.path('child-process-persistent.js'); // The backlog should now be indicate to backoff. const rv3 = s.send('three', assert.ifError); assert.strictEqual(rv3, false); - const rv4 = s.send('four', (err) => { - assert.ifError(err); + const rv4 = s.send('four', common.mustSucceed(() => { // `send` queue should have been drained. const rv5 = s.send('5', handle, assert.ifError); assert.strictEqual(rv5, true); @@ -52,7 +51,7 @@ const subScript = fixtures.path('child-process-persistent.js'); s.kill(); handle.close(); server.close(); - }); + })); assert.strictEqual(rv4, false); - }); + })); } diff --git a/test/parallel/test-child-process-server-close.js b/test/parallel/test-child-process-server-close.js index 832cf970178afa..65a4ebb87c1cad 100644 --- a/test/parallel/test-child-process-server-close.js +++ b/test/parallel/test-child-process-server-close.js @@ -24,17 +24,17 @@ if (process.argv[2] !== 'child') { } // Child -const server = net.createServer((conn) => { +const server = net.createServer(common.mustCall((conn) => { spawn(process.execPath, ['-v'], { stdio: ['ignore', conn, 'ignore'] }).on('close', common.mustCall(() => { conn.end(); })); -}).listen(common.PIPE, () => { +})).listen(common.PIPE, common.mustCall(() => { const client = net.connect(common.PIPE, common.mustCall()); client.once('data', () => { client.end(() => { server.close(); }); }); -}); +})); diff --git a/test/parallel/test-child-process-spawn-timeout-kill-signal.js b/test/parallel/test-child-process-spawn-timeout-kill-signal.js index a03a984b50ebbd..9ac76285a7df5f 100644 --- a/test/parallel/test-child-process-spawn-timeout-kill-signal.js +++ b/test/parallel/test-child-process-spawn-timeout-kill-signal.js @@ -1,7 +1,7 @@ 'use strict'; const { mustCall } = require('../common'); -const { strictEqual, throws } = require('assert'); +const assert = require('assert'); const fixtures = require('../common/fixtures'); const { spawn } = require('child_process'); const { getEventListeners } = require('events'); @@ -12,7 +12,7 @@ const aliveForeverFile = 'child-process-stay-alive-forever.js'; const cp = spawn(process.execPath, [fixtures.path(aliveForeverFile)], { timeout: 5, }); - cp.on('exit', mustCall((code, ks) => strictEqual(ks, 'SIGTERM'))); + cp.on('exit', mustCall((code, ks) => assert.strictEqual(ks, 'SIGTERM'))); } { @@ -21,16 +21,16 @@ const aliveForeverFile = 'child-process-stay-alive-forever.js'; timeout: 6, killSignal: 'SIGKILL', }); - cp.on('exit', mustCall((code, ks) => strictEqual(ks, 'SIGKILL'))); + cp.on('exit', mustCall((code, ks) => assert.strictEqual(ks, 'SIGKILL'))); } { // Verify timeout verification - throws(() => spawn(process.execPath, [fixtures.path(aliveForeverFile)], { + assert.throws(() => spawn(process.execPath, [fixtures.path(aliveForeverFile)], { timeout: 'badValue', }), /ERR_INVALID_ARG_TYPE/); - throws(() => spawn(process.execPath, [fixtures.path(aliveForeverFile)], { + assert.throws(() => spawn(process.execPath, [fixtures.path(aliveForeverFile)], { timeout: {}, }), /ERR_INVALID_ARG_TYPE/); } @@ -43,8 +43,8 @@ const aliveForeverFile = 'child-process-stay-alive-forever.js'; timeout: 6, signal, }); - strictEqual(getEventListeners(signal, 'abort').length, 1); + assert.strictEqual(getEventListeners(signal, 'abort').length, 1); cp.on('exit', mustCall(() => { - strictEqual(getEventListeners(signal, 'abort').length, 0); + assert.strictEqual(getEventListeners(signal, 'abort').length, 0); })); } diff --git a/test/parallel/test-child-process-spawnsync-args.js b/test/parallel/test-child-process-spawnsync-args.js index 4e65b22f6e4587..997852cae11870 100644 --- a/test/parallel/test-child-process-spawnsync-args.js +++ b/test/parallel/test-child-process-spawnsync-args.js @@ -32,7 +32,7 @@ const testCases = [ const expectedResult = tmpdir.path.trim().toLowerCase(); -const results = testCases.map((testCase) => { +const results = testCases.map(common.mustCallAtLeast((testCase) => { const { stdout, stderr, error } = spawnSync( command, testCase, @@ -43,6 +43,6 @@ const results = testCases.map((testCase) => { assert.deepStrictEqual(stderr, Buffer.alloc(0)); return stdout.toString().trim().toLowerCase(); -}); +})); assert.deepStrictEqual([...new Set(results)], [expectedResult]); diff --git a/test/parallel/test-child-process-spawnsync-kill-signal.js b/test/parallel/test-child-process-spawnsync-kill-signal.js index 6d14f24724bb2b..c3073a09c476f4 100644 --- a/test/parallel/test-child-process-spawnsync-kill-signal.js +++ b/test/parallel/test-child-process-spawnsync-kill-signal.js @@ -35,18 +35,18 @@ if (process.argv[2] === 'child') { // Verify that the default kill signal is SIGTERM. { - const child = spawn(undefined, (opts) => { + const child = spawn(undefined, common.mustCall((opts) => { assert.strictEqual(opts.killSignal, undefined); - }); + })); assert.strictEqual(child.signal, 'SIGTERM'); } // Verify that a string signal name is handled properly. { - const child = spawn('SIGKILL', (opts) => { + const child = spawn('SIGKILL', common.mustCall((opts) => { assert.strictEqual(opts.killSignal, SIGKILL); - }); + })); assert.strictEqual(child.signal, 'SIGKILL'); } @@ -55,9 +55,9 @@ if (process.argv[2] === 'child') { { assert.strictEqual(typeof SIGKILL, 'number'); - const child = spawn(SIGKILL, (opts) => { + const child = spawn(SIGKILL, common.mustCall((opts) => { assert.strictEqual(opts.killSignal, SIGKILL); - }); + })); assert.strictEqual(child.signal, 'SIGKILL'); } diff --git a/test/parallel/test-child-process-stdio-inherit.js b/test/parallel/test-child-process-stdio-inherit.js index 034a0770168bc9..73a5bc802c7660 100644 --- a/test/parallel/test-child-process-stdio-inherit.js +++ b/test/parallel/test-child-process-stdio-inherit.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 spawn = require('child_process').spawn; @@ -42,12 +42,12 @@ function grandparent() { child.stdin.end(input); - child.on('close', function(code, signal) { + child.on('close', common.mustCall((code, signal) => { assert.strictEqual(code, 0); assert.strictEqual(signal, null); // 'cat' on windows adds a \r\n at the end. assert.strictEqual(output.trim(), input.trim()); - }); + })); } function parent() { diff --git a/test/parallel/test-cli-node-options.js b/test/parallel/test-cli-node-options.js index 53bca572c3405c..3eee6023025f85 100644 --- a/test/parallel/test-cli-node-options.js +++ b/test/parallel/test-cli-node-options.js @@ -112,7 +112,7 @@ function expect( if (typeof want === 'string') want = new RegExp(want); - const test = (type) => common.mustCall((err, stdout) => { + const test = common.mustCallAtLeast((type) => common.mustCall((err, stdout) => { const o = JSON.stringify(opt); if (wantsError) { assert.ok(err, `${type}: expected error for ${o}`); @@ -125,7 +125,7 @@ function expect( assert.fail( `${type}: for ${o}, failed to find ${want} in: <\n${stdout}\n>` ); - }); + })); exec(process.execPath, argv, opts, test('child process')); if (testWorker) diff --git a/test/parallel/test-cli-node-print-help.js b/test/parallel/test-cli-node-print-help.js index 4075a6c9b609b2..f42129eb133026 100644 --- a/test/parallel/test-cli-node-print-help.js +++ b/test/parallel/test-cli-node-print-help.js @@ -40,15 +40,15 @@ function validateNodePrintHelp() { function testForSubstring(options) { if (options.compileConstant) { - options.flags.forEach((flag) => { - assert.strictEqual(stdOut.indexOf(flag) !== -1, true, - `Missing flag ${flag} in ${stdOut}`); - }); + for (const flag of options.flags) { + assert.notStrictEqual(stdOut.indexOf(flag), -1, + `Missing flag ${flag} in ${stdOut}`); + } } else { - options.flags.forEach((flag) => { + for (const flag of options.flags) { assert.strictEqual(stdOut.indexOf(flag), -1, `Unexpected flag ${flag} in ${stdOut}`); - }); + } } } diff --git a/test/parallel/test-cli-options-as-flags.js b/test/parallel/test-cli-options-as-flags.js index c9d92b69f72a45..04e9e801b8ec81 100644 --- a/test/parallel/test-cli-options-as-flags.js +++ b/test/parallel/test-cli-options-as-flags.js @@ -4,7 +4,7 @@ const { spawnPromisified, } = require('../common'); const fixtures = require('../common/fixtures'); -const { strictEqual } = require('node:assert'); +const assert = require('node:assert'); const { describe, it } = require('node:test'); const path = require('node:path'); @@ -21,11 +21,11 @@ describe('getOptionsAsFlagsFromBinding', () => { fixtureFile, ]); - strictEqual(result.code, 0); + assert.strictEqual(result.code, 0); const flags = JSON.parse(result.stdout.trim()); - strictEqual(flags.includes('--no-warnings'), true); - strictEqual(flags.includes('--stack-trace-limit=512'), true); + assert.strictEqual(flags.includes('--no-warnings'), true); + assert.strictEqual(flags.includes('--stack-trace-limit=512'), true); }); it('should extract flags from NODE_OPTIONS environment variable', async () => { @@ -40,13 +40,13 @@ describe('getOptionsAsFlagsFromBinding', () => { } }); - strictEqual(result.code, 0); + assert.strictEqual(result.code, 0); const flags = JSON.parse(result.stdout.trim()); // Should contain the flag from NODE_OPTIONS - strictEqual(flags.includes('--stack-trace-limit=4096'), true); + assert.strictEqual(flags.includes('--stack-trace-limit=4096'), true); // Should also contain command line flags - strictEqual(flags.includes('--no-warnings'), true); + assert.strictEqual(flags.includes('--no-warnings'), true); }); it('should extract flags from config file', async () => { @@ -58,15 +58,15 @@ describe('getOptionsAsFlagsFromBinding', () => { fixtureFile, ]); - strictEqual(result.code, 0); + assert.strictEqual(result.code, 0); const flags = JSON.parse(result.stdout.trim()); // Should contain flags from config file - strictEqual(flags.includes('--experimental-transform-types'), true); - strictEqual(flags.includes('--max-http-header-size=8192'), true); - strictEqual(flags.includes('--test-isolation=none'), true); + assert.strictEqual(flags.includes('--experimental-transform-types'), true); + assert.strictEqual(flags.includes('--max-http-header-size=8192'), true); + assert.strictEqual(flags.includes('--test-isolation=none'), true); // Should also contain command line flags - strictEqual(flags.includes('--no-warnings'), true); + assert.strictEqual(flags.includes('--no-warnings'), true); }); it('should extract flags from config file and command line', async () => { @@ -79,17 +79,17 @@ describe('getOptionsAsFlagsFromBinding', () => { fixtureFile, ]); - strictEqual(result.code, 0); + assert.strictEqual(result.code, 0); const flags = JSON.parse(result.stdout.trim()); // Should contain flags from command line arguments - strictEqual(flags.includes('--no-warnings'), true); - strictEqual(flags.includes('--stack-trace-limit=512'), true); + assert.strictEqual(flags.includes('--no-warnings'), true); + assert.strictEqual(flags.includes('--stack-trace-limit=512'), true); // Should contain flags from config file - strictEqual(flags.includes('--experimental-transform-types'), true); - strictEqual(flags.includes('--max-http-header-size=8192'), true); - strictEqual(flags.includes('--test-isolation=none'), true); + assert.strictEqual(flags.includes('--experimental-transform-types'), true); + assert.strictEqual(flags.includes('--max-http-header-size=8192'), true); + assert.strictEqual(flags.includes('--test-isolation=none'), true); }); it('should extract flags from .env file', async () => { @@ -100,12 +100,12 @@ describe('getOptionsAsFlagsFromBinding', () => { fixtureFile, ]); - strictEqual(result.code, 0); + assert.strictEqual(result.code, 0); const flags = JSON.parse(result.stdout.trim()); // Should contain flags from .env file (NODE_OPTIONS) - strictEqual(flags.includes('--v8-pool-size=8'), true); + assert.strictEqual(flags.includes('--v8-pool-size=8'), true); // Should also contain command line flags - strictEqual(flags.includes('--no-warnings'), true); + assert.strictEqual(flags.includes('--no-warnings'), true); }); }); diff --git a/test/parallel/test-cluster-accept-fail.js b/test/parallel/test-cluster-accept-fail.js index 29d57783a9d11f..f35379afab4d1a 100644 --- a/test/parallel/test-cluster-accept-fail.js +++ b/test/parallel/test-cluster-accept-fail.js @@ -7,12 +7,12 @@ const cluster = require('cluster'); const rr = require('internal/cluster/round_robin_handle'); if (cluster.isPrimary) { - const distribute = rr.prototype.distribute; - rr.prototype.distribute = function(err, handle) { + const originalDistribute = rr.prototype.distribute; + rr.prototype.distribute = common.mustCall(function distribute(err, handle) { assert.strictEqual(err, 0); handle.close(); - distribute.call(this, -1, undefined); - }; + originalDistribute.call(this, -1, undefined); + }); cluster.schedulingPolicy = cluster.SCHED_RR; cluster.fork(); } else { diff --git a/test/parallel/test-cluster-basic.js b/test/parallel/test-cluster-basic.js index 306b4d7f58788d..12b531a1110fd1 100644 --- a/test/parallel/test-cluster-basic.js +++ b/test/parallel/test-cluster-basic.js @@ -92,7 +92,7 @@ if (cluster.isWorker) { const stateNames = Object.keys(checks.worker.states); // Check events, states, and emit arguments - forEach(checks.cluster.events, (bool, name, index) => { + forEach(checks.cluster.events, common.mustCallAtLeast((bool, name, index) => { // Listen on event cluster.on(name, common.mustCall(function(/* worker */) { @@ -107,7 +107,7 @@ if (cluster.isWorker) { const state = stateNames[index]; checks.worker.states[state] = (state === worker.state); })); - }); + })); // Kill worker when listening cluster.on('listening', common.mustCall(() => { @@ -124,7 +124,7 @@ if (cluster.isWorker) { 'the worker is not a instance of the Worker constructor'); // Check event - forEach(checks.worker.events, function(bool, name, index) { + forEach(checks.worker.events, common.mustCallAtLeast((bool, name, index) => { worker.on(name, common.mustCall(function() { // Set event checks.worker.events[name] = true; @@ -157,7 +157,7 @@ if (cluster.isWorker) { break; } })); - }); + })); // Check all values process.once('exit', () => { diff --git a/test/parallel/test-cluster-concurrent-disconnect.js b/test/parallel/test-cluster-concurrent-disconnect.js index b754fa221a0dcd..56707d3cf2fa74 100644 --- a/test/parallel/test-cluster-concurrent-disconnect.js +++ b/test/parallel/test-cluster-concurrent-disconnect.js @@ -24,14 +24,14 @@ if (cluster.isPrimary) { // These errors can occur due to the nature of the test, we might be trying // to send messages when the worker is disconnecting. - worker.on('error', (err) => { + worker.on('error', common.mustCallAtLeast((err) => { assert.strictEqual(err.syscall, 'write'); if (common.isMacOS) { assert(['EPIPE', 'ENOTCONN'].includes(err.code), err); } else { assert(['EPIPE', 'ECONNRESET'].includes(err.code), err); } - }); + }, 0)); worker.once('disconnect', common.mustCall(() => { for (const worker of workers) diff --git a/test/parallel/test-cluster-disconnect-exitedAfterDisconnect-race.js b/test/parallel/test-cluster-disconnect-exitedAfterDisconnect-race.js index f1a8dea0a9a6df..81bdc0459d0b12 100644 --- a/test/parallel/test-cluster-disconnect-exitedAfterDisconnect-race.js +++ b/test/parallel/test-cluster-disconnect-exitedAfterDisconnect-race.js @@ -8,9 +8,9 @@ const assert = require('assert'); const cluster = require('cluster'); if (cluster.isPrimary) { - cluster.on('exit', (worker, code) => { + cluster.on('exit', common.mustCall((worker, code) => { assert.strictEqual(code, 0, `worker exited with code: ${code}, expected 0`); - }); + })); return cluster.fork(); } diff --git a/test/parallel/test-cluster-disconnect.js b/test/parallel/test-cluster-disconnect.js index 240bb972fa359e..01a2167dbc2ee1 100644 --- a/test/parallel/test-cluster-disconnect.js +++ b/test/parallel/test-cluster-disconnect.js @@ -38,8 +38,8 @@ if (cluster.isWorker) { const serverPorts = new Set(); // Test a single TCP server - const testConnection = (port, cb) => { - const socket = net.connect(port, '127.0.0.1', () => { + const testConnection = common.mustCallAtLeast((port, cb) => { + const socket = net.connect(port, '127.0.0.1', common.mustCall(() => { // buffer result let result = ''; socket.on('data', (chunk) => { result += chunk; }); @@ -49,27 +49,27 @@ if (cluster.isWorker) { cb(result === 'echo'); serverPorts.delete(port); })); - }); - }; + })); + }); // Test both servers created in the cluster - const testCluster = (cb) => { + const testCluster = common.mustCallAtLeast((cb) => { let done = 0; const portsArray = Array.from(serverPorts); for (let i = 0; i < servers; i++) { - testConnection(portsArray[i], (success) => { + testConnection(portsArray[i], common.mustCall((success) => { assert.ok(success); done += 1; if (done === servers) { cb(); } - }); + })); } - }; + }); // Start two workers and execute callback when both is listening - const startCluster = (cb) => { + const startCluster = common.mustCallAtLeast((cb) => { const workers = 8; let online = 0; @@ -83,9 +83,9 @@ if (cluster.isWorker) { } }, servers)); } - }; + }); - const test = (again) => { + const test = common.mustCall((again) => { // 1. start cluster startCluster(common.mustCall(() => { // 2. test cluster @@ -99,7 +99,7 @@ if (cluster.isWorker) { })); })); })); - }; + }, 2); test(true); } diff --git a/test/parallel/test-cluster-eaddrinuse.js b/test/parallel/test-cluster-eaddrinuse.js index f74d4ab7ec2eb9..cbab4aa5262c70 100644 --- a/test/parallel/test-cluster-eaddrinuse.js +++ b/test/parallel/test-cluster-eaddrinuse.js @@ -49,13 +49,13 @@ if (id === 'undefined') { server.on('error', common.mustCall(function(e) { assert(e.code, 'EADDRINUSE'); process.send('stop-listening'); - process.once('message', function(msg) { + process.once('message', common.mustCall((msg) => { if (msg !== 'stopped-listening') return; server = net.createServer(common.mustNotCall()); server.listen(port, common.mustCall(function() { server.close(); })); - }); + })); })); } else { assert(0); // Bad argument. diff --git a/test/parallel/test-cluster-fork-stdio.js b/test/parallel/test-cluster-fork-stdio.js index 263c2ba8024f25..37708c2faaf9b5 100644 --- a/test/parallel/test-cluster-fork-stdio.js +++ b/test/parallel/test-cluster-fork-stdio.js @@ -33,8 +33,8 @@ if (cluster.isPrimary) { const pipe = new net.Socket({ fd: 4 }); pipe.unref(); - pipe.on('data', (data) => { + pipe.on('data', common.mustCallAtLeast((data) => { assert.ok(data instanceof Buffer); pipe.write(data); - }); + })); } diff --git a/test/parallel/test-cluster-fork-windowsHide.js b/test/parallel/test-cluster-fork-windowsHide.js index 2b90713ceb0a74..b74a7606e9700a 100644 --- a/test/parallel/test-cluster-fork-windowsHide.js +++ b/test/parallel/test-cluster-fork-windowsHide.js @@ -30,11 +30,11 @@ if (!process.argv[2]) { }) }; - primary.on('message', (msg) => { + primary.on('message', common.mustCallAtLeast((msg) => { const handler = messageHandlers[msg.type]; assert.ok(handler); handler(msg); - }); + })); primary.on('exit', common.mustCall((code, signal) => { assert.strictEqual(code, 0); diff --git a/test/parallel/test-cluster-message.js b/test/parallel/test-cluster-message.js index 35d6c975b28b5f..58d0a88c8921f6 100644 --- a/test/parallel/test-cluster-message.js +++ b/test/parallel/test-cluster-message.js @@ -103,13 +103,13 @@ if (cluster.isWorker) { worker.on('message', function(message) { check('primary', message === 'message from worker'); }); - cluster.on('message', function(worker_, message) { + cluster.on('message', common.mustCall((worker_, message) => { assert.strictEqual(worker_, worker); check('global', message === 'message from worker'); - }); + })); // When a TCP server is listening in the worker connect to it - worker.on('listening', function(address) { + worker.on('listening', common.mustCall((address) => { client = net.connect(address.port, function() { // Send message to worker. @@ -135,12 +135,12 @@ if (cluster.isWorker) { worker.on('exit', common.mustCall(function() { process.exit(0); })); - }); + })); process.once('exit', function() { - forEach(checks, function(check, type) { + for (const [type, check] of Object.entries(checks)) { assert.ok(check.receive, `The ${type} did not receive any message`); assert.ok(check.correct, `The ${type} did not get the correct message`); - }); + } }); } diff --git a/test/parallel/test-cluster-net-send.js b/test/parallel/test-cluster-net-send.js index f6b735db997d8a..72b88dd1f87fbd 100644 --- a/test/parallel/test-cluster-net-send.js +++ b/test/parallel/test-cluster-net-send.js @@ -36,10 +36,10 @@ if (process.argv[2] !== 'child') { assert.ok(handle); worker.send('got'); - handle.on('data', function(data) { + handle.on('data', common.mustCall((data) => { called = true; assert.strictEqual(data.toString(), 'hello'); - }); + })); handle.on('end', function() { worker.kill(); @@ -59,13 +59,13 @@ if (process.argv[2] !== 'child') { process.send('handle', socket); } - const server = net.createServer(function(c) { + const server = net.createServer(common.mustCall((c) => { process.once('message', common.mustCall(function(msg) { assert.strictEqual(msg, 'got'); c.end('hello'); })); socketConnected(); - }); + })); server.listen(0, function() { socket = net.connect(server.address().port, '127.0.0.1', socketConnected); diff --git a/test/parallel/test-cluster-rr-handle-keep-loop-alive.js b/test/parallel/test-cluster-rr-handle-keep-loop-alive.js index 0b18408a192ba1..c31bbe5cbcb9a5 100644 --- a/test/parallel/test-cluster-rr-handle-keep-loop-alive.js +++ b/test/parallel/test-cluster-rr-handle-keep-loop-alive.js @@ -13,10 +13,10 @@ if (cluster.isPrimary) { worker.on('exit', () => { exited = true; }); - setTimeout(() => { + setTimeout(common.mustCall(() => { assert.ok(!exited); worker.kill(); - }, 3000); + }), 3000); } else { const server = net.createServer(common.mustNotCall()); server.listen(0, common.mustCall(() => process.channel.unref())); diff --git a/test/parallel/test-cluster-send-deadlock.js b/test/parallel/test-cluster-send-deadlock.js index 8ddc40c2529441..076e903a4060b0 100644 --- a/test/parallel/test-cluster-send-deadlock.js +++ b/test/parallel/test-cluster-send-deadlock.js @@ -23,18 +23,18 @@ // Testing mutual send of handles: from primary to worker, and from worker to // primary. -require('../common'); +const common = require('../common'); const assert = require('assert'); const cluster = require('cluster'); const net = require('net'); if (cluster.isPrimary) { const worker = cluster.fork(); - worker.on('exit', (code, signal) => { + worker.on('exit', common.mustCall((code, signal) => { assert.strictEqual(code, 0, `Worker exited with an error code: ${code}`); assert(!signal, `Worker exited by a signal: ${signal}`); server.close(); - }); + })); const server = net.createServer((socket) => { worker.send('handle', socket); diff --git a/test/parallel/test-cluster-send-handle-twice.js b/test/parallel/test-cluster-send-handle-twice.js index c413f6f82bffca..7064a9c7e18d20 100644 --- a/test/parallel/test-cluster-send-handle-twice.js +++ b/test/parallel/test-cluster-send-handle-twice.js @@ -45,14 +45,14 @@ if (cluster.isPrimary) { process.send('send-handle-2', socket); })); - server.listen(0, function() { + server.listen(0, common.mustCall(() => { const client = net.connect({ host: 'localhost', port: server.address().port }); client.on('close', common.mustCall(() => { cluster.worker.disconnect(); })); client.on('connect', () => { client.end(); }); - }).on('error', function(e) { + })).on('error', function(e) { console.error(e); assert.fail('server.listen failed'); }); diff --git a/test/parallel/test-cluster-server-restart-none.js b/test/parallel/test-cluster-server-restart-none.js index fdc3fa5a36a718..b8fca694904e1e 100644 --- a/test/parallel/test-cluster-server-restart-none.js +++ b/test/parallel/test-cluster-server-restart-none.js @@ -9,7 +9,7 @@ if (cluster.isPrimary) { const worker1 = cluster.fork(); worker1.on('listening', common.mustCall(() => { const worker2 = cluster.fork(); - worker2.on('exit', (code, signal) => { + worker2.on('exit', common.mustCall((code, signal) => { assert.strictEqual(code, 0, 'worker2 did not exit normally. ' + `exited with code ${code}`); @@ -17,7 +17,7 @@ if (cluster.isPrimary) { 'worker2 did not exit normally. ' + `exited with signal ${signal}`); worker1.disconnect(); - }); + })); })); worker1.on('exit', common.mustCall((code, signal) => { @@ -33,13 +33,13 @@ if (cluster.isPrimary) { const server = net.createServer(); server.listen(0, common.mustCall(() => { if (cluster.worker.id === 2) { - server.close(() => { + server.close(common.mustCall(() => { server.listen(0, common.mustCall(() => { server.close(() => { process.disconnect(); }); })); - }); + })); } })); } diff --git a/test/parallel/test-cluster-server-restart-rr.js b/test/parallel/test-cluster-server-restart-rr.js index 446a7de1549072..9fbbf63f5b711c 100644 --- a/test/parallel/test-cluster-server-restart-rr.js +++ b/test/parallel/test-cluster-server-restart-rr.js @@ -9,7 +9,7 @@ if (cluster.isPrimary) { const worker1 = cluster.fork(); worker1.on('listening', common.mustCall(() => { const worker2 = cluster.fork(); - worker2.on('exit', (code, signal) => { + worker2.on('exit', common.mustCall((code, signal) => { assert.strictEqual( code, 0, @@ -21,7 +21,7 @@ if (cluster.isPrimary) { `worker${worker2.id} did not exit normally. Exit with signal: ${signal}` ); worker1.disconnect(); - }); + })); })); worker1.on('exit', common.mustCall((code, signal) => { @@ -41,13 +41,13 @@ if (cluster.isPrimary) { const server = net.createServer(); server.listen(0, common.mustCall(() => { if (cluster.worker.id === 2) { - server.close(() => { + server.close(common.mustCall(() => { server.listen(0, common.mustCall(() => { server.close(() => { process.disconnect(); }); })); - }); + })); } })); } diff --git a/test/parallel/test-cluster-shared-leak.js b/test/parallel/test-cluster-shared-leak.js index 67c11ea32145e0..48c07c7cc04df5 100644 --- a/test/parallel/test-cluster-shared-leak.js +++ b/test/parallel/test-cluster-shared-leak.js @@ -15,7 +15,7 @@ if (cluster.isPrimary) { const worker1 = cluster.fork(); worker1.on('listening', common.mustCall(function(address) { worker2 = cluster.fork(); - worker2.on('online', function() { + worker2.on('online', common.mustCall(() => { conn = net.connect(address.port, common.mustCall(function() { worker1.disconnect(); worker2.disconnect(); @@ -25,16 +25,16 @@ if (cluster.isPrimary) { if (e.code !== 'ECONNRESET') throw e; }); - }); + })); })); - cluster.on('exit', function(worker, exitCode, signalCode) { + cluster.on('exit', common.mustCall((worker, exitCode, signalCode) => { assert(worker === worker1 || worker === worker2); assert.strictEqual(exitCode, 0); assert.strictEqual(signalCode, null); if (Object.keys(cluster.workers).length === 0) conn.destroy(); - }); + }, 2)); return; } diff --git a/test/parallel/test-cluster-worker-events.js b/test/parallel/test-cluster-worker-events.js index 6c044ace8df04c..d83068de026e93 100644 --- a/test/parallel/test-cluster-worker-events.js +++ b/test/parallel/test-cluster-worker-events.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 cluster = require('cluster'); @@ -30,10 +30,10 @@ if (cluster.isPrimary) { const worker = cluster.fork(); - worker.on('exit', (code) => { + worker.on('exit', common.mustCall((code) => { assert.strictEqual(code, OK); process.exit(0); - }); + })); const result = worker.send('SOME MESSAGE'); assert.strictEqual(result, true); @@ -51,20 +51,20 @@ let sawWorker; const messages = []; -const check = (m) => { +const check = common.mustCallAtLeast((m) => { messages.push(m); if (messages.length < 2) return; assert.deepStrictEqual(messages[0], messages[1]); - cluster.worker.once('error', (e) => { + cluster.worker.once('error', common.mustCall((e) => { assert.strictEqual(e, 'HI'); process.exit(OK); - }); + })); process.emit('error', 'HI'); -}; +}); process.on('message', (m) => { assert(!sawProcess); diff --git a/test/parallel/test-cluster-worker-isdead.js b/test/parallel/test-cluster-worker-isdead.js index 6f2aa3c52ecd5c..24395da42045b6 100644 --- a/test/parallel/test-cluster-worker-isdead.js +++ b/test/parallel/test-cluster-worker-isdead.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); const cluster = require('cluster'); const assert = require('assert'); @@ -10,12 +10,12 @@ if (cluster.isPrimary) { `isDead() returned ${workerDead}. isDead() should return ` + 'false right after the worker has been created.'); - worker.on('exit', function() { + worker.on('exit', common.mustCall(() => { workerDead = worker.isDead(); assert.ok(workerDead, `isDead() returned ${workerDead}. After an event has been ` + 'emitted, isDead should return true'); - }); + })); worker.on('message', function(msg) { if (msg === 'readyToDie') { diff --git a/test/parallel/test-common-must-not-call.js b/test/parallel/test-common-must-not-call.js index b3c94a2390ffb6..43da3a208f6d8e 100644 --- a/test/parallel/test-common-must-not-call.js +++ b/test/parallel/test-common-must-not-call.js @@ -10,7 +10,7 @@ const testFunction1 = common.mustNotCall(message); const testFunction2 = common.mustNotCall(message); -const createValidate = (line, args = []) => common.mustCall((e) => { +const createValidate = common.mustCallAtLeast((line, args = []) => common.mustCall((e) => { const prefix = `${message} at `; assert.ok(e.message.startsWith(prefix)); if (process.platform === 'win32') { @@ -24,7 +24,7 @@ const createValidate = (line, args = []) => common.mustCall((e) => { const argsInfo = args.length > 0 ? `\ncalled with arguments: ${args.map(util.inspect).join(', ')}` : ''; assert.strictEqual(rest, line + argsInfo); -}); +})); const validate1 = createValidate('9'); try { diff --git a/test/parallel/test-config-file.js b/test/parallel/test-config-file.js index cc235bfadae146..4f4e6703f88702 100644 --- a/test/parallel/test-config-file.js +++ b/test/parallel/test-config-file.js @@ -8,7 +8,7 @@ const { skipIfSQLiteMissing(); const fixtures = require('../common/fixtures'); const tmpdir = require('../common/tmpdir'); -const { match, strictEqual, deepStrictEqual } = require('node:assert'); +const assert = require('node:assert'); const { test, it, describe } = require('node:test'); const { chmodSync, writeFileSync, constants } = require('node:fs'); const { join } = require('node:path'); @@ -19,10 +19,10 @@ test('should handle non existing json', async () => { 'i-do-not-exist.json', '-p', '"Hello, World!"', ]); - match(result.stderr, /Cannot read configuration from i-do-not-exist\.json: no such file or directory/); - match(result.stderr, /i-do-not-exist\.json: not found/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Cannot read configuration from i-do-not-exist\.json: no such file or directory/); + assert.match(result.stderr, /i-do-not-exist\.json: not found/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should handle empty json', async () => { @@ -31,10 +31,10 @@ test('should handle empty json', async () => { fixtures.path('rc/empty.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Can't parse/); - match(result.stderr, /empty\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Can't parse/); + assert.match(result.stderr, /empty\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should handle empty object json', async () => { @@ -44,9 +44,9 @@ test('should handle empty object json', async () => { fixtures.path('rc/empty-object.json'), '-p', '"Hello, World!"', ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, World!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, World!/); + assert.strictEqual(result.code, 0); }); test('should parse boolean flag', async () => { @@ -55,9 +55,9 @@ test('should parse boolean flag', async () => { fixtures.path('rc/transform-types.json'), fixtures.path('typescript/ts/transformation/test-enum.ts'), ]); - match(result.stderr, /--experimental-config-file is an experimental feature and might change at any time/); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.match(result.stderr, /--experimental-config-file is an experimental feature and might change at any time/); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('should parse boolean flag defaulted to true', async () => { @@ -66,9 +66,9 @@ test('should parse boolean flag defaulted to true', async () => { fixtures.path('rc/warnings-false.json'), '-p', 'process.emitWarning("A warning")', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'undefined\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'undefined\n'); + assert.strictEqual(result.code, 0); }); test('should throw an error when a flag is declared twice', async () => { @@ -78,9 +78,9 @@ test('should throw an error when a flag is declared twice', async () => { fixtures.path('rc/override-property.json'), fixtures.path('typescript/ts/transformation/test-enum.ts'), ]); - match(result.stderr, /Option --experimental-transform-types is already defined/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Option --experimental-transform-types is already defined/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); @@ -92,9 +92,9 @@ test('should override env-file', async () => { '--env-file', fixtures.path('dotenv/node-options-no-tranform.env'), fixtures.path('typescript/ts/transformation/test-enum.ts'), ]); - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.match(result.stdout, /Hello, TypeScript!/); + assert.strictEqual(result.code, 0); }); test('should not override NODE_OPTIONS', async () => { @@ -109,9 +109,9 @@ test('should not override NODE_OPTIONS', async () => { NODE_OPTIONS: '--no-experimental-transform-types', }, }); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('should not override CLI flags', async () => { @@ -122,9 +122,9 @@ test('should not override CLI flags', async () => { fixtures.path('rc/transform-types.json'), fixtures.path('typescript/ts/transformation/test-enum.ts'), ]); - match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); + assert.match(result.stderr, /ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 1); }); test('should parse array flag correctly', async () => { @@ -134,9 +134,9 @@ test('should parse array flag correctly', async () => { fixtures.path('rc/import.json'), '--eval', 'setTimeout(() => console.log("D"),99)', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'A\nB\nC\nD\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'A\nB\nC\nD\n'); + assert.strictEqual(result.code, 0); }); test('should validate invalid array flag', async () => { @@ -146,9 +146,9 @@ test('should validate invalid array flag', async () => { fixtures.path('rc/invalid-import.json'), '--eval', 'setTimeout(() => console.log("D"),99)', ]); - match(result.stderr, /invalid-import\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /invalid-import\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should validate array flag as string', async () => { @@ -158,9 +158,9 @@ test('should validate array flag as string', async () => { fixtures.path('rc/import-as-string.json'), '--eval', 'setTimeout(() => console.log("B"),99)', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'A\nB\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'A\nB\n'); + assert.strictEqual(result.code, 0); }); test('should throw at unknown flag', async () => { @@ -170,9 +170,9 @@ test('should throw at unknown flag', async () => { fixtures.path('rc/unknown-flag.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Unknown or not allowed option some-unknown-flag for namespace nodeOptions/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Unknown or not allowed option some-unknown-flag for namespace nodeOptions/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should throw at flag not available in NODE_OPTIONS', async () => { @@ -182,9 +182,9 @@ test('should throw at flag not available in NODE_OPTIONS', async () => { fixtures.path('rc/not-node-options-flag.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Unknown or not allowed option test for namespace nodeOptions/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Unknown or not allowed option test for namespace nodeOptions/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('unsigned flag should be parsed correctly', async () => { @@ -194,9 +194,9 @@ test('unsigned flag should be parsed correctly', async () => { fixtures.path('rc/numeric.json'), '-p', 'http.maxHeaderSize', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '4294967295\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '4294967295\n'); + assert.strictEqual(result.code, 0); }); test('numeric flag should not allow negative values', async () => { @@ -206,10 +206,10 @@ test('numeric flag should not allow negative values', async () => { fixtures.path('rc/negative-numeric.json'), '-p', 'http.maxHeaderSize', ]); - match(result.stderr, /Invalid value for --max-http-header-size/); - match(result.stderr, /negative-numeric\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Invalid value for --max-http-header-size/); + assert.match(result.stderr, /negative-numeric\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('v8 flag should not be allowed in config file', async () => { @@ -219,9 +219,9 @@ test('v8 flag should not be allowed in config file', async () => { fixtures.path('rc/v8-flag.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /V8 flag --abort-on-uncaught-exception is currently not supported/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /V8 flag --abort-on-uncaught-exception is currently not supported/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('string flag should be parsed correctly', async () => { @@ -232,9 +232,9 @@ test('string flag should be parsed correctly', async () => { fixtures.path('rc/string.json'), fixtures.path('rc/test.js'), ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '.\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '.\n'); + assert.strictEqual(result.code, 0); }); test('host port flag should be parsed correctly', { skip: !process.features.inspector }, async () => { @@ -245,9 +245,9 @@ test('host port flag should be parsed correctly', { skip: !process.features.insp fixtures.path('rc/host-port.json'), '-p', 'require("internal/options").getOptionValue("--inspect-port").port', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '65535\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '65535\n'); + assert.strictEqual(result.code, 0); }); test('--inspect=true should be parsed correctly', { skip: !process.features.inspector }, async () => { @@ -258,9 +258,9 @@ test('--inspect=true should be parsed correctly', { skip: !process.features.insp '--inspect-port', '0', '-p', 'require("node:inspector").url()', ]); - match(result.stderr, /^Debugger listening on (ws:\/\/[^\s]+)/); - match(result.stdout, /ws:\/\/[^\s]+/); - strictEqual(result.code, 0); + assert.match(result.stderr, /^Debugger listening on (ws:\/\/[^\s]+)/); + assert.match(result.stdout, /ws:\/\/[^\s]+/); + assert.strictEqual(result.code, 0); }); test('--inspect=false should be parsed correctly', { skip: !process.features.inspector }, async () => { @@ -270,9 +270,9 @@ test('--inspect=false should be parsed correctly', { skip: !process.features.ins fixtures.path('rc/inspect-false.json'), '-p', 'require("node:inspector").url()', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'undefined\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'undefined\n'); + assert.strictEqual(result.code, 0); }); test('no op flag should throw', async () => { @@ -282,10 +282,10 @@ test('no op flag should throw', async () => { fixtures.path('rc/no-op.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /No-op flag --http-parser is currently not supported/); - match(result.stderr, /no-op\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /No-op flag --http-parser is currently not supported/); + assert.match(result.stderr, /no-op\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should not allow users to sneak in a flag', async () => { @@ -295,9 +295,9 @@ test('should not allow users to sneak in a flag', async () => { fixtures.path('rc/sneaky-flag.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /The number of NODE_OPTIONS doesn't match the number of flags in the config file/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /The number of NODE_OPTIONS doesn't match the number of flags in the config file/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('non object root', async () => { @@ -307,9 +307,9 @@ test('non object root', async () => { fixtures.path('rc/non-object-root.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Root value unexpected not an object for/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Root value unexpected not an object for/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('non object node options', async () => { @@ -319,9 +319,9 @@ test('non object node options', async () => { fixtures.path('rc/non-object-node-options.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /"nodeOptions" value unexpected for/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /"nodeOptions" value unexpected for/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should throw correct error when a json is broken', async () => { @@ -331,10 +331,10 @@ test('should throw correct error when a json is broken', async () => { fixtures.path('rc/broken.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Can't parse/); - match(result.stderr, /broken\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Can't parse/); + assert.match(result.stderr, /broken\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('broken value in node_options', async () => { @@ -344,10 +344,10 @@ test('broken value in node_options', async () => { fixtures.path('rc/broken-node-options.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Can't parse/); - match(result.stderr, /broken-node-options\.json: invalid content/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Can't parse/); + assert.match(result.stderr, /broken-node-options\.json: invalid content/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); test('should use node.config.json as default', async () => { @@ -358,9 +358,9 @@ test('should use node.config.json as default', async () => { ], { cwd: fixtures.path('rc/default'), }); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '10\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '10\n'); + assert.strictEqual(result.code, 0); }); test('should override node.config.json when specificied', async () => { @@ -373,9 +373,9 @@ test('should override node.config.json when specificied', async () => { ], { cwd: fixtures.path('rc/default'), }); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '20\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '20\n'); + assert.strictEqual(result.code, 0); }); // Skip on windows because it doesn't support chmod changing read permissions // Also skip if user is root because it would have read permissions anyway @@ -395,9 +395,9 @@ test('should throw an error when the file is non readable', { ], { cwd: tmpdir.path, }); - match(result.stderr, /Cannot read configuration from node\.config\.json: permission denied/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Cannot read configuration from node\.config\.json: permission denied/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); describe('namespace-scoped options', () => { @@ -409,9 +409,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/namespaced/node.config.json'), '-p', 'require("internal/options").getOptionValue("--test-isolation")', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'none\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'none\n'); + assert.strictEqual(result.code, 0); }); it('should throw an error when a namespace-scoped option is not recognised', async () => { @@ -421,9 +421,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/unknown-flag-namespace.json'), '-p', '"Hello, World!"', ]); - match(result.stderr, /Unknown or not allowed option unknown-flag for namespace testRunner/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Unknown or not allowed option unknown-flag for namespace testRunner/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); it('should not throw an error when a namespace is not recognised', async () => { @@ -433,9 +433,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/unknown-namespace.json'), '-p', '"Hello, World!"', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello, World!\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello, World!\n'); + assert.strictEqual(result.code, 0); }); it('should handle an empty namespace valid namespace', async () => { @@ -445,9 +445,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/empty-valid-namespace.json'), '-p', '"Hello, World!"', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'Hello, World!\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'Hello, World!\n'); + assert.strictEqual(result.code, 0); }); it('should throw an error if a namespace-scoped option has already been set in node options', async () => { @@ -458,9 +458,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/override-node-option-with-namespace.json'), '-p', 'require("internal/options").getOptionValue("--test-isolation")', ]); - match(result.stderr, /Option --test-isolation is already defined/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Option --test-isolation is already defined/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); it('should throw an error if a node option has already been set in a namespace-scoped option', async () => { @@ -471,9 +471,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/override-namespace.json'), '-p', 'require("internal/options").getOptionValue("--test-isolation")', ]); - match(result.stderr, /Option --test-isolation is already defined/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 9); + assert.match(result.stderr, /Option --test-isolation is already defined/); + assert.strictEqual(result.stdout, ''); + assert.strictEqual(result.code, 9); }); it('should prioritise CLI namespace-scoped options over config file options', async () => { @@ -485,9 +485,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/namespaced/node.config.json'), '-p', 'require("internal/options").getOptionValue("--test-isolation")', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, 'process\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, 'process\n'); + assert.strictEqual(result.code, 0); }); it('should append namespace-scoped config file options with CLI options in case of array', async () => { @@ -500,7 +500,7 @@ describe('namespace-scoped options', () => { fixtures.path('rc/namespace-with-array.json'), '-p', 'JSON.stringify(require("internal/options").getOptionValue("--test-coverage-exclude"))', ]); - strictEqual(result.stderr, ''); + assert.strictEqual(result.stderr, ''); const excludePatterns = JSON.parse(result.stdout); const expected = [ 'config-pattern1', @@ -508,8 +508,8 @@ describe('namespace-scoped options', () => { 'cli-pattern1', 'cli-pattern2', ]; - deepStrictEqual(excludePatterns, expected); - strictEqual(result.code, 0); + assert.deepStrictEqual(excludePatterns, expected); + assert.strictEqual(result.code, 0); }); it('should allow setting kDisallowedInEnvvar in the config file if part of a namespace', async () => { @@ -522,9 +522,9 @@ describe('namespace-scoped options', () => { fixtures.path('rc/namespace-with-disallowed-envvar.json'), '-p', 'require("internal/options").getOptionValue("--test-concurrency")', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '1\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '1\n'); + assert.strictEqual(result.code, 0); }); it('should override namespace-scoped config file options with CLI options', async () => { @@ -538,8 +538,8 @@ describe('namespace-scoped options', () => { fixtures.path('rc/namespace-with-disallowed-envvar.json'), '-p', 'require("internal/options").getOptionValue("--test-concurrency")', ]); - strictEqual(result.stderr, ''); - strictEqual(result.stdout, '2\n'); - strictEqual(result.code, 0); + assert.strictEqual(result.stderr, ''); + assert.strictEqual(result.stdout, '2\n'); + assert.strictEqual(result.code, 0); }); }); diff --git a/test/parallel/test-console-diagnostics-channels.js b/test/parallel/test-console-diagnostics-channels.js index 1a12d7a78f0b71..70de442697e1bb 100644 --- a/test/parallel/test-console-diagnostics-channels.js +++ b/test/parallel/test-console-diagnostics-channels.js @@ -1,7 +1,7 @@ 'use strict'; const { mustCall } = require('../common'); -const { deepStrictEqual, ok, strictEqual } = require('assert'); +const assert = require('assert'); const { channel } = require('diagnostics_channel'); @@ -54,10 +54,10 @@ for (const method of methods) { channels[method].subscribe(mustCall((args) => { // Should not have been formatted yet. intercepted = true; - ok(!formatted); + assert.ok(!formatted); // Should receive expected log message args. - deepStrictEqual(args, [foo, bar, baz]); + assert.deepStrictEqual(args, [foo, bar, baz]); // Should be able to mutate message args and have it reflected in output. bar.added = true; @@ -66,10 +66,10 @@ for (const method of methods) { hijack(mustCall((output) => { // Should have already been intercepted. formatted = true; - ok(intercepted); + assert.ok(intercepted); // Should produce expected formatted output with mutated message args. - strictEqual(output, 'string { key: /value/, added: true } [ 1, 2, 3 ]\n'); + assert.strictEqual(output, 'string { key: /value/, added: true } [ 1, 2, 3 ]\n'); })); console[method](foo, bar, baz); diff --git a/test/parallel/test-console-tty-colors-per-stream.js b/test/parallel/test-console-tty-colors-per-stream.js index a7502766a1e354..4831c1d2ef7626 100644 --- a/test/parallel/test-console-tty-colors-per-stream.js +++ b/test/parallel/test-console-tty-colors-per-stream.js @@ -2,7 +2,7 @@ require('../common'); const { Console } = require('console'); const { PassThrough } = require('stream'); -const { strict: assert } = require('assert'); +const assert = require('assert'); const stdout = new PassThrough().setEncoding('utf8'); const stderr = new PassThrough().setEncoding('utf8'); diff --git a/test/parallel/test-console.js b/test/parallel/test-console.js index bc08ba395e787e..7aab6414cd23ce 100644 --- a/test/parallel/test-console.js +++ b/test/parallel/test-console.js @@ -179,11 +179,11 @@ console.timeEnd(NaN); // Make sure calling time twice without timeEnd doesn't reset the timer. console.time('test'); const time = console._times.get('test'); -setTimeout(() => { +setTimeout(common.mustCall(() => { console.time('test'); assert.deepStrictEqual(console._times.get('test'), time); console.timeEnd('test'); -}, 1); +}), 1); console.time('log1'); console.timeLog('log1'); diff --git a/test/parallel/test-constants.js b/test/parallel/test-constants.js index 08d1f1dbcdd0ab..51023b56d4dca1 100644 --- a/test/parallel/test-constants.js +++ b/test/parallel/test-constants.js @@ -15,16 +15,16 @@ assert.ok(binding.fs); assert.ok(binding.crypto); ['os', 'fs', 'crypto'].forEach((l) => { - Object.keys(binding[l]).forEach((k) => { + for (const k of Object.keys(binding[l])) { if (typeof binding[l][k] === 'object') { // errno and signals - Object.keys(binding[l][k]).forEach((j) => { + for (const j of Object.keys(binding[l][k])) { assert.strictEqual(binding[l][k][j], constants[j]); - }); + } } if (l !== 'os') { // Top level os constant isn't currently copied assert.strictEqual(binding[l][k], constants[k]); } - }); + } }); assert.ok(Object.isFrozen(constants)); diff --git a/test/parallel/test-cppheap-stats.js b/test/parallel/test-cppheap-stats.js index cbc6dd4981cd7f..b77847602aa828 100644 --- a/test/parallel/test-cppheap-stats.js +++ b/test/parallel/test-cppheap-stats.js @@ -40,7 +40,7 @@ const expectedSpaceKeys = [ 'free_list_stats', ].sort(); -heapStatsDetailed.space_statistics.forEach((space) => { +for (const space of heapStatsDetailed.space_statistics) { const actualSpaceKeys = Object.keys(space).sort(); assert.deepStrictEqual(actualSpaceKeys, expectedSpaceKeys); assert.strictEqual(typeof space.name, 'string'); @@ -49,7 +49,7 @@ heapStatsDetailed.space_statistics.forEach((space) => { assert.strictEqual(typeof space.used_size_bytes, 'number'); assert.strictEqual(Array.isArray(space.page_stats), true); assert.strictEqual(typeof space.free_list_stats, 'object'); -}); +} // Check page statistics array const expectedPageKeys = [ @@ -59,46 +59,46 @@ const expectedPageKeys = [ 'object_statistics', ].sort(); -heapStatsDetailed.space_statistics.forEach((space) => { - space.page_stats.forEach((page) => { +for (const space of heapStatsDetailed.space_statistics) { + for (const page of space.page_stats) { const actualPageKeys = Object.keys(page).sort(); assert.deepStrictEqual(actualPageKeys, expectedPageKeys); assert.strictEqual(typeof page.committed_size_bytes, 'number'); assert.strictEqual(typeof page.resident_size_bytes, 'number'); assert.strictEqual(typeof page.used_size_bytes, 'number'); assert.strictEqual(Array.isArray(page.object_statistics), true); - }); -}); + } +} // Check free list statistics const expectedFreeListKeys = ['bucket_size', 'free_count', 'free_size'].sort(); -heapStatsDetailed.space_statistics.forEach((space) => { +for (const space of heapStatsDetailed.space_statistics) { const actualFreeListKeys = Object.keys(space.free_list_stats).sort(); assert.deepStrictEqual(actualFreeListKeys, expectedFreeListKeys); assert.strictEqual(Array.isArray(space.free_list_stats.bucket_size), true); assert.strictEqual(Array.isArray(space.free_list_stats.free_count), true); assert.strictEqual(Array.isArray(space.free_list_stats.free_size), true); -}); +} // Check object statistics const expectedObjectStatsKeys = ['allocated_bytes', 'object_count'].sort(); -heapStatsDetailed.space_statistics.forEach((space) => { - space.page_stats.forEach((page) => { - page.object_statistics.forEach((objectStats) => { +for (const space of heapStatsDetailed.space_statistics) { + for (const page of space.page_stats) { + for (const objectStats of page.object_statistics) { const actualObjectStatsKeys = Object.keys(objectStats).sort(); assert.deepStrictEqual(actualObjectStatsKeys, expectedObjectStatsKeys); assert.strictEqual(typeof objectStats.allocated_bytes, 'number'); assert.strictEqual(typeof objectStats.object_count, 'number'); - }); - }); -}); + } + } +} // Check type names -heapStatsDetailed.type_names.forEach((typeName) => { +for (const typeName of heapStatsDetailed.type_names) { assert.strictEqual(typeof typeName, 'string'); -}); +} // Brief heap statistics const heapStatsBrief = v8.getCppHeapStatistics('brief'); diff --git a/test/parallel/test-crypto-async-sign-verify.js b/test/parallel/test-crypto-async-sign-verify.js index d385926e994305..9876c4bb6ecd2e 100644 --- a/test/parallel/test-crypto-async-sign-verify.js +++ b/test/parallel/test-crypto-async-sign-verify.js @@ -88,18 +88,21 @@ test('rsa_public.pem', 'rsa_private.pem', 'sha256', false, // ED25519 test('ed25519_public.pem', 'ed25519_private.pem', undefined, true); -// ED448 -test('ed448_public.pem', 'ed448_private.pem', undefined, true); -// ECDSA w/ der signature encoding -test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', - false); -test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', - false, { dsaEncoding: 'der' }); +if (!process.features.openssl_is_boringssl) { + // ED448 + test('ed448_public.pem', 'ed448_private.pem', undefined, true); -// ECDSA w/ ieee-p1363 signature encoding -test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', false, - { dsaEncoding: 'ieee-p1363' }); + // ECDSA w/ der signature encoding + test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', + false); + test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', + false, { dsaEncoding: 'der' }); + + // ECDSA w/ ieee-p1363 signature encoding + test('ec_secp256k1_public.pem', 'ec_secp256k1_private.pem', 'sha384', false, + { dsaEncoding: 'ieee-p1363' }); +} // DSA w/ der signature encoding test('dsa_public.pem', 'dsa_private.pem', 'sha256', @@ -150,7 +153,10 @@ MCowBQYDK2VuAyEA6pwGRbadNQAI/tYN8+/p/0/hbsdHfOEGr1ADiLVk/Gc= const data = crypto.randomBytes(32); const signature = crypto.randomBytes(16); - const expected = hasOpenSSL3 ? /operation not supported for this keytype/ : /no default digest/; + let expected = /no default digest/; + if (hasOpenSSL3 || process.features.openssl_is_boringssl) { + expected = /operation[\s_]not[\s_]supported[\s_]for[\s_]this[\s_]keytype/i; + } crypto.verify(undefined, data, untrustedKey, signature, common.mustCall((err) => { assert.ok(err); @@ -164,6 +170,6 @@ MCowBQYDK2VuAyEA6pwGRbadNQAI/tYN8+/p/0/hbsdHfOEGr1ADiLVk/Gc= }); crypto.sign('sha512', 'message', privateKey, common.mustCall((err) => { assert.ok(err); - assert.match(err.message, /digest too big for rsa key/); + assert.match(err.message, /digest[\s_]too[\s_]big[\s_]for[\s_]rsa[\s_]key/i); })); } diff --git a/test/parallel/test-crypto-certificate.js b/test/parallel/test-crypto-certificate.js index 4a5f1f149fe6c7..28d20ba61c755c 100644 --- a/test/parallel/test-crypto-certificate.js +++ b/test/parallel/test-crypto-certificate.js @@ -41,7 +41,8 @@ function copyArrayBuffer(buf) { function checkMethods(certificate) { - assert.strictEqual(certificate.verifySpkac(spkacValid), true); + if (!process.features.openssl_is_boringssl) + assert.strictEqual(certificate.verifySpkac(spkacValid), true); assert.strictEqual(certificate.verifySpkac(spkacFail), false); assert.strictEqual( @@ -56,10 +57,12 @@ function checkMethods(certificate) { ); assert.strictEqual(certificate.exportChallenge(spkacFail), ''); - const ab = copyArrayBuffer(spkacValid); - assert.strictEqual(certificate.verifySpkac(ab), true); - assert.strictEqual(certificate.verifySpkac(new Uint8Array(ab)), true); - assert.strictEqual(certificate.verifySpkac(new DataView(ab)), true); + if (!process.features.openssl_is_boringssl) { + const ab = copyArrayBuffer(spkacValid); + assert.strictEqual(certificate.verifySpkac(ab), true); + assert.strictEqual(certificate.verifySpkac(new Uint8Array(ab)), true); + assert.strictEqual(certificate.verifySpkac(new DataView(ab)), true); + } } { diff --git a/test/parallel/test-crypto-dh-errors.js b/test/parallel/test-crypto-dh-errors.js index 0af4db0310750c..d7527d82617efc 100644 --- a/test/parallel/test-crypto-dh-errors.js +++ b/test/parallel/test-crypto-dh-errors.js @@ -35,7 +35,7 @@ for (const bits of [-1, 0, 1]) { assert.throws(() => crypto.createDiffieHellman(bits), { code: 'ERR_OSSL_BN_BITS_TOO_SMALL', name: 'Error', - message: /bits too small/, + message: /bits[\s_]too[\s_]small/i, }); } } diff --git a/test/parallel/test-crypto-dh-generate-keys.js b/test/parallel/test-crypto-dh-generate-keys.js index e4598274328bd8..acf7e2d09b2b83 100644 --- a/test/parallel/test-crypto-dh-generate-keys.js +++ b/test/parallel/test-crypto-dh-generate-keys.js @@ -56,9 +56,9 @@ const { hasOpenSSL3 } = require('../common/crypto'); }, ['public']); // The public key is outdated: generateKeys() generates only the public key. - testGenerateKeysChangesKeys((dh) => { + testGenerateKeysChangesKeys(common.mustCall((dh) => { const oldPublicKey = dh.generateKeys(); dh.setPrivateKey(Buffer.from('01020304', 'hex')); assert.deepStrictEqual(dh.getPublicKey(), oldPublicKey); - }, ['public']); + }), ['public']); } diff --git a/test/parallel/test-crypto-dh.js b/test/parallel/test-crypto-dh.js index d7ffbe5eca9273..3c00a5fc73bb9f 100644 --- a/test/parallel/test-crypto-dh.js +++ b/test/parallel/test-crypto-dh.js @@ -60,18 +60,17 @@ const { let wrongBlockLength; if (hasOpenSSL3) { wrongBlockLength = { - message: 'error:1C80006B:Provider routines::wrong final block length', - code: 'ERR_OSSL_WRONG_FINAL_BLOCK_LENGTH', - library: 'Provider routines', - reason: 'wrong final block length' + message: /wrong[\s_]final[\s_]block[\s_]length/i, + code: /ERR_OSSL_(EVP_)?WRONG_FINAL_BLOCK_LENGTH/, + library: /Provider routines|Cipher functions/, + reason: /wrong[\s_]final[\s_]block[\s_]length/i, }; } else { wrongBlockLength = { - message: 'error:0606506D:digital envelope' + - ' routines:EVP_DecryptFinal_ex:wrong final block length', - code: 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH', - library: 'digital envelope routines', - reason: 'wrong final block length' + message: /wrong[\s_]final[\s_]block[\s_]length/i, + code: /ERR_OSSL_(EVP_)?WRONG_FINAL_BLOCK_LENGTH/, + library: /digital envelope routines|Cipher functions/, + reason: /wrong[\s_]final[\s_]block[\s_]length/i, }; } diff --git a/test/parallel/test-crypto-domain.js b/test/parallel/test-crypto-domain.js index 62e2be4c0f39c2..3e8ead73dc28d2 100644 --- a/test/parallel/test-crypto-domain.js +++ b/test/parallel/test-crypto-domain.js @@ -28,7 +28,7 @@ const assert = require('assert'); const crypto = require('crypto'); const domain = require('domain'); -const test = (fn) => { +function test(fn) { const ex = new Error('BAM'); const d = domain.create(); d.on('error', common.mustCall(function(err) { @@ -37,11 +37,11 @@ const test = (fn) => { const cb = common.mustCall(function() { throw ex; }); - d.run(cb); + d.run(fn, cb); }; test(function(cb) { - crypto.pbkdf2('password', 'salt', 1, 8, cb); + crypto.pbkdf2('password', 'salt', 1, 8, 'sha1', cb); }); test(function(cb) { diff --git a/test/parallel/test-crypto-hash.js b/test/parallel/test-crypto-hash.js index cac81483b53491..5f18ad2d1ec137 100644 --- a/test/parallel/test-crypto-hash.js +++ b/test/parallel/test-crypto-hash.js @@ -191,7 +191,7 @@ assert.throws( } // Test XOF hash functions and the outputLength option. -{ +if (!process.features.openssl_is_boringssl) { // Default outputLengths. assert.strictEqual(crypto.createHash('shake128').digest('hex'), '7f9c2ba4e88f827d616045507605853e'); diff --git a/test/parallel/test-crypto-key-objects.js b/test/parallel/test-crypto-key-objects.js index 0c516d80950694..e8359ed6d0362c 100644 --- a/test/parallel/test-crypto-key-objects.js +++ b/test/parallel/test-crypto-key-objects.js @@ -243,14 +243,14 @@ const privateDsa = fixtures.readKey('dsa_private_encrypted_1025.pem', assert(Buffer.isBuffer(privateDER)); const plaintext = Buffer.from('Hello world', 'utf8'); - const testDecryption = (fn, ciphertexts, decryptionKeys) => { + const testDecryption = common.mustCall((fn, ciphertexts, decryptionKeys) => { for (const ciphertext of ciphertexts) { for (const key of decryptionKeys) { const deciphered = fn(key, ciphertext); assert.deepStrictEqual(deciphered, plaintext); } } - }; + }, 2); testDecryption(privateDecrypt, [ // Encrypt using the public key. diff --git a/test/parallel/test-crypto-op-during-process-exit.js b/test/parallel/test-crypto-op-during-process-exit.js index a9a70c39e095a3..e48b38caedd996 100644 --- a/test/parallel/test-crypto-op-during-process-exit.js +++ b/test/parallel/test-crypto-op-during-process-exit.js @@ -22,6 +22,7 @@ generateKeyPair('rsa', { format: 'pem' } }, (err/* , publicKey, privateKey */) => { + // eslint-disable-next-line node-core/must-call-assert assert.ifError(err); }); diff --git a/test/parallel/test-crypto-padding.js b/test/parallel/test-crypto-padding.js index 48cd1ed4df61aa..6e7a7fffee58d8 100644 --- a/test/parallel/test-crypto-padding.js +++ b/test/parallel/test-crypto-padding.js @@ -84,14 +84,13 @@ assert.throws(function() { // Input must have block length %. enc(ODD_LENGTH_PLAIN, false); }, hasOpenSSL3 ? { - message: 'error:1C80006B:Provider routines::wrong final block length', - code: 'ERR_OSSL_WRONG_FINAL_BLOCK_LENGTH', - reason: 'wrong final block length', + message: /wrong[\s_]final[\s_]block[\s_]length/i, + code: /ERR_OSSL(_EVP)?_WRONG_FINAL_BLOCK_LENGTH/, + reason: /wrong[\s_]final[\s_]block[\s_]length/i, } : { - message: 'error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:' + - 'data not multiple of block length', - code: 'ERR_OSSL_EVP_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH', - reason: 'data not multiple of block length', + message: /data[\s_]not[\s_]multiple[\s_]of[\s_]block[\s_]length/i, + code: /ERR_OSSL(_EVP)?_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH/, + reason: /data[\s_]not[\s_]multiple[\s_]of[\s_]block[\s_]length/i, } ); @@ -110,15 +109,10 @@ assert.strictEqual(dec(EVEN_LENGTH_ENCRYPTED, false).length, 48); assert.throws(function() { // Must have at least 1 byte of padding (PKCS): assert.strictEqual(dec(EVEN_LENGTH_ENCRYPTED_NOPAD, true), EVEN_LENGTH_PLAIN); -}, hasOpenSSL3 ? { - message: 'error:1C800064:Provider routines::bad decrypt', - reason: 'bad decrypt', - code: 'ERR_OSSL_BAD_DECRYPT', -} : { - message: 'error:06065064:digital envelope routines:EVP_DecryptFinal_ex:' + - 'bad decrypt', - reason: 'bad decrypt', - code: 'ERR_OSSL_EVP_BAD_DECRYPT', +}, { + message: /bad[\s_]decrypt/i, + reason: /bad[\s_]decrypt/i, + code: /ERR_OSSL(_EVP)?_BAD_DECRYPT/, }); // No-pad encrypted string should return the same: diff --git a/test/parallel/test-crypto-pqc-keygen-ml-dsa.js b/test/parallel/test-crypto-pqc-keygen-ml-dsa.js index 9fa0a0ffef5d72..abad2c15cf01d1 100644 --- a/test/parallel/test-crypto-pqc-keygen-ml-dsa.js +++ b/test/parallel/test-crypto-pqc-keygen-ml-dsa.js @@ -42,6 +42,7 @@ if (!hasOpenSSL(3, 5)) { } for (const [publicKeyEncoding, validate] of [ + /* eslint-disable node-core/must-call-assert */ [undefined, (publicKey) => { assert.strictEqual(publicKey.type, 'public'); assert.strictEqual(publicKey.asymmetricKeyType, asymmetricKeyType); @@ -50,10 +51,12 @@ if (!hasOpenSSL(3, 5)) { [{ format: 'jwk' }, (publicKey) => assertPublicJwk(publicKey)], [{ format: 'pem', type: 'spki' }, (publicKey) => assert.strictEqual(typeof publicKey, 'string')], [{ format: 'der', type: 'spki' }, (publicKey) => assert.strictEqual(Buffer.isBuffer(publicKey), true)], + /* eslint-enable node-core/must-call-assert */ ]) { generateKeyPair(asymmetricKeyType, { publicKeyEncoding }, common.mustSucceed(validate)); } for (const [privateKeyEncoding, validate] of [ + /* eslint-disable node-core/must-call-assert */ [undefined, (_, privateKey) => { assert.strictEqual(privateKey.type, 'private'); assert.strictEqual(privateKey.asymmetricKeyType, asymmetricKeyType); @@ -62,6 +65,7 @@ if (!hasOpenSSL(3, 5)) { [{ format: 'jwk' }, (_, privateKey) => assertPrivateJwk(privateKey)], [{ format: 'pem', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(typeof privateKey, 'string')], [{ format: 'der', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(Buffer.isBuffer(privateKey), true)], + /* eslint-enable node-core/must-call-assert */ ]) { generateKeyPair(asymmetricKeyType, { privateKeyEncoding }, common.mustSucceed(validate)); } diff --git a/test/parallel/test-crypto-pqc-keygen-ml-kem.js b/test/parallel/test-crypto-pqc-keygen-ml-kem.js index fbbbc4f8de9663..adb5fcb56ce6ef 100644 --- a/test/parallel/test-crypto-pqc-keygen-ml-kem.js +++ b/test/parallel/test-crypto-pqc-keygen-ml-kem.js @@ -21,6 +21,7 @@ if (!hasOpenSSL(3, 5)) { } else { for (const asymmetricKeyType of ['ml-kem-512', 'ml-kem-768', 'ml-kem-1024']) { for (const [publicKeyEncoding, validate] of [ + /* eslint-disable node-core/must-call-assert */ [undefined, (publicKey) => { assert.strictEqual(publicKey.type, 'public'); assert.strictEqual(publicKey.asymmetricKeyType, asymmetricKeyType); @@ -28,10 +29,12 @@ if (!hasOpenSSL(3, 5)) { }], [{ format: 'pem', type: 'spki' }, (publicKey) => assert.strictEqual(typeof publicKey, 'string')], [{ format: 'der', type: 'spki' }, (publicKey) => assert.strictEqual(Buffer.isBuffer(publicKey), true)], + /* eslint-enable node-core/must-call-assert */ ]) { generateKeyPair(asymmetricKeyType, { publicKeyEncoding }, common.mustSucceed(validate)); } for (const [privateKeyEncoding, validate] of [ + /* eslint-disable node-core/must-call-assert */ [undefined, (_, privateKey) => { assert.strictEqual(privateKey.type, 'private'); assert.strictEqual(privateKey.asymmetricKeyType, asymmetricKeyType); @@ -39,6 +42,7 @@ if (!hasOpenSSL(3, 5)) { }], [{ format: 'pem', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(typeof privateKey, 'string')], [{ format: 'der', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(Buffer.isBuffer(privateKey), true)], + /* eslint-enable node-core/must-call-assert */ ]) { generateKeyPair(asymmetricKeyType, { privateKeyEncoding }, common.mustSucceed(validate)); } diff --git a/test/parallel/test-crypto-pqc-keygen-slh-dsa.js b/test/parallel/test-crypto-pqc-keygen-slh-dsa.js index 78dde3bea4775e..6b741e37f0cc11 100644 --- a/test/parallel/test-crypto-pqc-keygen-slh-dsa.js +++ b/test/parallel/test-crypto-pqc-keygen-slh-dsa.js @@ -29,6 +29,7 @@ if (!hasOpenSSL(3, 5)) { 'slh-dsa-shake-192f', 'slh-dsa-shake-192s', 'slh-dsa-shake-256f', 'slh-dsa-shake-256s', ]) { for (const [publicKeyEncoding, validate] of [ + /* eslint-disable node-core/must-call-assert */ [undefined, (publicKey) => { assert.strictEqual(publicKey.type, 'public'); assert.strictEqual(publicKey.asymmetricKeyType, asymmetricKeyType); @@ -47,6 +48,7 @@ if (!hasOpenSSL(3, 5)) { }], [{ format: 'pem', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(typeof privateKey, 'string')], [{ format: 'der', type: 'pkcs8' }, (_, privateKey) => assert.strictEqual(Buffer.isBuffer(privateKey), true)], + /* eslint-enable node-core/must-call-assert */ ]) { generateKeyPair(asymmetricKeyType, { privateKeyEncoding }, common.mustSucceed(validate)); } diff --git a/test/parallel/test-crypto-randomfillsync-regression.js b/test/parallel/test-crypto-randomfillsync-regression.js index 7a378642588d9e..0b7cd6931569e4 100644 --- a/test/parallel/test-crypto-randomfillsync-regression.js +++ b/test/parallel/test-crypto-randomfillsync-regression.js @@ -4,7 +4,7 @@ if (!common.hasCrypto) common.skip('missing crypto'); const { randomFillSync } = require('crypto'); -const { notStrictEqual } = require('assert'); +const assert = require('assert'); const ab = new ArrayBuffer(20); const buf = Buffer.from(ab, 10); @@ -15,4 +15,4 @@ randomFillSync(buf); const after = buf.toString('hex'); -notStrictEqual(before, after); +assert.notStrictEqual(before, after); diff --git a/test/parallel/test-crypto-rsa-pss-default-salt-length.js b/test/parallel/test-crypto-rsa-pss-default-salt-length.js new file mode 100644 index 00000000000000..fc86b52931fc74 --- /dev/null +++ b/test/parallel/test-crypto-rsa-pss-default-salt-length.js @@ -0,0 +1,37 @@ +'use strict'; +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const crypto = require('crypto'); + +const fixtures = require('../common/fixtures'); + +const privateKey = crypto.createPrivateKey(fixtures.readKey('rsa_private.pem', 'ascii')); +const publicKey = crypto.createPublicKey(fixtures.readKey('rsa_public.pem', 'ascii')); + +const data = crypto.randomBytes(32); + +for (const digest of ['sha256', 'sha384', 'sha512']) { + const hLen = crypto.hash(digest, data, 'buffer').byteLength; + const maxSaltLength = + privateKey.asymmetricKeyDetails.modulusLength / 8 - hLen - 2; + + const sig = crypto.sign(digest, data, { + key: privateKey, + padding: crypto.constants.RSA_PKCS1_PSS_PADDING, + // No "saltLength" provided, documented default RSA_PSS_SALTLEN_MAX_SIGN expected + }); + + assert.strictEqual(crypto.verify( + digest, + data, + { + key: publicKey, + padding: crypto.constants.RSA_PKCS1_PSS_PADDING, + saltLength: maxSaltLength, + }, + sig + ), true); +} diff --git a/test/parallel/test-crypto-stream.js b/test/parallel/test-crypto-stream.js index 747af780469c22..ed0916b036a9af 100644 --- a/test/parallel/test-crypto-stream.js +++ b/test/parallel/test-crypto-stream.js @@ -73,9 +73,9 @@ const cipher = crypto.createCipheriv('aes-128-cbc', key, iv); const decipher = crypto.createDecipheriv('aes-128-cbc', badkey, iv); cipher.pipe(decipher) - .on('error', common.expectsError(hasOpenSSL3 ? { - message: /bad[\s_]decrypt/, - library: 'Provider routines', + .on('error', common.expectsError((hasOpenSSL3 || process.features.openssl_is_boringssl) ? { + message: /bad[\s_]decrypt/i, + library: /Provider routines|Cipher functions/, reason: /bad[\s_]decrypt/i, } : { message: /bad[\s_]decrypt/i, diff --git a/test/parallel/test-crypto-subtle-zero-length.js b/test/parallel/test-crypto-subtle-zero-length.js index f5a84727b02a01..fa0ffa0160d701 100644 --- a/test/parallel/test-crypto-subtle-zero-length.js +++ b/test/parallel/test-crypto-subtle-zero-length.js @@ -34,6 +34,4 @@ const { subtle } = globalThis.crypto; }, k, e); assert(v instanceof ArrayBuffer); assert.strictEqual(v.byteLength, 0); -})().then(common.mustCall()).catch((e) => { - assert.ifError(e); -}); +})().then(common.mustCall()); diff --git a/test/parallel/test-debugger-restart-message.js b/test/parallel/test-debugger-restart-message.js index 190d0c18ccc081..292a15bd9f4d7a 100644 --- a/test/parallel/test-debugger-restart-message.js +++ b/test/parallel/test-debugger-restart-message.js @@ -31,6 +31,8 @@ const startCLI = require('../common/debugger'); } finally { await cli.quit(); } + + assert.doesNotMatch(cli.stderrOutput, /MaxListenersExceededWarning/); } onWaitForInitialBreak(); diff --git a/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers-and-strings.js b/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers-and-strings.js new file mode 100644 index 00000000000000..2985beb5cbe526 --- /dev/null +++ b/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers-and-strings.js @@ -0,0 +1,73 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +// This test ensures that the built-in HTTP/2 diagnostics channels are reporting +// the diagnostics messages for the 'http2.client.stream.bodyChunkSent' and +// 'http2.client.stream.bodySent' channels when ClientHttp2Streams bodies are +// being sent with multiple Buffers and strings. + +const assert = require('assert'); +const dc = require('diagnostics_channel'); +const http2 = require('http2'); +const { Duplex } = require('stream'); + +let bodyChunkSent = false; + +dc.subscribe('http2.client.stream.bodyChunkSent', common.mustCall(({ stream, writev, data, encoding }) => { + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); + + assert.strictEqual(writev, true); + + assert.ok(Array.isArray(data)); + assert.strictEqual(data.length, 3); + + assert.strictEqual(data[0].chunk, 'héllo'); + assert.strictEqual(data[0].encoding, 'latin1'); + + assert.ok(Buffer.from('foo').equals(data[1].chunk)); + assert.strictEqual(data[1].encoding, 'buffer'); + + assert.ok(Buffer.from('bar').equals(data[2].chunk)); + assert.strictEqual(data[2].encoding, 'buffer'); + + assert.strictEqual(encoding, ''); + + bodyChunkSent = true; +})); + +dc.subscribe('http2.client.stream.bodySent', common.mustCall(({ stream }) => { + // 'http2.client.stream.bodyChunkSent' must run first. + assert.ok(bodyChunkSent); + + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); +})); + +const server = http2.createServer(); +server.on('stream', common.mustCall((stream) => { + stream.respond({}, { endStream: true }); +})); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + + const stream = client.request({ [http2.constants.HTTP2_HEADER_METHOD]: 'POST' }); + stream.write('héllo', 'latin1'); + stream.write(Buffer.from('foo')); + stream.write(new TextEncoder().encode('bar')); + stream.end(); + + stream.on('response', common.mustCall(() => { + client.close(); + server.close(); + })); +}, 1)); diff --git a/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers.js b/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers.js new file mode 100644 index 00000000000000..ddb3a5ef001b2c --- /dev/null +++ b/test/parallel/test-diagnostics-channel-http2-client-stream-body-multiple-buffers.js @@ -0,0 +1,66 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +// This test ensures that the built-in HTTP/2 diagnostics channels are reporting +// the diagnostics messages for the 'http2.client.stream.bodyChunkSent' and +// 'http2.client.stream.bodySent' channels when ClientHttp2Streams bodies are +// being sent with multiple Buffers. + +const assert = require('assert'); +const dc = require('diagnostics_channel'); +const http2 = require('http2'); +const { Duplex } = require('stream'); + +let bodyChunkSent = false; + +dc.subscribe('http2.client.stream.bodyChunkSent', common.mustCall(({ stream, writev, data, encoding }) => { + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); + + assert.strictEqual(writev, true); + + assert.ok(Array.isArray(data)); + assert.strictEqual(data.length, 2); + + assert.ok(Buffer.from('foo').equals(data[0])); + assert.ok(Buffer.from('bar').equals(data[1])); + + assert.strictEqual(encoding, ''); + + bodyChunkSent = true; +})); + +dc.subscribe('http2.client.stream.bodySent', common.mustCall(({ stream }) => { + // 'http2.client.stream.bodyChunkSent' must run first. + assert.ok(bodyChunkSent); + + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); +})); + +const server = http2.createServer(); +server.on('stream', common.mustCall((stream) => { + stream.respond({}, { endStream: true }); +})); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + + const stream = client.request({ [http2.constants.HTTP2_HEADER_METHOD]: 'POST' }); + stream.write(Buffer.from('foo')); + stream.write(Buffer.from('bar')); + stream.end(); + + stream.on('response', common.mustCall(() => { + client.close(); + server.close(); + })); +}, 1)); diff --git a/test/parallel/test-diagnostics-channel-http2-client-stream-body-no-chunks.js b/test/parallel/test-diagnostics-channel-http2-client-stream-body-no-chunks.js new file mode 100644 index 00000000000000..1053d79c5375b3 --- /dev/null +++ b/test/parallel/test-diagnostics-channel-http2-client-stream-body-no-chunks.js @@ -0,0 +1,42 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +// This test ensures that the built-in HTTP/2 diagnostics channels are reporting +// the diagnostics messages for the 'http2.client.stream.bodyChunkSent' and +// 'http2.client.stream.bodySent' channels when ClientHttp2Streams bodies are +// being sent with no chunks. + +const assert = require('assert'); +const dc = require('diagnostics_channel'); +const http2 = require('http2'); +const { Duplex } = require('stream'); + +dc.subscribe('http2.client.stream.bodyChunkSent', common.mustNotCall()); + +dc.subscribe('http2.client.stream.bodySent', common.mustCall(({ stream }) => { + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); +})); + +const server = http2.createServer(); +server.on('stream', common.mustCall((stream) => { + stream.respond({}, { endStream: true }); +})); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + + const stream = client.request({ [http2.constants.HTTP2_HEADER_METHOD]: 'POST' }); + stream.end(); + + stream.on('response', common.mustCall(() => { + client.close(); + server.close(); + })); +}, 1)); diff --git a/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-buffer.js b/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-buffer.js new file mode 100644 index 00000000000000..43d02ce839b7d0 --- /dev/null +++ b/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-buffer.js @@ -0,0 +1,59 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +// This test ensures that the built-in HTTP/2 diagnostics channels are reporting +// the diagnostics messages for the 'http2.client.stream.bodyChunkSent' and +// 'http2.client.stream.bodySent' channels when ClientHttp2Streams bodies are +// being sent with a single Buffer. + +const assert = require('assert'); +const dc = require('diagnostics_channel'); +const http2 = require('http2'); +const { Duplex } = require('stream'); + +let bodyChunkSent = false; + +dc.subscribe('http2.client.stream.bodyChunkSent', common.mustCall(({ stream, writev, data, encoding }) => { + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); + + assert.strictEqual(writev, false); + assert.ok(Buffer.from('foo').equals(data)); + assert.strictEqual(encoding, 'buffer'); + + bodyChunkSent = true; +})); + +dc.subscribe('http2.client.stream.bodySent', common.mustCall(({ stream }) => { + // 'http2.client.stream.bodyChunkSent' must run first. + assert.ok(bodyChunkSent); + + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); +})); + +const server = http2.createServer(); +server.on('stream', common.mustCall((stream) => { + stream.respond({}, { endStream: true }); +})); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + + const stream = client.request({ [http2.constants.HTTP2_HEADER_METHOD]: 'POST' }); + stream.write(Buffer.from('foo')); + stream.end(); + + stream.on('response', common.mustCall(() => { + client.close(); + server.close(); + })); +}, 1)); diff --git a/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-string.js b/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-string.js new file mode 100644 index 00000000000000..76d9b449871ebd --- /dev/null +++ b/test/parallel/test-diagnostics-channel-http2-client-stream-body-single-string.js @@ -0,0 +1,59 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); + +// This test ensures that the built-in HTTP/2 diagnostics channels are reporting +// the diagnostics messages for the 'http2.client.stream.bodyChunkSent' and +// 'http2.client.stream.bodySent' channels when ClientHttp2Streams bodies are +// being sent with a single string. + +const assert = require('assert'); +const dc = require('diagnostics_channel'); +const http2 = require('http2'); +const { Duplex } = require('stream'); + +let bodyChunkSent = false; + +dc.subscribe('http2.client.stream.bodyChunkSent', common.mustCall(({ stream, writev, data, encoding }) => { + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); + + assert.strictEqual(writev, false); + assert.strictEqual(data, 'foo'); + assert.strictEqual(encoding, 'utf8'); + + bodyChunkSent = true; +})); + +dc.subscribe('http2.client.stream.bodySent', common.mustCall(({ stream }) => { + // 'http2.client.stream.bodyChunkSent' must run first. + assert.ok(bodyChunkSent); + + // Since ClientHttp2Stream is not exported from any module, this just checks + // if the stream is an instance of Duplex. + assert.ok(stream instanceof Duplex); + assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream'); +})); + +const server = http2.createServer(); +server.on('stream', common.mustCall((stream) => { + stream.respond({}, { endStream: true }); +})); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + + const stream = client.request({ [http2.constants.HTTP2_HEADER_METHOD]: 'POST' }); + stream.write('foo'); + stream.end(); + + stream.on('response', common.mustCall(() => { + client.close(); + server.close(); + })); +}, 1)); diff --git a/test/parallel/test-dotenv-edge-cases.js b/test/parallel/test-dotenv-edge-cases.js index 084265e80a68a4..aa5c5f548f1376 100644 --- a/test/parallel/test-dotenv-edge-cases.js +++ b/test/parallel/test-dotenv-edge-cases.js @@ -39,6 +39,17 @@ describe('.env supports edge cases', () => { }))); }); + it('should not support comma-separated env files', async () => { + const code = 'assert.strictEqual(1, 1)'; + const child = await common.spawnPromisified( + process.execPath, + [`--env-file=${validEnvFilePath},${nodeOptionsEnvFilePath}`, '--eval', code], + { cwd: __dirname }, + ); + assert.notStrictEqual(child.stderr, ''); + assert.strictEqual(child.code, 9); + }); + it('supports absolute paths', async () => { const code = ` assert.strictEqual(process.env.BASIC, 'basic'); diff --git a/test/parallel/test-eslint-must-call-assert.js b/test/parallel/test-eslint-must-call-assert.js index 356d168fd195d4..bc82a5f1b32490 100644 --- a/test/parallel/test-eslint-must-call-assert.js +++ b/test/parallel/test-eslint-must-call-assert.js @@ -8,7 +8,7 @@ common.skipIfEslintMissing(); const RuleTester = require('../../tools/eslint/node_modules/eslint').RuleTester; const rule = require('../../tools/eslint-rules/must-call-assert'); -const message = 'Assertions must be wrapped into `common.mustCall` or `common.mustCallAtLeast`'; +const message = 'Assertions must be wrapped into `common.mustSucceed`, `common.mustCall` or `common.mustCallAtLeast`'; const tester = new RuleTester(); tester.run('must-call-assert', rule, { @@ -18,6 +18,8 @@ tester.run('must-call-assert', rule, { 'process.once("message", common.mustCall((code) => {assert.strictEqual(code, 0)}));', 'process.once("message", common.mustCall((code) => {if(2+2 === 5) { assert.strictEqual(code, 0)} }));', 'process.once("message", common.mustCall((code) => { (() => assert.strictEqual(code, 0))(); }));', + 'someAsyncTask(common.mustSucceed((code) => { (() => assert.strictEqual(code, 0))(); }));', + 'someAsyncTask(mustSucceed((code) => { (() => assert.strictEqual(code, 0))(); }));', '(async () => {await assert.rejects(fun())})().then()', '[1, true].forEach((val) => assert.strictEqual(fun(val), 0));', 'const assert = require("node:assert")', @@ -68,11 +70,42 @@ tester.run('must-call-assert', rule, { import assert from 'node:assert'; describe("whatever", () => { - it("should not be reported", async () => { + it("should not be reported", async (t) => { assert.strictEqual(2+2, 5); + await t.test("name", () => { + assert.ok(global.test); + }); }); }); `, + ` + process.on("message", common.mustCall(() => { + Promise.all([].map(async (val) => { + val = await asyncTask(val); + assert.strictEqual(val, 3); + })).then(common.mustCall()); + })); + `, + ` + spawnSyncAndAssert( + outputFile, + { + env: { + NODE_DEBUG_NATIVE: 'SEA,MKSNAPSHOT', + ...process.env, + }, + }, + { + trim: true, + stdout: 'Hello from snapshot', + stderr(output) { + assert.doesNotMatch( + output, + /Single executable application is an experimental feature/); + }, + }, + ); + `, ], invalid: [ { diff --git a/test/parallel/test-esm-loader-hooks-inspect-wait.js b/test/parallel/test-esm-loader-hooks-inspect-wait.js index cb3ae3d17b9a73..427b05641cce23 100644 --- a/test/parallel/test-esm-loader-hooks-inspect-wait.js +++ b/test/parallel/test-esm-loader-hooks-inspect-wait.js @@ -12,6 +12,7 @@ const { NodeInstance } = require('../common/inspector-helper.js'); async function runTest() { const main = fixtures.path('es-module-loaders', 'register-loader.mjs'); + process.env.NODE_DEBUG = 'esm,async_loader_worker'; const child = new NodeInstance(['--inspect-wait=0'], '', main); const session = await child.connectInspectorSession(); @@ -24,7 +25,11 @@ async function runTest() { ]); await session.send({ method: 'NodeRuntime.disable' }); await session.waitForDisconnect(); - assert.strictEqual((await child.expectShutdown()).exitCode, 0); + const result = await child.expectShutdown(); + assert.deepStrictEqual(result, { + exitCode: 0, + signal: null, + }); } runTest(); diff --git a/test/parallel/test-fs-filehandle.js b/test/parallel/test-fs-filehandle.js index 6813ad1c28a1d0..064ec423614d64 100644 --- a/test/parallel/test-fs-filehandle.js +++ b/test/parallel/test-fs-filehandle.js @@ -8,17 +8,20 @@ const { internalBinding } = require('internal/test/binding'); const fs = internalBinding('fs'); const { stringToFlags } = require('internal/fs/utils'); +const filepath = path.toNamespacedPath(__filename); + // Verifies that the FileHandle object is garbage collected and that an // error is thrown if it is not closed. process.on('uncaughtException', common.mustCall((err) => { assert.strictEqual(err.code, 'ERR_INVALID_STATE'); assert.match(err.message, /^A FileHandle object was closed during/); + assert.match(err.message, new RegExp(RegExp.escape(filepath))); })); { const ctx = {}; - fs.openFileHandle(path.toNamespacedPath(__filename), + fs.openFileHandle(filepath, stringToFlags('r'), 0o666, undefined, ctx); assert.strictEqual(ctx.errno, undefined); } diff --git a/test/parallel/test-http-server-optimize-empty-requests.js b/test/parallel/test-http-server-optimize-empty-requests.js new file mode 100644 index 00000000000000..b88b8eb509d4db --- /dev/null +++ b/test/parallel/test-http-server-optimize-empty-requests.js @@ -0,0 +1,77 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); +const net = require('net'); + +let reqs = 0; +let optimizedReqs = 0; +const server = http.createServer({ + optimizeEmptyRequests: true +}, (req, res) => { + reqs++; + if (req._dumped) { + optimizedReqs++; + req.on('data', common.mustNotCall()); + req.on('end', common.mustNotCall()); + + assert.strictEqual(req._dumped, true); + assert.strictEqual(req.readableEnded, true); + assert.strictEqual(req.destroyed, true); + } + res.writeHead(200); + res.end('ok'); +}); + +server.listen(0, common.mustCall(async () => { + // GET request without Content-Length (should be optimized) + const getRequest = 'GET / HTTP/1.1\r\nHost: localhost\r\n\r\n'; + await makeRequest(getRequest); + + // HEAD request (should always be optimized regardless of headers) + const headRequest = 'HEAD / HTTP/1.1\r\nHost: localhost\r\n\r\n'; + await makeRequest(headRequest); + + // POST request without body headers (should be optimized) + const postWithoutBodyHeaders = 'POST / HTTP/1.1\r\nHost: localhost\r\n\r\n'; + await makeRequest(postWithoutBodyHeaders); + + // DELETE request without body headers (should be optimized) + const deleteWithoutBodyHeaders = 'DELETE / HTTP/1.1\r\nHost: localhost\r\n\r\n'; + await makeRequest(deleteWithoutBodyHeaders); + + // POST request with Content-Length header (should not be optimized) + const postWithContentLength = 'POST / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 0\r\n\r\n'; + await makeRequest(postWithContentLength); + + // GET request with Content-Length header (should not be optimized) + const getWithContentLength = 'GET / HTTP/1.1\r\nHost: localhost\r\nContent-Length: 0\r\n\r\n'; + await makeRequest(getWithContentLength); + + // POST request with Transfer-Encoding header (should not be optimized) + const postWithTransferEncoding = 'POST / HTTP/1.1\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\n\r\n'; + await makeRequest(postWithTransferEncoding); + + // GET request with Transfer-Encoding header (should not be optimized) + const getWithTransferEncoding = 'GET / HTTP/1.1\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\n\r\n'; + await makeRequest(getWithTransferEncoding); + + server.close(); + + assert.strictEqual(reqs, 8, `Expected 8 requests but got ${reqs}`); + assert.strictEqual(optimizedReqs, 4, `Expected 4 optimized requests but got ${optimizedReqs}`); +})); + +function makeRequest(str) { + return new Promise((resolve) => { + const client = net.connect({ port: server.address().port }, common.mustCall(() => { + client.on('data', () => {}); + client.on('end', common.mustCall(() => { + resolve(); + })); + client.write(str); + client.end(); + })); + }); +} diff --git a/test/parallel/test-inspector-invalid-protocol.js b/test/parallel/test-inspector-invalid-protocol.js new file mode 100644 index 00000000000000..28c02028aed472 --- /dev/null +++ b/test/parallel/test-inspector-invalid-protocol.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common'); +common.skipIfInspectorDisabled(); +const { spawn } = require('node:child_process'); +const assert = require('node:assert'); + +(async () => { + const child = spawn( + process.execPath, + ['--inspect-wait=0', '-e', "console.log('test');"], + {} + ); + + const url = await new Promise((resolve) => { + child.stderr.on('data', (data) => { + const msg = data.toString(); + const match = msg.match(/ws:\/\/127\.0\.0\.1:(\d+)\/([a-f0-9-]+)/); + if (match) { + child.stderr.removeAllListeners('data'); + return resolve(match[0]); + } + }); + }); + + child.once('exit', (_, signal) => { + assert.strictEqual(signal, 'SIGTERM'); + }); + + const socket = new WebSocket(url); + + socket.addEventListener('open', common.mustCall(() => { + socket.send('This is not a valid protocol message'); + })); + + socket.addEventListener('message', common.mustCall((event) => { + assert.ok(Object.keys(JSON.parse(event.data)).includes('error')); + socket.close(); + child.kill(); + })); +})().then(common.mustCall()); diff --git a/test/parallel/test-inspector-network-http.js b/test/parallel/test-inspector-network-http.js index 1dd4a65fc0dd72..74c6488ef399a5 100644 --- a/test/parallel/test-inspector-network-http.js +++ b/test/parallel/test-inspector-network-http.js @@ -130,6 +130,27 @@ function verifyLoadingFailed({ method, params }) { assert.strictEqual(typeof params.errorText, 'string'); } +function verifyHttpResponse(response) { + assert.strictEqual(response.statusCode, 200); + const chunks = []; + + // Verifies that the inspector does not put the response into flowing mode. + assert.strictEqual(response.readableFlowing, null); + // Verifies that the data listener may be added at a later time, and it can + // still observe the data in full. + queueMicrotask(() => { + response.on('data', (chunk) => { + chunks.push(chunk); + }); + assert.strictEqual(response.readableFlowing, true); + }); + + response.on('end', common.mustCall(() => { + const body = Buffer.concat(chunks).toString(); + assert.strictEqual(body, '\nhello world\n'); + })); +} + async function testHttpGet() { const url = `http://127.0.0.1:${httpServer.address().port}/hello-world`; const requestWillBeSentFuture = once(session, 'Network.requestWillBeSent') @@ -146,11 +167,7 @@ async function testHttpGet() { port: httpServer.address().port, path: '/hello-world', headers: requestHeaders - }, common.mustCall((res) => { - // Dump the response. - res.on('data', () => {}); - res.on('end', () => {}); - })); + }, common.mustCall(verifyHttpResponse)); await requestWillBeSentFuture; const responseReceived = await responseReceivedFuture; @@ -158,6 +175,12 @@ async function testHttpGet() { const delta = (loadingFinished.timestamp - responseReceived.timestamp) * 1000; assert.ok(delta > kDelta); + + const responseBody = await session.post('Network.getResponseBody', { + requestId: responseReceived.requestId, + }); + assert.strictEqual(responseBody.base64Encoded, false); + assert.strictEqual(responseBody.body, '\nhello world\n'); } async function testHttpsGet() { @@ -177,11 +200,7 @@ async function testHttpsGet() { path: '/hello-world', rejectUnauthorized: false, headers: requestHeaders, - }, common.mustCall((res) => { - // Dump the response. - res.on('data', () => {}); - res.on('end', () => {}); - })); + }, common.mustCall(verifyHttpResponse)); await requestWillBeSentFuture; const responseReceived = await responseReceivedFuture; @@ -189,6 +208,12 @@ async function testHttpsGet() { const delta = (loadingFinished.timestamp - responseReceived.timestamp) * 1000; assert.ok(delta > kDelta); + + const responseBody = await session.post('Network.getResponseBody', { + requestId: responseReceived.requestId, + }); + assert.strictEqual(responseBody.base64Encoded, false); + assert.strictEqual(responseBody.body, '\nhello world\n'); } async function testHttpError() { diff --git a/test/parallel/test-inspector-network-http2.js b/test/parallel/test-inspector-network-http2.js index 46b51229aa77c0..9c29fc219273b5 100644 --- a/test/parallel/test-inspector-network-http2.js +++ b/test/parallel/test-inspector-network-http2.js @@ -14,12 +14,15 @@ const inspector = require('node:inspector/promises'); const session = new inspector.Session(); session.connect(); +const requestBody = { 'hello': 'world' }; + const requestHeaders = { 'x-header1': ['value1', 'value2'], [http2.constants.HTTP2_HEADER_ACCEPT_LANGUAGE]: 'en-US', [http2.constants.HTTP2_HEADER_AGE]: 1000, + [http2.constants.HTTP2_HEADER_CONTENT_TYPE]: 'application/json; charset=utf-8', [http2.constants.HTTP2_HEADER_COOKIE]: ['k1=v1', 'k2=v2'], - [http2.constants.HTTP2_HEADER_METHOD]: 'GET', + [http2.constants.HTTP2_HEADER_METHOD]: 'POST', [http2.constants.HTTP2_HEADER_PATH]: '/hello-world', }; @@ -54,23 +57,35 @@ const pushResponseHeaders = { [http2.constants.HTTP2_HEADER_STATUS]: 200, }; +const styleCss = 'body { color: red; }\n'; +const serverResponse = 'hello world\n'; + const kTimeout = 1000; const kDelta = 200; const handleStream = (stream, headers) => { const path = headers[http2.constants.HTTP2_HEADER_PATH]; + let body = ''; switch (path) { case '/hello-world': - stream.pushStream(pushRequestHeaders, common.mustSucceed((pushStream) => { - pushStream.respond(pushResponseHeaders); - pushStream.end('body { color: red; }\n'); - })); + stream.on('data', (chunk) => { + body += chunk; + }); - stream.respond(responseHeaders); + stream.on('end', () => { + assert.strictEqual(body, JSON.stringify(requestBody)); - setTimeout(() => { - stream.end('hello world\n'); - }, kTimeout); + stream.pushStream(pushRequestHeaders, common.mustSucceed((pushStream) => { + pushStream.respond(pushResponseHeaders); + pushStream.end(styleCss); + })); + + stream.respond(responseHeaders); + + setTimeout(() => { + stream.end(serverResponse); + }, kTimeout); + }); break; case '/trigger-error': stream.close(http2.constants.NGHTTP2_STREAM_CLOSED); @@ -114,7 +129,6 @@ function verifyRequestWillBeSent({ method, params }, expectedUrl) { assert.ok(params.requestId.startsWith('node-network-event-')); assert.strictEqual(params.request.url, expectedUrl); - assert.strictEqual(params.request.method, 'GET'); assert.strictEqual(typeof params.request.headers, 'object'); if (expectedUrl.endsWith('/hello-world')) { @@ -123,10 +137,17 @@ function verifyRequestWillBeSent({ method, params }, expectedUrl) { assert.strictEqual(params.request.headers.age, '1000'); assert.strictEqual(params.request.headers['x-header1'], 'value1, value2'); assert.ok(findFrameInInitiator(__filename, params.initiator)); + assert.strictEqual(params.request.hasPostData, true); + assert.strictEqual(params.request.method, 'POST'); } else if (expectedUrl.endsWith('/style.css')) { assert.strictEqual(params.request.headers['x-header3'], 'value1, value2'); assert.strictEqual(params.request.headers['x-push'], 'true'); assert.ok(!findFrameInInitiator(__filename, params.initiator)); + assert.strictEqual(params.request.hasPostData, true); + assert.strictEqual(params.request.method, 'GET'); + } else { + assert.strictEqual(params.request.hasPostData, false); + assert.strictEqual(params.request.method, 'GET'); } assert.strictEqual(typeof params.timestamp, 'number'); @@ -198,6 +219,8 @@ async function testHttp2(secure = false) { rejectUnauthorized: false, }); const request = client.request(requestHeaders); + request.write(JSON.stringify(requestBody)); + request.end(); // Dump the responses. request.on('data', () => {}); @@ -216,6 +239,11 @@ async function testHttp2(secure = false) { verifyRequestWillBeSent(mainRequest, url); verifyRequestWillBeSent(pushRequest, pushedUrl); + const { postData } = await session.post('Network.getRequestPostData', { + requestId: mainRequest.params.requestId + }); + assert.strictEqual(postData, JSON.stringify(requestBody)); + const [ { value: [ mainResponse ] }, { value: [ pushResponse ] }, @@ -230,6 +258,18 @@ async function testHttp2(secure = false) { verifyLoadingFinished(event1); verifyLoadingFinished(event2); + const responseBody = await session.post('Network.getResponseBody', { + requestId: mainRequest.params.requestId, + }); + assert.strictEqual(responseBody.base64Encoded, false); + assert.strictEqual(responseBody.body, serverResponse); + + const pushResponseBody = await session.post('Network.getResponseBody', { + requestId: pushRequest.params.requestId, + }); + assert.strictEqual(pushResponseBody.base64Encoded, true); + assert.strictEqual(Buffer.from(pushResponseBody.body, 'base64').toString(), styleCss); + const mainFinished = [event1, event2] .find((event) => event.params.requestId === mainResponse.params.requestId); const pushFinished = [event1, event2] diff --git a/test/parallel/test-inspector-network-websocket.js b/test/parallel/test-inspector-network-websocket.js index 8f0d4cb75dc674..f0fc6a8216b5c5 100644 --- a/test/parallel/test-inspector-network-websocket.js +++ b/test/parallel/test-inspector-network-websocket.js @@ -29,8 +29,15 @@ function findFrameInInitiator(regex, initiator) { async function test() { await session.post('Network.enable'); + + const CUSTOM_HEADER_NAME = 'X-Custom-Header'; + const CUSTOM_HEADER_VALUE = 'CustomHeaderValue'; + const server = new WebSocketServer({ responseError: true, + customHandleUpgradeHeaders: [ + `${CUSTOM_HEADER_NAME}: ${CUSTOM_HEADER_VALUE}`, + ] }); await server.start(); const url = `ws://127.0.0.1:${server.port}/`; @@ -49,6 +56,11 @@ async function test() { assert.strictEqual(message.params.requestId, requestId); assert.strictEqual(message.params.response.status, 101); assert.strictEqual(message.params.response.statusText, 'Switching Protocols'); + assert.strictEqual(message.params.response.headers.upgrade, 'websocket'); + assert.strictEqual(message.params.response.headers.connection, 'Upgrade'); + assert.ok(message.params.response.headers['sec-websocket-accept']); + assert.ok(message.params.response.headers['sec-websocket-accept'].length > 0); + assert.strictEqual(message.params.response.headers[CUSTOM_HEADER_NAME.toLowerCase()], CUSTOM_HEADER_VALUE); assert.strictEqual(typeof message.params.timestamp, 'number'); socket.close(); })); diff --git a/test/parallel/test-internal-module-wrap.js b/test/parallel/test-internal-module-wrap.js index ce4d5dae52412c..2b7bcf009d14f1 100644 --- a/test/parallel/test-internal-module-wrap.js +++ b/test/parallel/test-internal-module-wrap.js @@ -91,7 +91,7 @@ function testLinkMismatch() { }, { code: 'ERR_MODULE_LINK_MISMATCH', // Test that ModuleCacheKey::ToString() is used in the error message. - message: `Module request 'ModuleCacheKey("bar")' at index 0 must be linked to the same module requested at index 1` + message: `Module request 'ModuleCacheKey("bar")' at index 1 must be linked to the same module requested at index 0` }); } diff --git a/test/parallel/test-internal-util-construct-sab.js b/test/parallel/test-internal-util-construct-sab.js new file mode 100644 index 00000000000000..5ff9b09f8e7d36 --- /dev/null +++ b/test/parallel/test-internal-util-construct-sab.js @@ -0,0 +1,18 @@ +// Flags: --enable-sharedarraybuffer-per-context --expose-internals +'use strict'; + +require('../common'); +const assert = require('assert'); +const { isSharedArrayBuffer } = require('util/types'); +const { constructSharedArrayBuffer } = require('internal/util'); + +// We're testing that we can construct a SAB even when the global is not exposed. +assert.strictEqual(typeof SharedArrayBuffer, 'undefined'); + +for (const length of [undefined, 0, 1, 2 ** 32]) { + assert(isSharedArrayBuffer(constructSharedArrayBuffer(length))); +} + +for (const length of [-1, Number.MAX_SAFE_INTEGER + 1, 2 ** 64]) { + assert.throws(() => constructSharedArrayBuffer(length), RangeError); +} diff --git a/test/parallel/test-max-old-space-size-percentage.js b/test/parallel/test-max-old-space-size-percentage.js index d4da10b3012662..b84344ddb3988d 100644 --- a/test/parallel/test-max-old-space-size-percentage.js +++ b/test/parallel/test-max-old-space-size-percentage.js @@ -122,7 +122,11 @@ assert( ); // Validate heap sizes against system memory -const totalMemoryMB = Math.floor(os.totalmem() / 1024 / 1024); +// When pointer compression is enabled, the maximum total memory is 4 GB +const totalmem = Math.floor(os.totalmem() / 1024 / 1024); +const totalMemoryMB = process.config.variables.v8_enable_pointer_compression ? + Math.min(4096, totalmem) : + totalmem; const uint64Max = 2 ** 64 - 1; const constrainedMemory = process.constrainedMemory(); const constrainedMemoryMB = Math.floor(constrainedMemory / 1024 / 1024); diff --git a/test/parallel/test-net-autoselectfamily-attempt-timeout-cli-option.js b/test/parallel/test-net-autoselectfamily-attempt-timeout-cli-option.js index 474ffe024cd549..cf177e968ce7da 100644 --- a/test/parallel/test-net-autoselectfamily-attempt-timeout-cli-option.js +++ b/test/parallel/test-net-autoselectfamily-attempt-timeout-cli-option.js @@ -7,4 +7,4 @@ const { platformTimeout } = require('../common'); const assert = require('assert'); const { getDefaultAutoSelectFamilyAttemptTimeout } = require('net'); -assert.strictEqual(getDefaultAutoSelectFamilyAttemptTimeout(), platformTimeout(123 * 10)); +assert.strictEqual(getDefaultAutoSelectFamilyAttemptTimeout(), platformTimeout(123 * 5)); diff --git a/test/parallel/test-performance-eventlooputil.js b/test/parallel/test-perf-hooks-eventlooputilization.js similarity index 93% rename from test/parallel/test-performance-eventlooputil.js rename to test/parallel/test-perf-hooks-eventlooputilization.js index 3b0c36892ea486..680139d6bb8444 100644 --- a/test/parallel/test-performance-eventlooputil.js +++ b/test/parallel/test-perf-hooks-eventlooputilization.js @@ -6,10 +6,13 @@ const TIMEOUT = 10; const SPIN_DUR = 50; const assert = require('assert'); -const { performance } = require('perf_hooks'); +const { performance, eventLoopUtilization } = require('perf_hooks'); const { Worker, parentPort } = require('worker_threads'); -const { nodeTiming, eventLoopUtilization } = performance; +// Verifies that `performance.eventLoopUtilization` is an alias of +// `perf_hooks.eventLoopUtilization`. +assert.strictEqual(performance.eventLoopUtilization, eventLoopUtilization); +const { nodeTiming } = performance; const elu = eventLoopUtilization(); // Take into account whether this test was started as a Worker. diff --git a/test/parallel/test-perf-hooks-timerify-basic.js b/test/parallel/test-perf-hooks-timerify-basic.js new file mode 100644 index 00000000000000..c33d83b1cf21c1 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-basic.js @@ -0,0 +1,25 @@ +// Test basic functionality of timerify and PerformanceObserver. +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { timerify, PerformanceObserver } = require('perf_hooks'); + +// Verifies that `performance.timerify` is an alias of `perf_hooks.timerify`. +assert.strictEqual(performance.timerify, timerify); + +// Intentional non-op. Do not wrap in common.mustCall(); +const n = timerify(function noop() {}); + +const obs = new PerformanceObserver(common.mustCall((list) => { + const entries = list.getEntries(); + const entry = entries[0]; + assert(entry); + assert.strictEqual(entry.name, 'noop'); + assert.strictEqual(entry.entryType, 'function'); + assert.strictEqual(typeof entry.duration, 'number'); + assert.strictEqual(typeof entry.startTime, 'number'); + obs.disconnect(); +})); +obs.observe({ entryTypes: ['function'] }); +n(); diff --git a/test/parallel/test-perf-hooks-timerify-constructor.js b/test/parallel/test-perf-hooks-timerify-constructor.js new file mode 100644 index 00000000000000..65ae42f373a5e5 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-constructor.js @@ -0,0 +1,27 @@ +// Test that timerify works with class constructors and creates performance +// entries with the correct name. + +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { timerify, PerformanceObserver } = require('perf_hooks'); + +class N {} +const n = timerify(N); + +const obs = new PerformanceObserver(common.mustCall((list) => { + const entries = list.getEntries(); + const entry = entries[0]; + assert.strictEqual(entry[0], 1); + assert.strictEqual(entry[1], 'abc'); + assert(entry); + assert.strictEqual(entry.name, 'N'); + assert.strictEqual(entry.entryType, 'function'); + assert.strictEqual(typeof entry.duration, 'number'); + assert.strictEqual(typeof entry.startTime, 'number'); + obs.disconnect(); +})); +obs.observe({ entryTypes: ['function'] }); + +new n(1, 'abc'); diff --git a/test/parallel/test-perf-hooks-timerify-error.js b/test/parallel/test-perf-hooks-timerify-error.js new file mode 100644 index 00000000000000..d7851072115b85 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-error.js @@ -0,0 +1,16 @@ +// Test that errors thrown in timerified functions bubble up without creating +// performance timeline entries. + +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const { timerify, PerformanceObserver } = require('perf_hooks'); + +const obs = new PerformanceObserver(common.mustNotCall()); +obs.observe({ entryTypes: ['function'] }); +const n = timerify(() => { + throw new Error('test'); +}); +assert.throws(() => n(), /^Error: test$/); +obs.disconnect(); diff --git a/test/parallel/test-perf-hooks-timerify-histogram-async.mjs b/test/parallel/test-perf-hooks-timerify-histogram-async.mjs new file mode 100644 index 00000000000000..2fc6b6a2e49669 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-histogram-async.mjs @@ -0,0 +1,17 @@ +// Test that timerify works with histogram option for asynchronous functions. + +import '../common/index.mjs'; +import assert from 'assert'; +import { createHistogram, timerify } from 'perf_hooks'; +import { setTimeout as sleep } from 'timers/promises'; + +const histogram = createHistogram(); +const m = async (a, b = 1) => { + await sleep(10); +}; +const n = timerify(m, { histogram }); +assert.strictEqual(histogram.max, 0); +for (let i = 0; i < 10; i++) { + await n(); +} +assert.notStrictEqual(histogram.max, 0); diff --git a/test/parallel/test-perf-hooks-timerify-histogram-sync.mjs b/test/parallel/test-perf-hooks-timerify-histogram-sync.mjs new file mode 100644 index 00000000000000..b26a40ee3cda65 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-histogram-sync.mjs @@ -0,0 +1,19 @@ +// Test that timerify works with histogram option for synchronous functions. + +import { sleepSync } from '../common/index.mjs'; +import assert from 'assert'; +import { createHistogram, timerify } from 'perf_hooks'; + +const histogram = createHistogram(); + +const m = () => { + // Deterministic blocking delay (~1 millisecond). The histogram operates on + // nanosecond precision, so this should be sufficient to prevent zero timings. + sleepSync(1); +}; +const n = timerify(m, { histogram }); +assert.strictEqual(histogram.max, 0); +for (let i = 0; i < 10; i++) { + n(); +} +assert.notStrictEqual(histogram.max, 0); diff --git a/test/parallel/test-perf-hooks-timerify-invalid-args.js b/test/parallel/test-perf-hooks-timerify-invalid-args.js new file mode 100644 index 00000000000000..dc874c40ad730f --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-invalid-args.js @@ -0,0 +1,28 @@ +// Test that timerify throws appropriate errors for invalid argument types. + +'use strict'; + +require('../common'); +const assert = require('assert'); +const { timerify } = require('perf_hooks'); + +[1, {}, [], null, undefined, Infinity].forEach((input) => { + assert.throws(() => timerify(input), + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError', + message: /The "fn" argument must be of type function/ + }); +}); + +const asyncFunc = async (a, b = 1) => {}; +const syncFunc = (a, b = 1) => {}; + +[1, '', {}, [], false].forEach((histogram) => { + assert.throws(() => timerify(asyncFunc, { histogram }), { + code: 'ERR_INVALID_ARG_TYPE' + }); + assert.throws(() => timerify(syncFunc, { histogram }), { + code: 'ERR_INVALID_ARG_TYPE' + }); +}); diff --git a/test/parallel/test-perf-hooks-timerify-multiple-wrapping.js b/test/parallel/test-perf-hooks-timerify-multiple-wrapping.js new file mode 100644 index 00000000000000..f56ac108a11783 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-multiple-wrapping.js @@ -0,0 +1,19 @@ +// Test that functions can be wrapped multiple times and verify length and name +// properties are preserved correctly. + +'use strict'; + +require('../common'); +const assert = require('assert'); +const { timerify } = require('perf_hooks'); + +const m = (a, b = 1) => {}; +const n = timerify(m); +const o = timerify(m); +const p = timerify(n); +assert.notStrictEqual(n, o); +assert.notStrictEqual(n, p); +assert.notStrictEqual(o, p); +assert.strictEqual(n.length, m.length); +assert.strictEqual(n.name, 'timerified m'); +assert.strictEqual(p.name, 'timerified timerified m'); diff --git a/test/parallel/test-perf-hooks-timerify-return-value.js b/test/parallel/test-perf-hooks-timerify-return-value.js new file mode 100644 index 00000000000000..44c3cdb1c4d631 --- /dev/null +++ b/test/parallel/test-perf-hooks-timerify-return-value.js @@ -0,0 +1,24 @@ +// Regression tests for https://github.com/nodejs/node/issues/40623 +// Test that timerify preserves return values and class constructor behavior. + +'use strict'; + +require('../common'); +const assert = require('assert'); +const { timerify } = require('perf_hooks'); + +assert.strictEqual(timerify(function func() { + return 1; +})(), 1); +assert.strictEqual(timerify(function() { + return 1; +})(), 1); +assert.strictEqual(timerify(() => { + return 1; +})(), 1); +class C {} +const wrap = timerify(C); +assert.ok(new wrap() instanceof C); +assert.throws(() => wrap(), { + name: 'TypeError', +}); diff --git a/test/parallel/test-performance-function.js b/test/parallel/test-performance-function.js deleted file mode 100644 index b69a21308cf048..00000000000000 --- a/test/parallel/test-performance-function.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -const { - createHistogram, - performance, - PerformanceObserver -} = require('perf_hooks'); - -const { - setTimeout: sleep -} = require('timers/promises'); - -{ - // Intentional non-op. Do not wrap in common.mustCall(); - const n = performance.timerify(function noop() {}); - - const obs = new PerformanceObserver(common.mustCall((list) => { - const entries = list.getEntries(); - const entry = entries[0]; - assert(entry); - assert.strictEqual(entry.name, 'noop'); - assert.strictEqual(entry.entryType, 'function'); - assert.strictEqual(typeof entry.duration, 'number'); - assert.strictEqual(typeof entry.startTime, 'number'); - obs.disconnect(); - })); - obs.observe({ entryTypes: ['function'] }); - n(); -} - -{ - // If the error throws, the error should just be bubbled up and the - // performance timeline entry will not be reported. - const obs = new PerformanceObserver(common.mustNotCall()); - obs.observe({ entryTypes: ['function'] }); - const n = performance.timerify(() => { - throw new Error('test'); - }); - assert.throws(() => n(), /^Error: test$/); - obs.disconnect(); -} - -{ - class N {} - const n = performance.timerify(N); - - const obs = new PerformanceObserver(common.mustCall((list) => { - const entries = list.getEntries(); - const entry = entries[0]; - assert.strictEqual(entry[0], 1); - assert.strictEqual(entry[1], 'abc'); - assert(entry); - assert.strictEqual(entry.name, 'N'); - assert.strictEqual(entry.entryType, 'function'); - assert.strictEqual(typeof entry.duration, 'number'); - assert.strictEqual(typeof entry.startTime, 'number'); - obs.disconnect(); - })); - obs.observe({ entryTypes: ['function'] }); - - new n(1, 'abc'); -} - -{ - [1, {}, [], null, undefined, Infinity].forEach((input) => { - assert.throws(() => performance.timerify(input), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /The "fn" argument must be of type function/ - }); - }); -} - -// Function can be wrapped many times, also check length and name -{ - const m = (a, b = 1) => {}; - const n = performance.timerify(m); - const o = performance.timerify(m); - const p = performance.timerify(n); - assert.notStrictEqual(n, o); - assert.notStrictEqual(n, p); - assert.notStrictEqual(o, p); - assert.strictEqual(n.length, m.length); - assert.strictEqual(n.name, 'timerified m'); - assert.strictEqual(p.name, 'timerified timerified m'); -} - -(async () => { - let _deadCode; - - const histogram = createHistogram(); - const m = (a, b = 1) => { - for (let i = 0; i < 1e3; i++) - _deadCode = i; - }; - const n = performance.timerify(m, { histogram }); - assert.strictEqual(histogram.max, 0); - for (let i = 0; i < 10; i++) { - n(); - await sleep(10); - } - assert.ok(_deadCode >= 0); - assert.notStrictEqual(histogram.max, 0); - [1, '', {}, [], false].forEach((histogram) => { - assert.throws(() => performance.timerify(m, { histogram }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - }); -})().then(common.mustCall()); - -(async () => { - const histogram = createHistogram(); - const m = async (a, b = 1) => { - await sleep(10); - }; - const n = performance.timerify(m, { histogram }); - assert.strictEqual(histogram.max, 0); - for (let i = 0; i < 10; i++) { - await n(); - } - assert.notStrictEqual(histogram.max, 0); - [1, '', {}, [], false].forEach((histogram) => { - assert.throws(() => performance.timerify(m, { histogram }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - }); -})().then(common.mustCall()); - -// Regression tests for https://github.com/nodejs/node/issues/40623 -{ - assert.strictEqual(performance.timerify(function func() { - return 1; - })(), 1); - assert.strictEqual(performance.timerify(function() { - return 1; - })(), 1); - assert.strictEqual(performance.timerify(() => { - return 1; - })(), 1); - class C {} - const wrap = performance.timerify(C); - assert.ok(new wrap() instanceof C); - assert.throws(() => wrap(), { - name: 'TypeError', - }); -} diff --git a/test/parallel/test-permission-dc-worker-threads.js b/test/parallel/test-permission-dc-worker-threads.js deleted file mode 100644 index 4fdb566f9e1701..00000000000000 --- a/test/parallel/test-permission-dc-worker-threads.js +++ /dev/null @@ -1,19 +0,0 @@ -// Flags: --permission --allow-fs-read=* --experimental-test-module-mocks -'use strict'; - -const common = require('../common'); -const assert = require('node:assert'); - -{ - const diagnostics_channel = require('node:diagnostics_channel'); - diagnostics_channel.subscribe('worker_threads', common.mustNotCall()); - const { mock } = require('node:test'); - - // Module mocking should throw instead of posting to worker_threads dc - assert.throws(() => { - mock.module('node:path'); - }, common.expectsError({ - code: 'ERR_ACCESS_DENIED', - permission: 'WorkerThreads', - })); -} diff --git a/test/parallel/test-process-env-allowed-flags-are-documented.js b/test/parallel/test-process-env-allowed-flags-are-documented.js index a6904159fc858f..68df0baebad19d 100644 --- a/test/parallel/test-process-env-allowed-flags-are-documented.js +++ b/test/parallel/test-process-env-allowed-flags-are-documented.js @@ -49,6 +49,8 @@ if (!hasOpenSSL3) { documented.delete('--openssl-shared-config'); } +const isV8Sandboxed = process.config.variables.v8_enable_sandbox; + // Filter out options that are conditionally present. const conditionalOpts = [ { @@ -74,6 +76,9 @@ const conditionalOpts = [ }, { include: process.features.inspector, filter: (opt) => opt.startsWith('--inspect') || opt === '--debug-port' + }, { + include: !isV8Sandboxed, + filter: (opt) => ['--secure-heap', '--secure-heap-min'].includes(opt) }, ]; documented.forEach((opt) => { diff --git a/test/parallel/test-process-get-builtin.mjs b/test/parallel/test-process-get-builtin.mjs index 8131a470281c6a..de863ff3597641 100644 --- a/test/parallel/test-process-get-builtin.mjs +++ b/test/parallel/test-process-get-builtin.mjs @@ -1,4 +1,4 @@ -import { hasCrypto, hasIntl, hasSQLite } from '../common/index.mjs'; +import { hasCrypto, hasIntl, hasInspector, hasSQLite } from '../common/index.mjs'; import assert from 'node:assert'; import { builtinModules } from 'node:module'; import { isMainThread } from 'node:worker_threads'; @@ -39,6 +39,10 @@ if (!hasIntl) { // TODO(@jasnell): Remove this once node:quic graduates from unflagged. publicBuiltins.delete('node:quic'); +if (!hasInspector) { + publicBuiltins.delete('inspector'); + publicBuiltins.delete('inspector/promises'); +} if (!hasSQLite) { publicBuiltins.delete('node:sqlite'); } diff --git a/test/parallel/test-repl-async-iife.js b/test/parallel/test-repl-async-iife.js new file mode 100644 index 00000000000000..e1f5ca78128ad4 --- /dev/null +++ b/test/parallel/test-repl-async-iife.js @@ -0,0 +1,10 @@ +'use strict'; +require('../common'); + +// Note: This test ensures that async IIFE doesn't crash +// Ref: https://github.com/nodejs/node/issues/38685 + +const repl = require('repl').start({ terminal: true }); + +repl.write('(async() => { })()\n'); +repl.write('.exit\n'); diff --git a/test/parallel/test-repl-paste-big-data.js b/test/parallel/test-repl-paste-big-data.js index 5abc195cecb968..78cdd93c5ba35c 100644 --- a/test/parallel/test-repl-paste-big-data.js +++ b/test/parallel/test-repl-paste-big-data.js @@ -9,6 +9,11 @@ const { startNewREPLServer } = require('../common/repl'); const cpuUsage = process.cpuUsage(); const { replServer } = startNewREPLServer({}, { disableDomainErrorAssert: true }); +replServer.input.emit('data', '{}'); +replServer.input.emit('keypress', '', { name: 'left' }); +replServer.input.emit('data', 'node'); +assert.strictEqual(replServer.line, '{node}'); + replServer.input.emit('data', 'a'.repeat(2e4) + '\n'); replServer.input.emit('data', '.exit\n'); diff --git a/test/parallel/test-runner-module-mocking.js b/test/parallel/test-runner-module-mocking.js index 89e08a9e22a362..dcb6f84597fe71 100644 --- a/test/parallel/test-runner-module-mocking.js +++ b/test/parallel/test-runner-module-mocking.js @@ -679,44 +679,3 @@ test('wrong import syntax should throw error after module mocking', async () => assert.match(stderr, /Error \[ERR_MODULE_NOT_FOUND\]: Cannot find module/); assert.strictEqual(code, 1); }); - -test('should throw ERR_ACCESS_DENIED when permission model is enabled', async (t) => { - const cwd = fixtures.path('test-runner'); - const fixture = fixtures.path('test-runner', 'mock-nm.js'); - const args = [ - '--permission', - '--allow-fs-read=*', - '--experimental-test-module-mocks', - fixture, - ]; - const { - code, - stdout, - } = await common.spawnPromisified(process.execPath, args, { cwd }); - - assert.strictEqual(code, 1); - assert.match(stdout, /Error: Access to this API has been restricted/); - assert.match(stdout, /permission: 'WorkerThreads'/); -}); - -test('should work when --allow-worker is passed and permission model is enabled', async (t) => { - const cwd = fixtures.path('test-runner'); - const fixture = fixtures.path('test-runner', 'mock-nm.js'); - const args = [ - '--permission', - '--allow-fs-read=*', - '--allow-worker', - '--experimental-test-module-mocks', - fixture, - ]; - const { - code, - stdout, - stderr, - signal, - } = await common.spawnPromisified(process.execPath, args, { cwd }); - - assert.strictEqual(code, 0, stderr); - assert.strictEqual(signal, null); - assert.match(stdout, /pass 1/, stderr); -}); diff --git a/test/parallel/test-runner-output.mjs b/test/parallel/test-runner-output.mjs deleted file mode 100644 index f854447c4526b1..00000000000000 --- a/test/parallel/test-runner-output.mjs +++ /dev/null @@ -1,358 +0,0 @@ -// Flags: --expose-internals -import * as common from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import * as snapshot from '../common/assertSnapshot.js'; -import { describe, it } from 'node:test'; -import { hostname } from 'node:os'; -import { chdir, cwd } from 'node:process'; -import { fileURLToPath } from 'node:url'; - -const skipForceColors = - process.config.variables.icu_gyp_path !== 'tools/icu/icu-generic.gyp' || - process.config.variables.node_shared_openssl; - -// We're using dynamic import here to not break `NODE_REGENERATE_SNAPSHOTS`. -const canColorize = (await import('internal/tty')).default.getColorDepth() > 2; -const skipCoverageColors = !canColorize; - -function replaceTestDuration(str) { - return str - .replaceAll(/duration_ms: [0-9.]+/g, 'duration_ms: *') - .replaceAll(/duration_ms [0-9.]+/g, 'duration_ms *'); -} - -const root = fileURLToPath(new URL('../..', import.meta.url)).slice(0, -1); - -const color = '(\\[\\d+m)'; -const stackTraceBasePath = new RegExp(`${color}\\(${root.replaceAll(/[\\^$*+?.()|[\]{}]/g, '\\$&')}/?${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'); -} - -function replaceJunitDuration(str) { - return 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'); -} - -// The Node test coverage returns results for all files called by the test. This -// will make the output file change if files like test/common/index.js change. -// This transform picks only the first line and then the lines from the test -// file. -function pickTestFileFromLcov(str) { - const lines = str.split(/\n/); - const firstLineOfTestFile = lines.findIndex( - (line) => line.startsWith('SF:') && line.trim().endsWith('output.js') - ); - const lastLineOfTestFile = lines.findIndex( - (line, index) => index > firstLineOfTestFile && line.trim() === 'end_of_record' - ); - return ( - lines[0] + '\n' + lines.slice(firstLineOfTestFile, lastLineOfTestFile + 1).join('\n') + '\n' - ); -} - -const defaultTransform = snapshot.transform( - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - removeWindowsPathEscaping, - snapshot.transformProjectRoot(), - snapshot.replaceWindowsPaths, - replaceTestDuration, - replaceTestLocationLine, -); -const specTransform = snapshot.transform( - replaceSpecDuration, - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.replaceWindowsPaths, -); -const junitTransform = snapshot.transform( - replaceJunitDuration, - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.replaceWindowsPaths, -); -const lcovTransform = snapshot.transform( - snapshot.replaceWindowsLineEndings, - snapshot.replaceStackTrace, - snapshot.transformProjectRoot(), - snapshot.replaceWindowsPaths, - pickTestFileFromLcov -); - - -const tests = [ - { name: 'test-runner/output/abort.js', flags: ['--test-reporter=tap'] }, - { - name: 'test-runner/output/abort-runs-after-hook.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/abort_suite.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/abort_hooks.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/describe_it.js', flags: ['--test-reporter=tap'] }, - { - name: 'test-runner/output/describe_nested.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/eval_dot.js', transform: specTransform }, - { name: 'test-runner/output/eval_spec.js', transform: specTransform }, - { name: 'test-runner/output/eval_tap.js' }, - { - name: 'test-runner/output/filtered-suite-delayed-build.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/filtered-suite-order.mjs', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/filtered-suite-throws.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/hooks.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/hooks_spec_reporter.js', transform: specTransform }, - { name: 'test-runner/output/skip-each-hooks.js', transform: specTransform }, - { name: 'test-runner/output/suite-skip-hooks.js', transform: specTransform }, - { - name: 'test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-timeout-flag.js', - flags: [ - '--test-reporter=tap', - '--test-timeout=100', - ], - }, - // --test-timeout should work with or without --test flag - { - name: 'test-runner/output/test-timeout-flag.js', - flags: [ - '--test-reporter=tap', - '--test-timeout=100', - '--test', - ], - }, - { - name: 'test-runner/output/hooks-with-no-global-test.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/global-hooks-with-no-tests.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/before-and-after-each-too-many-listeners.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/force_exit.js', transform: specTransform }, - { - name: 'test-runner/output/global_after_should_fail_the_test.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/no_refs.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/no_tests.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/only_tests.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/dot_reporter.js', transform: specTransform }, - { name: 'test-runner/output/junit_reporter.js', transform: junitTransform }, - { name: 'test-runner/output/spec_reporter_successful.js', transform: specTransform }, - { name: 'test-runner/output/spec_reporter.js', transform: specTransform }, - { name: 'test-runner/output/spec_reporter_cli.js', transform: specTransform }, - { - name: 'test-runner/output/source_mapped_locations.mjs', - flags: ['--test-reporter=tap'], - }, - process.features.inspector ? - { - name: 'test-runner/output/lcov_reporter.js', - transform: lcovTransform - } : - false, - { name: 'test-runner/output/output.js', flags: ['--test-reporter=tap'] }, - { name: 'test-runner/output/output_cli.js' }, - { - name: 'test-runner/output/name_and_skip_patterns.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/name_pattern.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/name_pattern_with_only.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/skip_pattern.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/unfinished-suite-async-error.js', - flags: ['--test-reporter=tap'], - }, - { name: 'test-runner/output/default_output.js', transform: specTransform, tty: true }, - { - name: 'test-runner/output/arbitrary-output.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/non-tty-forced-color-output.js', - transform: specTransform, - }, - canColorize ? { - name: 'test-runner/output/assertion-color-tty.mjs', - flags: ['--test', '--stack-trace-limit=0'], - transform: specTransform, - tty: true, - } : false, - { - name: 'test-runner/output/async-test-scheduling.mjs', - flags: ['--test-reporter=tap'], - }, - !skipForceColors ? { - name: 'test-runner/output/arbitrary-output-colored.js', - transform: snapshot.transform(specTransform, replaceTestDuration), tty: true - } : false, - { name: 'test-runner/output/dot_output_custom_columns.js', transform: specTransform, tty: true }, - { - name: 'test-runner/output/tap_escape.js', - transform: snapshot.transform( - snapshot.replaceWindowsLineEndings, - replaceTestDuration, - ), - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-runner-plan.js', - flags: ['--test-reporter=tap'], - }, - { - name: 'test-runner/output/test-runner-watch-spec.mjs', - transform: specTransform, - }, - { - name: 'test-runner/output/test-runner-plan-timeout.js', - flags: ['--test-reporter=tap', '--test-force-exit'], - }, - process.features.inspector ? { - name: 'test-runner/output/coverage_failure.js', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - { - name: 'test-runner/output/test-diagnostic-warning-without-test-only-flag.js', - flags: ['--test', '--test-reporter=tap'], - }, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-40.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-80.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector && !skipCoverageColors ? { - name: 'test-runner/output/coverage-width-80-color.mjs', - flags: ['--test-coverage-exclude=!test/**'], - transform: specTransform, - tty: true - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-100.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-150.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-infinity.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-80-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-100-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector && !skipCoverageColors ? { - name: 'test-runner/output/coverage-width-80-uncovered-lines-color.mjs', - flags: ['--test-coverage-exclude=!test/**'], - transform: specTransform, - tty: true - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-150-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-width-infinity-uncovered-lines.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'], - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-short-filename.mjs', - flags: ['--test-reporter=tap', '--test-coverage-exclude=../output/**'], - cwd: fixtures.path('test-runner/coverage-snap'), - } : false, - process.features.inspector ? { - name: 'test-runner/output/typescript-coverage.mts', - flags: ['--disable-warning=ExperimentalWarning', - '--test-reporter=tap', - '--experimental-transform-types', - '--experimental-test-module-mocks', - '--experimental-test-coverage', - '--test-coverage-exclude=!test/**'] - } : false, - process.features.inspector ? { - name: 'test-runner/output/coverage-with-mock.mjs', - flags: ['--disable-warning=ExperimentalWarning', - '--test-reporter=tap', - '--experimental-transform-types', - '--experimental-test-module-mocks', - '--experimental-test-coverage', - '--test-coverage-exclude=!test/**'] - } : false, -] -.filter(Boolean) -.map(({ flags, name, tty, transform, cwd }) => ({ - name, - fn: common.mustCall(async () => { - await snapshot.spawnAndAssert(fixtures.path(name), transform ?? defaultTransform, { tty, flags, cwd }); - }), -})); - -if (cwd() !== root) { - chdir(root); -} -describe('test runner output', { concurrency: true }, () => { - for (const { name, fn } of tests) { - it(name, fn); - } -}); diff --git a/test/parallel/test-runner-watch-mode-kill-signal.mjs b/test/parallel/test-runner-watch-mode-kill-signal.mjs deleted file mode 100644 index d59f4522fadc7f..00000000000000 --- a/test/parallel/test-runner-watch-mode-kill-signal.mjs +++ /dev/null @@ -1,131 +0,0 @@ -import * as common from '../common/index.mjs'; -import { describe, it, beforeEach } from 'node:test'; -import assert from 'node:assert'; -import { spawn } from 'node:child_process'; -import { writeFileSync } from 'node:fs'; -import tmpdir from '../common/tmpdir.js'; - -if (common.isWindows) { - common.skip('no signals on Windows'); -} - -if (common.isIBMi) { - common.skip('IBMi does not support `fs.watch()`'); -} - -if (common.isAIX) { - common.skip('folder watch capability is limited in AIX.'); -} - -const indexContents = ` - process.on('SIGTERM', () => { console.log('__SIGTERM received__'); process.exit(); }); - process.on('SIGINT', () => { console.log('__SIGINT received__'); process.exit(); }); - process.send('script ready'); - setTimeout(() => {}, 100_000); -`; - -let indexPath = ''; - -function refresh() { - tmpdir.refresh(); - indexPath = tmpdir.resolve('index.js'); - writeFileSync(indexPath, indexContents); -} - -describe('test runner watch mode with --watch-kill-signal', () => { - beforeEach(refresh); - - it('defaults to SIGTERM', async () => { - const child = spawn( - process.execPath, - ['--watch', indexPath], - { - cwd: tmpdir.path, - stdio: ['pipe', 'pipe', 'pipe', 'ipc'], - } - ); - - let stdout = ''; - child.stdout.on('data', (data) => { - stdout += `${data}`; - if (/__(SIGINT|SIGTERM) received__/.test(stdout)) { - child.kill(); - } - }); - - child.on('message', (msg) => { - if (msg === 'script ready') { - writeFileSync(indexPath, indexContents); - } - }); - - await new Promise((resolve) => - child.on('exit', () => { - resolve(); - }) - ); - - assert.match(stdout, /__SIGTERM received__/); - assert.doesNotMatch(stdout, /__SIGINT received__/); - }); - - it('can be overridden (to SIGINT)', async () => { - const child = spawn( - process.execPath, - ['--watch', '--watch-kill-signal', 'SIGINT', indexPath], - { - cwd: tmpdir.path, - stdio: ['pipe', 'pipe', 'pipe', 'ipc'], - } - ); - - let stdout = ''; - child.stdout.on('data', (data) => { - stdout += `${data}`; - if (/__(SIGINT|SIGTERM) received__/.test(stdout)) { - child.kill(); - } - }); - - child.on('message', (msg) => { - if (msg === 'script ready') { - writeFileSync(indexPath, indexContents); - } - }); - - await new Promise((resolve) => - child.on('exit', () => { - resolve(); - }) - ); - - assert.match(stdout, /__SIGINT received__/); - assert.doesNotMatch(stdout, /__SIGTERM received__/); - }); - - it('errors if an invalid signal is provided', async () => { - const currentRun = Promise.withResolvers(); - const child = spawn( - process.execPath, - ['--watch', '--watch-kill-signal', 'invalid_signal', indexPath], - { - cwd: tmpdir.path, - } - ); - let stdout = ''; - - child.stderr.on('data', (data) => { - stdout += data.toString(); - currentRun.resolve(); - }); - - await currentRun.promise; - - assert.match( - stdout, - new RegExp( - /TypeError \[ERR_UNKNOWN_SIGNAL\]: Unknown signal: invalid_signal/ - ) - ); - }); -}); diff --git a/test/parallel/test-sqlite-config.js b/test/parallel/test-sqlite-config.js new file mode 100644 index 00000000000000..13916f7407ed48 --- /dev/null +++ b/test/parallel/test-sqlite-config.js @@ -0,0 +1,56 @@ +'use strict'; +const { skipIfSQLiteMissing } = require('../common/index.mjs'); +const { test } = require('node:test'); +const assert = require('node:assert'); +const { DatabaseSync } = require('node:sqlite'); +skipIfSQLiteMissing(); + +function checkDefensiveMode(db) { + function journalMode() { + return db.prepare('PRAGMA journal_mode').get().journal_mode; + } + + assert.strictEqual(journalMode(), 'memory'); + db.exec('PRAGMA journal_mode=OFF'); + + switch (journalMode()) { + case 'memory': return true; // journal_mode unchanged, defensive mode must be active + case 'off': return false; // journal_mode now 'off', so defensive mode not active + default: throw new Error('unexpected journal_mode'); + } +} + +test('by default, defensive mode is off', (t) => { + const db = new DatabaseSync(':memory:'); + t.assert.strictEqual(checkDefensiveMode(db), false); +}); + +test('when passing { defensive: true } as config, defensive mode is on', (t) => { + const db = new DatabaseSync(':memory:', { + defensive: true + }); + t.assert.strictEqual(checkDefensiveMode(db), true); +}); + +test('defensive mode on after calling db.enableDefensive(true)', (t) => { + const db = new DatabaseSync(':memory:'); + db.enableDefensive(true); + t.assert.strictEqual(checkDefensiveMode(db), true); +}); + +test('defensive mode should be off after calling db.enableDefensive(false)', (t) => { + const db = new DatabaseSync(':memory:', { + defensive: true + }); + db.enableDefensive(false); + t.assert.strictEqual(checkDefensiveMode(db), false); +}); + +test('throws if options.defensive is provided but is not a boolean', (t) => { + t.assert.throws(() => { + new DatabaseSync(':memory:', { defensive: 42 }); + }, { + code: 'ERR_INVALID_ARG_TYPE', + message: 'The "options.defensive" argument must be a boolean.', + }); +}); diff --git a/test/parallel/test-tls-alert-handling.js b/test/parallel/test-tls-alert-handling.js index 7bd42bbe721c4c..de49dbdc2b7551 100644 --- a/test/parallel/test-tls-alert-handling.js +++ b/test/parallel/test-tls-alert-handling.js @@ -43,7 +43,8 @@ const errorHandler = common.mustCall((err) => { assert.strictEqual(err.code, expectedErrorCode); assert.strictEqual(err.library, 'SSL routines'); - if (!hasOpenSSL3) assert.strictEqual(err.function, 'ssl3_get_record'); + if (!hasOpenSSL3 && !process.features.openssl_is_boringssl) + assert.strictEqual(err.function, 'ssl3_get_record'); assert.match(err.reason, expectedErrorReason); errorReceived = true; if (canCloseServer()) @@ -105,7 +106,7 @@ function sendBADTLSRecord() { } assert.strictEqual(err.code, expectedErrorCode); assert.strictEqual(err.library, 'SSL routines'); - if (!hasOpenSSL3) + if (!hasOpenSSL3 && !process.features.openssl_is_boringssl) assert.strictEqual(err.function, 'ssl3_read_bytes'); assert.match(err.reason, expectedErrorReason); })); diff --git a/test/parallel/test-util-deprecate.js b/test/parallel/test-util-deprecate.js index 9807264548e6d3..9f37c5b275eddd 100644 --- a/test/parallel/test-util-deprecate.js +++ b/test/parallel/test-util-deprecate.js @@ -61,6 +61,28 @@ for (const fn of [ fn2(); } + +// Test modifyPrototype option +{ + const msg = 'prototype-test'; + const code = 'proto-code'; + + function OriginalFn() {} + OriginalFn.prototype.testMethod = function() { return 'test'; }; + + const deprecatedWithoutProto = util.deprecate(OriginalFn, msg, code, { modifyPrototype: false }); + + assert.notStrictEqual(deprecatedWithoutProto.prototype, OriginalFn.prototype); + assert.notStrictEqual(Object.getPrototypeOf(deprecatedWithoutProto), OriginalFn); + assert.strictEqual(deprecatedWithoutProto.prototype.testMethod, undefined); + + const deprecatedWithProto = util.deprecate(OriginalFn, msg, code); + + assert.strictEqual(deprecatedWithProto.prototype, OriginalFn.prototype); + assert.strictEqual(Object.getPrototypeOf(deprecatedWithProto), OriginalFn); + assert.strictEqual(typeof deprecatedWithProto.prototype.testMethod, 'function'); +} + process.on('warning', (warning) => { assert.strictEqual(warning.name, 'DeprecationWarning'); assert.ok(expectedWarnings.has(warning.message)); diff --git a/test/parallel/test-util-format.js b/test/parallel/test-util-format.js index ad77c7cafd38fb..dfcf62c378b84b 100644 --- a/test/parallel/test-util-format.js +++ b/test/parallel/test-util-format.js @@ -588,7 +588,7 @@ assert.strictEqual( assert.strictEqual( util.format(new SharedArrayBuffer(4)), - 'SharedArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' + 'SharedArrayBuffer { [Uint8Contents]: <00 00 00 00>, [byteLength]: 4 }' ); assert.strictEqual( diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 89b798f20cba6d..9150f3a8958666 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -172,56 +172,67 @@ assert.doesNotMatch( const dv = new DataView(ab, 1, 2); assert.strictEqual( util.inspect(ab, showHidden), - 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, byteLength: 4 }' + 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, [byteLength]: 4 }' ); assert.strictEqual(util.inspect(new DataView(ab, 1, 2), showHidden), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer {' + - ' [Uint8Contents]: <01 02 03 04>, byteLength: 4 }\n}'); + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer {' + + ' [Uint8Contents]: <01 02 03 04>, [byteLength]: 4 }\n}'); assert.strictEqual( util.inspect(ab, showHidden), - 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, byteLength: 4 }' + 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, [byteLength]: 4 }' ); assert.strictEqual(util.inspect(dv, showHidden), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer { [Uint8Contents]: ' + - '<01 02 03 04>, byteLength: 4 }\n}'); + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer { [Uint8Contents]: ' + + '<01 02 03 04>, [byteLength]: 4 }\n}'); ab.x = 42; dv.y = 1337; assert.strictEqual(util.inspect(ab, showHidden), 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, ' + - 'byteLength: 4, x: 42 }'); - assert.strictEqual(util.inspect(dv, showHidden), + '[byteLength]: 4, x: 42 }'); + assert.strictEqual(util.inspect(dv, { showHidden, breakLength: 82 }), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer { [Uint8Contents]: <01 02 03 04>,' + - ' byteLength: 4, x: 42 },\n' + + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer { [Uint8Contents]: <01 02 03 04>,' + + ' [byteLength]: 4, x: 42 },\n' + ' y: 1337\n}'); } { const ab = new ArrayBuffer(42); + const dv = new DataView(ab); + assert.strictEqual(ab.byteLength, 42); new MessageChannel().port1.postMessage(ab, [ ab ]); assert.strictEqual(ab.byteLength, 0); assert.strictEqual(util.inspect(ab), - 'ArrayBuffer { (detached), byteLength: 0 }'); + 'ArrayBuffer { (detached), [byteLength]: 0 }'); + + assert.strictEqual( + util.inspect(dv), + 'DataView {\n' + + ' [byteLength]: 0,\n' + + ' [byteOffset]: undefined,\n' + + ' [buffer]: ArrayBuffer { (detached), [byteLength]: 0 }\n' + + ' }', + ); } // Truncate output for ArrayBuffers using plural or singular bytes { const ab = new ArrayBuffer(3); - assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 2 }), + assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 2, breakLength: 82 }), 'ArrayBuffer { [Uint8Contents]' + - ': <00 00 ... 1 more byte>, byteLength: 3 }'); - assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 1 }), + ': <00 00 ... 1 more byte>, [byteLength]: 3 }'); + assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 1, breakLength: 82 }), 'ArrayBuffer { [Uint8Contents]' + - ': <00 ... 2 more bytes>, byteLength: 3 }'); + ': <00 ... 2 more bytes>, [byteLength]: 3 }'); } // Now do the same checks but from a different context. @@ -231,35 +242,35 @@ assert.doesNotMatch( const dv = vm.runInNewContext('new DataView(ab, 1, 2)', { ab }); assert.strictEqual( util.inspect(ab, showHidden), - 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' + 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, [byteLength]: 4 }' ); assert.strictEqual(util.inspect(new DataView(ab, 1, 2), showHidden), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + - ' byteLength: 4 }\n}'); + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + + ' [byteLength]: 4 }\n}'); assert.strictEqual( util.inspect(ab, showHidden), - 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' + 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, [byteLength]: 4 }' ); assert.strictEqual(util.inspect(dv, showHidden), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + - ' byteLength: 4 }\n}'); + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + + ' [byteLength]: 4 }\n}'); ab.x = 42; dv.y = 1337; assert.strictEqual(util.inspect(ab, showHidden), 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, ' + - 'byteLength: 4, x: 42 }'); - assert.strictEqual(util.inspect(dv, showHidden), + '[byteLength]: 4, x: 42 }'); + assert.strictEqual(util.inspect(dv, { showHidden, breakLength: 82 }), 'DataView {\n' + - ' byteLength: 2,\n' + - ' byteOffset: 1,\n' + - ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + - ' byteLength: 4, x: 42 },\n' + + ' [byteLength]: 2,\n' + + ' [byteOffset]: 1,\n' + + ' [buffer]: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + + ' [byteLength]: 4, x: 42 },\n' + ' y: 1337\n}'); } @@ -286,7 +297,7 @@ assert.doesNotMatch( ` [length]: ${length},\n` + ` [byteLength]: ${byteLength},\n` + ' [byteOffset]: 0,\n' + - ` [buffer]: ArrayBuffer { byteLength: ${byteLength} }\n]`); + ` [buffer]: ArrayBuffer { [byteLength]: ${byteLength} }\n]`); assert.strictEqual( util.inspect(array, false), `${constructor.name}(${length}) [ 65, 97 ]` @@ -320,7 +331,7 @@ assert.doesNotMatch( ` [length]: ${length},\n` + ` [byteLength]: ${byteLength},\n` + ' [byteOffset]: 0,\n' + - ` [buffer]: ArrayBuffer { byteLength: ${byteLength} }\n]`); + ` [buffer]: ArrayBuffer { [byteLength]: ${byteLength} }\n]`); assert.strictEqual( util.inspect(array, false), `${constructor.name}(${length}) [ 65, 97 ]` @@ -1837,7 +1848,7 @@ util.inspect(process); ' [byteLength]: 0,', ' [byteOffset]: 0,', ' [buffer]: ArrayBuffer {', - ' byteLength: 0,', + ' [byteLength]: 0,', ' foo: true', ' }', ' ],', @@ -1855,7 +1866,7 @@ util.inspect(process); ' [byteLength]: 0,', ' [byteOffset]: 0,', ' [buffer]: ArrayBuffer {', - ' byteLength: 0,', + ' [byteLength]: 0,', ' foo: true', ' }', ' ],', @@ -1885,7 +1896,7 @@ util.inspect(process); ' [length]: 0,', ' [byteLength]: 0,', ' [byteOffset]: 0,', - ' [buffer]: ArrayBuffer { byteLength: 0, foo: true }', + ' [buffer]: ArrayBuffer { [byteLength]: 0, foo: true }', ' ],', ' [Set Iterator] {', ' [ 1, 2, [length]: 2 ],', @@ -1896,7 +1907,7 @@ util.inspect(process); ' [length]: 0,', ' [byteLength]: 0,', ' [byteOffset]: 0,', - ' [buffer]: ArrayBuffer { byteLength: 0, foo: true }', + ' [buffer]: ArrayBuffer { [byteLength]: 0, foo: true }', ' ],', ' [Circular *1],', " [Symbol(Symbol.toStringTag)]: 'Map Iterator'", @@ -1924,7 +1935,7 @@ util.inspect(process); ' [byteLength]: 0,', ' [byteOffset]: 0,', ' [buffer]: ArrayBuffer {', - ' byteLength: 0,', + ' [byteLength]: 0,', ' foo: true } ],', ' [Set Iterator] {', ' [ 1,', @@ -1938,7 +1949,7 @@ util.inspect(process); ' [byteLength]: 0,', ' [byteOffset]: 0,', ' [buffer]: ArrayBuffer {', - ' byteLength: 0,', + ' [byteLength]: 0,', ' foo: true } ],', ' [Circular *1],', ' [Symbol(Symbol.toStringTag)]:', @@ -2244,12 +2255,12 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'"); [new BigUint64Array(2), '[BigUint64Array(2): null prototype] [ 0n, 0n ]'], [new ArrayBuffer(16), '[ArrayBuffer: null prototype] {\n' + ' [Uint8Contents]: <00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>,\n' + - ' byteLength: undefined\n}'], + ' [byteLength]: undefined\n}'], [new DataView(new ArrayBuffer(16)), - '[DataView: null prototype] {\n byteLength: undefined,\n ' + - 'byteOffset: undefined,\n buffer: undefined\n}'], + '[DataView: null prototype] {\n [byteLength]: undefined,\n ' + + '[byteOffset]: undefined,\n [buffer]: undefined\n}'], [new SharedArrayBuffer(2), '[SharedArrayBuffer: null prototype] ' + - '{\n [Uint8Contents]: <00 00>,\n byteLength: undefined\n}'], + '{\n [Uint8Contents]: <00 00>,\n [byteLength]: undefined\n}'], [/foobar/, '[RegExp: null prototype] /foobar/'], [new Date('Sun, 14 Feb 2010 11:48:40 GMT'), '[Date: null prototype] 2010-02-14T11:48:40.000Z'], @@ -2380,6 +2391,20 @@ assert.strictEqual( inspect.styles.string = stringStyle; } +// Special (extra) properties follow normal coloring: +// only the name is colored, ":" and space are unstyled. +{ + const [open, close] = inspect.colors[inspect.styles.string]; + const keyPattern = (k) => new RegExp( + `\\u001b\\[${open}m\\[${k}\\]\\u001b\\[${close}m: ` + ); + const colored = util.inspect(new Uint8Array(0), { showHidden: true, colors: true }); + assert.match(colored, keyPattern('BYTES_PER_ELEMENT')); + assert.match(colored, keyPattern('length')); + assert.match(colored, keyPattern('byteLength')); + assert.match(colored, keyPattern('byteOffset')); +} + assert.strictEqual( inspect([1, 3, 2], { sorted: true }), inspect([1, 3, 2]) @@ -3632,7 +3657,7 @@ assert.strictEqual( assert.strictEqual( util.inspect(o), '{\n' + - ' arrayBuffer: ArrayBuffer { [Uint8Contents]: <>, byteLength: 0 },\n' + + ' arrayBuffer: ArrayBuffer { [Uint8Contents]: <>, [byteLength]: 0 },\n' + ' buffer: ,\n' + ' typedArray: TypedArray(5) [Uint8Array] [ 72, 101, 108, 108, 111 ],\n' + ' array: [],\n' + @@ -3705,3 +3730,28 @@ ${error.stack.split('\n').slice(1).join('\n')}`, assert.strictEqual(inspect(error), '[Error: foo\n [Error: bar\n [Circular *1]]]'); } + +{ + Object.defineProperty(Error, Symbol.hasInstance, + { __proto__: null, value: common.mustNotCall(), configurable: true }); + const error = new Error(); + + const throwingGetter = { + __proto__: null, + get() { + throw error; + }, + configurable: true, + enumerable: true, + }; + + Object.defineProperties(error, { + name: throwingGetter, + stack: throwingGetter, + cause: throwingGetter, + }); + + assert.strictEqual(inspect(error), `[object Error] {\n stack: [Getter/Setter],\n name: [Getter],\n cause: [Getter]\n}`); + assert.match(inspect(DOMException.prototype), /^\[object DOMException\] \{/); + delete Error[Symbol.hasInstance]; +} diff --git a/test/parallel/test-v8-stats.js b/test/parallel/test-v8-stats.js index 07be833e6e749a..5ee4c5aeb31adf 100644 --- a/test/parallel/test-v8-stats.js +++ b/test/parallel/test-v8-stats.js @@ -12,6 +12,7 @@ const keys = [ 'number_of_detached_contexts', 'number_of_native_contexts', 'peak_malloced_memory', + 'total_allocated_bytes', 'total_available_size', 'total_global_handles_size', 'total_heap_size', diff --git a/test/parallel/test-vm-module-evaluate-source-text-module.js b/test/parallel/test-vm-module-evaluate-source-text-module.js new file mode 100644 index 00000000000000..6227e6d73d4497 --- /dev/null +++ b/test/parallel/test-vm-module-evaluate-source-text-module.js @@ -0,0 +1,167 @@ +// Flags: --experimental-vm-modules +'use strict'; + +// This tests the result of evaluating a vm.SourceTextModule. +const common = require('../common'); + +const assert = require('assert'); +// To make testing easier we just use the public inspect API. If the output format +// changes, update this test accordingly. +const { inspect } = require('util'); +const vm = require('vm'); + +globalThis.callCount = {}; +common.allowGlobals(globalThis.callCount); + +// Synchronous error during evaluation results in a synchronously rejected promise. +{ + globalThis.callCount.syncError = 0; + const mod = new vm.SourceTextModule(` + globalThis.callCount.syncError++; + throw new Error("synchronous source text module"); + export const a = 1; + `); + mod.linkRequests([]); + mod.instantiate(); + const promise = mod.evaluate(); + assert.strictEqual(globalThis.callCount.syncError, 1); + assert.match(inspect(promise), /rejected/); + assert(mod.error, 'Expected mod.error to be set'); + assert.strictEqual(mod.error.message, 'synchronous source text module'); + + promise.catch(common.mustCall((err) => { + assert.strictEqual(err, mod.error); + // Calling evaluate() again results in the same rejection synchronously. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /rejected/); + promise2.catch(common.mustCall((err2) => { + assert.strictEqual(err, err2); + // The module is only evaluated once. + assert.strictEqual(globalThis.callCount.syncError, 1); + })); + })); +} + +// Successful evaluation of a module without top-level await results in a +// promise synchronously resolved to undefined. +{ + globalThis.callCount.syncNamedExports = 0; + const mod = new vm.SourceTextModule(` + globalThis.callCount.syncNamedExports++; + export const a = 1, b = 2; + `); + mod.linkRequests([]); + mod.instantiate(); + const promise = mod.evaluate(); + assert.match(inspect(promise), /Promise { undefined }/); + assert.strictEqual(mod.namespace.a, 1); + assert.strictEqual(mod.namespace.b, 2); + assert.strictEqual(globalThis.callCount.syncNamedExports, 1); + promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + + // Calling evaluate() again results in the same resolved promise synchronously. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /Promise { undefined }/); + assert.strictEqual(mod.namespace.a, 1); + assert.strictEqual(mod.namespace.b, 2); + promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + // The module is only evaluated once. + assert.strictEqual(globalThis.callCount.syncNamedExports, 1); + })); + })); +} + +{ + globalThis.callCount.syncDefaultExports = 0; + // Modules with either named and default exports have the same behaviors. + const mod = new vm.SourceTextModule(` + globalThis.callCount.syncDefaultExports++; + export default 42; + `); + mod.linkRequests([]); + mod.instantiate(); + const promise = mod.evaluate(); + assert.match(inspect(promise), /Promise { undefined }/); + assert.strictEqual(mod.namespace.default, 42); + assert.strictEqual(globalThis.callCount.syncDefaultExports, 1); + + promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + + // Calling evaluate() again results in the same resolved promise synchronously. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /Promise { undefined }/); + assert.strictEqual(mod.namespace.default, 42); + promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + // The module is only evaluated once. + assert.strictEqual(globalThis.callCount.syncDefaultExports, 1); + })); + })); +} + +// Successful evaluation of a module with top-level await results in a promise +// that is fulfilled asynchronously with undefined. +{ + globalThis.callCount.asyncEvaluation = 0; + const mod = new vm.SourceTextModule(` + globalThis.callCount.asyncEvaluation++; + await Promise.resolve(); + export const a = 1; + `); + mod.linkRequests([]); + mod.instantiate(); + const promise = mod.evaluate(); + assert.match(inspect(promise), //); + // Accessing the namespace before the promise is fulfilled throws ReferenceError. + assert.throws(() => mod.namespace.a, { name: 'ReferenceError' }); + assert.strictEqual(globalThis.callCount.asyncEvaluation, 1); + promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + assert.strictEqual(globalThis.callCount.asyncEvaluation, 1); + + // Calling evaluate() again results in a promise synchronously resolved to undefined. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /Promise { undefined }/); + assert.strictEqual(mod.namespace.a, 1); + promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + // The module is only evaluated once. + assert.strictEqual(globalThis.callCount.asyncEvaluation, 1); + })); + })); +} + +// Rejection of a top-level await promise results in a promise that is +// rejected asynchronously with the same reason. +{ + globalThis.callCount.asyncRejection = 0; + const mod = new vm.SourceTextModule(` + globalThis.callCount.asyncRejection++; + await Promise.reject(new Error("asynchronous source text module")); + export const a = 1; + `); + mod.linkRequests([]); + mod.instantiate(); + const promise = mod.evaluate(); + assert.match(inspect(promise), //); + // Accessing the namespace before the promise is fulfilled throws ReferenceError. + assert.throws(() => mod.namespace.a, { name: 'ReferenceError' }); + promise.catch(common.mustCall((err) => { + assert.strictEqual(err, mod.error); + assert.strictEqual(err.message, 'asynchronous source text module'); + assert.strictEqual(globalThis.callCount.asyncRejection, 1); + + // Calling evaluate() again results in a promise synchronously rejected + // with the same reason. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /rejected/); + promise2.catch(common.mustCall((err2) => { + assert.strictEqual(err, err2); + // The module is only evaluated once. + assert.strictEqual(globalThis.callCount.asyncRejection, 1); + })); + })); +} diff --git a/test/parallel/test-vm-module-evaluate-synthethic-module-rejection.js b/test/parallel/test-vm-module-evaluate-synthethic-module-rejection.js new file mode 100644 index 00000000000000..ad7b2f922fbced --- /dev/null +++ b/test/parallel/test-vm-module-evaluate-synthethic-module-rejection.js @@ -0,0 +1,42 @@ +// Flags: --experimental-vm-modules +'use strict'; + +// This tests the result of evaluating a vm.SyntheticModule with an async rejection +// in the evaluation step. + +const common = require('../common'); + +const assert = require('assert'); +// To make testing easier we just use the public inspect API. If the output format +// changes, update this test accordingly. +const { inspect } = require('util'); +const vm = require('vm'); + +// The promise _synchronously_ resolves to undefined, because for a synthethic module, +// the evaluation operation can only either resolve or reject immediately. +// In this case, the asynchronously rejected promise can't be handled from the outside, +// so we'll catch it with the isolate-level unhandledRejection handler. +// See https://tc39.es/ecma262/#sec-smr-Evaluate +process.on('unhandledRejection', common.mustCall((err) => { + assert.strictEqual(err.message, 'asynchronous source text module'); +})); + +const mod = new vm.SyntheticModule(['a'], common.mustCall(async () => { + throw new Error('asynchronous source text module'); +})); + +const promise = mod.evaluate(); +assert.match(inspect(promise), /Promise { undefined }/); +// Accessing the uninitialized export of a synthetic module returns undefined. +assert.strictEqual(mod.namespace.a, undefined); + +promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); +})); + +// Calling evaluate() again results in a promise _synchronously_ resolved to undefined again. +const promise2 = mod.evaluate(); +assert.match(inspect(promise2), /Promise { undefined }/); +promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); +})); diff --git a/test/parallel/test-vm-module-evaluate-synthethic-module.js b/test/parallel/test-vm-module-evaluate-synthethic-module.js new file mode 100644 index 00000000000000..1cd1bcadc6801a --- /dev/null +++ b/test/parallel/test-vm-module-evaluate-synthethic-module.js @@ -0,0 +1,83 @@ +// Flags: --experimental-vm-modules +'use strict'; + +// This tests the result of evaluating a vm.SynthethicModule. +// See https://tc39.es/ecma262/#sec-smr-Evaluate +const common = require('../common'); + +const assert = require('assert'); +// To make testing easier we just use the public inspect API. If the output format +// changes, update this test accordingly. +const { inspect } = require('util'); +const vm = require('vm'); + +// Synthetic modules with a synchronous evaluation step evaluate to a promise synchronously +// resolved to undefined. +{ + const mod = new vm.SyntheticModule(['a'], common.mustCall(() => { + mod.setExport('a', 42); + })); + const promise = mod.evaluate(); + assert.match(inspect(promise), /Promise { undefined }/); + assert.strictEqual(mod.namespace.a, 42); + + promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + + // Calling evaluate() again results in a promise synchronously resolved to undefined. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /Promise { undefined }/); + promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + })); + })); +} + +// Synthetic modules with an asynchronous evaluation step evaluate to a promise +// _synchronously_ resolved to undefined. +{ + const mod = new vm.SyntheticModule(['a'], common.mustCall(async () => { + const result = await Promise.resolve(42); + mod.setExport('a', result); + return result; + })); + const promise = mod.evaluate(); + assert.match(inspect(promise), /Promise { undefined }/); + // Accessing the uninitialized export of a synthetic module returns undefined. + assert.strictEqual(mod.namespace.a, undefined); + + promise.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + + // Calling evaluate() again results in a promise _synchronously_ resolved to undefined again. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /Promise { undefined }/); + promise2.then(common.mustCall((value) => { + assert.strictEqual(value, undefined); + })); + })); +} + +// Synchronous error during the evaluation step of a synthetic module results +// in a _synchronously_ rejected promise. +{ + const mod = new vm.SyntheticModule(['a'], common.mustCall(() => { + throw new Error('synchronous synthethic module'); + })); + const promise = mod.evaluate(); + assert.match(inspect(promise), /rejected/); + assert(mod.error, 'Expected mod.error to be set'); + assert.strictEqual(mod.error.message, 'synchronous synthethic module'); + + promise.catch(common.mustCall((err) => { + assert.strictEqual(err, mod.error); + + // Calling evaluate() again results in a promise _synchronously_ rejected + // with the same reason. + const promise2 = mod.evaluate(); + assert.match(inspect(promise2), /rejected/); + promise2.catch(common.mustCall((err2) => { + assert.strictEqual(err, err2); + })); + })); +} diff --git a/test/parallel/test-vm-module-evaluate-while-evaluating.js b/test/parallel/test-vm-module-evaluate-while-evaluating.js new file mode 100644 index 00000000000000..343b67e610332b --- /dev/null +++ b/test/parallel/test-vm-module-evaluate-while-evaluating.js @@ -0,0 +1,34 @@ +// Flags: --experimental-vm-modules +'use strict'; + +// This tests the result of evaluating a vm.Module while it is evaluating. +const common = require('../common'); + +const assert = require('assert'); +const vm = require('vm'); + +{ + let mod; + globalThis.evaluate = common.mustCall(() => { + assert.rejects(() => mod.evaluate(), { + code: 'ERR_VM_MODULE_STATUS' + }).then(common.mustCall()); + }); + common.allowGlobals(globalThis.evaluate); + mod = new vm.SourceTextModule(` + globalThis.evaluate(); + export const a = 42; + `); + mod.linkRequests([]); + mod.instantiate(); + mod.evaluate(); +} + +{ + const mod = new vm.SyntheticModule(['a'], common.mustCall(() => { + assert.rejects(() => mod.evaluate(), { + code: 'ERR_VM_MODULE_STATUS' + }).then(common.mustCall()); + })); + mod.evaluate(); +} diff --git a/test/parallel/test-watch-mode-kill-signal-default.mjs b/test/parallel/test-watch-mode-kill-signal-default.mjs new file mode 100644 index 00000000000000..53aec43d22e050 --- /dev/null +++ b/test/parallel/test-watch-mode-kill-signal-default.mjs @@ -0,0 +1,67 @@ +// Test that the kill signal sent by --watch defaults to SIGTERM. + +import '../common/index.mjs'; +import assert from 'node:assert'; +import { writeFileSync } from 'node:fs'; +import { spawn } from 'node:child_process'; +import { once } from 'node:events'; +import tmpdir from '../common/tmpdir.js'; +import fixtures from '../common/fixtures.js'; +import { skipIfNoWatchModeSignals } from '../common/watch.js'; + +skipIfNoWatchModeSignals(); + +tmpdir.refresh(); +const indexPath = tmpdir.resolve('kill-signal-for-watch.js'); +const indexContents = fixtures.readSync('kill-signal-for-watch.js', 'utf8'); +writeFileSync(indexPath, indexContents); + +const child = spawn( + process.execPath, + ['--watch', indexPath], + { + cwd: tmpdir.path, + stdio: ['inherit', 'pipe', 'inherit', 'ipc'], + } +); + +let stdout = ''; +let firstGrandchildPid; +child.stdout.on('data', (data) => { + const dataStr = data.toString(); + console.log(`[STDOUT] ${dataStr}`); + stdout += `${dataStr}`; + const match = dataStr.match(/__(SIGINT|SIGTERM) received__ (\d+)/); + if (match && match[2] === firstGrandchildPid) { + console.log(`[PARENT] Sending kill signal to watcher process: ${child.pid}`); + child.kill(); + } +}); + +// After the write triggers a restart of the grandchild, the newly spawned second +// grandchild can post another 'script ready' message before the stdout from the first +// grandchild is relayed by the watcher and processed by this parent process to kill +// the watcher. If we write again and trigger another restart, we can +// end up in an infinite loop and never receive the stdout of the grandchildren in time. +// Only write once to verify the first grandchild process receives the expected signal. +// We don't care about the subsequent grandchild processes. +child.on('message', (msg) => { + console.log(`[MESSAGE]`, msg); + if (!firstGrandchildPid && typeof msg === 'string') { + const match = msg.match(/script ready (\d+)/); + if (match) { + firstGrandchildPid = match[1]; // This is the first grandchild + const writeDelay = 1000; // Delay to reduce the chance of fs events coalescing + console.log(`[PARENT] writing to restart ${firstGrandchildPid} after ${writeDelay}ms`); + setTimeout(() => { + console.log(`[PARENT] writing to ${indexPath} to restart ${firstGrandchildPid}`); + writeFileSync(indexPath, indexContents); + }, writeDelay); + } + } +}); + +await once(child, 'exit'); + +assert.match(stdout, new RegExp(`__SIGTERM received__ ${firstGrandchildPid}`)); +assert.doesNotMatch(stdout, new RegExp(`__SIGINT received__ ${firstGrandchildPid}`)); diff --git a/test/parallel/test-watch-mode-kill-signal-invalid.mjs b/test/parallel/test-watch-mode-kill-signal-invalid.mjs new file mode 100644 index 00000000000000..e2f32ba978e210 --- /dev/null +++ b/test/parallel/test-watch-mode-kill-signal-invalid.mjs @@ -0,0 +1,39 @@ +// Test that --watch-kill-signal errors when an invalid kill signal is provided. + +import '../common/index.mjs'; +import assert from 'node:assert'; +import { writeFileSync } from 'node:fs'; +import { spawn } from 'node:child_process'; +import tmpdir from '../common/tmpdir.js'; +import fixtures from '../common/fixtures.js'; +import { skipIfNoWatchModeSignals } from '../common/watch.js'; + +skipIfNoWatchModeSignals(); + +tmpdir.refresh(); +const indexPath = tmpdir.resolve('kill-signal-for-watch.js'); +const indexContents = fixtures.readSync('kill-signal-for-watch.js', 'utf8'); +writeFileSync(indexPath, indexContents); + +const currentRun = Promise.withResolvers(); +const child = spawn( + process.execPath, + ['--watch', '--watch-kill-signal', 'invalid_signal', indexPath], + { + cwd: tmpdir.path, + stdio: ['inherit', 'inherit', 'pipe'], + } +); +let stderr = ''; + +child.stderr.on('data', (data) => { + stderr += data.toString(); + currentRun.resolve(); +}); + +await currentRun.promise; + +assert.match( + stderr, + /TypeError \[ERR_UNKNOWN_SIGNAL\]: Unknown signal: invalid_signal/ +); diff --git a/test/parallel/test-watch-mode-kill-signal-override.mjs b/test/parallel/test-watch-mode-kill-signal-override.mjs new file mode 100644 index 00000000000000..dc3af3f76e848d --- /dev/null +++ b/test/parallel/test-watch-mode-kill-signal-override.mjs @@ -0,0 +1,71 @@ +// Test that the kill signal sent by --watch can be overridden to SIGINT +// by using --watch-kill-signal. + +import '../common/index.mjs'; +import assert from 'node:assert'; +import { writeFileSync } from 'node:fs'; +import { spawn } from 'node:child_process'; +import { once } from 'node:events'; +import tmpdir from '../common/tmpdir.js'; +import fixtures from '../common/fixtures.js'; +import { skipIfNoWatchModeSignals } from '../common/watch.js'; + +skipIfNoWatchModeSignals(); + +tmpdir.refresh(); +const indexPath = tmpdir.resolve('kill-signal-for-watch.js'); +const indexContents = fixtures.readSync('kill-signal-for-watch.js', 'utf8'); +writeFileSync(indexPath, indexContents); + +const child = spawn( + process.execPath, + ['--watch', '--watch-kill-signal', 'SIGINT', indexPath], + { + cwd: tmpdir.path, + stdio: ['inherit', 'pipe', 'inherit', 'ipc'], + } +); + +let stdout = ''; +let firstGrandchildPid; +child.stdout.on('data', (data) => { + const dataStr = data.toString(); + console.log(`[STDOUT] ${dataStr}`); + stdout += `${dataStr}`; + const match = dataStr.match(/__(SIGINT|SIGTERM) received__ (\d+)/); + if (match && match[2] === firstGrandchildPid) { + console.log(`[PARENT] Sending kill signal to watcher process: ${child.pid}`); + child.kill(); + } +}); + +// After the write triggers a restart of the grandchild, the newly spawned second +// grandchild can post another 'script ready' message before the stdout from the first +// grandchild is relayed by the watcher and processed by this parent process to kill +// the watcher. If we write again and trigger another restart, we can +// end up in an infinite loop and never receive the stdout of the grandchildren in time. +// Only write once to verify the first grandchild process receives the expected signal. +// We don't care about the subsequent grandchild processes. +child.on('message', (msg) => { + console.log(`[MESSAGE]`, msg); + if (!firstGrandchildPid && typeof msg === 'string') { + const match = msg.match(/script ready (\d+)/); + if (match) { + firstGrandchildPid = match[1]; // This is the first grandchild + const writeDelay = 1000; // Delay to reduce the chance of fs events coalescing + console.log(`[PARENT] writing to restart ${firstGrandchildPid} after ${writeDelay}ms`); + setTimeout(() => { + console.log(`[PARENT] writing to ${indexPath} to restart ${firstGrandchildPid}`); + writeFileSync(indexPath, indexContents); + }, writeDelay); + } + } +}); + +await once(child, 'exit'); + +// The second grandchild, if there is one, could receive SIGTERM if it's killed as a +// consequence of the parent being killed in this process instead of being killed by the +// parent for file changes. Here we only care about the first grandchild. +assert.match(stdout, new RegExp(`__SIGINT received__ ${firstGrandchildPid}`)); +assert.doesNotMatch(stdout, new RegExp(`__SIGTERM received__ ${firstGrandchildPid}`)); diff --git a/test/parallel/test-webcrypto-derivebits-hkdf.js b/test/parallel/test-webcrypto-derivebits-hkdf.js index 0629f85b0fb538..2759223e76a060 100644 --- a/test/parallel/test-webcrypto-derivebits-hkdf.js +++ b/test/parallel/test-webcrypto-derivebits-hkdf.js @@ -91,18 +91,20 @@ const kDerivations = { empty: '9e4b719033742101e90f1ad61e2ff3b4' + '256863667296d74389f1f02af2c4e6a6' }, - 'SHA3-256': { - normal: '386b0693d7a58c4ddf01b49bfbbd2fa87c6f911991543995170ba20ed28df599', - empty: 'd029bc828b6c6c8bb16ce3d25f5058f19c7d2517745e11c5d65c6d242e82e47f', - }, - 'SHA3-384': { - normal: '8c3b72e659bad40bcd14bdc1f7c3836059d24253795ab046a272973fd0456508', - empty: '3211ff4c676f761494c1ca2683d2d4662fe1d770ae5c58ebf6af6acb181c7d71', - }, - 'SHA3-512': { - normal: '5588c5c70cb3dd2f95323da2e9d5f299ca99c301d920a499330c449d21c645cd', - empty: '2c944b916c2751a71a1b5e57fcb487939c624335683995770b9f7cc7cbbb21f0', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '386b0693d7a58c4ddf01b49bfbbd2fa87c6f911991543995170ba20ed28df599', + empty: 'd029bc828b6c6c8bb16ce3d25f5058f19c7d2517745e11c5d65c6d242e82e47f', + }, + 'SHA3-384': { + normal: '8c3b72e659bad40bcd14bdc1f7c3836059d24253795ab046a272973fd0456508', + empty: '3211ff4c676f761494c1ca2683d2d4662fe1d770ae5c58ebf6af6acb181c7d71', + }, + 'SHA3-512': { + normal: '5588c5c70cb3dd2f95323da2e9d5f299ca99c301d920a499330c449d21c645cd', + empty: '2c944b916c2751a71a1b5e57fcb487939c624335683995770b9f7cc7cbbb21f0', + }, + } : {}), }, empty: { 'SHA-384': { @@ -129,18 +131,20 @@ const kDerivations = { empty: 'c8e12774135305c9147f2cc4766e5ead' + '25d8f457b9a1953d52677361ced558fb' }, - 'SHA3-256': { - normal: '9befc557f5baf4075b5fb38c014b41b92ab7534150baf64201069e8807d0e83d', - empty: '54d1fa1aa7cad99dab0622b772170e775c103756183bac36a228fd817a98a3f6', - }, - 'SHA3-384': { - normal: '46b54c015e368677edf7ac16963bccd9d2ba8246eef0e8beb04d8d188774b91b', - empty: '46eb0b2649bb0f605d70e4818ffc8176ee1be9782396e69fb4d0fd7cfe902b55', - }, - 'SHA3-512': { - normal: 'aa4375c82b5d7a3cac88a0423250b3882f140c253e98e8e7a0f6055b0908e4c2', - empty: '6613003f98602ddb53ac35f5aa256c9f5279d50ee65bb08fdf2ecf65cc5df27f', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '9befc557f5baf4075b5fb38c014b41b92ab7534150baf64201069e8807d0e83d', + empty: '54d1fa1aa7cad99dab0622b772170e775c103756183bac36a228fd817a98a3f6', + }, + 'SHA3-384': { + normal: '46b54c015e368677edf7ac16963bccd9d2ba8246eef0e8beb04d8d188774b91b', + empty: '46eb0b2649bb0f605d70e4818ffc8176ee1be9782396e69fb4d0fd7cfe902b55', + }, + 'SHA3-512': { + normal: 'aa4375c82b5d7a3cac88a0423250b3882f140c253e98e8e7a0f6055b0908e4c2', + empty: '6613003f98602ddb53ac35f5aa256c9f5279d50ee65bb08fdf2ecf65cc5df27f', + }, + } : {}), } }, long: { @@ -169,18 +173,20 @@ const kDerivations = { empty: 'e579d1f9e7f08e6f990ffcfcce1ed201' + 'c5e37e62cdf606f0ba4aca80427fbc44' }, - 'SHA3-256': { - normal: '24f38fd1905554b7cbf8395cc3976292d11ce24a0b3131da0fd4b109832d27e3', - empty: '33d0a5151c0f52e4bb7fb67cf7a17063127624dc3e685903f49ebb07872084d1', - }, - 'SHA3-384': { - normal: '15777581a1ea81ad0baac8a97d954df4142f7260d9e8351aa7f6ef6de2d04632', - empty: 'ada4da4e28dc971633a8760b265b3019db57baf17e7bf7e13cf78b1a676f6d44', - }, - 'SHA3-512': { - normal: '621e4602b07fcba55ed6b976a8bef513b0f7c4ad0c546e0f852993051d887408', - empty: 'f1292af65b05c86cf7146b739bc65785c707450316f3207ee54a3f596a7d0f7b', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: '24f38fd1905554b7cbf8395cc3976292d11ce24a0b3131da0fd4b109832d27e3', + empty: '33d0a5151c0f52e4bb7fb67cf7a17063127624dc3e685903f49ebb07872084d1', + }, + 'SHA3-384': { + normal: '15777581a1ea81ad0baac8a97d954df4142f7260d9e8351aa7f6ef6de2d04632', + empty: 'ada4da4e28dc971633a8760b265b3019db57baf17e7bf7e13cf78b1a676f6d44', + }, + 'SHA3-512': { + normal: '621e4602b07fcba55ed6b976a8bef513b0f7c4ad0c546e0f852993051d887408', + empty: 'f1292af65b05c86cf7146b739bc65785c707450316f3207ee54a3f596a7d0f7b', + }, + } : {}), }, empty: { 'SHA-384': { @@ -207,18 +213,20 @@ const kDerivations = { empty: 'b4f7e7557674d501cbfbc0148ad800c0' + '750189fe295a2aca5e1bf4122c85edf9' }, - 'SHA3-256': { - normal: 'fe32459f7339dd2e8df6c6fc874ed9e81e3b7aad669edad9b71196f53ed95b12', - empty: '04519be1eb94079c91306cc5b21946b3de6a78ad35ec83d4f4a37bafbda678d7', - }, - 'SHA3-384': { - normal: 'a474e8289cb4a0511e90b87eaf9ec29cadd74d4c1f2ee1fb8cb5f7d08f91a379', - empty: '726c8c4b39083a7d5755604d3a67e9aa6139db00c08028ac9e69f7fb1525bf1d', - }, - 'SHA3-512': { - normal: 'c7a7f5004d1d595c6896498c169642ac24b946e13296ff53e12b534962a88675', - empty: '7b543480b5696932551abb3100d72e05c18f57fbb63aa44fe020bef1eec3555c', - }, + ...(!process.features.openssl_is_boringssl ? { + 'SHA3-256': { + normal: 'fe32459f7339dd2e8df6c6fc874ed9e81e3b7aad669edad9b71196f53ed95b12', + empty: '04519be1eb94079c91306cc5b21946b3de6a78ad35ec83d4f4a37bafbda678d7', + }, + 'SHA3-384': { + normal: 'a474e8289cb4a0511e90b87eaf9ec29cadd74d4c1f2ee1fb8cb5f7d08f91a379', + empty: '726c8c4b39083a7d5755604d3a67e9aa6139db00c08028ac9e69f7fb1525bf1d', + }, + 'SHA3-512': { + normal: 'c7a7f5004d1d595c6896498c169642ac24b946e13296ff53e12b534962a88675', + empty: '7b543480b5696932551abb3100d72e05c18f57fbb63aa44fe020bef1eec3555c', + }, + } : {}), } }, }; diff --git a/test/parallel/test-webcrypto-derivekey.js b/test/parallel/test-webcrypto-derivekey.js index 422384f4447bda..e04a7eab1bd8ef 100644 --- a/test/parallel/test-webcrypto-derivekey.js +++ b/test/parallel/test-webcrypto-derivekey.js @@ -135,14 +135,21 @@ const { KeyObject } = require('crypto'); '201509b012c9cd2fbe7ea938f0c509b36ecb140f38bf9130e96923f55f46756d'], ['hello', 'there', 5, 'SHA-512', '2e8d981741f98193e0af9c79870af0e985089341221edad9a130d297eae1984b'], - ['hello', 'there', 5, 'SHA3-256', - '0aed29b61b3ca3978aea34a9793276574ea997b69e8d03727438199f90571649'], - ['hello', 'there', 5, 'SHA3-384', - '7aa4a274aa19b4623c5d3091c4b06355de85ff6f25e53a83e3126cbb86ae68df'], - ['hello', 'there', 5, 'SHA3-512', - '4d909c47a81c625f866d1f9406248e6bc3c7ea89225fbccf1f08820254c9ef56'], ]; + if (!process.features.openssl_is_boringssl) { + kTests.push( + ['hello', 'there', 5, 'SHA3-256', + '0aed29b61b3ca3978aea34a9793276574ea997b69e8d03727438199f90571649'], + ['hello', 'there', 5, 'SHA3-384', + '7aa4a274aa19b4623c5d3091c4b06355de85ff6f25e53a83e3126cbb86ae68df'], + ['hello', 'there', 5, 'SHA3-512', + '4d909c47a81c625f866d1f9406248e6bc3c7ea89225fbccf1f08820254c9ef56'] + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + const tests = Promise.all(kTests.map((args) => test(...args))); tests.then(common.mustCall()); @@ -158,16 +165,23 @@ const { KeyObject } = require('crypto'); // Not long enough secret generated by ECDH [{ name: 'HMAC', hash: 'SHA-384' }, 'sign', 1024], [{ name: 'HMAC', hash: 'SHA-512' }, 'sign', 1024], - [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], - [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], - [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], - // This interaction is not defined for now. - // https://github.com/WICG/webcrypto-modern-algos/issues/23 - // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], - // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], - // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], ]; + if (!process.features.openssl_is_boringssl) { + vectors.push( + [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], + [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], + [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512] + // This interaction is not defined for now. + // https://github.com/WICG/webcrypto-modern-algos/issues/23 + // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], + // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], + // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + if (hasOpenSSL(3)) { vectors.push( ['KMAC128', 'sign', 128], @@ -211,16 +225,23 @@ const { KeyObject } = require('crypto'); [{ name: 'HMAC', hash: 'SHA-256' }, 'sign', 512], [{ name: 'HMAC', hash: 'SHA-384' }, 'sign', 1024], [{ name: 'HMAC', hash: 'SHA-512' }, 'sign', 1024], - [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], - [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], - [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], - // This interaction is not defined for now. - // https://github.com/WICG/webcrypto-modern-algos/issues/23 - // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], - // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], - // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], ]; + if (!process.features.openssl_is_boringssl) { + vectors.push( + [{ name: 'HMAC', hash: 'SHA3-256', length: 256 }, 'sign', 256], + [{ name: 'HMAC', hash: 'SHA3-384', length: 384 }, 'sign', 384], + [{ name: 'HMAC', hash: 'SHA3-512', length: 512 }, 'sign', 512], + // This interaction is not defined for now. + // https://github.com/WICG/webcrypto-modern-algos/issues/23 + // [{ name: 'HMAC', hash: 'SHA3-256' }, 'sign', 256], + // [{ name: 'HMAC', hash: 'SHA3-384' }, 'sign', 384], + // [{ name: 'HMAC', hash: 'SHA3-512' }, 'sign', 512], + ); + } else { + common.printSkipMessage('Skipping unsupported SHA-3 test cases'); + } + if (hasOpenSSL(3)) { vectors.push( ['KMAC128', 'sign', 128], diff --git a/test/parallel/test-webcrypto-digest.js b/test/parallel/test-webcrypto-digest.js index 04507d77b59142..e91214047dea43 100644 --- a/test/parallel/test-webcrypto-digest.js +++ b/test/parallel/test-webcrypto-digest.js @@ -148,65 +148,67 @@ const kDigestedData = { '60b22aab8d36a4c2a3affdb71234f49276737c575ddf7' + '4d14054cbd6fdb98fd0ddcbcb46f91ad76b6ee' }, - 'cshake128': { - empty: '7f9c2ba4e88f827d616045507605853ed73b8093f6e' + - 'fbc88eb1a6eacfa66ef26', - short: 'dea62d73e6b59cf725d0320d660089a4475cbbd3b85' + - '39e36691f150d47556794', - medium: 'b1acd53a03e76a221e52ea578e042f686a68c3d1c9' + - '832ab18285cf4f304ca32d', - long: '3a5bf5676955e5dec87d430e526925558971ca14c370' + - 'ee5d7cf572b94c7c63d7' - }, - 'cshake256': { - empty: '46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b' + - '81b82b50c27646ed5762fd75dc4ddd8c0f200cb0501' + - '9d67b592f6fc821c49479ab48640292eacb3b7c4be', - short: '1738113f5abb3ee5320ee18aa266c3617a7475dbd8e' + - 'd9a985994fddd6112ad999ec8e2ebdfeafb96e76f6b' + - 'b3a3adba43da60f00cd12496df5af3e28ae6d3de42', - medium: '4146c13d86d9bc186b0b309ab6a124ee0c74ba26b8' + - 'c60dcc7b3ed505969aa8d19028c6317999a085b1e6' + - 'b6a785ce4ff632aeb27493227e44232fb7b3952141' + - '7b', - long: '0c42bfd1e282622fd8144aa29b072fd09fc2bae70885' + - 'd5290933492f9d17411926a613dd0611668c2ac999e8' + - 'c011aabaa9004323425fbad75b0f58ee6e777a94' - }, - 'sha3-256': { - empty: 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a', - short: '3059af7aa33b517084e8ad7bbc4fb208a44c28ef32b4698d103dd540e4f91aa1', - medium: '1fa7cd1da74cd8046417508c8314e74a9a4a9d38f9f18e6cb215b8c891a0a80e', - long: 'b2cfc61e0386cdaef5e10a2be189891f5ef52a7624bfcd8edc893acc64fec600' - }, - 'sha3-384': { - empty: '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa9' + - '4fc61995e71bbee983a2ac3713831264adb47fb6bd1' + - 'e058d5f004', - short: '54b8f0e4cf4974de740098f66b3024479b01631315a' + - '6773606c33eadc32556a6e778e08f0225ae79265aec' + - '666cb2390b', - medium: '437b7d8b68b250b5c1739ea4cc86db2033879dfb18' + - 'de292c9c50d9c193a4c79a08a6cae3f4e483c2795e' + - 'a5d1ef7e69d2', - long: '3b39c4c97ad87613305d0ccc987181713e2d5e84b1f9' + - '760011bcce0c297499005bdce8a3d2409b5ad0164f32' + - 'bb8778d0' - }, - 'sha3-512': { - empty: 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe' + - '25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9' + - '402c3ac558f500199d95b6d3e301758586281dcd26', - short: '2dd2e07a62e6ad0498ba84f313c4d4024cb46001f78' + - 'f75db336b0d4d8bd2a9ec152c4ad20878735d82ba08' + - '72ecf59608ef3ced2b2a8669427e7da31e362333d8', - medium: 'e640a21909536640369e9b0a48931c5cb2efcbc91f' + - 'ecf247306bc96a0e4ca33307cb8e1b9af367946dd01' + - 'c243f3907508d04f1692a3161df1f898de8ee25febe', - long: 'bd262cecf565c338032de5ba0138f0aacfe7dde83d27' + - '2d0d37d952829ed25de1a1342d98659ef7d2fa4aca7c' + - 'e2b1aa0784d8fc1dcbf81bcec7a7431a3da36bf7' - } + ...(!process.features.openssl_is_boringssl ? { + 'cshake128': { + empty: '7f9c2ba4e88f827d616045507605853ed73b8093f6e' + + 'fbc88eb1a6eacfa66ef26', + short: 'dea62d73e6b59cf725d0320d660089a4475cbbd3b85' + + '39e36691f150d47556794', + medium: 'b1acd53a03e76a221e52ea578e042f686a68c3d1c9' + + '832ab18285cf4f304ca32d', + long: '3a5bf5676955e5dec87d430e526925558971ca14c370' + + 'ee5d7cf572b94c7c63d7' + }, + 'cshake256': { + empty: '46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b' + + '81b82b50c27646ed5762fd75dc4ddd8c0f200cb0501' + + '9d67b592f6fc821c49479ab48640292eacb3b7c4be', + short: '1738113f5abb3ee5320ee18aa266c3617a7475dbd8e' + + 'd9a985994fddd6112ad999ec8e2ebdfeafb96e76f6b' + + 'b3a3adba43da60f00cd12496df5af3e28ae6d3de42', + medium: '4146c13d86d9bc186b0b309ab6a124ee0c74ba26b8' + + 'c60dcc7b3ed505969aa8d19028c6317999a085b1e6' + + 'b6a785ce4ff632aeb27493227e44232fb7b3952141' + + '7b', + long: '0c42bfd1e282622fd8144aa29b072fd09fc2bae70885' + + 'd5290933492f9d17411926a613dd0611668c2ac999e8' + + 'c011aabaa9004323425fbad75b0f58ee6e777a94' + }, + 'sha3-256': { + empty: 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a', + short: '3059af7aa33b517084e8ad7bbc4fb208a44c28ef32b4698d103dd540e4f91aa1', + medium: '1fa7cd1da74cd8046417508c8314e74a9a4a9d38f9f18e6cb215b8c891a0a80e', + long: 'b2cfc61e0386cdaef5e10a2be189891f5ef52a7624bfcd8edc893acc64fec600' + }, + 'sha3-384': { + empty: '0c63a75b845e4f7d01107d852e4c2485c51a50aaaa9' + + '4fc61995e71bbee983a2ac3713831264adb47fb6bd1' + + 'e058d5f004', + short: '54b8f0e4cf4974de740098f66b3024479b01631315a' + + '6773606c33eadc32556a6e778e08f0225ae79265aec' + + '666cb2390b', + medium: '437b7d8b68b250b5c1739ea4cc86db2033879dfb18' + + 'de292c9c50d9c193a4c79a08a6cae3f4e483c2795e' + + 'a5d1ef7e69d2', + long: '3b39c4c97ad87613305d0ccc987181713e2d5e84b1f9' + + '760011bcce0c297499005bdce8a3d2409b5ad0164f32' + + 'bb8778d0' + }, + 'sha3-512': { + empty: 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe' + + '25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9' + + '402c3ac558f500199d95b6d3e301758586281dcd26', + short: '2dd2e07a62e6ad0498ba84f313c4d4024cb46001f78' + + 'f75db336b0d4d8bd2a9ec152c4ad20878735d82ba08' + + '72ecf59608ef3ced2b2a8669427e7da31e362333d8', + medium: 'e640a21909536640369e9b0a48931c5cb2efcbc91f' + + 'ecf247306bc96a0e4ca33307cb8e1b9af367946dd01' + + 'c243f3907508d04f1692a3161df1f898de8ee25febe', + long: 'bd262cecf565c338032de5ba0138f0aacfe7dde83d27' + + '2d0d37d952829ed25de1a1342d98659ef7d2fa4aca7c' + + 'e2b1aa0784d8fc1dcbf81bcec7a7431a3da36bf7' + } + } : {}), }; async function testDigest(size, alg) { diff --git a/test/parallel/test-webcrypto-sign-verify-rsa.js b/test/parallel/test-webcrypto-sign-verify-rsa.js index 7e90388cc4c270..7dd5637b12f702 100644 --- a/test/parallel/test-webcrypto-sign-verify-rsa.js +++ b/test/parallel/test-webcrypto-sign-verify-rsa.js @@ -241,13 +241,13 @@ async function testSaltLength(keyLength, hash, hLen) { ['SHA-256', 32], ['SHA-384', 48], ['SHA-512', 64], - ['SHA3-256', 32], - ['SHA3-384', 48], - ['SHA3-512', 64], + ...(!process.features.openssl_is_boringssl ? [ + ['SHA3-256', 32], + ['SHA3-384', 48], + ['SHA3-512', 64], + ] : []), ]) { - if (hash.startsWith('SHA-3') && !process.features.openssl_is_boringssl) { - variations.push(testSaltLength(keyLength, hash, hLen)); - } + variations.push(testSaltLength(keyLength, hash, hLen)); } } diff --git a/test/parallel/test-without-async-context-frame.mjs b/test/parallel/test-without-async-context-frame.mjs deleted file mode 100644 index fa431c5700053c..00000000000000 --- a/test/parallel/test-without-async-context-frame.mjs +++ /dev/null @@ -1,64 +0,0 @@ -import { isWindows } from '../common/index.mjs'; -import { spawn } from 'node:child_process'; -import { once } from 'node:events'; -import { opendir } from 'node:fs/promises'; -import { fileURLToPath } from 'node:url'; -import { describe, it } from 'node:test'; -import { sep } from 'node:path'; -import { strictEqual } from 'node:assert'; - -const python = process.env.PYTHON || (isWindows ? 'python' : 'python3'); - -const testRunner = fileURLToPath( - new URL('../../tools/test.py', import.meta.url) -); - -const setNames = ['async-hooks', 'parallel']; - -// Get all test names for each set -const testSets = await Promise.all(setNames.map(async (name) => { - const path = fileURLToPath(new URL(`../${name}`, import.meta.url)); - const dir = await opendir(path); - - const tests = []; - for await (const entry of dir) { - if (entry.name.startsWith('test-async-local-storage-')) { - tests.push(entry.name); - } - } - - return { - name, - tests - }; -})); - -// Merge test sets with set name prefix -const tests = testSets.reduce((m, v) => { - for (const test of v.tests) { - m.push(`${v.name}${sep}${test}`); - } - return m; -}, []); - -describe('without AsyncContextFrame', { - // TODO(qard): I think high concurrency causes memory problems on Windows - // concurrency: tests.length -}, () => { - for (const test of tests) { - it(test, async () => { - const proc = spawn(python, [ - testRunner, - `--mode=${process.features.debug ? 'debug' : 'release'}`, - `--shell=${process.execPath}`, - '--node-args=--no-async-context-frame', - test, - ], { - stdio: ['ignore', 'ignore', 'inherit'], - }); - - const [code] = await once(proc, 'exit'); - strictEqual(code, 0, `Test ${test} failed with exit code ${code}`); - }); - } -}); diff --git a/test/parallel/test-worker-heap-statistics.js b/test/parallel/test-worker-heap-statistics.js index 12a748c303a026..ba3165aa24aba0 100644 --- a/test/parallel/test-worker-heap-statistics.js +++ b/test/parallel/test-worker-heap-statistics.js @@ -40,6 +40,7 @@ if (isMainThread) { `total_global_handles_size`, `used_global_handles_size`, `external_memory`, + `total_allocated_bytes`, ].sort(); assert.deepStrictEqual(keys, Object.keys(stats).sort()); for (const key of keys) { diff --git a/test/parallel/test-x509-escaping.js b/test/parallel/test-x509-escaping.js index b507af88e1f7f3..c8fc4abbb108a6 100644 --- a/test/parallel/test-x509-escaping.js +++ b/test/parallel/test-x509-escaping.js @@ -438,7 +438,7 @@ const { hasOpenSSL3 } = require('../common/crypto'); const cert = fixtures.readKey('incorrect_san_correct_subject-cert.pem'); // The hostname is the CN, but not a SAN entry. - const servername = 'good.example.com'; + const servername = process.features.openssl_is_boringssl ? undefined : 'good.example.com'; const certX509 = new X509Certificate(cert); assert.strictEqual(certX509.subject, `CN=${servername}`); assert.strictEqual(certX509.subjectAltName, 'DNS:evil.example.com'); diff --git a/test/parallel/test-zlib-brotli-16GB.js b/test/parallel/test-zlib-brotli-16GB.js index 9b894320e91ebd..7bd5a137f908fd 100644 --- a/test/parallel/test-zlib-brotli-16GB.js +++ b/test/parallel/test-zlib-brotli-16GB.js @@ -2,7 +2,7 @@ const common = require('../common'); const { createBrotliDecompress } = require('node:zlib'); -const strictEqual = require('node:assert').strictEqual; +const assert = require('node:assert'); const { getDefaultHighWaterMark } = require('stream'); // This tiny HEX string is a 16GB file. @@ -19,5 +19,5 @@ decoder.end(buf); // to process the data and the buffer is not empty. setTimeout(common.mustCall(() => { // There is only one chunk in the buffer - strictEqual(decoder._readableState.buffer.length, getDefaultHighWaterMark() / (16 * 1024)); + assert.strictEqual(decoder._readableState.buffer.length, getDefaultHighWaterMark() / (16 * 1024)); }), common.platformTimeout(500)); diff --git a/test/parallel/test-zlib-brotli-kmaxlength-rangeerror.js b/test/parallel/test-zlib-brotli-kmaxlength-rangeerror.js index 6a59ad34b0a174..69f23542cb9ac0 100644 --- a/test/parallel/test-zlib-brotli-kmaxlength-rangeerror.js +++ b/test/parallel/test-zlib-brotli-kmaxlength-rangeerror.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); // This test ensures that zlib throws a RangeError if the final buffer needs to // be larger than kMaxLength and concatenation fails. @@ -18,9 +18,9 @@ buffer.kMaxLength = oldkMaxLength; const encoded = Buffer.from('G38A+CXCIrFAIAM=', 'base64'); // Async -zlib.brotliDecompress(encoded, function(err) { +zlib.brotliDecompress(encoded, common.mustCall((err) => { assert.ok(err instanceof RangeError); -}); +})); // Sync assert.throws(function() { diff --git a/test/parallel/test-zlib-from-concatenated-gzip.js b/test/parallel/test-zlib-from-concatenated-gzip.js index 1de36dacf95f3d..31985aa2bbe791 100644 --- a/test/parallel/test-zlib-from-concatenated-gzip.js +++ b/test/parallel/test-zlib-from-concatenated-gzip.js @@ -47,9 +47,7 @@ const pmmResultBuffers = []; fs.createReadStream(pmmFileGz) .pipe(zlib.createGunzip()) - .on('error', (err) => { - assert.ifError(err); - }) + .on('error', common.mustNotCall()) .on('data', (data) => pmmResultBuffers.push(data)) .on('finish', common.mustCall(() => { // Result should match original random garbage @@ -61,9 +59,7 @@ fs.createReadStream(pmmFileGz) const resultBuffers = []; const unzip = zlib.createGunzip() - .on('error', (err) => { - assert.ifError(err); - }) + .on('error', common.mustNotCall()) .on('data', (data) => resultBuffers.push(data)) .on('finish', common.mustCall(() => { assert.strictEqual( diff --git a/test/parallel/test-zlib-kmaxlength-rangeerror.js b/test/parallel/test-zlib-kmaxlength-rangeerror.js index 9803630214eb36..bae49a6530a902 100644 --- a/test/parallel/test-zlib-kmaxlength-rangeerror.js +++ b/test/parallel/test-zlib-kmaxlength-rangeerror.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); // This test ensures that zlib throws a RangeError if the final buffer needs to // be larger than kMaxLength and concatenation fails. @@ -18,9 +18,9 @@ buffer.kMaxLength = oldkMaxLength; const encoded = Buffer.from('H4sIAAAAAAAAA0tMHFgAAIw2K/GAAAAA', 'base64'); // Async -zlib.gunzip(encoded, function(err) { +zlib.gunzip(encoded, common.mustCall((err) => { assert.ok(err instanceof RangeError); -}); +})); // Sync assert.throws(function() { diff --git a/test/parallel/test-zlib-maxOutputLength.js b/test/parallel/test-zlib-maxOutputLength.js index 9af0b3736f8815..ec293aabe7fc04 100644 --- a/test/parallel/test-zlib-maxOutputLength.js +++ b/test/parallel/test-zlib-maxOutputLength.js @@ -17,9 +17,7 @@ assert.throws(function() { }, RangeError); // Async -zlib.brotliDecompress(encoded, { maxOutputLength: 256 }, function(err) { - assert.strictEqual(err, null); -}); +zlib.brotliDecompress(encoded, { maxOutputLength: 256 }, common.mustSucceed()); // Sync zlib.brotliDecompressSync(encoded, { maxOutputLength: 256 }); diff --git a/test/parallel/test-zlib-reset-before-write.js b/test/parallel/test-zlib-reset-before-write.js index afa207f12c1b30..05c1cdce2c4972 100644 --- a/test/parallel/test-zlib-reset-before-write.js +++ b/test/parallel/test-zlib-reset-before-write.js @@ -21,9 +21,7 @@ for (const fn of [ const output = []; inflate - .on('error', (err) => { - assert.ifError(err); - }) + .on('error', common.mustNotCall()) .on('data', (chunk) => output.push(chunk)) .on('end', common.mustCall( () => assert.strictEqual(Buffer.concat(output).toString(), 'abc'))); diff --git a/test/parallel/test-zlib-truncated.js b/test/parallel/test-zlib-truncated.js index 94bc0e21cb7a5f..c489388a674e52 100644 --- a/test/parallel/test-zlib-truncated.js +++ b/test/parallel/test-zlib-truncated.js @@ -1,7 +1,7 @@ 'use strict'; // Tests zlib streams with truncated compressed input -require('../common'); +const common = require('../common'); const assert = require('assert'); const zlib = require('zlib'); @@ -23,8 +23,7 @@ const errMessage = /unexpected end of file/; { comp: 'deflate', decomp: 'inflate', decompSync: 'inflateSync' }, { comp: 'deflateRaw', decomp: 'inflateRaw', decompSync: 'inflateRawSync' }, ].forEach(function(methods) { - zlib[methods.comp](inputString, function(err, compressed) { - assert.ifError(err); + zlib[methods.comp](inputString, common.mustSucceed((compressed) => { const truncated = compressed.slice(0, compressed.length / 2); const toUTF8 = (buffer) => buffer.toString('utf-8'); @@ -33,10 +32,9 @@ const errMessage = /unexpected end of file/; assert.strictEqual(toUTF8(decompressed), inputString); // async sanity - zlib[methods.decomp](compressed, function(err, result) { - assert.ifError(err); + zlib[methods.decomp](compressed, common.mustSucceed((result) => { assert.strictEqual(toUTF8(result), inputString); - }); + })); // Sync truncated input test assert.throws(function() { @@ -44,9 +42,9 @@ const errMessage = /unexpected end of file/; }, errMessage); // Async truncated input test - zlib[methods.decomp](truncated, function(err, result) { + zlib[methods.decomp](truncated, common.mustCall((err) => { assert.match(err.message, errMessage); - }); + })); const syncFlushOpt = { finishFlush: zlib.constants.Z_SYNC_FLUSH }; @@ -55,10 +53,9 @@ const errMessage = /unexpected end of file/; assert.strictEqual(result, inputString.slice(0, result.length)); // Async truncated input test, finishFlush = Z_SYNC_FLUSH - zlib[methods.decomp](truncated, syncFlushOpt, function(err, decompressed) { - assert.ifError(err); + zlib[methods.decomp](truncated, syncFlushOpt, common.mustSucceed((decompressed) => { const result = toUTF8(decompressed); assert.strictEqual(result, inputString.slice(0, result.length)); - }); - }); + })); + })); }); diff --git a/test/parallel/test-zlib-type-error.js b/test/parallel/test-zlib-type-error.js index 3432d75e346ef1..912b59fd9ca923 100644 --- a/test/parallel/test-zlib-type-error.js +++ b/test/parallel/test-zlib-type-error.js @@ -1,20 +1,9 @@ 'use strict'; require('../common'); -const assert = require('assert').strict; +const assert = require('assert'); const test = require('node:test'); const { DecompressionStream } = require('stream/web'); -async function expectTypeError(promise) { - let threw = false; - try { - await promise; - } catch (err) { - threw = true; - assert(err instanceof TypeError, `Expected TypeError, got ${err}`); - } - assert(threw, 'Expected promise to reject'); -} - test('DecompressStream deflat emits error on trailing data', async () => { const valid = new Uint8Array([120, 156, 75, 4, 0, 0, 98, 0, 98]); // deflate('a') const empty = new Uint8Array(1); @@ -22,10 +11,11 @@ test('DecompressStream deflat emits error on trailing data', async () => { const double = new Uint8Array([...valid, ...valid]); for (const chunk of [[invalid], [valid, empty], [valid, valid], [valid, double]]) { - await expectTypeError( + await assert.rejects( Array.fromAsync( new Blob([chunk]).stream().pipeThrough(new DecompressionStream('deflate')) - ) + ), + { name: 'TypeError' }, ); } }); @@ -37,10 +27,11 @@ test('DecompressStream gzip emits error on trailing data', async () => { const invalid = new Uint8Array([...valid, ...empty]); const double = new Uint8Array([...valid, ...valid]); for (const chunk of [[invalid], [valid, empty], [valid, valid], [double]]) { - await expectTypeError( + await assert.rejects( Array.fromAsync( new Blob([chunk]).stream().pipeThrough(new DecompressionStream('gzip')) - ) + ), + { name: 'TypeError' }, ); } }); diff --git a/test/parallel/test-zlib-unzip-one-byte-chunks.js b/test/parallel/test-zlib-unzip-one-byte-chunks.js index b379584a0438ec..8fb8bcd39a7a28 100644 --- a/test/parallel/test-zlib-unzip-one-byte-chunks.js +++ b/test/parallel/test-zlib-unzip-one-byte-chunks.js @@ -1,38 +1,30 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('node:assert'); const zlib = require('node:zlib'); -const { test } = require('node:test'); -test('zlib should unzip one byte chunks', async () => { - const { promise, resolve } = Promise.withResolvers(); - const data = Buffer.concat([ - zlib.gzipSync('abc'), - zlib.gzipSync('def'), - ]); +const data = Buffer.concat([ + zlib.gzipSync('abc'), + zlib.gzipSync('def'), +]); - const resultBuffers = []; +const resultBuffers = []; - const unzip = zlib.createUnzip() - .on('error', (err) => { - assert.ifError(err); - }) - .on('data', (data) => resultBuffers.push(data)) - .on('finish', () => { - const unzipped = Buffer.concat(resultBuffers).toString(); - assert.strictEqual(unzipped, 'abcdef', - `'${unzipped}' should match 'abcdef' after zipping ` + - 'and unzipping'); - resolve(); - }); +const unzip = zlib.createUnzip() + .on('error', common.mustNotCall()) + .on('data', (data) => resultBuffers.push(data)) + .on('finish', common.mustCall(() => { + const unzipped = Buffer.concat(resultBuffers).toString(); + assert.strictEqual(unzipped, 'abcdef', + `'${unzipped}' should match 'abcdef' after zipping ` + + 'and unzipping'); + })); - for (let i = 0; i < data.length; i++) { - // Write each single byte individually. - unzip.write(Buffer.from([data[i]])); - } +for (let i = 0; i < data.length; i++) { + // Write each single byte individually. + unzip.write(Buffer.from([data[i]])); +} - unzip.end(); - await promise; -}); +unzip.end(); diff --git a/test/parallel/test-zlib-write-after-close.js b/test/parallel/test-zlib-write-after-close.js index 2d5d4965b0fec4..6b2b1c8cd0172b 100644 --- a/test/parallel/test-zlib-write-after-close.js +++ b/test/parallel/test-zlib-write-after-close.js @@ -21,25 +21,17 @@ 'use strict'; -require('../common'); +const common = require('../common'); const zlib = require('node:zlib'); const assert = require('node:assert'); -const { test } = require('node:test'); -test('zlib should not allow writing after close', async (t) => { - const { promise, resolve } = Promise.withResolvers(); - const closeCallback = t.mock.fn(); - zlib.gzip('hello', function() { - const unzip = zlib.createGunzip(); - unzip.close(closeCallback); - unzip.write('asd', function(err) { - assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); - assert.strictEqual(err.name, 'Error'); - assert.strictEqual(err.message, 'Cannot call write after a stream was destroyed'); - resolve(); - }); - }); - await promise; - assert.strictEqual(closeCallback.mock.callCount(), 1); -}); +zlib.gzip('hello', common.mustCall(() => { + const unzip = zlib.createGunzip(); + unzip.close(common.mustCall()); + unzip.write('asd', common.mustCall((err) => { + assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); + assert.strictEqual(err.name, 'Error'); + assert.strictEqual(err.message, 'Cannot call write after a stream was destroyed'); + })); +})); diff --git a/test/parallel/test-zlib-write-after-flush.js b/test/parallel/test-zlib-write-after-flush.js index fbe7c9859ea9fe..9449ab46823b80 100644 --- a/test/parallel/test-zlib-write-after-flush.js +++ b/test/parallel/test-zlib-write-after-flush.js @@ -21,39 +21,33 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('node:assert'); const zlib = require('node:zlib'); -const { test } = require('node:test'); -test('zlib should accept writing after flush', async () => { - for (const [ createCompress, createDecompress ] of [ - [ zlib.createGzip, zlib.createGunzip ], - [ zlib.createBrotliCompress, zlib.createBrotliDecompress ], - [ zlib.createZstdCompress, zlib.createZstdDecompress ], - ]) { - const { promise, resolve, reject } = Promise.withResolvers(); - const gzip = createCompress(); - const gunz = createDecompress(); +for (const [ createCompress, createDecompress ] of [ + [ zlib.createGzip, zlib.createGunzip ], + [ zlib.createBrotliCompress, zlib.createBrotliDecompress ], + [ zlib.createZstdCompress, zlib.createZstdDecompress ], +]) { + const gzip = createCompress(); + const gunz = createDecompress(); - gzip.pipe(gunz); + gzip.pipe(gunz); - let output = ''; - const input = 'A line of data\n'; - gunz.setEncoding('utf8'); - gunz.on('error', reject); - gunz.on('data', (c) => output += c); - gunz.on('end', () => { - assert.strictEqual(output, input); - resolve(); - }); + let output = ''; + const input = 'A line of data\n'; + gunz.setEncoding('utf8'); + gunz.on('error', common.mustNotCall()); + gunz.on('data', (c) => output += c); + gunz.on('end', common.mustCall(() => { + assert.strictEqual(output, input); + })); - // Make sure that flush/write doesn't trigger an assert failure - gzip.flush(); - gzip.write(input); - gzip.end(); - gunz.read(0); - await promise; - } -}); + // Make sure that flush/write doesn't trigger an assert failure + gzip.flush(); + gzip.write(input); + gzip.end(); + gunz.read(0); +} diff --git a/test/parallel/test-zlib-zero-byte.js b/test/parallel/test-zlib-zero-byte.js index a6120d4b92ed29..c3e56bd180ec93 100644 --- a/test/parallel/test-zlib-zero-byte.js +++ b/test/parallel/test-zlib-zero-byte.js @@ -21,35 +21,29 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('node:assert'); const zlib = require('node:zlib'); -const { test } = require('node:test'); -test('zlib should properly handle zero byte input', async () => { - const compressors = [ - [zlib.Gzip, 20], - [zlib.BrotliCompress, 1], - [zlib.ZstdCompress, 9], - ]; +const compressors = [ + [zlib.Gzip, 20], + [zlib.BrotliCompress, 1], + [zlib.ZstdCompress, 9], +]; - for (const [Compressor, expected] of compressors) { - const { promise, resolve, reject } = Promise.withResolvers(); - const gz = new Compressor(); - const emptyBuffer = Buffer.alloc(0); - let received = 0; - gz.on('data', function(c) { - received += c.length; - }); - gz.on('error', reject); - gz.on('end', function() { - assert.strictEqual(received, expected, - `${received}, ${expected}, ${Compressor.name}`); - resolve(); - }); - gz.write(emptyBuffer); - gz.end(); - await promise; - } -}); +for (const [Compressor, expected] of compressors) { + const gz = new Compressor(); + const emptyBuffer = Buffer.alloc(0); + let received = 0; + gz.on('data', function(c) { + received += c.length; + }); + gz.on('error', common.mustNotCall()); + gz.on('end', common.mustCall(() => { + assert.strictEqual(received, expected, + `${received}, ${expected}, ${Compressor.name}`); + })); + gz.write(emptyBuffer); + gz.end(); +} diff --git a/test/parallel/test-zlib-zstd-kmaxlength-rangeerror.js b/test/parallel/test-zlib-zstd-kmaxlength-rangeerror.js index 58ad8ff2c98dea..4537f16370148a 100644 --- a/test/parallel/test-zlib-zstd-kmaxlength-rangeerror.js +++ b/test/parallel/test-zlib-zstd-kmaxlength-rangeerror.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); // This test ensures that zlib throws a RangeError if the final buffer needs to // be larger than kMaxLength and concatenation fails. @@ -19,9 +19,9 @@ buffer.kMaxLength = oldkMaxLength; const encoded = Buffer.from('KLUv/SCARQAAEGFhAQA7BVg=', 'base64'); // Async -zlib.zstdDecompress(encoded, function(err) { +zlib.zstdDecompress(encoded, common.mustCall((err) => { assert.ok(err instanceof RangeError); -}); +})); // Sync assert.throws(function() { diff --git a/test/sea/sea.status b/test/sea/sea.status new file mode 100644 index 00000000000000..56202f3564918b --- /dev/null +++ b/test/sea/sea.status @@ -0,0 +1,20 @@ +prefix sea + +# To mark a test as flaky, list the test name in the appropriate section +# below, without ".js", followed by ": PASS,FLAKY". Example: +# sample-test : PASS,FLAKY + +[true] # This section applies to all platforms + +[$system==macos && $arch==x64] +# https://github.com/nodejs/node/issues/59553 +test-single-executable-application*: SKIP + +[$system==linux && $arch==ppc64] +# https://github.com/nodejs/node/issues/59561 +test-single-executable-application*: SKIP + +[$system==win32] +# https://github.com/nodejs/node/issues/49630 +test-single-executable-application-snapshot: PASS, FLAKY +test-single-executable-application-snapshot-and-code-cache: PASS, FLAKY diff --git a/test/sequential/test-single-executable-application-asset-keys-empty.js b/test/sea/test-single-executable-application-asset-keys-empty.js similarity index 97% rename from test/sequential/test-single-executable-application-asset-keys-empty.js rename to test/sea/test-single-executable-application-asset-keys-empty.js index 77892699a95794..9168f2b27235be 100644 --- a/test/sequential/test-single-executable-application-asset-keys-empty.js +++ b/test/sea/test-single-executable-application-asset-keys-empty.js @@ -43,7 +43,7 @@ spawnSyncAndExitWithoutError( NODE_DEBUG_NATIVE: 'SEA', ...process.env, }, - cwd: tmpdir.path + cwd: tmpdir.path, }, {}); @@ -57,9 +57,9 @@ spawnSyncAndAssert( env: { ...process.env, NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { stdout: /Asset keys: \[\]/, - } + }, ); diff --git a/test/sequential/test-single-executable-application-asset-keys.js b/test/sea/test-single-executable-application-asset-keys.js similarity index 98% rename from test/sequential/test-single-executable-application-asset-keys.js rename to test/sea/test-single-executable-application-asset-keys.js index e210f61579b342..a2d1dce487e356 100644 --- a/test/sequential/test-single-executable-application-asset-keys.js +++ b/test/sea/test-single-executable-application-asset-keys.js @@ -52,7 +52,7 @@ spawnSyncAndExitWithoutError( NODE_DEBUG_NATIVE: 'SEA', ...process.env, }, - cwd: tmpdir.path + cwd: tmpdir.path, }, {}); @@ -66,9 +66,9 @@ spawnSyncAndAssert( env: { ...process.env, NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { stdout: /Asset keys: \["asset-1\.txt","asset-2\.txt","asset-3\.txt"\]/, - } + }, ); diff --git a/test/sequential/test-single-executable-application-assets-raw.js b/test/sea/test-single-executable-application-assets-raw.js similarity index 98% rename from test/sequential/test-single-executable-application-assets-raw.js rename to test/sea/test-single-executable-application-assets-raw.js index a537f4c7d4f5aa..ff0fb3ecacddb3 100644 --- a/test/sequential/test-single-executable-application-assets-raw.js +++ b/test/sea/test-single-executable-application-assets-raw.js @@ -50,7 +50,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se NODE_DEBUG_NATIVE: 'SEA', ...process.env, }, - cwd: tmpdir.path + cwd: tmpdir.path, }); assert(existsSync(seaPrepBlob)); @@ -64,7 +64,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se ...process.env, NODE_DEBUG_NATIVE: 'SEA', __TEST_PERSON_JPG: fixtures.path('person.jpg'), - } + }, }, ); } diff --git a/test/sequential/test-single-executable-application-assets.js b/test/sea/test-single-executable-application-assets.js similarity index 96% rename from test/sequential/test-single-executable-application-assets.js rename to test/sea/test-single-executable-application-assets.js index 5d2df60e9fdaf9..dd285021cd714b 100644 --- a/test/sequential/test-single-executable-application-assets.js +++ b/test/sea/test-single-executable-application-assets.js @@ -45,12 +45,12 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path + cwd: tmpdir.path, }, { status: 1, signal: null, - stderr: /"assets" field of sea-config\.json is not a map of strings/ + stderr: /"assets" field of sea-config\.json is not a map of strings/, }); } @@ -71,12 +71,12 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path + cwd: tmpdir.path, }, { status: 1, signal: null, - stderr: /Cannot read asset nonexistent\.txt: no such file or directory/ + stderr: /Cannot read asset nonexistent\.txt: no such file or directory/, }); } @@ -104,7 +104,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se NODE_DEBUG_NATIVE: 'SEA', ...process.env, }, - cwd: tmpdir.path + cwd: tmpdir.path, }); assert(existsSync(seaPrepBlob)); @@ -119,11 +119,11 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se NODE_DEBUG_NATIVE: 'SEA', __TEST_PERSON_JPG: fixtures.path('person.jpg'), __TEST_UTF8_TEXT_PATH: fixtures.path('utf8_test_text.txt'), - } + }, }, { trim: true, stdout: fixtures.utf8TestText, - } + }, ); } diff --git a/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js b/test/sea/test-single-executable-application-disable-experimental-sea-warning.js similarity index 97% rename from test/sequential/test-single-executable-application-disable-experimental-sea-warning.js rename to test/sea/test-single-executable-application-disable-experimental-sea-warning.js index 3f7c54b77360bc..b85a2f2e09f05e 100644 --- a/test/sequential/test-single-executable-application-disable-experimental-sea-warning.js +++ b/test/sea/test-single-executable-application-disable-experimental-sea-warning.js @@ -60,8 +60,8 @@ spawnSyncAndAssert( COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }, { - stdout: 'Hello, world! 😊\n' + stdout: 'Hello, world! 😊\n', }); diff --git a/test/sequential/test-single-executable-application-empty.js b/test/sea/test-single-executable-application-empty.js similarity index 99% rename from test/sequential/test-single-executable-application-empty.js rename to test/sea/test-single-executable-application-empty.js index f90e52f0c704c5..6bffc94dbefeb1 100644 --- a/test/sequential/test-single-executable-application-empty.js +++ b/test/sea/test-single-executable-application-empty.js @@ -59,5 +59,5 @@ spawnSyncAndExitWithoutError( env: { NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }); diff --git a/test/sequential/test-single-executable-application-exec-argv-empty.js b/test/sea/test-single-executable-application-exec-argv-empty.js similarity index 96% rename from test/sequential/test-single-executable-application-exec-argv-empty.js rename to test/sea/test-single-executable-application-exec-argv-empty.js index 953d0d0e9f871b..acae5e8eb50b37 100644 --- a/test/sequential/test-single-executable-application-exec-argv-empty.js +++ b/test/sea/test-single-executable-application-exec-argv-empty.js @@ -54,8 +54,8 @@ spawnSyncAndAssert( COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }, { - stdout: /empty execArgv test passed/ + stdout: /empty execArgv test passed/, }); diff --git a/test/sequential/test-single-executable-application-exec-argv-extension-cli.js b/test/sea/test-single-executable-application-exec-argv-extension-cli.js similarity index 96% rename from test/sequential/test-single-executable-application-exec-argv-extension-cli.js rename to test/sea/test-single-executable-application-exec-argv-extension-cli.js index 81ff05d53ce7a4..fcd8602fc763f4 100644 --- a/test/sequential/test-single-executable-application-exec-argv-extension-cli.js +++ b/test/sea/test-single-executable-application-exec-argv-extension-cli.js @@ -56,8 +56,8 @@ spawnSyncAndAssert( NODE_OPTIONS: '--max-old-space-size=2048', // Should be ignored COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { - stdout: /execArgvExtension cli test passed/ + stdout: /execArgvExtension cli test passed/, }); diff --git a/test/sequential/test-single-executable-application-exec-argv-extension-env.js b/test/sea/test-single-executable-application-exec-argv-extension-env.js similarity index 98% rename from test/sequential/test-single-executable-application-exec-argv-extension-env.js rename to test/sea/test-single-executable-application-exec-argv-extension-env.js index 25d07bdc468f9a..1bacba1fb0a34c 100644 --- a/test/sequential/test-single-executable-application-exec-argv-extension-env.js +++ b/test/sea/test-single-executable-application-exec-argv-extension-env.js @@ -56,7 +56,7 @@ spawnSyncAndAssert( NODE_OPTIONS: '--max-old-space-size=512', COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { stdout: /execArgvExtension env test passed/, @@ -64,5 +64,5 @@ spawnSyncAndAssert( assert.doesNotMatch(output, /This warning should not be shown in the output/); return true; }, - trim: true + trim: true, }); diff --git a/test/sequential/test-single-executable-application-exec-argv-extension-none.js b/test/sea/test-single-executable-application-exec-argv-extension-none.js similarity index 96% rename from test/sequential/test-single-executable-application-exec-argv-extension-none.js rename to test/sea/test-single-executable-application-exec-argv-extension-none.js index 272016f006f3f7..c4036bc503382c 100644 --- a/test/sequential/test-single-executable-application-exec-argv-extension-none.js +++ b/test/sea/test-single-executable-application-exec-argv-extension-none.js @@ -56,8 +56,8 @@ spawnSyncAndAssert( NODE_OPTIONS: '--max-old-space-size=2048', COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { - stdout: /execArgvExtension none test passed/ + stdout: /execArgvExtension none test passed/, }); diff --git a/test/sequential/test-single-executable-application-exec-argv.js b/test/sea/test-single-executable-application-exec-argv.js similarity index 99% rename from test/sequential/test-single-executable-application-exec-argv.js rename to test/sea/test-single-executable-application-exec-argv.js index f24934a0fffc6f..a60dbe1cab5eaf 100644 --- a/test/sequential/test-single-executable-application-exec-argv.js +++ b/test/sea/test-single-executable-application-exec-argv.js @@ -55,7 +55,7 @@ spawnSyncAndAssert( NODE_NO_WARNINGS: '0', COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', - } + }, }, { stdout: /multiple execArgv test passed/, diff --git a/test/sequential/test-single-executable-application-inspect-in-sea-flags.js b/test/sea/test-single-executable-application-inspect-in-sea-flags.js similarity index 98% rename from test/sequential/test-single-executable-application-inspect-in-sea-flags.js rename to test/sea/test-single-executable-application-inspect-in-sea-flags.js index 32a0ad34848e80..66faed4812dba2 100644 --- a/test/sequential/test-single-executable-application-inspect-in-sea-flags.js +++ b/test/sea/test-single-executable-application-inspect-in-sea-flags.js @@ -38,7 +38,7 @@ writeFileSync(configFile, ` spawnSyncAndExitWithoutError( process.execPath, ['--experimental-sea-config', 'sea-config.json'], - { cwd: tmpdir.path } + { cwd: tmpdir.path }, ); assert(existsSync(seaPrepBlob)); @@ -65,5 +65,5 @@ spawnSyncAndAssert( return true; }, trim: true, - } + }, ); diff --git a/test/sequential/test-single-executable-application-inspect.js b/test/sea/test-single-executable-application-inspect.js similarity index 92% rename from test/sequential/test-single-executable-application-inspect.js rename to test/sea/test-single-executable-application-inspect.js index 009621ddf78b4d..bd885bd91e17f8 100644 --- a/test/sequential/test-single-executable-application-inspect.js +++ b/test/sea/test-single-executable-application-inspect.js @@ -3,7 +3,7 @@ // This tests the creation of a single executable application that can be // debugged using the inspector protocol with NODE_OPTIONS=--inspect-brk=0 -require('../common'); +const common = require('../common'); const assert = require('assert'); const { writeFileSync, existsSync } = require('fs'); const { spawn } = require('child_process'); @@ -38,7 +38,7 @@ writeFileSync(configFile, ` spawnSyncAndExitWithoutError( process.execPath, ['--experimental-sea-config', 'sea-config.json'], - { cwd: tmpdir.path } + { cwd: tmpdir.path }, ); assert(existsSync(seaPrepBlob)); @@ -64,7 +64,7 @@ seaProcess.stdout.on('data', (data) => { console.log(`[SEA][STDOUT] ${data}`); }); -seaProcess.stderr.on('data', (data) => { +seaProcess.stderr.on('data', common.mustCallAtLeast((data) => { console.log(`[SEA][STDERR] ${data}`); seaStderr += data; @@ -103,19 +103,19 @@ seaProcess.stderr.on('data', (data) => { console.log(`[INSPECT][STDERR] ${data}`); }); - inspectorProcess.on('close', (code) => { + inspectorProcess.on('close', common.mustCall((code) => { assert.strictEqual(code, 0, `Inspector process exited with code ${code}.`); - }); + })); inspectorProcess.on('error', (err) => { throw err; }); } -}); +})); -seaProcess.on('close', (code) => { +seaProcess.on('close', common.mustCall((code) => { assert.strictEqual(code, 0, `SEA process exited with code ${code}.`); -}); +})); seaProcess.on('error', (err) => { throw err; diff --git a/test/sequential/test-single-executable-application-snapshot-and-code-cache.js b/test/sea/test-single-executable-application-snapshot-and-code-cache.js similarity index 98% rename from test/sequential/test-single-executable-application-snapshot-and-code-cache.js rename to test/sea/test-single-executable-application-snapshot-and-code-cache.js index 6277381b3bde1a..24e10a1c12d6be 100644 --- a/test/sequential/test-single-executable-application-snapshot-and-code-cache.js +++ b/test/sea/test-single-executable-application-snapshot-and-code-cache.js @@ -56,8 +56,8 @@ const outputFile = join(tmpdir.path, process.platform === 'win32' ? 'sea.exe' : }, }, { - stderr: /"useCodeCache" is redundant when "useSnapshot" is true/ - } + stderr: /"useCodeCache" is redundant when "useSnapshot" is true/, + }, ); assert(existsSync(seaPrepBlob)); @@ -70,7 +70,7 @@ const outputFile = join(tmpdir.path, process.platform === 'win32' ? 'sea.exe' : env: { NODE_DEBUG_NATIVE: 'SEA,MKSNAPSHOT', ...process.env, - } + }, }, { stdout: 'Hello from snapshot', trim: true, diff --git a/test/sequential/test-single-executable-application-snapshot-worker.js b/test/sea/test-single-executable-application-snapshot-worker.js similarity index 97% rename from test/sequential/test-single-executable-application-snapshot-worker.js rename to test/sea/test-single-executable-application-snapshot-worker.js index 50c77743573a44..75ae6a27098798 100644 --- a/test/sequential/test-single-executable-application-snapshot-worker.js +++ b/test/sea/test-single-executable-application-snapshot-worker.js @@ -70,11 +70,11 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se env: { NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }, { trim: true, - stdout: 'Hello from Worker' - } + stdout: 'Hello from Worker', + }, ); } diff --git a/test/sequential/test-single-executable-application-snapshot.js b/test/sea/test-single-executable-application-snapshot.js similarity index 95% rename from test/sequential/test-single-executable-application-snapshot.js rename to test/sea/test-single-executable-application-snapshot.js index 552c86a0a1d9dd..15adcdb9b814bf 100644 --- a/test/sequential/test-single-executable-application-snapshot.js +++ b/test/sea/test-single-executable-application-snapshot.js @@ -39,12 +39,12 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se process.execPath, ['--experimental-sea-config', 'sea-config.json'], { - cwd: tmpdir.path + cwd: tmpdir.path, }, { status: 1, signal: null, - stderr: /snapshot\.js does not invoke v8\.startupSnapshot\.setDeserializeMainFunction\(\)/ + stderr: /snapshot\.js does not invoke v8\.startupSnapshot\.setDeserializeMainFunction\(\)/, }); } @@ -80,7 +80,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se }, }, { - stderr: /Single executable application is an experimental feature/ + stderr: /Single executable application is an experimental feature/, }); assert(existsSync(seaPrepBlob)); @@ -93,7 +93,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se env: { NODE_DEBUG_NATIVE: 'SEA,MKSNAPSHOT', ...process.env, - } + }, }, { trim: true, @@ -102,7 +102,7 @@ const outputFile = tmpdir.resolve(process.platform === 'win32' ? 'sea.exe' : 'se assert.doesNotMatch( output, /Single executable application is an experimental feature/); - } - } + }, + }, ); } diff --git a/test/sequential/test-single-executable-application-use-code-cache.js b/test/sea/test-single-executable-application-use-code-cache.js similarity index 97% rename from test/sequential/test-single-executable-application-use-code-cache.js rename to test/sea/test-single-executable-application-use-code-cache.js index 6d1575ecc6fac5..a66930f610ea1f 100644 --- a/test/sequential/test-single-executable-application-use-code-cache.js +++ b/test/sea/test-single-executable-application-use-code-cache.js @@ -66,8 +66,8 @@ spawnSyncAndAssert( COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }, { - stdout: 'Hello, world! 😊\n' + stdout: 'Hello, world! 😊\n', }); diff --git a/test/sequential/test-single-executable-application.js b/test/sea/test-single-executable-application.js similarity index 97% rename from test/sequential/test-single-executable-application.js rename to test/sea/test-single-executable-application.js index 2f8c346b95702e..036589c1cb269a 100644 --- a/test/sequential/test-single-executable-application.js +++ b/test/sea/test-single-executable-application.js @@ -59,8 +59,8 @@ spawnSyncAndAssert( COMMON_DIRECTORY: join(__dirname, '..', 'common'), NODE_DEBUG_NATIVE: 'SEA', ...process.env, - } + }, }, { - stdout: 'Hello, world! 😊\n' + stdout: 'Hello, world! 😊\n', }); diff --git a/test/parallel/test-single-executable-blob-config-errors.js b/test/sea/test-single-executable-blob-config-errors.js similarity index 90% rename from test/parallel/test-single-executable-blob-config-errors.js rename to test/sea/test-single-executable-blob-config-errors.js index a30850010e2e4d..322f430aad81d6 100644 --- a/test/parallel/test-single-executable-blob-config-errors.js +++ b/test/sea/test-single-executable-blob-config-errors.js @@ -16,7 +16,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot read single executable configuration from non-existent-relative\.json/ + stderr: /Cannot read single executable configuration from non-existent-relative\.json/, }); } @@ -29,7 +29,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot read single executable configuration from .*non-existent-absolute\.json/ + stderr: /Cannot read single executable configuration from .*non-existent-absolute\.json/, }); } @@ -43,7 +43,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /INCOMPLETE_ARRAY_OR_OBJECT/ + stderr: /INCOMPLETE_ARRAY_OR_OBJECT/, }); } @@ -57,7 +57,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /"main" field of .*empty\.json is not a non-empty string/ + stderr: /"main" field of .*empty\.json is not a non-empty string/, }); } @@ -71,7 +71,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /"main" field of .*no-main\.json is not a non-empty string/ + stderr: /"main" field of .*no-main\.json is not a non-empty string/, }); } @@ -85,7 +85,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /"output" field of .*no-output\.json is not a non-empty string/ + stderr: /"output" field of .*no-output\.json is not a non-empty string/, }); } @@ -105,7 +105,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /"disableExperimentalSEAWarning" field of .*invalid-disableExperimentalSEAWarning\.json is not a Boolean/ + stderr: /"disableExperimentalSEAWarning" field of .*invalid-disableExperimentalSEAWarning\.json is not a Boolean/, }); } @@ -119,7 +119,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot read main script .*bundle\.js/ + stderr: /Cannot read main script .*bundle\.js/, }); } @@ -129,7 +129,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); const main = tmpdir.resolve('bundle.js'); const configJson = JSON.stringify({ main, - output: 'sea.blob' + output: 'sea.blob', }); writeFileSync(config, configJson, 'utf8'); spawnSyncAndAssert( @@ -138,7 +138,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot read main script .*bundle\.js/ + stderr: /Cannot read main script .*bundle\.js/, }); } @@ -160,7 +160,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot write output to .*output-dir/ + stderr: /Cannot write output to .*output-dir/, }); } @@ -173,7 +173,7 @@ const { spawnSyncAndAssert } = require('../common/child_process'); writeFileSync(main, 'console.log("hello")', 'utf-8'); const configJson = JSON.stringify({ main, - output: 'output-dir' + output: 'output-dir', }); writeFileSync(config, configJson, 'utf8'); spawnSyncAndAssert( @@ -182,6 +182,6 @@ const { spawnSyncAndAssert } = require('../common/child_process'); cwd: tmpdir.path, }, { status: 1, - stderr: /Cannot write output to output-dir/ + stderr: /Cannot write output to output-dir/, }); } diff --git a/test/parallel/test-single-executable-blob-config.js b/test/sea/test-single-executable-blob-config.js similarity index 99% rename from test/parallel/test-single-executable-blob-config.js rename to test/sea/test-single-executable-blob-config.js index 4d56bc35066715..f3a148ae5a5559 100644 --- a/test/parallel/test-single-executable-blob-config.js +++ b/test/sea/test-single-executable-blob-config.js @@ -35,7 +35,7 @@ const assert = require('assert'); writeFileSync(main, 'console.log("hello")', 'utf-8'); const configJson = JSON.stringify({ main: 'bundle.js', - output: 'output.blob' + output: 'output.blob', }); writeFileSync(config, configJson, 'utf8'); const child = spawnSync( diff --git a/test/sea/testcfg.py b/test/sea/testcfg.py new file mode 100644 index 00000000000000..3eb661072bc011 --- /dev/null +++ b/test/sea/testcfg.py @@ -0,0 +1,20 @@ +import sys, os, multiprocessing, shutil +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +import testpy + +def GetConfiguration(context, root): + # We don't use arch-specific out folder in Node.js; use none/none to auto + # detect release mode from GetVm and get the path to the executable. + vm = context.GetVm('none', 'none') + if not os.path.isfile(vm): + return testpy.SimpleTestConfiguration(context, root, 'sea') + + # Get the size of the executable to decide whether we can run tests in parallel. + executable_size = os.path.getsize(vm) + num_cpus = multiprocessing.cpu_count() + remaining_disk_space = shutil.disk_usage('.').free + # Give it a bit of leeway by multiplying by 3. + if (executable_size * num_cpus * 3 > remaining_disk_space): + return testpy.SimpleTestConfiguration(context, root, 'sea') + + return testpy.ParallelTestConfiguration(context, root, 'sea') diff --git a/test/sequential/sequential.status b/test/sequential/sequential.status index c36eac6302d43a..627e61911d15ca 100644 --- a/test/sequential/sequential.status +++ b/test/sequential/sequential.status @@ -14,9 +14,6 @@ test-watch-mode-inspect: PASS, FLAKY test-http2-large-file: PASS, FLAKY [$system==win32] -# https://github.com/nodejs/node/issues/49630 -test-single-executable-application-snapshot: PASS, FLAKY -test-single-executable-application-snapshot-and-code-cache: PASS, FLAKY # https://github.com/nodejs/node/issues/47409 test-http2-large-file: PASS, FLAKY @@ -26,27 +23,6 @@ test-http-server-request-timeouts-mixed: PASS, FLAKY [$system==macos] -[$system==macos && $arch==x64] -# https://github.com/nodejs/node/issues/59553 -test-single-executable-application: PASS, FLAKY -test-single-executable-application-assets: PASS, FLAKY -test-single-executable-application-assets-raw: PASS, FLAKY -test-single-executable-application-asset-keys-empty: PASS, FLAKY -test-single-executable-application-asset-keys: PASS, FLAKY -test-single-executable-application-disable-experimental-sea-warning: PASS, FLAKY -test-single-executable-application-empty: PASS, FLAKY -test-single-executable-application-exec-argv: PASS, FLAKY -test-single-executable-application-exec-argv-empty: PASS, FLAKY -test-single-executable-application-exec-argv-extension-cli: PASS, FLAKY -test-single-executable-application-exec-argv-extension-env: PASS, FLAKY -test-single-executable-application-exec-argv-extension-none: PASS, FLAKY -test-single-executable-application-inspect-in-sea-flags: PASS, FLAKY -test-single-executable-application-inspect: PASS, FLAKY -test-single-executable-application-snapshot: PASS, FLAKY -test-single-executable-application-snapshot-and-code-cache: PASS, FLAKY -test-single-executable-application-snapshot-worker: PASS, FLAKY -test-single-executable-application-use-code-cache: PASS, FLAKY - # https://github.com/nodejs/node/issues/43465 test-http-server-request-timeouts-mixed: PASS, FLAKY @@ -70,24 +46,3 @@ test-tls-psk-client: PASS, FLAKY [$arch==arm] # https://github.com/nodejs/node/issues/49933 test-watch-mode-inspect: SKIP - -[$system==linux && $arch==ppc64] -# https://github.com/nodejs/node/issues/59561 -test-single-executable-application: SKIP -test-single-executable-application-assets: SKIP -test-single-executable-application-assets-raw: SKIP -test-single-executable-application-asset-keys-empty: SKIP -test-single-executable-application-asset-keys: SKIP -test-single-executable-application-disable-experimental-sea-warning: SKIP -test-single-executable-application-empty: SKIP -test-single-executable-application-exec-argv: SKIP -test-single-executable-application-exec-argv-empty: SKIP -test-single-executable-application-exec-argv-extension-cli: SKIP -test-single-executable-application-exec-argv-extension-env: SKIP -test-single-executable-application-exec-argv-extension-none: SKIP -test-single-executable-application-inspect-in-sea-flags: SKIP -test-single-executable-application-inspect: SKIP -test-single-executable-application-snapshot: SKIP -test-single-executable-application-snapshot-and-code-cache: SKIP -test-single-executable-application-snapshot-worker: SKIP -test-single-executable-application-use-code-cache: SKIP diff --git a/test/sequential/test-child-process-execsync.js b/test/sequential/test-child-process-execsync.js index 53ee42b21490dd..ed7f78d421112f 100644 --- a/test/sequential/test-child-process-execsync.js +++ b/test/sequential/test-child-process-execsync.js @@ -147,9 +147,9 @@ const args = [ assert.strictEqual(typeof err.pid, 'number'); spawnSyncKeys .filter((key) => key !== 'pid') - .forEach((key) => { + .forEach(common.mustCallAtLeast((key) => { assert.deepStrictEqual(err[key], spawnSyncResult[key]); - }); + })); return true; }); } diff --git a/test/sequential/test-child-process-pass-fd.js b/test/sequential/test-child-process-pass-fd.js index 0a77aca0f4c846..9b62c3edb30034 100644 --- a/test/sequential/test-child-process-pass-fd.js +++ b/test/sequential/test-child-process-pass-fd.js @@ -21,7 +21,7 @@ const N = 80; let messageCallbackCount = 0; function forkWorker() { - const messageCallback = (msg, handle) => { + const messageCallback = common.mustCall((msg, handle) => { messageCallbackCount++; assert.strictEqual(msg, 'handle'); assert.ok(handle); @@ -32,11 +32,11 @@ function forkWorker() { recvData += data; })); - handle.on('end', () => { + handle.on('end', common.mustCall(() => { assert.strictEqual(recvData, 'hello'); worker.kill(); - }); - }; + })); + }); const worker = fork(__filename, ['child']); worker.on('error', (err) => { @@ -70,13 +70,13 @@ if (process.argv[2] !== 'child') { // thus no work to do, and will exit immediately, preventing process leaks. process.on('message', common.mustCall()); - const server = net.createServer((c) => { - process.once('message', (msg) => { + const server = net.createServer(common.mustCall((c) => { + process.once('message', common.mustCall((msg) => { assert.strictEqual(msg, 'got'); c.end('hello'); - }); + })); socketConnected(); - }).unref(); + })).unref(); server.listen(0, common.localhostIPv4, () => { const { port } = server.address(); socket = net.connect(port, common.localhostIPv4, socketConnected).unref(); diff --git a/test/sequential/test-cluster-send-handle-large-payload.js b/test/sequential/test-cluster-send-handle-large-payload.js index c5226ceb40688a..81e4f797817f56 100644 --- a/test/sequential/test-cluster-send-handle-large-payload.js +++ b/test/sequential/test-cluster-send-handle-large-payload.js @@ -23,10 +23,9 @@ if (cluster.isPrimary) { server.listen(0, common.mustCall(() => { const port = server.address().port; const socket = new net.Socket(); - socket.connect(port, (err) => { - assert.ifError(err); + socket.connect(port, common.mustSucceed(() => { worker.send({ payload }, socket); - }); + })); })); } else { process.on('message', common.mustCall(({ payload: received }, handle) => { diff --git a/test/sequential/test-crypto-timing-safe-equal-fast.js b/test/sequential/test-crypto-timing-safe-equal-fast.js new file mode 100644 index 00000000000000..0774eeae561fbb --- /dev/null +++ b/test/sequential/test-crypto-timing-safe-equal-fast.js @@ -0,0 +1,40 @@ +// Test v8 fast path for crypto.timingSafeEqual works correctly. +// Flags: --expose-internals --allow-natives-syntax +'use strict'; + +const common = require('../common'); + +if (!common.hasCrypto) + common.skip('missing crypto'); + +const assert = require('assert'); +const crypto = require('crypto'); + +// V8 Fast API +const foo = Buffer.from('foo'); +const bar = Buffer.from('bar'); +const longer = Buffer.from('longer'); +function testFastPath(buf1, buf2) { + return crypto.timingSafeEqual(buf1, buf2); +} +eval('%PrepareFunctionForOptimization(testFastPath)'); +assert.strictEqual(testFastPath(foo, bar), false); +eval('%OptimizeFunctionOnNextCall(testFastPath)'); +assert.strictEqual(testFastPath(foo, bar), false); +assert.strictEqual(testFastPath(foo, foo), true); +assert.throws(() => testFastPath(foo, longer), { + code: 'ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH', +}); +assert.throws(() => testFastPath(foo, ''), { + code: 'ERR_INVALID_ARG_TYPE', +}); +assert.throws(() => testFastPath('', ''), { + code: 'ERR_INVALID_ARG_TYPE', +}); + +if (common.isDebug) { + const { internalBinding } = require('internal/test/binding'); + const { getV8FastApiCallCount } = internalBinding('debug'); + assert.strictEqual(getV8FastApiCallCount('crypto.timingSafeEqual.ok'), 2); + assert.strictEqual(getV8FastApiCallCount('crypto.timingSafeEqual.error'), 3); +} diff --git a/test/sequential/test-crypto-timing-safe-equal.js b/test/sequential/test-crypto-timing-safe-equal.js index 80b3a69e59cb2d..74ae39fbafcd0c 100644 --- a/test/sequential/test-crypto-timing-safe-equal.js +++ b/test/sequential/test-crypto-timing-safe-equal.js @@ -1,4 +1,4 @@ -// Flags: --expose-internals --no-warnings --allow-natives-syntax +// Flags: --no-warnings 'use strict'; const common = require('../common'); if (!common.hasCrypto) @@ -92,28 +92,3 @@ assert.throws( name: 'TypeError', } ); - -{ - // V8 Fast API - const foo = Buffer.from('foo'); - const bar = Buffer.from('bar'); - const longer = Buffer.from('longer'); - function testFastPath(buf1, buf2) { - return crypto.timingSafeEqual(buf1, buf2); - } - eval('%PrepareFunctionForOptimization(testFastPath)'); - assert.strictEqual(testFastPath(foo, bar), false); - eval('%OptimizeFunctionOnNextCall(testFastPath)'); - assert.strictEqual(testFastPath(foo, bar), false); - assert.strictEqual(testFastPath(foo, foo), true); - assert.throws(() => testFastPath(foo, longer), { - code: 'ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH', - }); - - if (common.isDebug) { - const { internalBinding } = require('internal/test/binding'); - const { getV8FastApiCallCount } = internalBinding('debug'); - assert.strictEqual(getV8FastApiCallCount('crypto.timingSafeEqual.ok'), 2); - assert.strictEqual(getV8FastApiCallCount('crypto.timingSafeEqual.error'), 1); - } -} diff --git a/test/sequential/test-debugger-pid.js b/test/sequential/test-debugger-pid.js index 972c8448bc7440..97218b796caebd 100644 --- a/test/sequential/test-debugger-pid.js +++ b/test/sequential/test-debugger-pid.js @@ -11,7 +11,7 @@ const { spawn } = require('child_process'); const script = fixtures.path('debugger', 'alive.js'); -const runTest = async () => { +(async () => { const target = spawn(process.execPath, [script]); const cli = startCLI(['-p', `${target.pid}`], [], {}, { randomPort: false }); @@ -24,12 +24,8 @@ const runTest = async () => { cli.output, /> 3 {3}\+\+x;/, 'marks the 3rd line'); - } catch (error) { - assert.ifError(error); } finally { await cli.quit(); target.kill(); } -}; - -runTest().then(common.mustCall()); +})().then(common.mustCall()); diff --git a/test/sequential/test-deprecation-flags.js b/test/sequential/test-deprecation-flags.js index 30ac4a605ee8ce..0cbc0a6cded828 100644 --- a/test/sequential/test-deprecation-flags.js +++ b/test/sequential/test-deprecation-flags.js @@ -20,7 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; -require('../common'); +const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const execFile = require('child_process').execFile; @@ -40,49 +40,43 @@ const normal = [depmod]; const noDep = ['--no-deprecation', depmod]; const traceDep = ['--trace-deprecation', depmod]; -execFile(node, normal, function(er, stdout, stderr) { +execFile(node, normal, common.mustSucceed((stdout, stderr) => { console.error('normal: show deprecation warning'); - assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.match(stderr, /this function is deprecated/); console.log('normal ok'); -}); +})); -execFile(node, noDep, function(er, stdout, stderr) { +execFile(node, noDep, common.mustSucceed((stdout, stderr) => { console.error('--no-deprecation: silence deprecations'); - assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.strictEqual(stderr.trim(), 'This is deprecated'); console.log('silent ok'); -}); +})); -execFile(node, traceDep, function(er, stdout, stderr) { +execFile(node, traceDep, common.mustSucceed((stdout, stderr) => { console.error('--trace-deprecation: show stack'); - assert.strictEqual(er, null); assert.strictEqual(stdout, ''); const stack = stderr.trim().split('\n'); // Just check the top and bottom. assert.match(stack[1], /this function is deprecated/); assert.match(stack[0], /This is deprecated/); console.log('trace ok'); -}); +})); -execFile(node, [depUserlandFunction], function(er, stdout, stderr) { +execFile(node, [depUserlandFunction], common.mustSucceed((stdout, stderr) => { console.error('normal: testing deprecated userland function'); - assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.match(stderr, /deprecatedFunction is deprecated/); console.error('normal: ok'); -}); +})); -execFile(node, [depUserlandClass], function(er, stdout, stderr) { - assert.strictEqual(er, null); +execFile(node, [depUserlandClass], common.mustSucceed((stdout, stderr) => { assert.strictEqual(stdout, ''); assert.match(stderr, /deprecatedClass is deprecated/); -}); +})); -execFile(node, [depUserlandSubClass], function(er, stdout, stderr) { - assert.strictEqual(er, null); +execFile(node, [depUserlandSubClass], common.mustSucceed((stdout, stderr) => { assert.strictEqual(stdout, ''); assert.match(stderr, /deprecatedClass is deprecated/); -}); +})); diff --git a/test/sequential/test-dgram-pingpong.js b/test/sequential/test-dgram-pingpong.js index 33b01fbe22a9b9..87118ae85bf30c 100644 --- a/test/sequential/test-dgram-pingpong.js +++ b/test/sequential/test-dgram-pingpong.js @@ -14,17 +14,17 @@ function pingPongTest(port, host) { throw e; }); - server.on('listening', function() { + server.on('listening', common.mustCall(() => { console.log(`server listening on ${port}`); const client = dgram.createSocket('udp4'); - client.on('message', function(msg) { + client.on('message', common.mustCall((msg) => { assert.strictEqual(msg.toString('ascii'), 'PONG'); client.close(); server.close(); - }); + })); client.on('error', function(e) { throw e; @@ -37,7 +37,7 @@ function pingPongTest(port, host) { } clientSend(); - }); + })); server.bind(port, host); return server; } diff --git a/test/sequential/test-fs-readdir-recursive.js b/test/sequential/test-fs-readdir-recursive.js index 0b2da41969c56e..15bc75c6c928e1 100644 --- a/test/sequential/test-fs-readdir-recursive.js +++ b/test/sequential/test-fs-readdir-recursive.js @@ -134,11 +134,11 @@ function assertDirents(dirents) { assert.strictEqual(dirents.length, expected.length); dirents.sort((a, b) => (getDirentPath(a) < getDirentPath(b) ? -1 : 1)); assert.deepStrictEqual( - dirents.map((dirent) => { + dirents.map(common.mustCallAtLeast((dirent) => { assert(dirent instanceof fs.Dirent); assert.notStrictEqual(dirent.name, undefined); return getDirentPath(dirent); - }), + })), expected ); } diff --git a/test/sequential/test-heapdump-flag-custom-dir.js b/test/sequential/test-heapdump-flag-custom-dir.js index ea53cb660441d3..ece1f5b92b791d 100644 --- a/test/sequential/test-heapdump-flag-custom-dir.js +++ b/test/sequential/test-heapdump-flag-custom-dir.js @@ -7,7 +7,7 @@ if (common.isWindows) const assert = require('assert'); -const validateHeapSnapshotFile = () => { +if (process.argv[2] === 'child') { const fs = require('fs'); assert.strictEqual(process.listenerCount('SIGUSR2'), 1); @@ -31,10 +31,6 @@ const validateHeapSnapshotFile = () => { JSON.parse(fs.readFileSync(files[i])); } })(); -}; - -if (process.argv[2] === 'child') { - validateHeapSnapshotFile(); } else { // Modify the timezone. So we can check the file date string still returning correctly. process.env.TZ = 'America/New_York'; diff --git a/test/sequential/test-http-econnrefused.js b/test/sequential/test-http-econnrefused.js index 4d0f7a174e0f80..e326357a51f3d7 100644 --- a/test/sequential/test-http-econnrefused.js +++ b/test/sequential/test-http-econnrefused.js @@ -32,7 +32,7 @@ const common = require('../common'); const http = require('http'); const assert = require('assert'); -const server = http.createServer(function(req, res) { +const server = http.createServer(common.mustCallAtLeast((req, res) => { let body = ''; req.setEncoding('utf8'); @@ -40,12 +40,12 @@ const server = http.createServer(function(req, res) { body += chunk; }); - req.on('end', function() { + req.on('end', common.mustCall(() => { assert.strictEqual(body, 'PING'); res.writeHead(200, { 'Connection': 'close' }); res.end('PONG'); - }); -}); + })); +})); server.on('listening', pingping); @@ -109,7 +109,7 @@ function ping() { method: 'POST' }; - const req = http.request(opt, function(res) { + const req = http.request(opt, common.mustCallAtLeast((res) => { let body = ''; res.setEncoding('utf8'); @@ -117,20 +117,20 @@ function ping() { body += chunk; }); - res.on('end', function() { + res.on('end', common.mustCall(() => { assert.strictEqual(body, 'PONG'); assert.ok(!hadError); gotEnd = true; afterPing('success'); - }); - }); + })); + }, 0)); req.end('PING'); let gotEnd = false; let hadError = false; - req.on('error', function(error) { + req.on('error', common.mustCallAtLeast((error) => { console.log(`Error making ping req: ${error}`); hadError = true; assert.ok(!gotEnd); @@ -138,7 +138,7 @@ function ping() { // Family autoselection might be skipped if only a single address is returned by DNS. const actualError = Array.isArray(error.errors) ? error.errors[0] : error; afterPing(actualError.message); - }); + }, 0)); } diff --git a/test/sequential/test-http-keepalive-maxsockets.js b/test/sequential/test-http-keepalive-maxsockets.js index 9c98a140f6a134..a9775e88ad8972 100644 --- a/test/sequential/test-http-keepalive-maxsockets.js +++ b/test/sequential/test-http-keepalive-maxsockets.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 http = require('http'); @@ -33,7 +33,7 @@ const server = http.createServer(function(req, res) { } res.end(req.url); }); -server.listen(0, function() { +server.listen(0, common.mustCall(() => { const agent = http.Agent({ keepAlive: true, maxSockets: 5, @@ -41,16 +41,14 @@ server.listen(0, function() { }); let closed = false; - makeReqs(10, function(er) { - assert.ifError(er); + makeReqs(10, common.mustSucceed(() => { assert.strictEqual(count(agent.freeSockets), 2); assert.strictEqual(count(agent.sockets), 0); assert.strictEqual(serverSockets.length, 5); // Now make 10 more reqs. // should use the 2 free reqs from the pool first. - makeReqs(10, function(er) { - assert.ifError(er); + makeReqs(10, common.mustSucceed(() => { assert.strictEqual(count(agent.freeSockets), 2); assert.strictEqual(count(agent.sockets), 0); assert.strictEqual(serverSockets.length, 8); @@ -59,8 +57,8 @@ server.listen(0, function() { server.close(function() { closed = true; }); - }); - }); + })); + })); process.on('exit', function() { assert(closed); @@ -86,17 +84,17 @@ server.listen(0, function() { port: server.address().port, path: `/${i}`, agent: agent - }, function(res) { + }, common.mustCall((res) => { let data = ''; res.setEncoding('ascii'); res.on('data', function(c) { data += c; }); - res.on('end', function() { + res.on('end', common.mustCall(() => { assert.strictEqual(data, `/${i}`); cb(); - }); - }).end(); + })); + })).end(); } function count(sockets) { @@ -104,4 +102,4 @@ server.listen(0, function() { return n + sockets[name].length; }, 0); } -}); +})); diff --git a/test/sequential/test-http2-max-session-memory.js b/test/sequential/test-http2-max-session-memory.js index 9b77a45c3227fd..229bd7374458f9 100644 --- a/test/sequential/test-http2-max-session-memory.js +++ b/test/sequential/test-http2-max-session-memory.js @@ -27,7 +27,7 @@ server.listen(0, common.mustCall(() => { { const req = client.request(); - req.on('response', () => { + req.on('response', common.mustCall(() => { // This one should be rejected because the server is over budget // on the current memory allocation const req = client.request(); @@ -40,7 +40,7 @@ server.listen(0, common.mustCall(() => { server.close(); client.destroy(); })); - }); + })); req.resume(); req.on('close', common.mustCall()); diff --git a/test/sequential/test-http2-ping-flood.js b/test/sequential/test-http2-ping-flood.js index b414aca8a4703a..0f324c30d06cb5 100644 --- a/test/sequential/test-http2-ping-flood.js +++ b/test/sequential/test-http2-ping-flood.js @@ -21,11 +21,11 @@ let interval; server.on('stream', common.mustNotCall()); server.on('session', common.mustCall((session) => { - session.on('error', (e) => { + session.on('error', common.mustCallAtLeast((e) => { assert.strictEqual(e.code, 'ERR_HTTP2_ERROR'); assert(e.message.includes('Flooding was detected')); clearInterval(interval); - }); + }, 0)); session.on('close', common.mustCall(() => { server.close(); })); diff --git a/test/sequential/test-http2-settings-flood.js b/test/sequential/test-http2-settings-flood.js index 15b3696b9c298e..8d9efc4c1a6ac5 100644 --- a/test/sequential/test-http2-settings-flood.js +++ b/test/sequential/test-http2-settings-flood.js @@ -20,11 +20,11 @@ let interval; server.on('stream', common.mustNotCall()); server.on('session', common.mustCall((session) => { - session.on('error', (e) => { + session.on('error', common.mustCallAtLeast((e) => { assert.strictEqual(e.code, 'ERR_HTTP2_ERROR'); assert(e.message.includes('Flooding was detected')); clearInterval(interval); - }); + }, 0)); session.on('close', common.mustCall(() => { server.close(); diff --git a/test/sequential/test-http2-timeout-large-write-file.js b/test/sequential/test-http2-timeout-large-write-file.js index a35268b6127bae..15c7d9f0ae104a 100644 --- a/test/sequential/test-http2-timeout-large-write-file.js +++ b/test/sequential/test-http2-timeout-large-write-file.js @@ -47,9 +47,9 @@ server.on('stream', common.mustCall((stream) => { stream.end(); })); server.setTimeout(serverTimeout); -server.on('timeout', () => { +server.on('timeout', common.mustCallAtLeast(() => { assert.ok(!didReceiveData, 'Should not timeout'); -}); +}, 0)); server.listen(0, common.mustCall(() => { const client = http2.connect(`https://localhost:${server.address().port}`, diff --git a/test/sequential/test-http2-timeout-large-write.js b/test/sequential/test-http2-timeout-large-write.js index 73114776df0a0e..9f21042d88ca5b 100644 --- a/test/sequential/test-http2-timeout-large-write.js +++ b/test/sequential/test-http2-timeout-large-write.js @@ -28,6 +28,9 @@ const server = http2.createSecureServer({ key: fixtures.readKey('agent1-key.pem'), cert: fixtures.readKey('agent1-cert.pem') }); +const onTimeout = common.mustCallAtLeast(() => { + assert.ok(!didReceiveData, 'Should not timeout'); +}, 0); server.on('stream', common.mustCall((stream) => { const content = Buffer.alloc(writeSize, 0x44); @@ -39,15 +42,11 @@ server.on('stream', common.mustCall((stream) => { stream.write(content); stream.setTimeout(serverTimeout); - stream.on('timeout', () => { - assert.ok(!didReceiveData, 'Should not timeout'); - }); + stream.on('timeout', onTimeout); stream.end(); })); server.setTimeout(serverTimeout); -server.on('timeout', () => { - assert.ok(!didReceiveData, 'Should not timeout'); -}); +server.on('timeout', onTimeout); server.listen(0, common.mustCall(() => { const client = http2.connect(`https://localhost:${server.address().port}`, diff --git a/test/sequential/test-inspector-open-dispose.mjs b/test/sequential/test-inspector-open-dispose.mjs index d3add569c938c8..2e57354fbbed75 100644 --- a/test/sequential/test-inspector-open-dispose.mjs +++ b/test/sequential/test-inspector-open-dispose.mjs @@ -34,11 +34,11 @@ if (process.env.BE_CHILD) { function wasDisposedWhenOpenHandler(msg) { assert.strictEqual(msg.cmd, 'url'); assert.strictEqual(msg.url, undefined); - ping(firstPort, (err) => { + ping(firstPort, common.mustCall((err) => { assert(err, 'expected ping to inspector port to fail'); child.send({ cmd: 'dispose' }); child.once('message', common.mustCall(wasReDisposedHandler)); - }); + })); } function wasReDisposedHandler(msg) { diff --git a/test/sequential/test-module-loading.js b/test/sequential/test-module-loading.js index 1d30a2ba736eb8..b4f2d2633074f2 100644 --- a/test/sequential/test-module-loading.js +++ b/test/sequential/test-module-loading.js @@ -165,13 +165,13 @@ try { assert.strictEqual(path.dirname(__filename), __dirname); console.error('load custom file types with extensions'); -require.extensions['.test'] = function(module, filename) { +require.extensions['.test'] = common.mustCall(function(module, filename) { let content = fs.readFileSync(filename).toString(); assert.strictEqual(content, 'this is custom source\n'); content = content.replace('this is custom source', 'exports.test = \'passed\''); module._compile(content, filename); -}; +}); assert.strictEqual(require('../fixtures/registerExt').test, 'passed'); // Unknown extension, load as .js diff --git a/test/sequential/test-net-connect-econnrefused.js b/test/sequential/test-net-connect-econnrefused.js index c55a9ebe24cc55..67f5820221c5c8 100644 --- a/test/sequential/test-net-connect-econnrefused.js +++ b/test/sequential/test-net-connect-econnrefused.js @@ -40,7 +40,7 @@ const server = net.createServer().listen(0, common.mustCall(() => { function pummel() { let pending; for (pending = 0; pending < ATTEMPTS_PER_ROUND; pending++) { - net.createConnection({ port, autoSelectFamily: false }).on('error', function(error) { + net.createConnection({ port, autoSelectFamily: false }).on('error', common.mustCallAtLeast((error) => { // Family autoselection might be skipped if only a single address is returned by DNS. const actualError = Array.isArray(error.errors) ? error.errors[0] : error; @@ -50,7 +50,7 @@ function pummel() { if (rounds === ROUNDS) return check(); rounds++; pummel(); - }); + }, 0)); reqs++; } } diff --git a/test/sequential/test-net-localport.js b/test/sequential/test-net-localport.js index e90df73e524b51..4539acaaee4ccb 100644 --- a/test/sequential/test-net-localport.js +++ b/test/sequential/test-net-localport.js @@ -3,18 +3,18 @@ const common = require('../common'); const assert = require('assert'); const net = require('net'); -const server = net.createServer(function(socket) { +const server = net.createServer(common.mustCall((socket) => { assert.strictEqual(socket.remotePort, common.PORT); socket.end(); socket.on('close', function() { server.close(); }); -}).listen(0).on('listening', function() { +})).listen(0).on('listening', common.mustCall(function() { const client = net.connect({ host: '127.0.0.1', port: this.address().port, localPort: common.PORT, - }).on('connect', function() { + }).on('connect', common.mustCall(() => { assert.strictEqual(client.localPort, common.PORT); - }); -}); + })); +})); diff --git a/test/sequential/test-net-server-bind.js b/test/sequential/test-net-server-bind.js index 56216d0ed60619..f1f274a01d0965 100644 --- a/test/sequential/test-net-server-bind.js +++ b/test/sequential/test-net-server-bind.js @@ -20,7 +20,7 @@ const net = require('net'); server.listen(common.PORT); - setTimeout(function() { + setTimeout(common.mustCall(() => { const address = server.address(); assert.strictEqual(address.port, common.PORT); @@ -30,7 +30,7 @@ const net = require('net'); assert.strictEqual(server._connectionKey, `4:0.0.0.0:${address.port}`); server.close(); - }, 100); + }), 100); } // Callback to listen() diff --git a/test/sequential/test-perf-hooks.js b/test/sequential/test-perf-hooks.js index 847decdef18bfc..2db7353cf5fc93 100644 --- a/test/sequential/test-perf-hooks.js +++ b/test/sequential/test-perf-hooks.js @@ -28,15 +28,10 @@ const epsilon = 50; { const uptime1 = Date.now() - performance.timeOrigin; const uptime2 = performance.now(); - const uptime3 = process.uptime() * 1000; assert(Math.abs(uptime1 - uptime2) < epsilon, `Date.now() - performance.timeOrigin (${uptime1}) - ` + `performance.now() (${uptime2}) = ` + `${uptime1 - uptime2} >= +- ${epsilon}`); - assert(Math.abs(uptime1 - uptime3) < epsilon, - `Date.now() - performance.timeOrigin (${uptime1}) - ` + - `process.uptime() * 1000 (${uptime3}) = ` + - `${uptime1 - uptime3} >= +- ${epsilon}`); } assert.strictEqual(performance.nodeTiming.name, 'node'); @@ -58,8 +53,8 @@ function checkNodeTiming(timing) { // performance.now() i.e. measures Node.js instance up time. assert.strictEqual(typeof timing.duration, 'number'); assert(timing.duration > 0, `timing.duration ${timing.duration} <= 0`); - assert(delta < 10, - `now (${now}) - timing.duration (${timing.duration}) = ${delta} >= ${10}`); + assert(delta < epsilon, + `now (${now}) - timing.duration (${timing.duration}) = ${delta} >= ${epsilon}`); // Check that the following fields do not change. assert.strictEqual(timing.startTime, initialTiming.startTime); @@ -93,6 +88,18 @@ checkNodeTiming(initialTiming); assert(nodeStart < testStartTime, `nodeStart ${nodeStart} >= ${testStartTime}`); + { + // Due to https://github.com/nodejs/node/pull/46588, + // The difference between process.uptime() and (Date.now() - performance.timeOrigin) + // is roughly performance.nodeTiming.nodeStart + const uptime1 = Date.now() - performance.timeOrigin; // now - process start time + const uptime3 = process.uptime() * 1000; // now - node start time + assert(Math.abs(uptime1 - uptime3 - nodeStart) < epsilon, + `Date.now() - performance.timeOrigin (${uptime1}) - ` + + `process.uptime() * 1000 (${uptime3}) = ` + + `${uptime1 - uptime3} >= +- ${epsilon}`); + } + assert.strictEqual(typeof v8Start, 'number'); assert(v8Start > 0, `v8Start ${v8Start} <= 0`); // V8 starts after the process starts. diff --git a/test/sequential/test-pipe.js b/test/sequential/test-pipe.js index c3e0ddef9fe57d..4defd4628e37c9 100644 --- a/test/sequential/test-pipe.js +++ b/test/sequential/test-pipe.js @@ -57,9 +57,7 @@ const web = http.Server(common.mustCall((req, res) => { res.end(); })); - req.connection.on('error', (e) => { - assert.ifError(e); - }); + req.connection.on('error', common.mustNotCall()); })); web.listen(webPort, startClient); @@ -70,21 +68,19 @@ const tcp = net.Server(common.mustCall((s) => { let i = 0; - s.on('data', (d) => { + s.on('data', common.mustCallAtLeast((d) => { tcpLengthSeen += d.length; for (let j = 0; j < d.length; j++) { assert.strictEqual(d[j], buffer[i]); i++; } - }); + })); s.on('end', common.mustCall(() => { s.end(); })); - s.on('error', (e) => { - assert.ifError(e); - }); + s.on('error', common.mustNotCall()); })); tcp.listen(tcpPort, startClient); diff --git a/test/sequential/test-process-title.js b/test/sequential/test-process-title.js index 13a030decf887c..b4f4b025173f66 100644 --- a/test/sequential/test-process-title.js +++ b/test/sequential/test-process-title.js @@ -1,7 +1,7 @@ 'use strict'; const common = require('../common'); const { spawnSync } = require('child_process'); -const { strictEqual } = require('assert'); +const assert = require('assert'); // FIXME add sunos support if (common.isSunOS) @@ -19,4 +19,4 @@ if (common.isWindows) const xs = 'x'.repeat(1024); const proc = spawnSync(process.execPath, ['-p', 'process.title', xs]); -strictEqual(proc.stdout.toString().trim(), process.execPath); +assert.strictEqual(proc.stdout.toString().trim(), process.execPath); diff --git a/test/sequential/test-process-warnings.js b/test/sequential/test-process-warnings.js index f4457e137ec08c..eca6432fbe8b22 100644 --- a/test/sequential/test-process-warnings.js +++ b/test/sequential/test-process-warnings.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const execFile = require('child_process').execFile; @@ -13,24 +13,24 @@ const traceWarn = ['--trace-warnings', warnmod]; const warningMessage = /^\(.+\)\sWarning: a bad practice warning/; -execFile(node, normal, function(er, stdout, stderr) { +execFile(node, normal, common.mustCall((er, stdout, stderr) => { // Show Process Warnings assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.match(stderr, warningMessage); -}); +})); -execFile(node, noWarn, function(er, stdout, stderr) { +execFile(node, noWarn, common.mustCall((er, stdout, stderr) => { // Hide Process Warnings assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.doesNotMatch(stderr, warningMessage); -}); +})); -execFile(node, traceWarn, function(er, stdout, stderr) { +execFile(node, traceWarn, common.mustCall((er, stdout, stderr) => { // Show Warning Trace assert.strictEqual(er, null); assert.strictEqual(stdout, ''); assert.match(stderr, warningMessage); assert.match(stderr, /at Object\.\s\(.+warnings\.js:3:9\)/); -}); +})); diff --git a/test/sequential/test-repl-timeout-throw.js b/test/sequential/test-repl-timeout-throw.js index f788ab295ba9eb..d8f1df9564e49f 100644 --- a/test/sequential/test-repl-timeout-throw.js +++ b/test/sequential/test-repl-timeout-throw.js @@ -1,5 +1,5 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const spawn = require('child_process').spawn; @@ -51,9 +51,9 @@ child.stdout.once('data', function() { } }); -child.on('close', function(c) { +child.on('close', common.mustCall((c) => { assert.strictEqual(c, 0); // Make sure we got 3 throws, in the end. const lastLine = stdout.trim().split(/\r?\n/).pop(); assert.strictEqual(lastLine, '> 3'); -}); +})); diff --git a/test/sequential/test-stream2-fs.js b/test/sequential/test-stream2-fs.js index 3d06abc9214089..10414eaab33640 100644 --- a/test/sequential/test-stream2-fs.js +++ b/test/sequential/test-stream2-fs.js @@ -20,7 +20,7 @@ // USE OR OTHER DEALINGS IN THE SOFTWARE. 'use strict'; -require('../common'); +const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); @@ -58,13 +58,13 @@ class TestWriter extends Stream { const r = new FSReadable(file); const w = new TestWriter(); -w.on('results', function(res) { +w.on('results', common.mustCall((res) => { console.error(res, w.length); assert.strictEqual(w.length, size); assert.deepStrictEqual(res.map(function(c) { return c.length; }), expectLengths); console.log('ok'); -}); +})); r.pipe(w); diff --git a/test/sequential/test-stream2-stderr-sync.js b/test/sequential/test-stream2-stderr-sync.js index db0ed180edc51b..7704ba8fd2c241 100644 --- a/test/sequential/test-stream2-stderr-sync.js +++ b/test/sequential/test-stream2-stderr-sync.js @@ -22,7 +22,7 @@ 'use strict'; // Make sure that sync writes to stderr get processed before exiting. -require('../common'); +const common = require('../common'); function parent() { const spawn = require('child_process').spawn; @@ -36,12 +36,12 @@ function parent() { err += c; }); - child.on('close', function() { + child.on('close', common.mustCall(() => { assert.strictEqual(err, `child ${c}\nfoo\nbar\nbaz\n`); console.log(`ok ${++i} child #${c}`); if (i === children.length) console.log(`1..${i}`); - }); + })); }); } diff --git a/test/sequential/test-timers-block-eventloop.js b/test/sequential/test-timers-block-eventloop.js index 6118695c9235a2..25f96d6b37ac84 100644 --- a/test/sequential/test-timers-block-eventloop.js +++ b/test/sequential/test-timers-block-eventloop.js @@ -6,14 +6,14 @@ const assert = require('assert'); const { sleep } = require('internal/util'); let called = false; -const t1 = setInterval(() => { +const t1 = setInterval(common.mustCallAtLeast(() => { assert(!called); called = true; setImmediate(common.mustCall(() => { clearInterval(t1); clearInterval(t2); })); -}, 10); +}), 10); const t2 = setInterval(() => { sleep(20); diff --git a/test/sequential/test-timers-set-interval-excludes-callback-duration.js b/test/sequential/test-timers-set-interval-excludes-callback-duration.js index b32c7e7e3c2e9c..23127afc5967a5 100644 --- a/test/sequential/test-timers-set-interval-excludes-callback-duration.js +++ b/test/sequential/test-timers-set-interval-excludes-callback-duration.js @@ -1,23 +1,23 @@ // Flags: --expose-internals 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const { sleep } = require('internal/util'); let cntr = 0; let first; -const t = setInterval(() => { +const t = setInterval(common.mustCallAtLeast(() => { cntr++; if (cntr === 1) { sleep(100); // Ensure that the event loop passes before the second interval - setImmediate(() => assert.strictEqual(cntr, 1)); + setImmediate(common.mustCall(() => assert.strictEqual(cntr, 1))); first = Date.now(); } else if (cntr === 2) { assert(Date.now() - first < 100); clearInterval(t); } -}, 100); +}), 100); const t2 = setInterval(() => { if (cntr === 2) { clearInterval(t2); diff --git a/test/sequential/test-tls-psk-client.js b/test/sequential/test-tls-psk-client.js index c07b1f92d98376..c9a904e729b830 100644 --- a/test/sequential/test-tls-psk-client.js +++ b/test/sequential/test-tls-psk-client.js @@ -36,12 +36,12 @@ let serverOut = ''; server.stderr.on('data', (data) => serverErr += data); server.stdout.on('data', (data) => serverOut += data); server.on('error', common.mustNotCall()); -server.on('exit', (code, signal) => { +server.on('exit', common.mustCall((code, signal) => { // Server is expected to be terminated by cleanUp(). assert.strictEqual(code, null, `'${server.spawnfile} ${server.spawnargs.join(' ')}' unexpected exited with output:\n${serverOut}\n${serverErr}`); assert.strictEqual(signal, 'SIGTERM'); -}); +})); const cleanUp = (err) => { clearTimeout(timeout); diff --git a/test/sequential/test-tls-session-timeout.js b/test/sequential/test-tls-session-timeout.js index 14baabd7a64b7d..44e8d537fc0bfc 100644 --- a/test/sequential/test-tls-session-timeout.js +++ b/test/sequential/test-tls-session-timeout.js @@ -90,7 +90,7 @@ function doTest() { client.stdout.on('data', (data) => { clientOutput += data.toString(); }); - client.on('exit', (code) => { + client.on('exit', common.mustCall((code) => { let connectionType; // Log the output for debugging purposes. Don't remove them or otherwise // the CI output is useless when this test flakes. @@ -120,7 +120,7 @@ function doTest() { assert.strictEqual(code, 0); assert.strictEqual(connectionType, expectedType); cb(connectionType); - }); + })); } const server = tls.createServer(options, (cleartext) => { diff --git a/test/sequential/test-watch-mode.mjs b/test/sequential/test-watch-mode.mjs index f0a7d62e560821..dc7ccf6cf6d2e7 100644 --- a/test/sequential/test-watch-mode.mjs +++ b/test/sequential/test-watch-mode.mjs @@ -791,4 +791,97 @@ process.on('message', (message) => { `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, ]); }); + + it('should watch changes to a file from config file', async () => { + const file = createTmpFile(); + const configFile = createTmpFile(JSON.stringify({ watch: { 'watch': true } }), '.json'); + const { stderr, stdout } = await runWriteSucceed({ + file, watchedFile: file, args: ['--experimental-config-file', configFile, file], options: { + timeout: 10000 + } + }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + }); + + it('should watch changes to a file with watch-path from config file', { + skip: !supportsRecursive, + }, async () => { + const dir = tmpdir.resolve('subdir4'); + mkdirSync(dir); + const file = createTmpFile(); + const watchedFile = createTmpFile('', '.js', dir); + const configFile = createTmpFile(JSON.stringify({ watch: { 'watch-path': [dir] } }), '.json', dir); + + const args = ['--experimental-config-file', configFile, file]; + const { stderr, stdout } = await runWriteSucceed({ file, watchedFile, args }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + assert.strictEqual(stderr, ''); + }); + + it('should watch changes to a file from default config file', async () => { + const dir = tmpdir.resolve('subdir5'); + mkdirSync(dir); + + const file = createTmpFile('console.log("running");', '.js', dir); + writeFileSync(path.join(dir, 'node.config.json'), JSON.stringify({ watch: { 'watch': true } })); + + const { stderr, stdout } = await runWriteSucceed({ + file, + watchedFile: file, + args: ['--experimental-default-config-file', file], + options: { + timeout: 10000, + cwd: dir + } + }); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + `Restarting ${inspect(file)}`, + 'running', + `Completed running ${inspect(file)}. Waiting for file changes before restarting...`, + ]); + }); + + it('should support multiple --env-file flags', async () => { + const envKey = `TEST_ENV_A_${Date.now()}`; + const envKey2 = `TEST_ENV_B_${Date.now()}`; + const jsFile = createTmpFile(`console.log('ENV_A: ' + process.env.${envKey} + '\\n' + 'ENV_B: ' + process.env.${envKey2});`); + const envFileA = createTmpFile(`${envKey}=123`, '.env'); + const envFileB = createTmpFile(`${envKey2}=456`, '.env'); + const { done, restart } = runInBackground({ + args: ['--watch', `--env-file=${envFileA}`, `--env-file=${envFileB}`, jsFile] + }); + + try { + const { stderr, stdout } = await restart(); + + assert.strictEqual(stderr, ''); + assert.deepStrictEqual(stdout, [ + 'ENV_A: 123', + 'ENV_B: 456', + `Completed running ${inspect(jsFile)}. Waiting for file changes before restarting...`, + ]); + } finally { + await done(); + } + }); }); diff --git a/test/sequential/test-without-async-context-frame.mjs b/test/sequential/test-without-async-context-frame.mjs new file mode 100644 index 00000000000000..e7342f03a4ee88 --- /dev/null +++ b/test/sequential/test-without-async-context-frame.mjs @@ -0,0 +1,24 @@ +import { isWindows } from '../common/index.mjs'; +import { spawn } from 'node:child_process'; +import { once } from 'node:events'; +import { fileURLToPath } from 'node:url'; +import assert from 'node:assert'; + +const python = process.env.PYTHON || (isWindows ? 'python' : 'python3'); + +const testRunner = fileURLToPath( + new URL('../../tools/test.py', import.meta.url) +); + +const proc = spawn(python, [ + testRunner, + `--mode=${process.features.debug ? 'debug' : 'release'}`, + `--shell=${process.execPath}`, + '--node-args=--no-async-context-frame', + '*/test-async-local-storage-*', +], { + stdio: ['inherit', 'inherit', 'inherit'], +}); + +const [code] = await once(proc, 'exit'); +assert.strictEqual(code, 0); diff --git a/test/sequential/test-worker-eventlooputil.js b/test/sequential/test-worker-eventlooputil.js index 396902915e1c17..39c6d723ff79a2 100644 --- a/test/sequential/test-worker-eventlooputil.js +++ b/test/sequential/test-worker-eventlooputil.js @@ -10,7 +10,7 @@ const { parentPort, } = require('worker_threads'); const { performance } = require('perf_hooks'); -const { eventLoopUtilization } = require('perf_hooks').performance; +const { eventLoopUtilization } = require('perf_hooks'); // Use argv to detect whether we're running as a Worker called by this test vs. // this test also being called as a Worker. @@ -98,7 +98,7 @@ function checkWorkerActive() { const w = workerELU(); metricsCh.port2.postMessage({ cmd: 'spin', dur: 50 }); - metricsCh.port2.once('message', (wElu) => { + metricsCh.port2.once('message', mustCall((wElu) => { const w2 = workerELU(w); assert.ok(w2.active >= 50, `${w2.active} < 50`); @@ -107,7 +107,7 @@ function checkWorkerActive() { `${idleActive(wElu)} >= ${idleActive(w2)}`); metricsCh.port2.postMessage({ cmd: 'close' }); - }); + })); } function idleActive(elu) { diff --git a/test/sequential/test-worker-prof.js b/test/sequential/test-worker-prof.js index 69d4b9f590e290..c04b4646a045db 100644 --- a/test/sequential/test-worker-prof.js +++ b/test/sequential/test-worker-prof.js @@ -16,10 +16,16 @@ if (process.argv[2] === 'child') { console.log('parent prof file:', parentProf); const { Worker } = require('worker_threads'); + let spinTime = 1500; + if (common.isWindows || common.isMacOS || process.arch === 's390x') { + // Windows and MacOS tend to be flaky in CI, s390x as well. + // Give them more spins. + spinTime = 4500; + } const w = new Worker(` const { parentPort, workerData } = require('worker_threads'); - const SPIN_MS = 1500; + const SPIN_MS = ${spinTime}; const start = Date.now(); parentPort.on('message', (data) => { if (Date.now() - start < SPIN_MS) { @@ -77,7 +83,7 @@ if (process.argv[2] === 'child') { // When not tracking Worker threads, only 1 or 2 ticks would // have been recorded. // prof_sampling_interval is by default 1 millisecond. A higher SPIN_MS - // should result in more ticks, while 15 should be safe on most machines. - assert(workerTicks.length > 15, `worker ticks <= 15:\n${workerTicks.join('\n')}`); - assert(parentTicks.length > 15, `parent ticks <= 15:\n${parentTicks.join('\n')}`); + // should result in more ticks, while 10 should be safe on most machines. + assert(workerTicks.length > 10, `worker ticks <= 10:\n${workerTicks.join('\n')}`); + assert(parentTicks.length > 10, `parent ticks <= 10:\n${parentTicks.join('\n')}`); } diff --git a/test/test-runner/test-output-abort-hooks.mjs b/test/test-runner/test-output-abort-hooks.mjs new file mode 100644 index 00000000000000..2bb1898c5cc7bd --- /dev/null +++ b/test/test-runner/test-output-abort-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort_hooks.js matches test-runner/output/abort_hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort_hooks.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort-runs-after-hook.mjs b/test/test-runner/test-output-abort-runs-after-hook.mjs new file mode 100644 index 00000000000000..e8716bb08333f7 --- /dev/null +++ b/test/test-runner/test-output-abort-runs-after-hook.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/abort-runs-after-hook.js matches +// test-runner/output/abort-runs-after-hook.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort-runs-after-hook.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort-suite.mjs b/test/test-runner/test-output-abort-suite.mjs new file mode 100644 index 00000000000000..c3f1b4625b4f5f --- /dev/null +++ b/test/test-runner/test-output-abort-suite.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort_suite.js matches test-runner/output/abort_suite.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort_suite.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-abort.mjs b/test/test-runner/test-output-abort.mjs new file mode 100644 index 00000000000000..b361bc68035824 --- /dev/null +++ b/test/test-runner/test-output-abort.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/abort.js matches test-runner/output/abort.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/abort.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-arbitrary-output-colored.mjs b/test/test-runner/test-output-arbitrary-output-colored.mjs new file mode 100644 index 00000000000000..77a13d8890430e --- /dev/null +++ b/test/test-runner/test-output-arbitrary-output-colored.mjs @@ -0,0 +1,27 @@ +// Test that the output of test-runner/output/arbitrary-output-colored.js matches +// test-runner/output/arbitrary-output-colored.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { + spawnAndAssert, + specTransform, + replaceTestDuration, + transform, + ensureCwdIsProjectRoot, +} from '../common/assertSnapshot.js'; + +const skipForceColors = + process.config.variables.icu_gyp_path !== 'tools/icu/icu-generic.gyp' || + process.config.variables.node_shared_openssl; + +if (skipForceColors) { + // https://github.com/nodejs/node/pull/48057 + common.skip('Forced colors not supported in this build'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/arbitrary-output-colored.js'), + transform(specTransform, replaceTestDuration), + { tty: true }, +); diff --git a/test/test-runner/test-output-arbitrary-output.mjs b/test/test-runner/test-output-arbitrary-output.mjs new file mode 100644 index 00000000000000..d7626bb01856fa --- /dev/null +++ b/test/test-runner/test-output-arbitrary-output.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/arbitrary-output.js matches +// test-runner/output/arbitrary-output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/arbitrary-output.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-assertion-color-tty.mjs b/test/test-runner/test-output-assertion-color-tty.mjs new file mode 100644 index 00000000000000..102b397c815746 --- /dev/null +++ b/test/test-runner/test-output-assertion-color-tty.mjs @@ -0,0 +1,17 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/assertion-color-tty.mjs matches +// test-runner/output/assertion-color-tty.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/assertion-color-tty.mjs'), + specTransform, + { flags: ['--test', '--stack-trace-limit=0'], tty: true }, +); diff --git a/test/test-runner/test-output-async-test-scheduling.mjs b/test/test-runner/test-output-async-test-scheduling.mjs new file mode 100644 index 00000000000000..5903619f7e1266 --- /dev/null +++ b/test/test-runner/test-output-async-test-scheduling.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/async-test-scheduling.mjs matches +// test-runner/output/async-test-scheduling.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/async-test-scheduling.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs b/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs new file mode 100644 index 00000000000000..bcaec70b17276a --- /dev/null +++ b/test/test-runner/test-output-before-and-after-each-too-many-listeners.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/before-and-after-each-too-many-listeners.js matches +// test-runner/output/before-and-after-each-too-many-listeners.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/before-and-after-each-too-many-listeners.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs b/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs new file mode 100644 index 00000000000000..7804692911aeda --- /dev/null +++ b/test/test-runner/test-output-before-and-after-each-with-timeout-too-many-listeners.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js matches +// test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/before-and-after-each-with-timeout-too-many-listeners.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-coverage-failure.mjs b/test/test-runner/test-output-coverage-failure.mjs new file mode 100644 index 00000000000000..fc171db3ef4627 --- /dev/null +++ b/test/test-runner/test-output-coverage-failure.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage_failure.js matches +// test-runner/output/coverage_failure.snapshot +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_failure.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-short-filename.mjs b/test/test-runner/test-output-coverage-short-filename.mjs new file mode 100644 index 00000000000000..04d673f530689f --- /dev/null +++ b/test/test-runner/test-output-coverage-short-filename.mjs @@ -0,0 +1,19 @@ +// Test that the output of test-runner/output/coverage-short-filename.mjs matches +// test-runner/output/coverage-short-filename.snapshot +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-short-filename.mjs'), + defaultTransform, + { + flags: ['--test-reporter=tap', '--test-coverage-exclude=../output/**'], + cwd: fixtures.path('test-runner/coverage-snap'), + }, +); diff --git a/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs new file mode 100644 index 00000000000000..dd7e1a9c455fbe --- /dev/null +++ b/test/test-runner/test-output-coverage-width-100-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-100-uncovered-lines.mjs matches +// test-runner/output/coverage-width-100-uncovered-lines.snapshot +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-width-100-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-100.mjs b/test/test-runner/test-output-coverage-width-100.mjs new file mode 100644 index 00000000000000..515e1d4e02cac4 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-100.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-100.mjs matches +// test-runner/output/coverage-width-100.snapshot +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-width-100.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs new file mode 100644 index 00000000000000..a09aa303c8cc73 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-150-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-150-uncovered-lines.mjs matches +// test-runner/output/coverage-width-150-uncovered-lines.snapshot +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-width-150-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-150.mjs b/test/test-runner/test-output-coverage-width-150.mjs new file mode 100644 index 00000000000000..077483de649f11 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-150.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-150.mjs matches +// test-runner/output/coverage-width-150.snapshot +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-width-150.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-40.mjs b/test/test-runner/test-output-coverage-width-40.mjs new file mode 100644 index 00000000000000..2fa862ac48e65b --- /dev/null +++ b/test/test-runner/test-output-coverage-width-40.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-40.mjs matches +// test-runner/output/coverage-width-40.snapshot +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-width-40.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-80-color.mjs b/test/test-runner/test-output-coverage-width-80-color.mjs new file mode 100644 index 00000000000000..97d11c2a48a584 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-color.mjs @@ -0,0 +1,21 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/coverage-width-80-color.mjs matches +// test-runner/output/coverage-width-80-color.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80-color.mjs'), + specTransform, + { flags: ['--test-coverage-exclude=!test/**'], tty: true }, +); diff --git a/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs b/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs new file mode 100644 index 00000000000000..1b2cb29620d6ff --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-uncovered-lines-color.mjs @@ -0,0 +1,21 @@ +// Flags: --expose-internals +// Test that the output of test-runner/output/coverage-width-80-uncovered-lines-color.mjs matches +// test-runner/output/coverage-width-80-uncovered-lines-color.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, canColorize, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +if (!canColorize()) { + common.skip('TTY colors not supported'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/coverage-width-80-uncovered-lines-color.mjs'), + specTransform, + { flags: ['--test-coverage-exclude=!test/**'], tty: true }, +); diff --git a/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs new file mode 100644 index 00000000000000..39cc7d9403c96a --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-80-uncovered-lines.mjs matches +// test-runner/output/coverage-width-80-uncovered-lines.snapshot +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-width-80-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-80.mjs b/test/test-runner/test-output-coverage-width-80.mjs new file mode 100644 index 00000000000000..dabf7644726b43 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-80.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-80.mjs matches +// test-runner/output/coverage-width-80.snapshot +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-width-80.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs b/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs new file mode 100644 index 00000000000000..b75bec1e04ec37 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-infinity-uncovered-lines.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-infinity-uncovered-lines.mjs matches +// test-runner/output/coverage-width-infinity-uncovered-lines.snapshot +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-width-infinity-uncovered-lines.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-width-infinity.mjs b/test/test-runner/test-output-coverage-width-infinity.mjs new file mode 100644 index 00000000000000..f586ff9ab159d0 --- /dev/null +++ b/test/test-runner/test-output-coverage-width-infinity.mjs @@ -0,0 +1,16 @@ +// Test that the output of test-runner/output/coverage-width-infinity.mjs matches +// test-runner/output/coverage-width-infinity.snapshot +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-width-infinity.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-coverage-exclude=!test/**'] }, +); diff --git a/test/test-runner/test-output-coverage-with-mock.mjs b/test/test-runner/test-output-coverage-with-mock.mjs new file mode 100644 index 00000000000000..f489451e184d6d --- /dev/null +++ b/test/test-runner/test-output-coverage-with-mock.mjs @@ -0,0 +1,25 @@ +// Test that the output of test-runner/output/coverage-with-mock.mjs matches +// test-runner/output/coverage-with-mock.snapshot +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.mjs'), + defaultTransform, + { + flags: [ + '--disable-warning=ExperimentalWarning', + '--test-reporter=tap', + '--experimental-transform-types', + '--experimental-test-module-mocks', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + ], + }, +); diff --git a/test/test-runner/test-output-default-output.mjs b/test/test-runner/test-output-default-output.mjs new file mode 100644 index 00000000000000..96ae139902755e --- /dev/null +++ b/test/test-runner/test-output-default-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/default_output.js matches test-runner/output/default_output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/default_output.js'), + specTransform, + { tty: true }, +); diff --git a/test/test-runner/test-output-describe-it.mjs b/test/test-runner/test-output-describe-it.mjs new file mode 100644 index 00000000000000..219951d5aec75e --- /dev/null +++ b/test/test-runner/test-output-describe-it.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/describe_it.js matches test-runner/output/describe_it.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/describe_it.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-describe-nested.mjs b/test/test-runner/test-output-describe-nested.mjs new file mode 100644 index 00000000000000..661048527fa668 --- /dev/null +++ b/test/test-runner/test-output-describe-nested.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/describe_nested.js matches test-runner/output/describe_nested.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/describe_nested.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-dot-output-custom-columns.mjs b/test/test-runner/test-output-dot-output-custom-columns.mjs new file mode 100644 index 00000000000000..c8061e6ba27e85 --- /dev/null +++ b/test/test-runner/test-output-dot-output-custom-columns.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/dot_output_custom_columns.js matches +// test-runner/output/dot_output_custom_columns.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/dot_output_custom_columns.js'), + specTransform, + { tty: true }, +); diff --git a/test/test-runner/test-output-dot-reporter.mjs b/test/test-runner/test-output-dot-reporter.mjs new file mode 100644 index 00000000000000..46312203bb46d7 --- /dev/null +++ b/test/test-runner/test-output-dot-reporter.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/dot_reporter.js matches test-runner/output/dot_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/dot_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-dot.mjs b/test/test-runner/test-output-eval-dot.mjs new file mode 100644 index 00000000000000..e31334ac52dd2b --- /dev/null +++ b/test/test-runner/test-output-eval-dot.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_dot.js matches test-runner/output/eval_dot.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_dot.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-spec.mjs b/test/test-runner/test-output-eval-spec.mjs new file mode 100644 index 00000000000000..86d6677552bdc5 --- /dev/null +++ b/test/test-runner/test-output-eval-spec.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_spec.js matches test-runner/output/eval_spec.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_spec.js'), + specTransform, +); diff --git a/test/test-runner/test-output-eval-tap.mjs b/test/test-runner/test-output-eval-tap.mjs new file mode 100644 index 00000000000000..a1902ec92878f4 --- /dev/null +++ b/test/test-runner/test-output-eval-tap.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/eval_tap.js matches test-runner/output/eval_tap.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/eval_tap.js'), + defaultTransform, +); diff --git a/test/test-runner/test-output-filtered-suite-delayed-build.mjs b/test/test-runner/test-output-filtered-suite-delayed-build.mjs new file mode 100644 index 00000000000000..c4ec3f3b019731 --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-delayed-build.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-delayed-build.js matches +// test-runner/output/filtered-suite-delayed-build.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-delayed-build.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-filtered-suite-order.mjs b/test/test-runner/test-output-filtered-suite-order.mjs new file mode 100644 index 00000000000000..f29c4dcf62bc3f --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-order.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-order.mjs matches +// test-runner/output/filtered-suite-order.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-order.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-filtered-suite-throws.mjs b/test/test-runner/test-output-filtered-suite-throws.mjs new file mode 100644 index 00000000000000..7976e3b63753de --- /dev/null +++ b/test/test-runner/test-output-filtered-suite-throws.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/filtered-suite-throws.js matches +// test-runner/output/filtered-suite-throws.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/filtered-suite-throws.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-force-exit.mjs b/test/test-runner/test-output-force-exit.mjs new file mode 100644 index 00000000000000..5138e3df57da31 --- /dev/null +++ b/test/test-runner/test-output-force-exit.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/force_exit.js matches test-runner/output/force_exit.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/force_exit.js'), + specTransform, +); diff --git a/test/test-runner/test-output-global-after-should-fail-the-test.mjs b/test/test-runner/test-output-global-after-should-fail-the-test.mjs new file mode 100644 index 00000000000000..71179d7f15ebfc --- /dev/null +++ b/test/test-runner/test-output-global-after-should-fail-the-test.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/global_after_should_fail_the_test.js matches +// test-runner/output/global_after_should_fail_the_test.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/global_after_should_fail_the_test.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-global-hooks-with-no-tests.mjs b/test/test-runner/test-output-global-hooks-with-no-tests.mjs new file mode 100644 index 00000000000000..361948df103ba2 --- /dev/null +++ b/test/test-runner/test-output-global-hooks-with-no-tests.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/global-hooks-with-no-tests.js matches +// test-runner/output/global-hooks-with-no-tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/global-hooks-with-no-tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-hooks-spec-reporter.mjs b/test/test-runner/test-output-hooks-spec-reporter.mjs new file mode 100644 index 00000000000000..cc46592fb74c6d --- /dev/null +++ b/test/test-runner/test-output-hooks-spec-reporter.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/hooks_spec_reporter.js matches +// test-runner/output/hooks_spec_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks_spec_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-hooks-with-no-global-test.mjs b/test/test-runner/test-output-hooks-with-no-global-test.mjs new file mode 100644 index 00000000000000..a0c0327e0f9ec2 --- /dev/null +++ b/test/test-runner/test-output-hooks-with-no-global-test.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/hooks-with-no-global-test.js matches +// test-runner/output/hooks-with-no-global-test.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks-with-no-global-test.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-hooks.mjs b/test/test-runner/test-output-hooks.mjs new file mode 100644 index 00000000000000..b1e1d655df6db8 --- /dev/null +++ b/test/test-runner/test-output-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/hooks.js matches test-runner/output/hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/hooks.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-junit-reporter.mjs b/test/test-runner/test-output-junit-reporter.mjs new file mode 100644 index 00000000000000..ece14e09ac2e04 --- /dev/null +++ b/test/test-runner/test-output-junit-reporter.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/junit_reporter.js matches +// test-runner/output/junit_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, junitTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/junit_reporter.js'), + junitTransform, +); diff --git a/test/test-runner/test-output-lcov-reporter.mjs b/test/test-runner/test-output-lcov-reporter.mjs new file mode 100644 index 00000000000000..93aa38fff2bc66 --- /dev/null +++ b/test/test-runner/test-output-lcov-reporter.mjs @@ -0,0 +1,14 @@ +// Test that the output of test-runner/output/lcov_reporter.js matches test-runner/output/lcov_reporter.snapshot +import * as common from '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, lcovTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +if (!process.features.inspector) { + common.skip('inspector support required'); +} + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/lcov_reporter.js'), + lcovTransform, +); diff --git a/test/test-runner/test-output-name-and-skip-patterns.mjs b/test/test-runner/test-output-name-and-skip-patterns.mjs new file mode 100644 index 00000000000000..875641a28435c4 --- /dev/null +++ b/test/test-runner/test-output-name-and-skip-patterns.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/name_and_skip_patterns.js matches +// test-runner/output/name_and_skip_patterns.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_and_skip_patterns.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-name-pattern-with-only.mjs b/test/test-runner/test-output-name-pattern-with-only.mjs new file mode 100644 index 00000000000000..89b94f8a80a031 --- /dev/null +++ b/test/test-runner/test-output-name-pattern-with-only.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/name_pattern_with_only.js matches +// test-runner/output/name_pattern_with_only.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_pattern_with_only.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-name-pattern.mjs b/test/test-runner/test-output-name-pattern.mjs new file mode 100644 index 00000000000000..efaef28ed0f0a9 --- /dev/null +++ b/test/test-runner/test-output-name-pattern.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/name_pattern.js matches test-runner/output/name_pattern.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/name_pattern.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-no-refs.mjs b/test/test-runner/test-output-no-refs.mjs new file mode 100644 index 00000000000000..5e2fbab53b2f54 --- /dev/null +++ b/test/test-runner/test-output-no-refs.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/no_refs.js matches test-runner/output/no_refs.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/no_refs.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-no-tests.mjs b/test/test-runner/test-output-no-tests.mjs new file mode 100644 index 00000000000000..0cff4003e7598c --- /dev/null +++ b/test/test-runner/test-output-no-tests.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/no_tests.js matches test-runner/output/no_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/no_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-non-tty-forced-color-output.mjs b/test/test-runner/test-output-non-tty-forced-color-output.mjs new file mode 100644 index 00000000000000..d630c52e293a35 --- /dev/null +++ b/test/test-runner/test-output-non-tty-forced-color-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/non-tty-forced-color-output.js matches +// test-runner/output/non-tty-forced-color-output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/non-tty-forced-color-output.js'), + specTransform, +); diff --git a/test/test-runner/test-output-only-tests.mjs b/test/test-runner/test-output-only-tests.mjs new file mode 100644 index 00000000000000..93a9097bec15dc --- /dev/null +++ b/test/test-runner/test-output-only-tests.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/only_tests.js matches test-runner/output/only_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/only_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-output-cli.mjs b/test/test-runner/test-output-output-cli.mjs new file mode 100644 index 00000000000000..924b6212e2eae8 --- /dev/null +++ b/test/test-runner/test-output-output-cli.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/output_cli.js matches test-runner/output/output_cli.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/output_cli.js'), + defaultTransform, +); diff --git a/test/test-runner/test-output-output.mjs b/test/test-runner/test-output-output.mjs new file mode 100644 index 00000000000000..1eb152324c4063 --- /dev/null +++ b/test/test-runner/test-output-output.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/output.js matches test-runner/output/output.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/output.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-skip-each-hooks.mjs b/test/test-runner/test-output-skip-each-hooks.mjs new file mode 100644 index 00000000000000..a5fb2fb613627b --- /dev/null +++ b/test/test-runner/test-output-skip-each-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/skip-each-hooks.js matches +// test-runner/output/skip-each-hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/skip-each-hooks.js'), + specTransform, +); diff --git a/test/test-runner/test-output-skip-pattern.mjs b/test/test-runner/test-output-skip-pattern.mjs new file mode 100644 index 00000000000000..852b48e7a2b6a1 --- /dev/null +++ b/test/test-runner/test-output-skip-pattern.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/skip_pattern.js matches test-runner/output/skip_pattern.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/skip_pattern.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-source-mapped-locations.mjs b/test/test-runner/test-output-source-mapped-locations.mjs new file mode 100644 index 00000000000000..a24bed052dc3ad --- /dev/null +++ b/test/test-runner/test-output-source-mapped-locations.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/source_mapped_locations.mjs matches +// test-runner/output/source_mapped_locations.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/source_mapped_locations.mjs'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-spec-reporter-cli.mjs b/test/test-runner/test-output-spec-reporter-cli.mjs new file mode 100644 index 00000000000000..5b44483601c3a5 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter-cli.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/spec_reporter_cli.js matches +// test-runner/output/spec_reporter_cli.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter_cli.js'), + specTransform, +); diff --git a/test/test-runner/test-output-spec-reporter-successful.mjs b/test/test-runner/test-output-spec-reporter-successful.mjs new file mode 100644 index 00000000000000..0308d1e1f01b24 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter-successful.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/spec_reporter_successful.js matches +// test-runner/output/spec_reporter_successful.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter_successful.js'), + specTransform, +); diff --git a/test/test-runner/test-output-spec-reporter.mjs b/test/test-runner/test-output-spec-reporter.mjs new file mode 100644 index 00000000000000..e7233b13da95d1 --- /dev/null +++ b/test/test-runner/test-output-spec-reporter.mjs @@ -0,0 +1,10 @@ +// Test that the output of test-runner/output/spec_reporter.js matches test-runner/output/spec_reporter.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/spec_reporter.js'), + specTransform, +); diff --git a/test/test-runner/test-output-suite-skip-hooks.mjs b/test/test-runner/test-output-suite-skip-hooks.mjs new file mode 100644 index 00000000000000..183c4bb27c5d34 --- /dev/null +++ b/test/test-runner/test-output-suite-skip-hooks.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/suite-skip-hooks.js matches +// test-runner/output/suite-skip-hooks.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/suite-skip-hooks.js'), + specTransform, +); diff --git a/test/test-runner/test-output-tap-escape.mjs b/test/test-runner/test-output-tap-escape.mjs new file mode 100644 index 00000000000000..f0b4471d5158bb --- /dev/null +++ b/test/test-runner/test-output-tap-escape.mjs @@ -0,0 +1,17 @@ +// Test that the output of test-runner/output/tap_escape.js matches test-runner/output/tap_escape.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { + spawnAndAssert, + transform, + replaceWindowsLineEndings, + replaceTestDuration, + ensureCwdIsProjectRoot, +} from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/tap_escape.js'), + transform(replaceWindowsLineEndings, replaceTestDuration), + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs b/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs new file mode 100644 index 00000000000000..b5f59df53b867d --- /dev/null +++ b/test/test-runner/test-output-test-diagnostic-warning-without-test-only-flag.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-diagnostic-warning-without-test-only-flag.js matches +// test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-diagnostic-warning-without-test-only-flag.js'), + defaultTransform, + { flags: ['--test', '--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-runner-plan-timeout.mjs b/test/test-runner/test-output-test-runner-plan-timeout.mjs new file mode 100644 index 00000000000000..6771468d3b9fa9 --- /dev/null +++ b/test/test-runner/test-output-test-runner-plan-timeout.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-runner-plan-timeout.js matches +// test-runner/output/test-runner-plan-timeout.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-plan-timeout.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-force-exit'] }, +); diff --git a/test/test-runner/test-output-test-runner-plan.mjs b/test/test-runner/test-output-test-runner-plan.mjs new file mode 100644 index 00000000000000..a4533e9a1b1196 --- /dev/null +++ b/test/test-runner/test-output-test-runner-plan.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-runner-plan.js matches +// test-runner/output/test-runner-plan.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-plan.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-test-runner-watch-spec.mjs b/test/test-runner/test-output-test-runner-watch-spec.mjs new file mode 100644 index 00000000000000..c835b11527a8f0 --- /dev/null +++ b/test/test-runner/test-output-test-runner-watch-spec.mjs @@ -0,0 +1,11 @@ +// Test that the output of test-runner/output/test-runner-watch-spec.mjs matches +// test-runner/output/test-runner-watch-spec.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, specTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-runner-watch-spec.mjs'), + specTransform, +); diff --git a/test/test-runner/test-output-test-timeout-flag-with-test.mjs b/test/test-runner/test-output-test-timeout-flag-with-test.mjs new file mode 100644 index 00000000000000..f34db67d0be2c0 --- /dev/null +++ b/test/test-runner/test-output-test-timeout-flag-with-test.mjs @@ -0,0 +1,13 @@ +// Test that the output of test-runner/output/test-timeout-flag.js matches +// test-runner/output/test-timeout-flag.snapshot with --test flag. +// --test-timeout should work with or without --test flag. +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-timeout-flag.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-timeout=100', '--test'] }, +); diff --git a/test/test-runner/test-output-test-timeout-flag.mjs b/test/test-runner/test-output-test-timeout-flag.mjs new file mode 100644 index 00000000000000..96ef6c47af00aa --- /dev/null +++ b/test/test-runner/test-output-test-timeout-flag.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/test-timeout-flag.js matches +// test-runner/output/test-timeout-flag.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/test-timeout-flag.js'), + defaultTransform, + { flags: ['--test-reporter=tap', '--test-timeout=100'] }, +); diff --git a/test/test-runner/test-output-timeout-in-before-each.mjs b/test/test-runner/test-output-timeout-in-before-each.mjs new file mode 100644 index 00000000000000..e0efd67155f556 --- /dev/null +++ b/test/test-runner/test-output-timeout-in-before-each.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js matches +// test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-output-typescript-coverage.mjs b/test/test-runner/test-output-typescript-coverage.mjs new file mode 100644 index 00000000000000..41aa97d194cc20 --- /dev/null +++ b/test/test-runner/test-output-typescript-coverage.mjs @@ -0,0 +1,25 @@ +// Test that the output of test-runner/output/typescript-coverage.mts matches +// test-runner/output/typescript-coverage.snapshot +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/typescript-coverage.mts'), + defaultTransform, + { + flags: [ + '--disable-warning=ExperimentalWarning', + '--test-reporter=tap', + '--experimental-transform-types', + '--experimental-test-module-mocks', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + ], + }, +); diff --git a/test/test-runner/test-output-unfinished-suite-async-error.mjs b/test/test-runner/test-output-unfinished-suite-async-error.mjs new file mode 100644 index 00000000000000..b6af0ae9a1170f --- /dev/null +++ b/test/test-runner/test-output-unfinished-suite-async-error.mjs @@ -0,0 +1,12 @@ +// Test that the output of test-runner/output/unfinished-suite-async-error.js matches +// test-runner/output/unfinished-suite-async-error.snapshot +import '../common/index.mjs'; +import * as fixtures from '../common/fixtures.mjs'; +import { spawnAndAssert, defaultTransform, ensureCwdIsProjectRoot } from '../common/assertSnapshot.js'; + +ensureCwdIsProjectRoot(); +await spawnAndAssert( + fixtures.path('test-runner/output/unfinished-suite-async-error.js'), + defaultTransform, + { flags: ['--test-reporter=tap'] }, +); diff --git a/test/test-runner/test-runner.status b/test/test-runner/test-runner.status new file mode 100644 index 00000000000000..e8b4ff2d32248c --- /dev/null +++ b/test/test-runner/test-runner.status @@ -0,0 +1,11 @@ +prefix test-runner + +# To mark a test as flaky, list the test name in the appropriate section +# below, without ".js", followed by ": PASS,FLAKY". Example: +# sample-test : PASS,FLAKY + +[true] # This section applies to all platforms + +# https://github.com/nodejs/node/pull/54888#issuecomment-2351128116 +# TODO(pmarchini): This test is failing when isolation is set to none and must be fixed. +test-watch-create-isolation-none: SKIP diff --git a/test/test-runner/test-watch-create-isolation-none.mjs b/test/test-runner/test-watch-create-isolation-none.mjs new file mode 100644 index 00000000000000..c7035ea63afd2c --- /dev/null +++ b/test/test-runner/test-watch-create-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none runs tests when a new file is created in the watched directory +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ action: 'create', fileToCreate: 'new-test-file.test.js', isolation: 'none' }); diff --git a/test/test-runner/test-watch-create-isolation-process.mjs b/test/test-runner/test-watch-create-isolation-process.mjs new file mode 100644 index 00000000000000..d1eaa9667d2e32 --- /dev/null +++ b/test/test-runner/test-watch-create-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process runs tests when a new file is created in the watched directory +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ action: 'create', fileToCreate: 'new-test-file.test.js', isolation: 'process' }); diff --git a/test/test-runner/test-watch-delete-isolation-none.mjs b/test/test-runner/test-watch-delete-isolation-none.mjs new file mode 100644 index 00000000000000..210d2a87f82666 --- /dev/null +++ b/test/test-runner/test-watch-delete-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none does not throw when deleting a watched test file +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', action: 'delete', isolation: 'none' }); diff --git a/test/test-runner/test-watch-delete-isolation-process.mjs b/test/test-runner/test-watch-delete-isolation-process.mjs new file mode 100644 index 00000000000000..d09b84caf53ea7 --- /dev/null +++ b/test/test-runner/test-watch-delete-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process does not throw when deleting a watched test file +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', action: 'delete', isolation: 'process' }); diff --git a/test/test-runner/test-watch-dependency-isolation-none.mjs b/test/test-runner/test-watch-dependency-isolation-none.mjs new file mode 100644 index 00000000000000..7171a334ce03bd --- /dev/null +++ b/test/test-runner/test-watch-dependency-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none runs tests with dependency repeatedly +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'dependency.js', isolation: 'none' }); diff --git a/test/test-runner/test-watch-dependency-isolation-process.mjs b/test/test-runner/test-watch-dependency-isolation-process.mjs new file mode 100644 index 00000000000000..25b8d00f3b0283 --- /dev/null +++ b/test/test-runner/test-watch-dependency-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process runs tests with dependency repeatedly +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'dependency.js', isolation: 'process' }); diff --git a/test/test-runner/test-watch-esm-dependency-isolation-none.mjs b/test/test-runner/test-watch-esm-dependency-isolation-none.mjs new file mode 100644 index 00000000000000..d066bd90d74ce5 --- /dev/null +++ b/test/test-runner/test-watch-esm-dependency-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none runs tests with ESM dependency +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'dependency.mjs', isolation: 'none' }); diff --git a/test/test-runner/test-watch-esm-dependency-isolation-process.mjs b/test/test-runner/test-watch-esm-dependency-isolation-process.mjs new file mode 100644 index 00000000000000..7e0ad48ece03d7 --- /dev/null +++ b/test/test-runner/test-watch-esm-dependency-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process runs tests with ESM dependency +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'dependency.mjs', isolation: 'process' }); diff --git a/test/test-runner/test-watch-no-file-isolation-none.mjs b/test/test-runner/test-watch-no-file-isolation-none.mjs new file mode 100644 index 00000000000000..ebf14d828a32c5 --- /dev/null +++ b/test/test-runner/test-watch-no-file-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none runs tests without a file argument +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', isolation: 'none' }); diff --git a/test/test-runner/test-watch-no-file-isolation-process.mjs b/test/test-runner/test-watch-no-file-isolation-process.mjs new file mode 100644 index 00000000000000..76991b37189894 --- /dev/null +++ b/test/test-runner/test-watch-no-file-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process runs tests without a file argument +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', isolation: 'process' }); diff --git a/test/test-runner/test-watch-rename-isolation-none.mjs b/test/test-runner/test-watch-rename-isolation-none.mjs new file mode 100644 index 00000000000000..d125b33ce83d84 --- /dev/null +++ b/test/test-runner/test-watch-rename-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none handles a watched test file rename +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', action: 'rename', isolation: 'none' }); diff --git a/test/test-runner/test-watch-rename-isolation-process.mjs b/test/test-runner/test-watch-rename-isolation-process.mjs new file mode 100644 index 00000000000000..e784831a33bfa0 --- /dev/null +++ b/test/test-runner/test-watch-rename-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process handles a watched test file rename +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ fileToUpdate: 'test.js', action: 'rename', isolation: 'process' }); diff --git a/test/test-runner/test-watch-run-repeatedly-isolation-none.mjs b/test/test-runner/test-watch-run-repeatedly-isolation-none.mjs new file mode 100644 index 00000000000000..763f5a3be05f14 --- /dev/null +++ b/test/test-runner/test-watch-run-repeatedly-isolation-none.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=none runs tests repeatedly +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'test.js', isolation: 'none' }); diff --git a/test/test-runner/test-watch-run-repeatedly-isolation-process.mjs b/test/test-runner/test-watch-run-repeatedly-isolation-process.mjs new file mode 100644 index 00000000000000..07719cfd77710f --- /dev/null +++ b/test/test-runner/test-watch-run-repeatedly-isolation-process.mjs @@ -0,0 +1,8 @@ +// Test --test --watch --test-isolation=process runs tests repeatedly +import '../common/index.mjs'; +import { skipIfNoWatch, refreshForTestRunnerWatch, testRunnerWatch } from '../common/watch.js'; + +skipIfNoWatch(); +refreshForTestRunnerWatch(); + +await testRunnerWatch({ file: 'test.js', fileToUpdate: 'test.js', isolation: 'process' }); diff --git a/test/test-runner/testcfg.py b/test/test-runner/testcfg.py new file mode 100644 index 00000000000000..fa53433d0dd1e5 --- /dev/null +++ b/test/test-runner/testcfg.py @@ -0,0 +1,6 @@ +import sys, os +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +import testpy + +def GetConfiguration(context, root): + return testpy.ParallelTestConfiguration(context, root, 'test-runner') diff --git a/test/testpy/__init__.py b/test/testpy/__init__.py index 605f2d2daa80d1..9e7686c450b74b 100644 --- a/test/testpy/__init__.py +++ b/test/testpy/__init__.py @@ -35,6 +35,7 @@ FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)") LS_RE = re.compile(r'^test-.*\.m?js$') ENV_PATTERN = re.compile(r"//\s+Env:(.*)") +NODE_TEST_PATTERN = re.compile(r"('|`|\")node:test\1") class SimpleTestCase(test.TestCase): @@ -98,6 +99,10 @@ def GetRunConfiguration(self): else: result += flags + if self.context.use_error_reporter and NODE_TEST_PATTERN.search(source): + result += ['--test-reporter=./test/common/test-error-reporter.js', + '--test-reporter-destination=stdout'] + if self.additional_flags: result += self.additional_flags diff --git a/test/wpt/status/console.json b/test/wpt/status/console.json index 7c9dadf0cc4465..ba74911d66fdd2 100644 --- a/test/wpt/status/console.json +++ b/test/wpt/status/console.json @@ -1,7 +1,7 @@ { "idlharness.any.js": { "note": "https://github.com/nodejs/node/issues/44185", - "requires": ["crypto", "small-icu"] + "requires": ["crypto", "inspector", "small-icu"] }, "idlharness-shadowrealm.window.js": { "skip": "ShadowRealm support is not enabled" diff --git a/tools/actions/lint-release-proposal-commit-list.mjs b/tools/actions/lint-release-proposal-commit-list.mjs index b5104a6503e489..9bbc7159fbf17a 100755 --- a/tools/actions/lint-release-proposal-commit-list.mjs +++ b/tools/actions/lint-release-proposal-commit-list.mjs @@ -23,12 +23,17 @@ const commitListingStart = changelog.indexOf('\n### Commits\n'); let commitList; if (commitListingStart === -1) { // We're preparing a semver-major release. - commitList = changelog.replace(/(^.+\n### Semver-Major|\n### Semver-(Minor|Patch)) Commits\n/gs, '') - .replaceAll('**(SEMVER-MAJOR)** ', ''); + assert.match(changelog, /\n### Semver-Major Commits\n/); + // The proposal should contain only the release commit. + commitList = ''; } else { - const commitListingEnd = changelog.indexOf('\n\n<\/a>\n\n## \d+-\d+-\d+, Version \1/.exec(changelog); + assert.ok(releaseStart, 'Could not determine the start of the release section'); + const releaseEnd = changelog.indexOf('\n\n>. ' 'Use v8::LocalVector instead.') +def CheckStringValueUsage(filename, lines, error): + """Logs an error if v8's String::Value/Utf8Value are used. + Args: + filename: The name of the current file. + lines: An array of strings, each representing a line of the file. + error: The function to call with any errors found. + """ + if filename.startswith('test/') or filename.startswith('test\\'): + return # Skip test files, where Node.js headers may not be available + + for linenum, line in enumerate(lines): + if Search(r'\bString::Utf8Value\b', line): + error(filename, linenum, 'runtime/v8_string_value', 5, + 'Do not use v8::String::Utf8Value. ' + 'Use node::Utf8Value instead.') + if Search(r'\bString::Value\b', line): + error(filename, linenum, 'runtime/v8_string_value', 5, + 'Do not use v8::String::Value. ' + 'Use node::TwoByteValue instead.') + def ProcessLine(filename, file_extension, clean_lines, line, include_state, function_state, nesting_state, error, extra_check_functions=None): @@ -6660,6 +6680,8 @@ def ProcessFileData(filename, file_extension, lines, error, CheckLocalVectorUsage(filename, lines, error) + CheckStringValueUsage(filename, lines, error) + def ProcessConfigOverrides(filename): """ Loads the configuration files and processes the config overrides. diff --git a/tools/dep_updaters/update-googletest.sh b/tools/dep_updaters/update-googletest.sh index 2503cedd2f8090..42fa09c1b63456 100755 --- a/tools/dep_updaters/update-googletest.sh +++ b/tools/dep_updaters/update-googletest.sh @@ -86,4 +86,4 @@ echo "$NEW_GYP" >"$DEPS_DIR/googletest/googletest.gyp" # Update the version number on maintaining-dependencies.md # and print the new version as the last line of the script as we need # to add it to $GITHUB_ENV variable -finalize_version_update "googletest" "$NEW_VERSION" +finalize_version_update "googletest" "$NEW_UPSTREAM_SHA1" diff --git a/tools/dep_updaters/update-icu.sh b/tools/dep_updaters/update-icu.sh index e79a6218307710..8cd402d9326959 100755 --- a/tools/dep_updaters/update-icu.sh +++ b/tools/dep_updaters/update-icu.sh @@ -32,15 +32,11 @@ CURRENT_VERSION="$(grep "#define U_ICU_VERSION " "$ICU_VERSION_H" | cut -d'"' -f # This function exit with 0 if new version and current version are the same compare_dependency_version "icu-small" "$NEW_VERSION" "$CURRENT_VERSION" -DASHED_NEW_VERSION=$(echo "$NEW_VERSION" | sed 's/\./-/g') +NEW_VERSION_TGZ="icu4c-${NEW_VERSION}-sources.tgz" -LOW_DASHED_NEW_VERSION=$(echo "$NEW_VERSION" | sed 's/\./_/g') +NEW_VERSION_TGZ_URL="https://github.com/unicode-org/icu/releases/download/release-${NEW_VERSION}/${NEW_VERSION_TGZ}" -NEW_VERSION_TGZ="icu4c-${LOW_DASHED_NEW_VERSION}-src.tgz" - -NEW_VERSION_TGZ_URL="https://github.com/unicode-org/icu/releases/download/release-${DASHED_NEW_VERSION}/$NEW_VERSION_TGZ" - -NEW_VERSION_MD5="https://github.com/unicode-org/icu/releases/download/release-${DASHED_NEW_VERSION}/icu4c-${LOW_DASHED_NEW_VERSION}-sources.md5" +NEW_VERSION_MD5="https://github.com/unicode-org/icu/releases/download/release-${NEW_VERSION}/icu4c-${NEW_VERSION}-sources.md5" CHECKSUM=$(curl -sL "$NEW_VERSION_MD5" | grep "$NEW_VERSION_TGZ" | grep -v "\.asc$" | awk '{print $1}') diff --git a/tools/dep_updaters/update-inspector-protocol.sh b/tools/dep_updaters/update-inspector-protocol.sh new file mode 100755 index 00000000000000..8637647b23fcb1 --- /dev/null +++ b/tools/dep_updaters/update-inspector-protocol.sh @@ -0,0 +1,45 @@ +#!/bin/sh +set -e +# Shell script to update inspector_protocol in the source tree to the version same with V8's. + +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +DEPS_DIR="$BASE_DIR/deps" + +# shellcheck disable=SC1091 +. "$BASE_DIR/tools/dep_updaters/utils.sh" + +echo "Making temporary workspace..." + +WORKSPACE=$(mktemp -d 2> /dev/null || mktemp -d -t 'tmp') + +cd "$WORKSPACE" + +git clone https://chromium.googlesource.com/deps/inspector_protocol.git + +INSPECTOR_PROTOCOL_DIR="$WORKSPACE/inspector_protocol" + +echo "Comparing latest upstream with current revision" + +set +e +python "$BASE_DIR/tools/inspector_protocol/roll.py" \ + --ip_src_upstream "$INSPECTOR_PROTOCOL_DIR" \ + --node_src_downstream "$BASE_DIR" +STATUS="$?" +set -e + +if [ "$STATUS" = "0" ]; then + echo "Skipped because inspector_protocol is on the latest version." + exit 0 +fi + +python "$BASE_DIR/tools/inspector_protocol/roll.py" \ + --ip_src_upstream "$INSPECTOR_PROTOCOL_DIR" \ + --node_src_downstream "$BASE_DIR" \ + --force + +NEW_VERSION=$(grep "Revision:" "$DEPS_DIR/inspector_protocol/README.node" | sed -n 's/^Revision: \([[:xdigit:]]\{36\}\).*$/\1/p') + +# Update the version number on maintaining-dependencies.md +# and print the new version as the last line of the script as we need +# to add it to $GITHUB_ENV variable +finalize_version_update "inspector_protocol" "$NEW_VERSION" diff --git a/tools/dep_updaters/update-nixpkgs-pin.sh b/tools/dep_updaters/update-nixpkgs-pin.sh new file mode 100755 index 00000000000000..6c23905ef0e093 --- /dev/null +++ b/tools/dep_updaters/update-nixpkgs-pin.sh @@ -0,0 +1,39 @@ +#!/bin/sh +set -ex +# Shell script to update Nixpkgs pin in the source tree to the most recent +# version on the unstable channel. + +BASE_DIR=$(cd "$(dirname "$0")/../.." && pwd) +NIXPKGS_PIN_FILE="$BASE_DIR/tools/nix/pkgs.nix" + +NIXPKGS_REPO=$(grep 'repo =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') +CURRENT_VERSION_SHA1=$(grep 'rev =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') + +NEW_UPSTREAM_SHA1=$(git ls-remote "$NIXPKGS_REPO.git" nixpkgs-unstable | awk '{print $1}') +NEW_VERSION=$(echo "$NEW_UPSTREAM_SHA1" | head -c 35) + + +# shellcheck disable=SC1091 +. "$BASE_DIR/tools/dep_updaters/utils.sh" + +compare_dependency_version "nixpkgs-unstable" "$CURRENT_VERSION_SHA1" "$NEW_UPSTREAM_SHA1" + +CURRENT_TARBALL_HASH=$(grep 'sha256 =' "$NIXPKGS_PIN_FILE" | awk -F'"' '{ print $2 }') +NEW_TARBALL_HASH=$(nix-prefetch-url --unpack "$NIXPKGS_REPO/archive/$NEW_UPSTREAM_SHA1.tar.gz") + +TMP_FILE=$(mktemp) +sed "s/$CURRENT_VERSION_SHA1/$NEW_UPSTREAM_SHA1/;s/$CURRENT_TARBALL_HASH/$NEW_TARBALL_HASH/" "$NIXPKGS_PIN_FILE" > "$TMP_FILE" +mv "$TMP_FILE" "$NIXPKGS_PIN_FILE" + +cat -< + node.parent?.type === 'CallExpression' && + node.parent.callee.type === 'MemberExpression' && + node.parent.callee.object.type === 'Identifier' && node.parent.callee.object.name === 'Promise' && + node.parent.callee.property.type === 'Identifier' && node.parent.callee.property.name === 'all' && + node.parent.arguments.length === 1 && node.parent.arguments[0] === node; + function findEnclosingFunction(node) { while (true) { node = node.parent; @@ -20,10 +27,20 @@ function findEnclosingFunction(node) { if ( node.parent.callee.type === 'MemberExpression' && (node.parent.callee.object.type === 'ArrayExpression' || node.parent.callee.object.type === 'Identifier') && - node.parent.callee.property.name === 'forEach' + ( + node.parent.callee.property.name === 'forEach' || + (node.parent.callee.property.name === 'map' && isPromiseAllCallArg(node.parent)) + ) ) continue; // `[].forEach()` call } else if (node.parent?.type === 'NewExpression') { if (node.parent.callee.type === 'Identifier' && node.parent.callee.name === 'Promise') continue; + } else if (node.parent?.type === 'Property') { + const ancestor = node.parent.parent?.parent; + if (ancestor?.type === 'CallExpression' && + ancestor.callee.type === 'Identifier' && + /^spawnSyncAnd(Exit(WithoutError)?|Assert)$/.test(ancestor.callee.name)) { + continue; + } } break; } @@ -31,7 +48,7 @@ function findEnclosingFunction(node) { } function isMustCallOrMustCallAtLeast(str) { - return str === 'mustCall' || str === 'mustCallAtLeast'; + return str === 'mustCall' || str === 'mustCallAtLeast' || str === 'mustSucceed'; } function isMustCallOrTest(str) { @@ -68,6 +85,7 @@ module.exports = { parent.arguments[0].type === 'Literal' && parent.arguments[0].value === 'exit' ), + t: (name) => name === 'test', // t.test }[parent.callee.object.name]?.(parent.callee.property.name) ) { return; diff --git a/tools/gyp/CHANGELOG.md b/tools/gyp/CHANGELOG.md index 69449c0d8049e7..74dbc82832719c 100644 --- a/tools/gyp/CHANGELOG.md +++ b/tools/gyp/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.20.5](https://github.com/nodejs/gyp-next/compare/v0.20.4...v0.20.5) (2025-10-13) + + +### Bug Fixes + +* Fix ruff v0.13.0 adds ruff rule RUF059 ([bd4491a](https://github.com/nodejs/gyp-next/commit/bd4491a3ba641eeb040b785bbce367f72c3baf19)) +* handle `None` case in xcode_emulation regexes ([#311](https://github.com/nodejs/gyp-next/issues/311)) ([b21ee31](https://github.com/nodejs/gyp-next/commit/b21ee3150eea9fc1a8811e910e5ba64f42e1fb77)) + ## [0.20.4](https://github.com/nodejs/gyp-next/compare/v0.20.3...v0.20.4) (2025-08-25) diff --git a/tools/gyp/pylib/gyp/generator/android.py b/tools/gyp/pylib/gyp/generator/android.py index cfc0681f6bb049..5d5cae2afbf668 100644 --- a/tools/gyp/pylib/gyp/generator/android.py +++ b/tools/gyp/pylib/gyp/generator/android.py @@ -378,7 +378,7 @@ def WriteRules(self, rules, extra_sources, extra_outputs): inputs = rule.get("inputs") for rule_source in rule.get("rule_sources", []): (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/tools/gyp/pylib/gyp/generator/compile_commands_json.py b/tools/gyp/pylib/gyp/generator/compile_commands_json.py index bebb1303154e16..1361aeca48d0cd 100644 --- a/tools/gyp/pylib/gyp/generator/compile_commands_json.py +++ b/tools/gyp/pylib/gyp/generator/compile_commands_json.py @@ -100,7 +100,7 @@ def resolve(filename): def GenerateOutput(target_list, target_dicts, data, params): per_config_commands = {} for qualified_target, target in target_dicts.items(): - build_file, target_name, toolset = gyp.common.ParseQualifiedTarget( + build_file, _target_name, _toolset = gyp.common.ParseQualifiedTarget( qualified_target ) if IsMac(params): diff --git a/tools/gyp/pylib/gyp/generator/gypd.py b/tools/gyp/pylib/gyp/generator/gypd.py index 3c70b81fd25625..89af24a201b101 100644 --- a/tools/gyp/pylib/gyp/generator/gypd.py +++ b/tools/gyp/pylib/gyp/generator/gypd.py @@ -73,7 +73,7 @@ def GenerateOutput(target_list, target_dicts, data, params): output_files = {} for qualified_target in target_list: - [input_file, target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] + [input_file, _target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2] if input_file[-4:] != ".gyp": continue diff --git a/tools/gyp/pylib/gyp/generator/make.py b/tools/gyp/pylib/gyp/generator/make.py index 1f0995718b59b7..5f30f39fc503e5 100644 --- a/tools/gyp/pylib/gyp/generator/make.py +++ b/tools/gyp/pylib/gyp/generator/make.py @@ -1169,7 +1169,7 @@ def WriteRules( for rule_source in rule.get("rule_sources", []): dirs = set() (rule_source_dirname, rule_source_basename) = os.path.split(rule_source) - (rule_source_root, rule_source_ext) = os.path.splitext( + (rule_source_root, _rule_source_ext) = os.path.splitext( rule_source_basename ) diff --git a/tools/gyp/pylib/gyp/generator/msvs.py b/tools/gyp/pylib/gyp/generator/msvs.py index 3b258ee8f395e7..0f14c055049add 100644 --- a/tools/gyp/pylib/gyp/generator/msvs.py +++ b/tools/gyp/pylib/gyp/generator/msvs.py @@ -1666,7 +1666,7 @@ def _HandlePreCompiledHeaders(p, sources, spec): p.AddFileConfig( source, _ConfigFullName(config_name, config), {}, tools=[tool] ) - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension == ".c": extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"] else: @@ -1677,7 +1677,7 @@ def DisableForSourceTree(source_tree): if isinstance(source, MSVSProject.Filter): DisableForSourceTree(source.contents) else: - basename, extension = os.path.splitext(source) + _basename, extension = os.path.splitext(source) if extension in extensions_excluded_from_precompile: for config_name, config in spec["configurations"].items(): tool = MSVSProject.Tool( @@ -3579,7 +3579,7 @@ def _AddSources2( # If the precompiled header is generated by a C source, # we must not try to use it for C++ sources, # and vice versa. - basename, extension = os.path.splitext(precompiled_source) + _basename, extension = os.path.splitext(precompiled_source) if extension == ".c": extensions_excluded_from_precompile = [ ".cc", diff --git a/tools/gyp/pylib/gyp/generator/xcode.py b/tools/gyp/pylib/gyp/generator/xcode.py index 8e05657961fe98..db4b45d1a04d25 100644 --- a/tools/gyp/pylib/gyp/generator/xcode.py +++ b/tools/gyp/pylib/gyp/generator/xcode.py @@ -531,7 +531,7 @@ def AddSourceToTarget(source, type, pbxp, xct): library_extensions = ["a", "dylib", "framework", "o"] basename = posixpath.basename(source) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) if ext: ext = ext[1:].lower() @@ -696,7 +696,7 @@ def GenerateOutput(target_list, target_dicts, data, params): xcode_targets = {} xcode_target_to_target_dict = {} for qualified_target in target_list: - [build_file, target_name, toolset] = gyp.common.ParseQualifiedTarget( + [build_file, target_name, _toolset] = gyp.common.ParseQualifiedTarget( qualified_target ) @@ -1215,7 +1215,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # Add "sources". for source in spec.get("sources", []): - (source_root, source_extension) = posixpath.splitext(source) + (_source_root, source_extension) = posixpath.splitext(source) if source_extension[1:] not in rules_by_ext: # AddSourceToTarget will add the file to a root group if it's not # already there. @@ -1227,7 +1227,7 @@ def GenerateOutput(target_list, target_dicts, data, params): # it's a bundle of any type. if is_bundle: for resource in tgt_mac_bundle_resources: - (resource_root, resource_extension) = posixpath.splitext(resource) + (_resource_root, resource_extension) = posixpath.splitext(resource) if resource_extension[1:] not in rules_by_ext: AddResourceToTarget(resource, pbxp, xct) else: diff --git a/tools/gyp/pylib/gyp/input.py b/tools/gyp/pylib/gyp/input.py index 4965ff1571c73c..f3a5e168f2075d 100644 --- a/tools/gyp/pylib/gyp/input.py +++ b/tools/gyp/pylib/gyp/input.py @@ -2757,7 +2757,7 @@ def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): source_keys.extend(extra_sources_for_rules) for source_key in source_keys: for source in target_dict.get(source_key, []): - (source_root, source_extension) = os.path.splitext(source) + (_source_root, source_extension) = os.path.splitext(source) if source_extension.startswith("."): source_extension = source_extension[1:] if source_extension == rule_extension: diff --git a/tools/gyp/pylib/gyp/xcode_emulation.py b/tools/gyp/pylib/gyp/xcode_emulation.py index 192a523529fddd..d13eaa9af240b7 100644 --- a/tools/gyp/pylib/gyp/xcode_emulation.py +++ b/tools/gyp/pylib/gyp/xcode_emulation.py @@ -1534,18 +1534,20 @@ def CLTVersion(): FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI" MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables" - regex = re.compile("version: (?P.+)") + regex = re.compile(r"version: (?P.+)") for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]: try: output = GetStdout(["/usr/sbin/pkgutil", "--pkg-info", key]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): continue regex = re.compile(r"Command Line Tools for Xcode\s+(?P\S+)") try: output = GetStdout(["/usr/sbin/softwareupdate", "--history"]) - return re.search(regex, output).groupdict()["version"] + if m := re.search(regex, output): + return m.groupdict()["version"] except (GypError, OSError): return None diff --git a/tools/gyp/pylib/gyp/xcode_ninja.py b/tools/gyp/pylib/gyp/xcode_ninja.py index 1a97a06c51d9f5..a133fdbe8b4f58 100644 --- a/tools/gyp/pylib/gyp/xcode_ninja.py +++ b/tools/gyp/pylib/gyp/xcode_ninja.py @@ -22,7 +22,7 @@ def _WriteWorkspace(main_gyp, sources_gyp, params): """Create a workspace to wrap main and sources gyp paths.""" - (build_file_root, build_file_ext) = os.path.splitext(main_gyp) + (build_file_root, _build_file_ext) = os.path.splitext(main_gyp) workspace_path = build_file_root + ".xcworkspace" options = params["options"] if options.generator_output: diff --git a/tools/gyp/pylib/gyp/xcodeproj_file.py b/tools/gyp/pylib/gyp/xcodeproj_file.py index 11e2be07372230..cb467470d3044b 100644 --- a/tools/gyp/pylib/gyp/xcodeproj_file.py +++ b/tools/gyp/pylib/gyp/xcodeproj_file.py @@ -487,7 +487,7 @@ def Children(self): children = [] for property, attributes in self._schema.items(): - (is_list, property_type, is_strong) = attributes[0:3] + (is_list, _property_type, is_strong) = attributes[0:3] if is_strong and property in self._properties: if not is_list: children.append(self._properties[property]) @@ -913,7 +913,7 @@ def VerifyHasRequiredProperties(self): # TODO(mark): A stronger verification mechanism is needed. Some # subclasses need to perform validation beyond what the schema can enforce. for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if is_required and property not in self._properties: raise KeyError(self.__class__.__name__ + " requires " + property) @@ -923,7 +923,7 @@ def _SetDefaultsFromSchema(self): defaults = {} for property, attributes in self._schema.items(): - (is_list, property_type, is_strong, is_required) = attributes[0:4] + (_is_list, _property_type, _is_strong, is_required) = attributes[0:4] if ( is_required and len(attributes) >= 5 @@ -1616,7 +1616,7 @@ def __init__(self, properties=None, id=None, parent=None): prop_name = "lastKnownFileType" else: basename = posixpath.basename(self._properties["path"]) - (root, ext) = posixpath.splitext(basename) + (_root, ext) = posixpath.splitext(basename) # Check the map using a lowercase extension. # TODO(mark): Maybe it should try with the original case first and fall # back to lowercase, in case there are any instances where case @@ -2010,7 +2010,7 @@ def Name(self): return "Frameworks" def FileGroup(self, path): - (root, ext) = posixpath.splitext(path) + (_root, ext) = posixpath.splitext(path) if ext != "": ext = ext[1:].lower() if ext == "o": diff --git a/tools/gyp/pyproject.toml b/tools/gyp/pyproject.toml index 3a029c4fc5140c..adc82c3350151f 100644 --- a/tools/gyp/pyproject.toml +++ b/tools/gyp/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "gyp-next" -version = "0.20.4" +version = "0.20.5" authors = [ { name="Node.js contributors", email="ryzokuken@disroot.org" }, ] diff --git a/tools/gyp/tools/graphviz.py b/tools/gyp/tools/graphviz.py index ed1c7ab3cd10b5..65f78011b583c0 100755 --- a/tools/gyp/tools/graphviz.py +++ b/tools/gyp/tools/graphviz.py @@ -47,7 +47,7 @@ def WriteGraph(edges): # Bucket targets by file. files = collections.defaultdict(list) for src, dst in edges.items(): - build_file, target_name, toolset = ParseTarget(src) + build_file, target_name, _toolset = ParseTarget(src) files[build_file].append(src) print("digraph D {") @@ -62,14 +62,14 @@ def WriteGraph(edges): # If there's only one node for this file, simplify # the display by making it a box without an internal node. target = targets[0] - build_file, target_name, toolset = ParseTarget(target) + build_file, target_name, _toolset = ParseTarget(target) print(f' "{target}" [shape=box, label="{filename}\\n{target_name}"]') else: # Group multiple nodes together in a subgraph. print(' subgraph "cluster_%s" {' % filename) print(' label = "%s"' % filename) for target in targets: - build_file, target_name, toolset = ParseTarget(target) + build_file, target_name, _toolset = ParseTarget(target) print(f' "{target}" [label="{target_name}"]') print(" }") diff --git a/tools/inspector_protocol/roll.py b/tools/inspector_protocol/roll.py index 474d163c30a123..92a68d4aa093e4 100644 --- a/tools/inspector_protocol/roll.py +++ b/tools/inspector_protocol/roll.py @@ -38,22 +38,13 @@ def RunCmd(cmd): return stdoutdata.decode('utf-8') -def CheckRepoIsClean(path, suffix): +def CheckRepoIsClean(path): os.chdir(path) # As a side effect this also checks for existence of the dir. # If path isn't a git repo, this will throw and exception. # And if it is a git repo and 'git status' has anything interesting to say, # then it's not clean (uncommitted files etc.) if len(RunCmd(['git', 'status', '--porcelain'])) != 0: raise Exception('%s is not a clean git repo (run git status)' % path) - if not path.endswith(suffix): - raise Exception('%s does not end with /%s' % (path, suffix)) - - -def CheckRepoIsNotAtMainBranch(path): - os.chdir(path) - stdout = RunCmd(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip() - if stdout == 'main': - raise Exception('%s is at main branch - refusing to copy there.' % path) def CheckRepoIsInspectorProtocolCheckout(path): @@ -85,6 +76,16 @@ def ReadV8IPRevision(node_src_path): return line[len(REVISION_LINE_PREFIX):] raise Exception('No V8 inspector protocol revision found') + +def ReadNodeIPRevision(node_src_path): + lines = open(os.path.join(node_src_path, 'deps/inspector_protocol/README.node')).readlines() + for line in lines: + line = line.strip() + if line.startswith(REVISION_LINE_PREFIX): + return line[len(REVISION_LINE_PREFIX):] + raise Exception('No Node inspector protocol revision found') + + def CheckoutRevision(path, revision): os.chdir(path) return RunCmd(['git', 'checkout', revision]) @@ -114,16 +115,15 @@ def main(argv): upstream = os.path.normpath(os.path.expanduser(args.ip_src_upstream)) downstream = os.path.normpath(os.path.expanduser( args.node_src_downstream)) - CheckRepoIsClean(upstream, '/src') - CheckRepoIsClean(downstream, '/node') + CheckRepoIsClean(upstream) CheckRepoIsInspectorProtocolCheckout(upstream) - # Check that the destination Git repo isn't at the main branch - it's - # generally a bad idea to check into the main branch, so we catch this - # common pilot error here early. - CheckRepoIsNotAtMainBranch(downstream) # Read V8's inspector_protocol revision v8_ip_revision = ReadV8IPRevision(downstream) + node_ip_revision = ReadNodeIPRevision(downstream) + if v8_ip_revision == node_ip_revision: + print('Node is already at V8\'s inspector_protocol revision %s - nothing to do.' % v8_ip_revision) + sys.exit(0) print('Checking out %s into %s ...' % (upstream, v8_ip_revision)) CheckoutRevision(upstream, v8_ip_revision) diff --git a/tools/msvs/install_tools/install_tools.bat b/tools/msvs/install_tools/install_tools.bat index c3f7a287bfd071..9d759f6398118f 100644 --- a/tools/msvs/install_tools/install_tools.bat +++ b/tools/msvs/install_tools/install_tools.bat @@ -61,6 +61,6 @@ cls -ArgumentList '-NoProfile -InputFormat None -ExecutionPolicy Bypass -Command ^ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; ^ iex ((New-Object System.Net.WebClient).DownloadString(''https://chocolatey.org/install.ps1'')); ^ - choco upgrade -y python visualstudio2019-workload-vctools; ^ + choco upgrade -y python visualstudio2022-workload-vctools; ^ Read-Host ''Type ENTER to exit'' ' ^ -Verb RunAs diff --git a/tools/msvs/msi/nodemsi/nodemsi.wixproj b/tools/msvs/msi/nodemsi/nodemsi.wixproj index 0e220b9dd51739..4170e53cf738f5 100644 --- a/tools/msvs/msi/nodemsi/nodemsi.wixproj +++ b/tools/msvs/msi/nodemsi/nodemsi.wixproj @@ -1,5 +1,5 @@ - - + + Debug x64 @@ -36,20 +36,24 @@ - - - + + + - + - - move "$(TargetDir)en-us\$(TargetFileName)" "$(TargetPath)" - move "$(TargetDir)en-us\$(TargetPdbFileName)" "$(TargetPdbPath)" - + + + + diff --git a/tools/nix/benchmarkTools.nix b/tools/nix/benchmarkTools.nix new file mode 100644 index 00000000000000..62c744a552b7d1 --- /dev/null +++ b/tools/nix/benchmarkTools.nix @@ -0,0 +1,9 @@ +{ + pkgs ? import ./pkgs.nix { }, +}: +[ + pkgs.R + pkgs.rPackages.ggplot2 + pkgs.rPackages.plyr + pkgs.wrk +] diff --git a/tools/nix/devTools.nix b/tools/nix/devTools.nix new file mode 100644 index 00000000000000..474e365ceb4e34 --- /dev/null +++ b/tools/nix/devTools.nix @@ -0,0 +1,21 @@ +{ + pkgs ? import ./pkgs.nix { }, + ncu-path ? null, # Provide this if you want to use a local version of NCU +}: +[ + pkgs.curl + pkgs.gh + pkgs.git + pkgs.jq + pkgs.shellcheck +] +++ ( + if (ncu-path == null) then + [ pkgs.node-core-utils ] + else + [ + (pkgs.writeShellScriptBin "git-node" "exec \"${ncu-path}/bin/git-node.js\" \"$@\"") + (pkgs.writeShellScriptBin "ncu-ci" "exec \"${ncu-path}/bin/ncu-ci.js\" \"$@\"") + (pkgs.writeShellScriptBin "ncu-config" "exec \"${ncu-path}/bin/ncu-config.js\" \"$@\"") + ] +) diff --git a/tools/nix/pkgs.nix b/tools/nix/pkgs.nix new file mode 100644 index 00000000000000..3251e57538a71e --- /dev/null +++ b/tools/nix/pkgs.nix @@ -0,0 +1,10 @@ +arg: +let + repo = "https://github.com/NixOS/nixpkgs"; + rev = "ca77296380960cd497a765102eeb1356eb80fed0"; + nixpkgs = import (builtins.fetchTarball { + url = "${repo}/archive/${rev}.tar.gz"; + sha256 = "1airrw6l87iyny1a3mb29l28na4s4llifprlgpll2na461jd40iy"; + }) arg; +in +nixpkgs diff --git a/tools/nix/sharedLibDeps.nix b/tools/nix/sharedLibDeps.nix new file mode 100644 index 00000000000000..742d5701a5f530 --- /dev/null +++ b/tools/nix/sharedLibDeps.nix @@ -0,0 +1,38 @@ +{ + pkgs ? import ./pkgs.nix { }, +}: +{ + inherit (pkgs) + ada + brotli + c-ares + libuv + nghttp2 + nghttp3 + ngtcp2 + simdjson + simdutf + sqlite + uvwasi + zlib + zstd + ; + http-parser = pkgs.llhttp; + openssl = pkgs.openssl.overrideAttrs (old: { + version = "3.5.4"; + src = pkgs.fetchurl { + url = builtins.replaceStrings [ old.version ] [ "3.5.4" ] old.src.url; + hash = "sha256-lnMR+ElVMWlpvbHY1LmDcY70IzhjnGIexMNP3e81Xpk="; + }; + doCheck = false; + configureFlags = (old.configureFlags or [ ]) ++ [ + "no-docs" + "no-tests" + ]; + outputs = [ + "bin" + "out" + "dev" + ]; + }); +} diff --git a/tools/test.py b/tools/test.py index 8457bbd939eefc..645385b0a8798f 100755 --- a/tools/test.py +++ b/tools/test.py @@ -969,6 +969,7 @@ def __init__(self, workspace, verbose, vm, args, expect_fail, self.abort_on_timeout = abort_on_timeout self.v8_enable_inspector = True self.node_has_crypto = True + self.use_error_reporter = False def GetVm(self, arch, mode): if self.vm is not None: @@ -1461,7 +1462,7 @@ def BuildOptions(): help="Type of build (simple, fips, coverage)", default=None) result.add_argument("--error-reporter", - help="use error reporter", + help="use error reporter if the test uses node:test", default=True, action="store_true") return result @@ -1679,10 +1680,6 @@ def Main(): options.node_args.append("--trace-file-names") options.progress = "deopts" - if options.error_reporter: - options.node_args.append('--test-reporter=./test/common/test-error-reporter.js') - options.node_args.append('--test-reporter-destination=stdout') - if options.worker: run_worker = join(workspace, "tools", "run-worker.js") options.node_args.append(run_worker) @@ -1701,6 +1698,9 @@ def Main(): options.repeat, options.abort_on_timeout) + if options.error_reporter: + context.use_error_reporter = True + # Get status for tests sections = [ ] defs = { } @@ -1712,27 +1712,28 @@ def Main(): all_unused = [ ] unclassified_tests = [ ] globally_unused_rules = None - for path in paths: - for arch in options.arch: - for mode in options.mode: - vm = context.GetVm(arch, mode) - if not exists(vm): - print("Can't find shell executable: '%s'" % vm) - continue - archEngineContext = Execute([vm, "-p", "process.arch"], context) - vmArch = archEngineContext.stdout.rstrip() - if archEngineContext.exit_code != 0 or vmArch == "undefined": - print("Can't determine the arch of: '%s'" % vm) - print(archEngineContext.stderr.rstrip()) - continue - env = { - 'mode': mode, - 'system': utils.GuessOS(), - 'arch': vmArch, - 'type': get_env_type(vm, options.type, context), - 'asan': get_asan_state(vm, context), - 'pointer_compression': get_pointer_compression_state(vm, context), - } + + for arch in options.arch: + for mode in options.mode: + vm = context.GetVm(arch, mode) + if not exists(vm): + print("Can't find shell executable: '%s'" % vm) + continue + archEngineContext = Execute([vm, "-p", "process.arch"], context) + vmArch = archEngineContext.stdout.rstrip() + if archEngineContext.exit_code != 0 or vmArch == "undefined": + print("Can't determine the arch of: '%s'" % vm) + print(archEngineContext.stderr.rstrip()) + continue + env = { + 'mode': mode, + 'system': utils.GuessOS(), + 'arch': vmArch, + 'type': get_env_type(vm, options.type, context), + 'asan': get_asan_state(vm, context), + 'pointer_compression': get_pointer_compression_state(vm, context), + } + for path in paths: test_list = root.ListTests([], path, context, arch, mode) unclassified_tests += test_list cases, unused_rules = config.ClassifyTests(test_list, env) diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index 462af7d2581985..e62b69e9a7175f 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -355,12 +355,12 @@ ['v8_enable_pointer_compression==1', { 'defines': ['V8_COMPRESS_POINTERS'], }], + ['v8_enable_pointer_compression==1 and v8_enable_pointer_compression_shared_cage!=1', { + 'defines': ['V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES'], + }], ['v8_enable_pointer_compression_shared_cage==1', { 'defines': ['V8_COMPRESS_POINTERS_IN_SHARED_CAGE'], }], - ['v8_enable_pointer_compression==1 and v8_enable_pointer_compression_shared_cage==0', { - 'defines': ['V8_COMPRESS_POINTERS_IN_ISOLATE_CAGE'], - }], ['v8_enable_pointer_compression==1 or v8_enable_31bit_smis_on_64bit_arch==1', { 'defines': ['V8_31BIT_SMIS_ON_64BIT_ARCH',], }], diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index 2d5e78b338b0cb..c13326c6b14c50 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -46,22 +46,31 @@ } }, 'conditions': [ - ['OS=="mac"', { - # Hide symbols that are not explicitly exported with V8_EXPORT. - # TODO(joyeecheung): enable it on other platforms. Currently gcc times out - # or run out of memory with -fvisibility=hidden on some machines in the CI. - 'xcode_settings': { - 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden - }, + # Build with -fvisibility=hidden and -fvisibility-inlines-hidden to avoid + # including unnecessary internal symbols, which may lead to run-time fixups. + # This is not done on AIX where symbols are exported by tools/create_expfile.sh + # see https://github.com/nodejs/node/pull/56290#issuecomment-2582703109 + ['OS!="aix" and OS!="os400"', { 'defines': [ 'BUILDING_V8_SHARED', # Make V8_EXPORT visible. - ], + ] }], ['node_shared=="true"', { 'defines': [ 'V8_TLS_USED_IN_LIBRARY', # Enable V8_TLS_LIBRARY_MODE. ], }], + ['OS=="mac"', { + 'xcode_settings': { + 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden + 'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES' # -fvisibility-inlines-hidden + }, + }, '(OS!="aix" and OS!="os400") and (OS!="win" or clang==1)', { + 'cflags': [ + '-fvisibility=hidden', + '-fvisibility-inlines-hidden' + ], + }], # MSVC hides the non-public symbols by default so no need to configure it. ], }, 'targets': [ @@ -1677,10 +1686,7 @@ '; styleText(format: Array | string, text: string): string; isInsideNodeModules(frameLimit: number, defaultValue: unknown): boolean; + constructSharedArrayBuffer(length?: number): SharedArrayBuffer; constants: { kPending: 0; diff --git a/typings/internalBinding/worker.d.ts b/typings/internalBinding/worker.d.ts index e98cd62b21f868..e168ff8abb1711 100644 --- a/typings/internalBinding/worker.d.ts +++ b/typings/internalBinding/worker.d.ts @@ -11,6 +11,7 @@ declare namespace InternalWorkerBinding { ); startThread(): void; stopThread(): void; + hasRef(): boolean; ref(): void; unref(): void; getResourceLimits(): Float64Array; @@ -38,7 +39,9 @@ export interface WorkerBinding { Worker: typeof InternalWorkerBinding.Worker; getEnvMessagePort(): InternalMessagingBinding.MessagePort; threadId: number; + threadName: string; isMainThread: boolean; + isInternalThread: boolean; ownsProcessState: boolean; resourceLimits?: Float64Array; kMaxYoungGenerationSizeMb: number; diff --git a/vcbuild.bat b/vcbuild.bat index ece8f222ad8f68..eada80f27a9647 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -192,7 +192,7 @@ if "%*"=="lint" if exist "%node_exe%" goto lint-cpp if "%*"=="format-md" if exist "%node_exe%" goto format-md if "%config%"=="Debug" set configure_flags=%configure_flags% --debug -if defined nosnapshot set configure_flags=%configure_flags% --without-snapshot +if defined nosnapshot set configure_flags=%configure_flags% --without-node-snapshot if defined nonpm set configure_flags=%configure_flags% --without-npm if defined ltcg set configure_flags=%configure_flags% --with-ltcg if defined release_urlbase set configure_flags=%configure_flags% --release-urlbase=%release_urlbase% @@ -353,7 +353,7 @@ del .gyp_configure_stamp 2> NUL @rem Generate the VS project. echo configure %configure_flags% echo %configure_flags%> .used_configure_flags -python configure %configure_flags% +call python configure %configure_flags% if errorlevel 1 goto create-msvs-files-failed if not exist node.sln goto create-msvs-files-failed set project_generated=1